From a1f9baa11813d105729378be4650155ca5d07669 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Apr 2022 16:42:12 +0200 Subject: [PATCH 001/618] Fix 5.3/5.4 builds --- tests/Composer/Test/Repository/Vcs/GitDriverTest.php | 2 +- tests/Composer/Test/Repository/Vcs/HgDriverTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php index c8cfdab0a733..30041c0dd78d 100644 --- a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php @@ -56,7 +56,7 @@ public function testGetBranchesFilterInvalidBranchNames() public function testFileGetContentInvalidIdentifier() { - $this->expectException('\RuntimeException'); + $this->setExpectedException('\RuntimeException'); $process = new ProcessExecutorMock; $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); diff --git a/tests/Composer/Test/Repository/Vcs/HgDriverTest.php b/tests/Composer/Test/Repository/Vcs/HgDriverTest.php index 356a28c48ab3..e4784d92bbee 100644 --- a/tests/Composer/Test/Repository/Vcs/HgDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/HgDriverTest.php @@ -103,7 +103,7 @@ public function testGetBranchesFilterInvalidBranchNames() public function testFileGetContentInvalidIdentifier() { - $this->expectException('\RuntimeException'); + $this->setExpectedException('\RuntimeException'); $process = new ProcessExecutorMock; $driver = new HgDriver(array('url' => 'https://example.org/acme.git'), $this->io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); From ba61e768b410736efe61df01b61f1ec44f51474f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Apr 2022 16:42:25 +0200 Subject: [PATCH 002/618] Release 2.2.12 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 624e0250764e..00e57415680f 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '@package_version@'; - const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - const RELEASE_DATE = '@release_date@'; - const SOURCE_VERSION = '2.2.999-dev+source'; + const VERSION = '2.2.12'; + const BRANCH_ALIAS_VERSION = ''; + const RELEASE_DATE = '2022-04-13 16:42:25'; + const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 699956867db2779d95a43d40bc62d630ca03ecfe Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Apr 2022 16:42:26 +0200 Subject: [PATCH 003/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 00e57415680f..624e0250764e 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '2.2.12'; - const BRANCH_ALIAS_VERSION = ''; - const RELEASE_DATE = '2022-04-13 16:42:25'; - const SOURCE_VERSION = ''; + const VERSION = '@package_version@'; + const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + const RELEASE_DATE = '@release_date@'; + const SOURCE_VERSION = '2.2.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 8029e036c48bb0900b4b98ca6589b1381194a3b5 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Apr 2022 16:43:01 +0200 Subject: [PATCH 004/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 4c54f8f2eae4..93e8c0a6f5d6 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.3.5'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-04-13 16:43:00'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.3.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 9a62ef7ff204aee67589220c1d09e67de614f1de Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Apr 2022 17:07:33 +0200 Subject: [PATCH 005/618] Add missing return type --- tests/Composer/Test/Repository/Vcs/GitDriverTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php index 30041c0dd78d..848946aace49 100644 --- a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php @@ -71,7 +71,7 @@ public function testFileGetContentInvalidIdentifier() * @param GitDriver $driver * @param string $path */ - private function setRepoDir($driver, $path) + private function setRepoDir($driver, $path): void { $reflectionClass = new \ReflectionClass($driver); $reflectionProperty = $reflectionClass->getProperty('repoDir'); From b0b364af199d5fdffe3901b4cfa99074ba6ebcd2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Apr 2022 17:24:39 +0200 Subject: [PATCH 006/618] E_TOO_MANY_BRANCHES --- tests/Composer/Test/Repository/Vcs/GitDriverTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php index 848946aace49..7c6964fc71db 100644 --- a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php @@ -70,8 +70,9 @@ public function testFileGetContentInvalidIdentifier() /** * @param GitDriver $driver * @param string $path + * @return void */ - private function setRepoDir($driver, $path): void + private function setRepoDir($driver, $path) { $reflectionClass = new \ReflectionClass($driver); $reflectionProperty = $reflectionClass->getProperty('repoDir'); From 78d505083247e961432b0d7b8ef17fd6ff6172db Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 14 Apr 2022 09:47:28 +0100 Subject: [PATCH 007/618] Docs: clarify caret contraint with ^0.0.x constraint (#10728) --- doc/articles/versions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/articles/versions.md b/doc/articles/versions.md index 81ed0cddf599..5a50b805b114 100644 --- a/doc/articles/versions.md +++ b/doc/articles/versions.md @@ -181,7 +181,7 @@ The `^` operator behaves very similarly, but it sticks closer to semantic versioning, and will always allow non-breaking updates. For example `^1.2.3` is equivalent to `>=1.2.3 <2.0.0` as none of the releases until 2.0 should break backwards compatibility. For pre-1.0 versions it also acts with safety -in mind and treats `^0.3` as `>=0.3.0 <0.4.0`. +in mind and treats `^0.3` as `>=0.3.0 <0.4.0` and `^0.0.3` as `>=0.0.3 <0.0.4`. This is the recommended operator for maximum interoperability when writing library code. From 1f6f4a786e764813be85b2da2594f2be5153d6a0 Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 14 Apr 2022 09:53:26 +0100 Subject: [PATCH 008/618] BitbucketDriver: remove unnecessary HTTP call to fetch the root identifier (#10729) --- .../Repository/Vcs/GitBitbucketDriver.php | 26 ++++-------------- .../Repository/Vcs/GitBitbucketDriverTest.php | 27 ++++++++----------- 2 files changed, 16 insertions(+), 37 deletions(-) diff --git a/src/Composer/Repository/Vcs/GitBitbucketDriver.php b/src/Composer/Repository/Vcs/GitBitbucketDriver.php index be998f3770ab..985ed21fd71d 100644 --- a/src/Composer/Repository/Vcs/GitBitbucketDriver.php +++ b/src/Composer/Repository/Vcs/GitBitbucketDriver.php @@ -48,6 +48,8 @@ class GitBitbucketDriver extends VcsDriver private $website = ''; /** @var string */ private $cloneHttpsUrl = ''; + /** @var array */ + private $repoData; /** * @var ?VcsDriver @@ -125,6 +127,8 @@ protected function getRepoData(): bool $this->website = $repoData['website']; $this->vcsType = $repoData['scm']; + $this->repoData = $repoData; + return true; } @@ -472,25 +476,6 @@ protected function parseCloneUrls(array $cloneLinks): void } } - /** - * @return (array{name: string}&mixed[])|null - */ - protected function getMainBranchData(): ?array - { - $resource = sprintf( - 'https://api.bitbucket.org/2.0/repositories/%s/%s?fields=mainbranch', - $this->owner, - $this->repository - ); - - $data = $this->fetchWithOAuthCredentials($resource)->decodeJson(); - if (isset($data['mainbranch'])) { - return $data['mainbranch']; - } - - return null; - } - /** * @inheritDoc */ @@ -517,8 +502,7 @@ public function getRootIdentifier(): string ); } - $mainBranchData = $this->getMainBranchData(); - $this->rootIdentifier = !empty($mainBranchData['name']) ? $mainBranchData['name'] : 'master'; + $this->rootIdentifier = $this->repoData['mainbranch']['name'] ?? 'master'; } return $this->rootIdentifier; diff --git a/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php index 7a5d3065451a..bc99e65c4f20 100644 --- a/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php @@ -105,11 +105,10 @@ public function testDriver(): GitBitbucketDriver $urls = array( 'https://api.bitbucket.org/2.0/repositories/user/repo?fields=-project%2C-owner', - 'https://api.bitbucket.org/2.0/repositories/user/repo?fields=mainbranch', 'https://api.bitbucket.org/2.0/repositories/user/repo/refs/tags?pagelen=100&fields=values.name%2Cvalues.target.hash%2Cnext&sort=-target.date', 'https://api.bitbucket.org/2.0/repositories/user/repo/refs/branches?pagelen=100&fields=values.name%2Cvalues.target.hash%2Cvalues.heads%2Cnext&sort=-target.date', - 'https://api.bitbucket.org/2.0/repositories/user/repo/src/master/composer.json', - 'https://api.bitbucket.org/2.0/repositories/user/repo/commit/master?fields=date', + 'https://api.bitbucket.org/2.0/repositories/user/repo/src/main/composer.json', + 'https://api.bitbucket.org/2.0/repositories/user/repo/commit/main?fields=date', ); $this->httpDownloader->expects($this->any()) ->method('get') @@ -128,22 +127,18 @@ public function testDriver(): GitBitbucketDriver ), array( $urls[4], array(), - ), - array( - $urls[5], array(), ) ) ->willReturnOnConsecutiveCalls( - new Response(array('url' => $urls[0]), 200, array(), '{"scm":"git","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/user\/repo.git","name":"https"},{"href":"ssh:\/\/git@bitbucket.org\/user\/repo.git","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/user\/repo"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}'), - new Response(array('url' => $urls[1]), 200, array(), '{"mainbranch": {"name": "master"}}'), - new Response(array('url' => $urls[2]), 200, array(), '{"values":[{"name":"1.0.1","target":{"hash":"9b78a3932143497c519e49b8241083838c8ff8a1"}},{"name":"1.0.0","target":{"hash":"d3393d514318a9267d2f8ebbf463a9aaa389f8eb"}}]}'), - new Response(array('url' => $urls[3]), 200, array(), '{"values":[{"name":"master","target":{"hash":"937992d19d72b5116c3e8c4a04f960e5fa270b22"}}]}'), - new Response(array('url' => $urls[4]), 200, array(), '{"name": "user/repo","description": "test repo","license": "GPL","authors": [{"name": "Name","email": "local@domain.tld"}],"require": {"creator/package": "^1.0"},"require-dev": {"phpunit/phpunit": "~4.8"}}'), - new Response(array('url' => $urls[5]), 200, array(), '{"date": "2016-05-17T13:19:52+00:00"}') + new Response(array('url' => $urls[0]), 200, array(), '{"mainbranch": {"name": "main"}, "scm":"git","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/user\/repo.git","name":"https"},{"href":"ssh:\/\/git@bitbucket.org\/user\/repo.git","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/user\/repo"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}'), + new Response(array('url' => $urls[1]), 200, array(), '{"values":[{"name":"1.0.1","target":{"hash":"9b78a3932143497c519e49b8241083838c8ff8a1"}},{"name":"1.0.0","target":{"hash":"d3393d514318a9267d2f8ebbf463a9aaa389f8eb"}}]}'), + new Response(array('url' => $urls[2]), 200, array(), '{"values":[{"name":"main","target":{"hash":"937992d19d72b5116c3e8c4a04f960e5fa270b22"}}]}'), + new Response(array('url' => $urls[3]), 200, array(), '{"name": "user/repo","description": "test repo","license": "GPL","authors": [{"name": "Name","email": "local@domain.tld"}],"require": {"creator/package": "^1.0"},"require-dev": {"phpunit/phpunit": "~4.8"}}'), + new Response(array('url' => $urls[4]), 200, array(), '{"date": "2016-05-17T13:19:52+00:00"}') ); $this->assertEquals( - 'master', + 'main', $driver->getRootIdentifier() ); @@ -157,7 +152,7 @@ public function testDriver(): GitBitbucketDriver $this->assertEquals( array( - 'master' => '937992d19d72b5116c3e8c4a04f960e5fa270b22', + 'main' => '937992d19d72b5116c3e8c4a04f960e5fa270b22', ), $driver->getBranches() ); @@ -181,11 +176,11 @@ public function testDriver(): GitBitbucketDriver ), 'time' => '2016-05-17T13:19:52+00:00', 'support' => array( - 'source' => 'https://bitbucket.org/user/repo/src/937992d19d72b5116c3e8c4a04f960e5fa270b22/?at=master', + 'source' => 'https://bitbucket.org/user/repo/src/937992d19d72b5116c3e8c4a04f960e5fa270b22/?at=main', ), 'homepage' => 'https://bitbucket.org/user/repo', ), - $driver->getComposerInformation('master') + $driver->getComposerInformation('main') ); return $driver; From 20d11bfdfb8a3580f219edb7501fada0f69335ff Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 14 Apr 2022 11:25:44 +0200 Subject: [PATCH 009/618] Display the stored channel when choosing a specific channel in self-update, fixes #10719 --- src/Composer/Command/SelfUpdateCommand.php | 2 +- src/Composer/SelfUpdate/Versions.php | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index 244c54aaab10..68f3c2c0b309 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -104,7 +104,7 @@ class_exists('Composer\Downloader\FilesystemException'); foreach (Versions::$channels as $channel) { if ($input->getOption($channel)) { $requestedChannel = $channel; - $versionsUtil->setChannel($channel); + $versionsUtil->setChannel($channel, $io); break; } } diff --git a/src/Composer/SelfUpdate/Versions.php b/src/Composer/SelfUpdate/Versions.php index 284449417e9d..eaedeff2ae7f 100644 --- a/src/Composer/SelfUpdate/Versions.php +++ b/src/Composer/SelfUpdate/Versions.php @@ -12,6 +12,7 @@ namespace Composer\SelfUpdate; +use Composer\IO\IOInterface; use Composer\Pcre\Preg; use Composer\Util\HttpDownloader; use Composer\Config; @@ -64,7 +65,7 @@ public function getChannel() * * @return void */ - public function setChannel($channel) + public function setChannel($channel, IOInterface $io = null) { if (!in_array($channel, self::$channels, true)) { throw new \InvalidArgumentException('Invalid channel '.$channel.', must be one of: ' . implode(', ', self::$channels)); @@ -72,8 +73,15 @@ public function setChannel($channel) $channelFile = $this->config->get('home').'/update-channel'; $this->channel = $channel; + + $storedChannel = Preg::isMatch('{^\d+$}D', $channel) ? 'stable' : $channel; + $previouslyStored = file_exists($channelFile) ? trim((string) file_get_contents($channelFile)) : null; // rewrite '2' and '1' channels to stable for future self-updates, but LTS ones like '2.2' remain pinned - file_put_contents($channelFile, (Preg::isMatch('{^\d+$}D', $channel) ? 'stable' : $channel).PHP_EOL); + file_put_contents($channelFile, $storedChannel.PHP_EOL); + + if ($io !== null && $previouslyStored !== $storedChannel) { + $io->writeError('Storing "'.$storedChannel.'" as default update channel for the next self-update run.'); + } } /** From b1828ef653486132b44f64fb131da0ca7fc72c1f Mon Sep 17 00:00:00 2001 From: Stephan Date: Thu, 14 Apr 2022 15:53:18 +0100 Subject: [PATCH 010/618] ComposerRepository: add a warning if the packages key doesn't match the package name (#10735) --- src/Composer/Repository/ComposerRepository.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index c4729600cf85..114d6388cad7 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -105,6 +105,8 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito private $hasPartialPackages = false; /** @var ?array */ private $partialPackagesByName = null; + /** @var bool */ + private $displayedWarningAboutNonMatchingPackageIndex = false; /** * @var array list of package names which are fresh and can be loaded from the cache directly in case loadPackage is called several times @@ -1235,8 +1237,13 @@ private function loadIncludes(array $data): array if (isset($data['packages'])) { foreach ($data['packages'] as $package => $versions) { + $packageName = strtolower((string) $package); foreach ($versions as $version => $metadata) { $packages[] = $metadata; + if (!$this->displayedWarningAboutNonMatchingPackageIndex && $packageName !== strtolower((string) ($metadata['name'] ?? ''))) { + $this->displayedWarningAboutNonMatchingPackageIndex = true; + $this->io->writeError(sprintf("Warning: the packages key '%s' doesn't match the name defined in the package metadata '%s' in repository %s", $package, $metadata['name'] ?? '', $this->baseUrl)); + } } } } @@ -1588,7 +1595,12 @@ private function initializePartialPackages(): void $this->partialPackagesByName = array(); foreach ($rootData['packages'] as $package => $versions) { foreach ($versions as $version) { - $this->partialPackagesByName[strtolower($version['name'])][] = $version; + $versionPackageName = strtolower((string) ($version['name'] ?? '')); + $this->partialPackagesByName[$versionPackageName][] = $version; + if (!$this->displayedWarningAboutNonMatchingPackageIndex && $versionPackageName !== strtolower($package)) { + $this->io->writeError(sprintf("Warning: the packages key '%s' doesn't match the name defined in the package metadata '%s' in repository %s", $package, $version['name'] ?? '', $this->baseUrl)); + $this->displayedWarningAboutNonMatchingPackageIndex = true; + } } } From f728b0b007cc5cd87c531493adbd94ae32a7cc4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20F=C3=B6rster?= Date: Tue, 26 Apr 2022 16:51:30 +0200 Subject: [PATCH 011/618] clarify `config.platform` short notation (#10741) --- doc/06-config.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/06-config.md b/doc/06-config.md index 5217b18f225e..5490faa7e0d1 100644 --- a/doc/06-config.md +++ b/doc/06-config.md @@ -223,7 +223,8 @@ production env or define your target platform in the config. Example: `{"php": This will make sure that no package requiring more than PHP 7.0.3 can be installed regardless of the actual PHP version you run locally. However it also means the dependencies are not checked correctly anymore, if you run PHP 5.6 it will -install fine as it assumes 7.0.3, but then it will fail at runtime. +install fine as it assumes 7.0.3, but then it will fail at runtime. This also means if +`{"php":"7.4"}` is specified; no packages will be used that define `7.4.1` as minimum. Therefore if you use this it is recommended, and safer, to also run the [`check-platform-reqs`](03-cli.md#check-platform-reqs) command as part of your From c36a9350bd6e81ca3ba3bbb49c72d6860489c393 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 27 Apr 2022 21:10:06 +0200 Subject: [PATCH 012/618] Fix TypeError in ConfigCommand (#10753) * Fix TypeError in ConfigCommand * Update ConfigCommand.php --- src/Composer/Command/ConfigCommand.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index 56ccb5b5ec06..cf3bd4298e32 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -214,7 +214,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int { // Open file in editor if (true === $input->getOption('editor')) { - $editor = escapeshellcmd(Platform::getEnv('EDITOR')); + $editor = Platform::getEnv('EDITOR'); if (!$editor) { if (Platform::isWindows()) { $editor = 'notepad'; @@ -226,6 +226,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int } } } + } else { + $editor = escapeshellcmd($editor); } $file = $input->getOption('auth') ? $this->authConfigFile->getPath() : $this->configFile->getPath(); From 5a54e0eb7ac1945d9acf702f07b2df47a2978e7e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 14 Apr 2022 17:05:40 +0200 Subject: [PATCH 013/618] Use new fixed compact table format --- composer.json | 2 +- composer.lock | 100 +++++++++++------------ src/Composer/Command/BaseCommand.php | 3 - src/Composer/Command/LicensesCommand.php | 3 - 4 files changed, 51 insertions(+), 57 deletions(-) diff --git a/composer.json b/composer.json index 80b97d6ad1c1..7696422998dc 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "psr/log": "^1.0 || ^2.0 || ^3.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", - "symfony/console": "^5.4.1 || ^6.0", + "symfony/console": "^5.4.7 || ^6.0.7", "symfony/filesystem": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0", "symfony/process": "^5.4 || ^6.0", diff --git a/composer.lock b/composer.lock index c652dca6c6d8..a9891dfbd577 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3a7c7da73f59287030b9704930778e2b", + "content-hash": "9e35cddef900ba721bf84c8cda25db75", "packages": [ { "name": "composer/ca-bundle", @@ -451,16 +451,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -515,9 +515,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "psr/container", @@ -807,16 +807,16 @@ }, { "name": "symfony/console", - "version": "v5.4.5", + "version": "v5.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad" + "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad", + "url": "https://api.github.com/repos/symfony/console/zipball/900275254f0a1a2afff1ab0e11abd5587a10e1d6", + "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6", "shasum": "" }, "require": { @@ -886,7 +886,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.5" + "source": "https://github.com/symfony/console/tree/v5.4.7" }, "funding": [ { @@ -902,20 +902,20 @@ "type": "tidelift" } ], - "time": "2022-02-24T12:45:35+00:00" + "time": "2022-03-31T17:09:19+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -953,7 +953,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" }, "funding": [ { @@ -969,20 +969,20 @@ "type": "tidelift" } ], - "time": "2021-07-12T14:48:14+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/filesystem", - "version": "v5.4.6", + "version": "v5.4.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d53a45039974952af7f7ebc461ccdd4295e29440" + "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d53a45039974952af7f7ebc461ccdd4295e29440", - "reference": "d53a45039974952af7f7ebc461ccdd4295e29440", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", + "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", "shasum": "" }, "require": { @@ -1017,7 +1017,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.6" + "source": "https://github.com/symfony/filesystem/tree/v5.4.7" }, "funding": [ { @@ -1033,7 +1033,7 @@ "type": "tidelift" } ], - "time": "2022-03-02T12:42:23+00:00" + "time": "2022-04-01T12:33:59+00:00" }, { "name": "symfony/finder", @@ -1592,16 +1592,16 @@ }, { "name": "symfony/process", - "version": "v5.4.5", + "version": "v5.4.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c" + "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/95440409896f90a5f85db07a32b517ecec17fa4c", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c", + "url": "https://api.github.com/repos/symfony/process/zipball/38a44b2517b470a436e1c944bf9b9ba3961137fb", + "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb", "shasum": "" }, "require": { @@ -1634,7 +1634,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.5" + "source": "https://github.com/symfony/process/tree/v5.4.7" }, "funding": [ { @@ -1650,26 +1650,26 @@ "type": "tidelift" } ], - "time": "2022-01-30T18:16:22+00:00" + "time": "2022-03-18T16:18:52+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.0", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -1717,7 +1717,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" }, "funding": [ { @@ -1733,7 +1733,7 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:48:04+00:00" + "time": "2022-03-13T20:07:29+00:00" }, { "name": "symfony/string", @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.5.4", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "bbf68cae24f6dc023c607ea0f87da55dd9d55c2b" + "reference": "d77a607667f29ae099c0686f99664bd451fd23df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/bbf68cae24f6dc023c607ea0f87da55dd9d55c2b", - "reference": "bbf68cae24f6dc023c607ea0f87da55dd9d55c2b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d77a607667f29ae099c0686f99664bd451fd23df", + "reference": "d77a607667f29ae099c0686f99664bd451fd23df", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.5.4" + "source": "https://github.com/phpstan/phpstan/tree/1.5.5" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-04-03T12:39:00+00:00" + "time": "2022-04-14T12:20:26+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -2111,16 +2111,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.0.3", + "version": "v6.0.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "81f5e8e453433e0182a49ca45d4734cb3a2f818f" + "reference": "924f44f1c682473453a502f8f01d4904a7761dcc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/81f5e8e453433e0182a49ca45d4734cb3a2f818f", - "reference": "81f5e8e453433e0182a49ca45d4734cb3a2f818f", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/924f44f1c682473453a502f8f01d4904a7761dcc", + "reference": "924f44f1c682473453a502f8f01d4904a7761dcc", "shasum": "" }, "require": { @@ -2174,7 +2174,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.0.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.0.7" }, "funding": [ { @@ -2190,7 +2190,7 @@ "type": "tidelift" } ], - "time": "2022-01-26T17:23:29+00:00" + "time": "2022-03-06T11:27:28+00:00" } ], "aliases": [], diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 2563442ea11f..c4f2ace111fb 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -356,9 +356,6 @@ protected function renderTable(array $table, OutputInterface $output) { $renderer = new Table($output); $renderer->setStyle('compact'); - $rendererStyle = $renderer->getStyle(); - $rendererStyle->setVerticalBorderChars(''); - $rendererStyle->setCellRowContentFormat('%s '); $renderer->setRows($table)->render(); } diff --git a/src/Composer/Command/LicensesCommand.php b/src/Composer/Command/LicensesCommand.php index 003538f3a56e..748b5b85d4fd 100644 --- a/src/Composer/Command/LicensesCommand.php +++ b/src/Composer/Command/LicensesCommand.php @@ -83,9 +83,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int $table = new Table($output); $table->setStyle('compact'); - $tableStyle = $table->getStyle(); - $tableStyle->setVerticalBorderChars(''); - $tableStyle->setCellRowContentFormat('%s '); $table->setHeaders(array('Name', 'Version', 'Licenses')); foreach ($packages as $package) { $link = PackageInfo::getViewSourceOrHomepageUrl($package); From a0cc388952aecd2608afe6322d20b8b8674ebe70 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 27 Apr 2022 21:23:13 +0200 Subject: [PATCH 014/618] Fix init command failing due to missing --ignore-platform-req[s] flags, fixes #10739 --- src/Composer/Command/PackageDiscoveryTrait.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/PackageDiscoveryTrait.php b/src/Composer/Command/PackageDiscoveryTrait.php index 1ad7e50c5aa8..99fb0f39b707 100644 --- a/src/Composer/Command/PackageDiscoveryTrait.php +++ b/src/Composer/Command/PackageDiscoveryTrait.php @@ -271,7 +271,11 @@ final protected function determineRequirements(InputInterface $input, OutputInte private function findBestVersionAndNameForPackage(InputInterface $input, string $name, ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', ?string $requiredVersion = null, ?string $minimumStability = null, bool $fixed = false): array { // handle ignore-platform-reqs flag if present - $platformRequirementFilter = $this->getPlatformRequirementFilter($input); + if ($input->hasOption('ignore-platform-reqs') && $input->hasOption('ignore-platform-req')) { + $platformRequirementFilter = $this->getPlatformRequirementFilter($input); + } else { + $platformRequirementFilter = PlatformRequirementFilterFactory::ignoreNothing(); + } // find the latest version allowed in this repo set $repoSet = $this->getRepositorySet($input, $minimumStability); From cac2d076b1d92be641ddb6a0476a37ddd57f4ee9 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 27 Apr 2022 21:30:21 +0200 Subject: [PATCH 015/618] Fix corrupt caches for svn driver, fixes #10751 --- src/Composer/Repository/Vcs/SvnDriver.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Composer/Repository/Vcs/SvnDriver.php b/src/Composer/Repository/Vcs/SvnDriver.php index af29720a21c0..579a46beadd8 100644 --- a/src/Composer/Repository/Vcs/SvnDriver.php +++ b/src/Composer/Repository/Vcs/SvnDriver.php @@ -137,6 +137,13 @@ public function getComposerInformation(string $identifier): ?array { if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier.'.json')) { + // old cache files had '' stored instead of null due to af3783b5f40bae32a23e353eaf0a00c9b8ce82e2, so we make sure here that we always return null or array + // and fix outdated invalid cache files + if ($res === '""') { + $res = 'null'; + $this->cache->write($identifier.'.json', json_encode(null)); + } + return $this->infoCache[$identifier] = JsonFile::parseJson($res); } From f435618cb3dfb6024030c6192ec46fffe941195f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 27 Apr 2022 21:54:54 +0200 Subject: [PATCH 016/618] Update phpstan baseline (2086, 104) --- phpstan/baseline.neon | 39 +++++++++++++++----------- src/Composer/Command/ConfigCommand.php | 2 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 760111d2a17a..522d6ce3421e 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -400,11 +400,6 @@ parameters: count: 1 path: ../src/Composer/Command/ConfigCommand.php - - - message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" - count: 1 - path: ../src/Composer/Command/ConfigCommand.php - - message: "#^Only booleans are allowed in an elseif condition, int\\<0, max\\>\\|false given\\.$#" count: 1 @@ -415,11 +410,6 @@ parameters: count: 1 path: ../src/Composer/Command/ConfigCommand.php - - - message: "#^Parameter \\#1 \\$command of function escapeshellcmd expects string, string\\|false given\\.$#" - count: 1 - path: ../src/Composer/Command/ConfigCommand.php - - message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, array\\{Composer\\\\Config\\\\JsonConfigSource, string\\} given\\.$#" count: 2 @@ -670,6 +660,11 @@ parameters: count: 1 path: ../src/Composer/Command/InitCommand.php + - + message: "#^Left side of && is always false\\.$#" + count: 1 + path: ../src/Composer/Command/InitCommand.php + - message: "#^Method Composer\\\\Command\\\\InitCommand\\:\\:getGitConfig\\(\\) should return array\\ but returns array\\\\.$#" count: 1 @@ -710,6 +705,11 @@ parameters: count: 1 path: ../src/Composer/Command/InitCommand.php + - + message: "#^Right side of && is always false\\.$#" + count: 1 + path: ../src/Composer/Command/InitCommand.php + - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 8 @@ -780,6 +780,11 @@ parameters: count: 3 path: ../src/Composer/Command/RequireCommand.php + - + message: "#^Left side of && is always true\\.$#" + count: 1 + path: ../src/Composer/Command/RequireCommand.php + - message: "#^Method Composer\\\\Command\\\\RequireCommand\\:\\:getPackagesByRequireKey\\(\\) should return array\\ but returns array\\\\.$#" count: 1 @@ -820,6 +825,11 @@ parameters: count: 1 path: ../src/Composer/Command/RequireCommand.php + - + message: "#^Right side of && is always true\\.$#" + count: 1 + path: ../src/Composer/Command/RequireCommand.php + - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 1 @@ -4260,7 +4270,7 @@ parameters: - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 5 + count: 4 path: ../src/Composer/Repository/Vcs/GitBitbucketDriver.php - @@ -4540,7 +4550,7 @@ parameters: - message: "#^Cannot call method write\\(\\) on Composer\\\\Cache\\|null\\.$#" - count: 1 + count: 2 path: ../src/Composer/Repository/Vcs/SvnDriver.php - @@ -5233,11 +5243,6 @@ parameters: count: 2 path: ../src/Composer/Util/HttpDownloader.php - - - message: "#^Offset 'curl_id' on array\\{curl_id\\: int, exception\\: Composer\\\\Downloader\\\\TransportException, id\\: int, origin\\: string, reject\\: mixed, request\\: array\\{url\\: string, options\\?\\: array, copyTo\\?\\: string\\|null\\}, resolve\\: mixed, response\\: Composer\\\\Util\\\\Http\\\\Response, \\.\\.\\.\\} in isset\\(\\) always exists and is not nullable\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - message: "#^Offset 'exception' does not exist on array\\{id\\: int, status\\: 4, request\\: array\\{url\\: string, options\\?\\: array, copyTo\\?\\: string\\|null\\}, sync\\: bool, origin\\: string, resolve\\?\\: callable\\(\\)\\: mixed, reject\\?\\: callable\\(\\)\\: mixed, curl_id\\?\\: int, \\.\\.\\.\\}\\.$#" count: 1 diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index cf3bd4298e32..390cf2969c3a 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -215,7 +215,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Open file in editor if (true === $input->getOption('editor')) { $editor = Platform::getEnv('EDITOR'); - if (!$editor) { + if (false === $editor || '' === $editor) { if (Platform::isWindows()) { $editor = 'notepad'; } else { From e918b6001b4b2bdb6b5f8bfb53c62c11a87eb6de Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 27 Apr 2022 22:00:04 +0200 Subject: [PATCH 017/618] Update phpstan --- composer.lock | 103 +++++++++--------- .../Repository/PlatformRepository.php | 6 - 2 files changed, 50 insertions(+), 59 deletions(-) diff --git a/composer.lock b/composer.lock index a9891dfbd577..e7effec9897b 100644 --- a/composer.lock +++ b/composer.lock @@ -807,16 +807,16 @@ }, { "name": "symfony/console", - "version": "v5.4.7", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6" + "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/900275254f0a1a2afff1ab0e11abd5587a10e1d6", - "reference": "900275254f0a1a2afff1ab0e11abd5587a10e1d6", + "url": "https://api.github.com/repos/symfony/console/zipball/ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b", + "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b", "shasum": "" }, "require": { @@ -886,7 +886,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.7" + "source": "https://github.com/symfony/console/tree/v5.4.8" }, "funding": [ { @@ -902,7 +902,7 @@ "type": "tidelift" } ], - "time": "2022-03-31T17:09:19+00:00" + "time": "2022-04-12T16:02:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1037,16 +1037,16 @@ }, { "name": "symfony/finder", - "version": "v5.4.3", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d" + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d", + "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", "shasum": "" }, "require": { @@ -1080,7 +1080,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.3" + "source": "https://github.com/symfony/finder/tree/v5.4.8" }, "funding": [ { @@ -1096,7 +1096,7 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:34:36+00:00" + "time": "2022-04-15T08:07:45+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1592,16 +1592,16 @@ }, { "name": "symfony/process", - "version": "v5.4.7", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb" + "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/38a44b2517b470a436e1c944bf9b9ba3961137fb", - "reference": "38a44b2517b470a436e1c944bf9b9ba3961137fb", + "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", "shasum": "" }, "require": { @@ -1634,7 +1634,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.7" + "source": "https://github.com/symfony/process/tree/v5.4.8" }, "funding": [ { @@ -1650,7 +1650,7 @@ "type": "tidelift" } ], - "time": "2022-03-18T16:18:52+00:00" + "time": "2022-04-08T05:07:18+00:00" }, { "name": "symfony/service-contracts", @@ -1737,16 +1737,16 @@ }, { "name": "symfony/string", - "version": "v5.4.3", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10" + "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10", + "url": "https://api.github.com/repos/symfony/string/zipball/3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8", + "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8", "shasum": "" }, "require": { @@ -1803,7 +1803,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.3" + "source": "https://github.com/symfony/string/tree/v5.4.8" }, "funding": [ { @@ -1819,22 +1819,22 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-04-19T10:40:37+00:00" } ], "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.5.5", + "version": "1.6.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d77a607667f29ae099c0686f99664bd451fd23df" + "reference": "becb9603a31d70f5007d505877a7b812598dfe46" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d77a607667f29ae099c0686f99664bd451fd23df", - "reference": "d77a607667f29ae099c0686f99664bd451fd23df", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/becb9603a31d70f5007d505877a7b812598dfe46", + "reference": "becb9603a31d70f5007d505877a7b812598dfe46", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.5.5" + "source": "https://github.com/phpstan/phpstan/tree/1.6.2" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-04-14T12:20:26+00:00" + "time": "2022-04-27T11:05:24+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -1934,16 +1934,16 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "09133ce914f1388a8bb8c7f8573aaa3723cff52a" + "reference": "4a3c437c09075736285d1cabb5c75bf27ed0bc84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/09133ce914f1388a8bb8c7f8573aaa3723cff52a", - "reference": "09133ce914f1388a8bb8c7f8573aaa3723cff52a", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4a3c437c09075736285d1cabb5c75bf27ed0bc84", + "reference": "4a3c437c09075736285d1cabb5c75bf27ed0bc84", "shasum": "" }, "require": { @@ -1980,27 +1980,27 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.1.0" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.1.1" }, - "time": "2022-03-28T09:20:49+00:00" + "time": "2022-04-20T15:24:25+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "e12d55f74a8cca18c6e684c6450767e055ba7717" + "reference": "afbe1e3235c51ee3f10ba4c8b32449099016ea02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/e12d55f74a8cca18c6e684c6450767e055ba7717", - "reference": "e12d55f74a8cca18c6e684c6450767e055ba7717", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/afbe1e3235c51ee3f10ba4c8b32449099016ea02", + "reference": "afbe1e3235c51ee3f10ba4c8b32449099016ea02", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0", - "phpstan/phpstan": "^1.2.0" + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.6.0" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -2010,9 +2010,6 @@ }, "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - }, "phpstan": { "includes": [ "rules.neon" @@ -2031,9 +2028,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.1.0" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.0" }, - "time": "2021-11-18T09:30:29+00:00" + "time": "2022-04-21T13:07:43+00:00" }, { "name": "phpstan/phpstan-symfony", @@ -2111,16 +2108,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.0.7", + "version": "v6.0.8", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "924f44f1c682473453a502f8f01d4904a7761dcc" + "reference": "4959a1eedd473bdb3f19db5b1525d5415dfab471" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/924f44f1c682473453a502f8f01d4904a7761dcc", - "reference": "924f44f1c682473453a502f8f01d4904a7761dcc", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/4959a1eedd473bdb3f19db5b1525d5415dfab471", + "reference": "4959a1eedd473bdb3f19db5b1525d5415dfab471", "shasum": "" }, "require": { @@ -2174,7 +2171,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.0.7" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.0.8" }, "funding": [ { @@ -2190,7 +2187,7 @@ "type": "tidelift" } ], - "time": "2022-03-06T11:27:28+00:00" + "time": "2022-04-12T16:11:42+00:00" } ], "aliases": [], diff --git a/src/Composer/Repository/PlatformRepository.php b/src/Composer/Repository/PlatformRepository.php index bce36fc809a9..abbe428c7910 100644 --- a/src/Composer/Repository/PlatformRepository.php +++ b/src/Composer/Repository/PlatformRepository.php @@ -564,12 +564,6 @@ public function addPackage(PackageInterface $package): void // Skip if PHP is overridden and we are adding a php-* package if (isset($this->overrides['php']) && 0 === strpos($package->getName(), 'php-')) { - if (isset($this->overrides[$package->getName()]) && $this->overrides[$package->getName()]['version'] === false) { - $this->addDisabledPackage($package); - - return; - } - $overrider = $this->addOverriddenPackage($this->overrides['php'], $package->getPrettyName()); if ($package->getVersion() === $overrider->getVersion()) { $actualText = 'same as actual'; From b8b84c2c354c5f7eaaf208b207da979624f1a4bb Mon Sep 17 00:00:00 2001 From: Liviu-Ionut Iosif Date: Thu, 28 Apr 2022 10:03:46 +0300 Subject: [PATCH 018/618] #10738 - Allow config unset for unrecognized keys (#10756) * Allow config unset for unrecognized keys * Move config key removal after all other checks Because key removal is done without matching the key in the recognized composer.json schema, leaving the key removal before other check would have stopped the execution there without reaching the specific config add (eg. composer config repo [--unset]) Co-authored-by: Liviu Iosif --- src/Composer/Command/ConfigCommand.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index 390cf2969c3a..e893e7983f82 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -634,11 +634,6 @@ function ($vals) { if ($input->getOption('global') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]) || strpos($settingKey, 'extra.') === 0)) { throw new \InvalidArgumentException('The ' . $settingKey . ' property can not be set in the global config.json file. Use `composer global config` to apply changes to the global composer.json'); } - if ($input->getOption('unset') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]))) { - $this->configSource->removeProperty($settingKey); - - return 0; - } if (isset($uniqueProps[$settingKey])) { $this->handleSingleValue($settingKey, $uniqueProps[$settingKey], $values, 'addProperty'); @@ -801,6 +796,12 @@ function ($vals) { return 0; } + if ($input->getOption('unset')) { + $this->configSource->removeProperty($settingKey); + + return 0; + } + throw new \InvalidArgumentException('Setting '.$settingKey.' does not exist or is not supported by this command'); } From 0cd02f62575b167b01ab33a610e788a6f8b11353 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 18 Mar 2022 09:26:31 +0100 Subject: [PATCH 019/618] added phpstan ConfigReturnTypeExtension --- phpstan/config.neon | 6 +++ .../PHPStan/ConfigReturnTypeExtension.php | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/Composer/PHPStan/ConfigReturnTypeExtension.php diff --git a/phpstan/config.neon b/phpstan/config.neon index 5ac2cd37b1ca..f09a2e4b74d4 100644 --- a/phpstan/config.neon +++ b/phpstan/config.neon @@ -58,3 +58,9 @@ parameters: - Composer\Composer::VERSION - Composer\Composer::RELEASE_DATE - Composer\Composer::SOURCE_VERSION + +services: + - + class: Composer\PHPStan\ConfigReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php new file mode 100644 index 000000000000..73f1764bc671 --- /dev/null +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -0,0 +1,50 @@ +getName()) === 'get'; + } + + public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type + { + $args = $methodCall->getArgs(); + + if (count($args) < 1) { + return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + } + + $keyType = $scope->getType($args[0]->value); + if ($keyType instanceof ConstantStringType) { + if ($keyType->getValue() == 'allow-plugins') { + return TypeCombinator::addNull( + new ArrayType(new StringType(), new BooleanType()) + ); + } + } + + return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + } +} From 532166a892aeb2a09fdd94bbf8259b8e98eeaff4 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 18 Mar 2022 09:37:11 +0100 Subject: [PATCH 020/618] ws --- phpstan/config.neon | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phpstan/config.neon b/phpstan/config.neon index f09a2e4b74d4..500e97ed41be 100644 --- a/phpstan/config.neon +++ b/phpstan/config.neon @@ -60,7 +60,7 @@ parameters: - Composer\Composer::SOURCE_VERSION services: - - - class: Composer\PHPStan\ConfigReturnTypeExtension - tags: - - phpstan.broker.dynamicMethodReturnTypeExtension + - + class: Composer\PHPStan\ConfigReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension From 6fdd9494efa2d5d638db1be6cb669668ced4fa4f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 28 Apr 2022 15:13:08 +0200 Subject: [PATCH 021/618] Implement config type parsing --- res/composer-schema.json | 2 +- .../PHPStan/ConfigReturnTypeExtension.php | 131 +++++++++++++++++- 2 files changed, 127 insertions(+), 6 deletions(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index 166a80820264..3276cc025318 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -326,7 +326,7 @@ }, "github-protocols": { "type": "array", - "description": "A list of protocols to use for github.com clones, in priority order, defaults to [\"git\", \"https\", \"http\"].", + "description": "A list of protocols to use for github.com clones, in priority order, defaults to [\"https\", \"ssh\", \"git\"].", "items": { "type": "string" } diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index 73f1764bc671..1b99218aca6c 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -3,20 +3,39 @@ namespace Composer\PHPStan; use Composer\Config; +use Composer\Json\JsonFile; use PhpParser\Node\Expr\MethodCall; use PHPStan\Analyser\Scope; use PHPStan\Reflection\MethodReflection; use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; +use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\DynamicMethodReturnTypeExtension; +use PHPStan\Type\IntegerRangeType; +use PHPStan\Type\IntegerType; +use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; +use PHPStan\Type\UnionType; -final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtension { +final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtension +{ + /** @var array */ + private $properties = []; + + public function __construct() + { + $schema = JsonFile::parseJson(file_get_contents(__DIR__.'/../../../res/composer-schema.json')); + foreach ($schema['properties']['config']['properties'] as $prop => $conf) { + $type = $this->parseType($conf, $prop); + + $this->properties[$prop] = $type; + } + } public function getClass(): string { @@ -38,13 +57,115 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method $keyType = $scope->getType($args[0]->value); if ($keyType instanceof ConstantStringType) { - if ($keyType->getValue() == 'allow-plugins') { - return TypeCombinator::addNull( - new ArrayType(new StringType(), new BooleanType()) - ); + if (isset($this->properties[$keyType->getValue()])) { + return $this->properties[$keyType->getValue()]; } } return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); } + + /** + * @param array $types + */ + private function parseType(array $def, string $path): Type + { + if (isset($def['type'])) { + $types = []; + foreach ((array) $def['type'] as $type) { + switch ($type) { + case 'integer': + if (in_array($path, ['process-timeout', 'cache-ttl', 'cache-files-ttl'], true)) { + $types[] = IntegerRangeType::createAllGreaterThan(0); + } else { + $types[] = new IntegerType(); + } + break; + + case 'string': + if ($path === 'discard-changes') { + $types[] = new ConstantStringType('stash'); + } elseif ($path === 'use-parent-dir') { + $types[] = new ConstantStringType('prompt'); + } elseif ($path === 'store-auths') { + $types[] = new ConstantStringType('prompt'); + } elseif ($path === 'platform-check') { + $types[] = new ConstantStringType('php-only'); + } elseif ($path === 'github-protocols') { + $types[] = new UnionType([new ConstantStringType('git'), new ConstantStringType('https'), new ConstantStringType('ssh'), new ConstantStringType('http')]); + } elseif (str_starts_with($path, 'preferred-install')) { + $types[] = new UnionType([new ConstantStringType('source'), new ConstantStringType('dist'), new ConstantStringType('auto')]); + } else { + $types[] = new StringType(); + } + break; + + case 'boolean': + $types[] = new BooleanType(); + break; + + case 'object': + $addlPropType = null; + if (isset($def['additionalProperties'])) { + $addlPropType = $this->parseType($def['additionalProperties'], $path.'.additionalProperties'); + } + + if (isset($def['properties'])) { + $keyNames = []; + $valTypes = []; + foreach ($def['properties'] as $propName => $propdef) { + $keyNames[] = new ConstantStringType($propName); + $valType = $this->parseType($propdef, $path.'.'.$propName); + if (!isset($def['required']) || !in_array($propName, $def['required'])) { + $valType = TypeCombinator::addNull($valType); + } + $valTypes[] = $valType; + } + + if ($addlPropType !== null) { + $types[] = new ArrayType(TypeCombinator::union(new StringType(), ...$keyNames), TypeCombinator::union($addlPropType, ...$valTypes)); + } else { + $types[] = new ConstantArrayType($keyNames, $valTypes); + } + } else { + $types[] = new ArrayType(new StringType(), $addlPropType ?? new MixedType()); + } + break; + + case 'array': + if (isset($def['items'])) { + $valType = $this->parseType($def['items'], $path.'.items'); + } else { + $valType = new MixedType(); + } + + $types[] = new ArrayType(new IntegerType(), $valType); + break; + + default: + $types[] = new MixedType(); + } + } + } elseif (isset($def['enum'])) { + $types[] = TypeCombinator::union(...array_map(function (string $value): ConstantStringType { + return new ConstantStringType($value); + }, $def['enum'])); + } else { + $types = [new MixedType()]; + } + + $type = \count($types) === 1 ? $types[0] : TypeCombinator::union(...$types); + + // allow-plugins defaults to null until July 1st 2022 for some BC hackery, but after that it is not nullable anymore + if ($path === 'allow-plugins' && time() < strtotime('2022-07-01')) { + $type = TypeCombinator::addNull($type); + } + + // default null props + if (in_array($path, ['autoloader-suffix', 'gitlab-protocol'], true)) { + $type = TypeCombinator::addNull($type); + } + + return $type; + } } From bd6403a6bef36fdbefdb287dc7e26286d5e06e5e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 28 Apr 2022 21:20:40 +0200 Subject: [PATCH 022/618] Fix newly surfaced errors --- res/composer-schema.json | 25 +++++- src/Composer/Autoload/AutoloadGenerator.php | 6 +- src/Composer/Command/DiagnoseCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Config.php | 14 ++-- src/Composer/Downloader/FileDownloader.php | 2 +- src/Composer/Factory.php | 6 +- src/Composer/IO/BaseIO.php | 6 +- .../PHPStan/ConfigReturnTypeExtension.php | 32 +++++--- src/Composer/Package/Locker.php | 24 +++--- src/Composer/Repository/Vcs/FossilDriver.php | 2 +- src/Composer/Repository/Vcs/GitDriver.php | 2 +- src/Composer/Repository/Vcs/GitLabDriver.php | 4 +- src/Composer/Repository/Vcs/HgDriver.php | 2 +- .../Repository/Vcs/PerforceDriver.php | 2 +- src/Composer/Util/Git.php | 3 - src/Composer/Util/GitLab.php | 4 +- src/Composer/Util/Url.php | 5 +- .../Test/Autoload/AutoloadGeneratorTest.php | 3 + .../Test/Repository/PathRepositoryTest.php | 78 +++++++------------ 20 files changed, 115 insertions(+), 109 deletions(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index 3276cc025318..2c410b26243f 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -289,7 +289,7 @@ "properties": { "platform": { "type": "object", - "description": "This is an object of package name (keys) and version (values) that will be used to mock the platform packages on this machine.", + "description": "This is an object of package name (keys) and version (values) that will be used to mock the platform packages on this machine, the version can be set to false to make it appear like the package is not present.", "additionalProperties": { "type": ["string", "boolean"] } @@ -347,9 +347,20 @@ }, "gitlab-token": { "type": "object", - "description": "An object of domain name => gitlab private tokens, typically {\"gitlab.com\":\"\"}.", + "description": "An object of domain name => gitlab private tokens, typically {\"gitlab.com\":\"\"}, or an object with username and token keys.", "additionalProperties": { - "type": "string" + "type": ["string", "object"], + "required": ["username", "token"], + "properties": { + "username": { + "type": "string", + "description": "The username used for GitLab authentication" + }, + "token": { + "type": "string", + "description": "The token used for GitLab authentication" + } + } } }, "gitlab-protocol": { @@ -512,6 +523,14 @@ "consumer-secret": { "type": "string", "description": "The consumer-secret used for OAuth authentication" + }, + "access-token": { + "type": "string", + "description": "The OAuth token retrieved from Bitbucket's API, this is written by Composer and you should not set it nor modify it." + }, + "access-token-expiration": { + "type": "integer", + "description": "The generated token's expiration timestamp, this is written by Composer and you should not set it nor modify it." } } } diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 3496e1dc4024..554b1cdcd7ba 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -202,7 +202,7 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro // See https://bugs.php.net/bug.php?id=72738 $basePath = $filesystem->normalizePath(realpath(realpath(Platform::getCwd()))); $vendorPath = $filesystem->normalizePath(realpath(realpath($config->get('vendor-dir')))); - $useGlobalIncludePath = (bool) $config->get('use-include-path'); + $useGlobalIncludePath = $config->get('use-include-path'); $prependAutoloader = $config->get('prepend-autoloader') === false ? 'false' : 'true'; $targetDir = $vendorPath.'/'.$targetDir; $filesystem->ensureDirectoryExists($targetDir); @@ -408,7 +408,7 @@ public static function autoload(\$class) unlink($includeFilesFilePath); } $filesystem->filePutContentsIfModified($targetDir.'/autoload_static.php', $this->getStaticFile($suffix, $targetDir, $vendorPath, $basePath)); - $checkPlatform = $config->get('platform-check') && !($this->platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter); + $checkPlatform = $config->get('platform-check') !== false && !($this->platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter); $platformCheckContent = null; if ($checkPlatform) { $platformCheckContent = $this->getPlatformCheck($packageMap, $config->get('platform-check'), $devPackageNames); @@ -429,7 +429,7 @@ public static function autoload(\$class) if ($this->runScripts) { $this->eventDispatcher->dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP, $this->devMode, array(), array( - 'optimize' => (bool) $scanPsrPackages, + 'optimize' => $scanPsrPackages, )); } diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index cb49c2d24201..ce548829182f 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -114,7 +114,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->outputResult($this->checkHttpProxy()); } - if ($oauth = $config->get('github-oauth')) { + if (count($oauth = $config->get('github-oauth')) > 0) { foreach ($oauth as $domain => $token) { $io->write('Checking '.$domain.' oauth access: ', false); $this->outputResult($this->checkGithubOauth($domain, $token)); diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 89e7bc6fcbdd..9d1fa4965027 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -237,7 +237,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $allowPlugins = $composer->getConfig()->get('allow-plugins'); $removedPlugins = is_array($allowPlugins) ? array_intersect(array_keys($allowPlugins), $packages) : []; - if (!$dryRun && count($removedPlugins) > 0) { + if (!$dryRun && is_array($allowPlugins) && count($removedPlugins) > 0) { if (count($allowPlugins) === count($removedPlugins)) { $json->removeConfigSetting('allow-plugins'); } else { diff --git a/src/Composer/Config.php b/src/Composer/Config.php index 18279743130b..166d9cbf6caf 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -301,6 +301,10 @@ public function get(string $key, int $flags = 0) $this->setSourceOfConfigValue($val, $key, $env); } + if ($key === 'process-timeout') { + return max(0, false !== $val ? (int) $val : $this->config[$key]); + } + $val = rtrim((string) $this->process(false !== $val ? $val : $this->config[$key], $flags), '/\\'); $val = Platform::expandPath($val); @@ -339,7 +343,7 @@ public function get(string $key, int $flags = 0) // ints without env var support case 'cache-ttl': - return (int) $this->config[$key]; + return max(0, (int) $this->config[$key]); // numbers with kb/mb/gb support, without env var support case 'cache-files-maxsize': @@ -348,7 +352,7 @@ public function get(string $key, int $flags = 0) "Could not parse the value of '$key': {$this->config[$key]}" ); } - $size = $matches[1]; + $size = (float) $matches[1]; if (isset($matches[2])) { switch (strtolower($matches[2])) { case 'g': @@ -365,15 +369,15 @@ public function get(string $key, int $flags = 0) } } - return $size; + return max(0, (int) $size); // special cases below case 'cache-files-ttl': if (isset($this->config[$key])) { - return (int) $this->config[$key]; + return max(0, (int) $this->config[$key]); } - return (int) $this->config['cache-ttl']; + return $this->get('cache-ttl'); case 'home': return rtrim($this->process(Platform::expandPath($this->config[$key]), $flags), '/\\'); diff --git a/src/Composer/Downloader/FileDownloader.php b/src/Composer/Downloader/FileDownloader.php index 38aff1a4dda3..960fcbf5864c 100644 --- a/src/Composer/Downloader/FileDownloader.php +++ b/src/Composer/Downloader/FileDownloader.php @@ -94,7 +94,7 @@ public function __construct(IOInterface $io, Config $config, HttpDownloader $htt if ($this->cache && $this->cache->gcIsNecessary()) { $this->io->writeError('Running cache garbage collection', true, IOInterface::VERY_VERBOSE); - $this->cache->gc((int) $config->get('cache-files-ttl'), (int) $config->get('cache-files-maxsize')); + $this->cache->gc($config->get('cache-files-ttl'), $config->get('cache-files-maxsize')); } } diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index d84d9ee880bd..a63dd0ab36b9 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -190,7 +190,7 @@ public static function createConfig(IOInterface $io = null, ?string $cwd = null) } $config->setConfigSource(new JsonConfigSource($file)); - $htaccessProtect = (bool) $config->get('htaccess-protect'); + $htaccessProtect = $config->get('htaccess-protect'); if ($htaccessProtect) { // Protect directory against web access. Since HOME could be // the www-data's user home and be web-accessible it is a @@ -645,10 +645,10 @@ public static function createHttpDownloader(IOInterface $io, Config $config, arr } $httpDownloaderOptions = array(); if ($disableTls === false) { - if ($config->get('cafile')) { + if ('' !== $config->get('cafile')) { $httpDownloaderOptions['ssl']['cafile'] = $config->get('cafile'); } - if ($config->get('capath')) { + if ('' !== $config->get('capath')) { $httpDownloaderOptions['ssl']['capath'] = $config->get('capath'); } $httpDownloaderOptions = array_replace_recursive($httpDownloaderOptions, $options); diff --git a/src/Composer/IO/BaseIO.php b/src/Composer/IO/BaseIO.php index 4f9bc1da926a..56715b709474 100644 --- a/src/Composer/IO/BaseIO.php +++ b/src/Composer/IO/BaseIO.php @@ -141,8 +141,8 @@ public function loadConfiguration(Config $config) } foreach ($gitlabToken as $domain => $token) { - $username = is_array($token) && array_key_exists("username", $token) ? $token["username"] : $token; - $password = is_array($token) && array_key_exists("token", $token) ? $token["token"] : 'private-token'; + $username = is_array($token) ? $token["username"] : $token; + $password = is_array($token) ? $token["token"] : 'private-token'; $this->checkAndSetAuthentication($domain, $username, $password); } @@ -156,7 +156,7 @@ public function loadConfiguration(Config $config) } // setup process timeout - ProcessExecutor::setTimeout((int) $config->get('process-timeout')); + ProcessExecutor::setTimeout($config->get('process-timeout')); } public function emergency($message, array $context = array()): void diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index 1b99218aca6c..fc1de219ea7e 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -11,6 +11,7 @@ use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; use PHPStan\Type\Constant\ConstantArrayType; +use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\DynamicMethodReturnTypeExtension; use PHPStan\Type\IntegerRangeType; @@ -29,7 +30,10 @@ final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtensio public function __construct() { - $schema = JsonFile::parseJson(file_get_contents(__DIR__.'/../../../res/composer-schema.json')); + $schema = JsonFile::parseJson((string) file_get_contents(__DIR__.'/../../../res/composer-schema.json')); + /** + * @var string $prop + */ foreach ($schema['properties']['config']['properties'] as $prop => $conf) { $type = $this->parseType($conf, $prop); @@ -66,7 +70,7 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method } /** - * @param array $types + * @param array $def */ private function parseType(array $def, string $path): Type { @@ -75,15 +79,17 @@ private function parseType(array $def, string $path): Type foreach ((array) $def['type'] as $type) { switch ($type) { case 'integer': - if (in_array($path, ['process-timeout', 'cache-ttl', 'cache-files-ttl'], true)) { - $types[] = IntegerRangeType::createAllGreaterThan(0); + if (in_array($path, ['process-timeout', 'cache-ttl', 'cache-files-ttl', 'cache-files-maxsize'], true)) { + $types[] = IntegerRangeType::createAllGreaterThanOrEqualTo(0); } else { $types[] = new IntegerType(); } break; case 'string': - if ($path === 'discard-changes') { + if ($path === 'cache-files-maxsize') { + // passthru, skip as it is always converted to int + } elseif ($path === 'discard-changes') { $types[] = new ConstantStringType('stash'); } elseif ($path === 'use-parent-dir') { $types[] = new ConstantStringType('prompt'); @@ -101,7 +107,11 @@ private function parseType(array $def, string $path): Type break; case 'boolean': - $types[] = new BooleanType(); + if ($path === 'platform.additionalProperties') { + $types[] = new ConstantBooleanType(false); + } else { + $types[] = new BooleanType(); + } break; case 'object': @@ -116,7 +126,7 @@ private function parseType(array $def, string $path): Type foreach ($def['properties'] as $propName => $propdef) { $keyNames[] = new ConstantStringType($propName); $valType = $this->parseType($propdef, $path.'.'.$propName); - if (!isset($def['required']) || !in_array($propName, $def['required'])) { + if (!isset($def['required']) || !in_array($propName, $def['required'], true)) { $valType = TypeCombinator::addNull($valType); } $valTypes[] = $valType; @@ -146,16 +156,16 @@ private function parseType(array $def, string $path): Type $types[] = new MixedType(); } } + + $type = TypeCombinator::union(...$types); } elseif (isset($def['enum'])) { - $types[] = TypeCombinator::union(...array_map(function (string $value): ConstantStringType { + $type = TypeCombinator::union(...array_map(function (string $value): ConstantStringType { return new ConstantStringType($value); }, $def['enum'])); } else { - $types = [new MixedType()]; + $type = new MixedType(); } - $type = \count($types) === 1 ? $types[0] : TypeCombinator::union(...$types); - // allow-plugins defaults to null until July 1st 2022 for some BC hackery, but after that it is not nullable anymore if ($path === 'allow-plugins' && time() < strtotime('2022-07-01')) { $type = TypeCombinator::addNull($type); diff --git a/src/Composer/Package/Locker.php b/src/Composer/Package/Locker.php index b9fd396df050..1763f42b4b41 100644 --- a/src/Composer/Package/Locker.php +++ b/src/Composer/Package/Locker.php @@ -337,17 +337,17 @@ public function getLockData(): array /** * Locks provided data into lockfile. * - * @param PackageInterface[] $packages array of packages - * @param PackageInterface[]|null $devPackages array of dev packages or null if installed without --dev - * @param array $platformReqs array of package name => constraint for required platform packages - * @param array $platformDevReqs array of package name => constraint for dev-required platform packages - * @param string[][] $aliases array of aliases - * @param string $minimumStability - * @param array $stabilityFlags - * @param bool $preferStable - * @param bool $preferLowest - * @param array $platformOverrides - * @param bool $write Whether to actually write data to disk, useful in tests and for --dry-run + * @param PackageInterface[] $packages array of packages + * @param PackageInterface[]|null $devPackages array of dev packages or null if installed without --dev + * @param array $platformReqs array of package name => constraint for required platform packages + * @param array $platformDevReqs array of package name => constraint for dev-required platform packages + * @param string[][] $aliases array of aliases + * @param string $minimumStability + * @param array $stabilityFlags + * @param bool $preferStable + * @param bool $preferLowest + * @param array $platformOverrides + * @param bool $write Whether to actually write data to disk, useful in tests and for --dry-run * * @return bool * @@ -386,7 +386,7 @@ public function setLockData(array $packages, ?array $devPackages, array $platfor $lock['platform'] = $platformReqs; $lock['platform-dev'] = $platformDevReqs; - if ($platformOverrides) { + if (\count($platformOverrides) > 0) { $lock['platform-overrides'] = $platformOverrides; } $lock['plugin-api-version'] = PluginInterface::PLUGIN_API_VERSION; diff --git a/src/Composer/Repository/Vcs/FossilDriver.php b/src/Composer/Repository/Vcs/FossilDriver.php index 86ee0307b2e5..32d54bf673db 100644 --- a/src/Composer/Repository/Vcs/FossilDriver.php +++ b/src/Composer/Repository/Vcs/FossilDriver.php @@ -51,7 +51,7 @@ public function initialize(): void if (Filesystem::isLocalPath($this->url) && is_dir($this->url)) { $this->checkoutDir = $this->url; } else { - if (!Cache::isUsable((string) $this->config->get('cache-repo-dir')) || !Cache::isUsable((string) $this->config->get('cache-vcs-dir'))) { + if (!Cache::isUsable($this->config->get('cache-repo-dir')) || !Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('FossilDriver requires a usable cache directory, and it looks like you set it to be disabled'); } diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php index 6b4635c3a886..71fc6b24175f 100644 --- a/src/Composer/Repository/Vcs/GitDriver.php +++ b/src/Composer/Repository/Vcs/GitDriver.php @@ -49,7 +49,7 @@ public function initialize(): void $this->repoDir = $this->url; $cacheUrl = realpath($this->url); } else { - if (!Cache::isUsable((string) $this->config->get('cache-vcs-dir'))) { + if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('GitDriver requires a usable cache directory, and it looks like you set it to be disabled'); } diff --git a/src/Composer/Repository/Vcs/GitLabDriver.php b/src/Composer/Repository/Vcs/GitLabDriver.php index 47dee5e4abf9..7f2db1f55899 100644 --- a/src/Composer/Repository/Vcs/GitLabDriver.php +++ b/src/Composer/Repository/Vcs/GitLabDriver.php @@ -111,7 +111,7 @@ public function initialize(): void } $this->originUrl = $origin; - if ($protocol = $this->config->get('gitlab-protocol')) { + if (is_string($protocol = $this->config->get('gitlab-protocol'))) { // https treated as a synonym for http. if (!in_array($protocol, array('git', 'http', 'https'))) { throw new \RuntimeException('gitlab-protocol must be one of git, http.'); @@ -582,7 +582,7 @@ public static function supports(IOInterface $io, Config $config, string $url, bo $guessedDomain = !empty($match['domain']) ? $match['domain'] : $match['domain2']; $urlParts = explode('/', $match['parts']); - if (false === self::determineOrigin((array) $config->get('gitlab-domains'), $guessedDomain, $urlParts, $match['port'])) { + if (false === self::determineOrigin($config->get('gitlab-domains'), $guessedDomain, $urlParts, $match['port'])) { return false; } diff --git a/src/Composer/Repository/Vcs/HgDriver.php b/src/Composer/Repository/Vcs/HgDriver.php index 33515f00e67f..f99790223e5c 100644 --- a/src/Composer/Repository/Vcs/HgDriver.php +++ b/src/Composer/Repository/Vcs/HgDriver.php @@ -42,7 +42,7 @@ public function initialize(): void if (Filesystem::isLocalPath($this->url)) { $this->repoDir = $this->url; } else { - if (!Cache::isUsable((string) $this->config->get('cache-vcs-dir'))) { + if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('HgDriver requires a usable cache directory, and it looks like you set it to be disabled'); } diff --git a/src/Composer/Repository/Vcs/PerforceDriver.php b/src/Composer/Repository/Vcs/PerforceDriver.php index 92459fdab32f..396c9489447e 100644 --- a/src/Composer/Repository/Vcs/PerforceDriver.php +++ b/src/Composer/Repository/Vcs/PerforceDriver.php @@ -62,7 +62,7 @@ private function initPerforce(array $repoConfig): void return; } - if (!Cache::isUsable((string) $this->config->get('cache-vcs-dir'))) { + if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('PerforceDriver requires a usable cache directory, and it looks like you set it to be disabled'); } diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php index 7bf62fcff477..9348b109ee59 100644 --- a/src/Composer/Util/Git.php +++ b/src/Composer/Util/Git.php @@ -74,9 +74,6 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, } $protocols = $this->config->get('github-protocols'); - if (!is_array($protocols)) { - throw new \RuntimeException('Config value "github-protocols" must be an array, got ' . gettype($protocols)); - } // public github, autoswitch protocols if (Preg::isMatch('{^(?:https?|git)://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)) { $messages = array(); diff --git a/src/Composer/Util/GitLab.php b/src/Composer/Util/GitLab.php index 8f453efaa340..267c2b526e38 100644 --- a/src/Composer/Util/GitLab.php +++ b/src/Composer/Util/GitLab.php @@ -90,8 +90,8 @@ public function authorizeOAuth(string $originUrl): bool } if (isset($token)) { - $username = is_array($token) && array_key_exists("username", $token) ? $token["username"] : $token; - $password = is_array($token) && array_key_exists("token", $token) ? $token["token"] : 'private-token'; + $username = is_array($token) ? $token["username"] : $token; + $password = is_array($token) ? $token["token"] : 'private-token'; $this->io->setAuthentication($originUrl, $username, $password); return true; diff --git a/src/Composer/Util/Url.php b/src/Composer/Util/Url.php index c30e4199dd2f..04c006560f9d 100644 --- a/src/Composer/Util/Url.php +++ b/src/Composer/Util/Url.php @@ -90,9 +90,8 @@ public static function getOrigin(Config $config, string $url): string // Gitlab can be installed in a non-root context (i.e. gitlab.com/foo). When downloading archives the originUrl // is the host without the path, so we look for the registered gitlab-domains matching the host here if ( - is_array($config->get('gitlab-domains')) - && false === strpos($origin, '/') - && !in_array($origin, $config->get('gitlab-domains')) + false === strpos($origin, '/') + && !in_array($origin, $config->get('gitlab-domains'), true) ) { foreach ($config->get('gitlab-domains') as $gitlabDomain) { if (0 === strpos($gitlabDomain, $origin)) { diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index 5eaa8ee8005c..73e46ed07636 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -104,6 +104,9 @@ protected function setUp(): void 'platform-check' => function (): bool { return true; }, + 'use-include-path' => function (): bool { + return false; + }, ); $this->config->expects($this->atLeastOnce()) diff --git a/tests/Composer/Test/Repository/PathRepositoryTest.php b/tests/Composer/Test/Repository/PathRepositoryTest.php index b82837d93207..5c30aa3393c7 100644 --- a/tests/Composer/Test/Repository/PathRepositoryTest.php +++ b/tests/Composer/Test/Repository/PathRepositoryTest.php @@ -14,33 +14,26 @@ use Composer\Repository\PathRepository; use Composer\Test\TestCase; +use Composer\Util\HttpDownloader; +use Composer\Util\Loop; use Composer\Util\Platform; +use Composer\Util\ProcessExecutor; class PathRepositoryTest extends TestCase { public function testLoadPackageFromFileSystemWithIncorrectPath(): void { self::expectException('RuntimeException'); - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'missing')); - $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl)); $repository->getPackages(); } public function testLoadPackageFromFileSystemWithVersion(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $versionGuesser = null; - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'with-version')); - $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl)); $repository->getPackages(); $this->assertSame(1, $repository->count()); @@ -49,14 +42,8 @@ public function testLoadPackageFromFileSystemWithVersion(): void public function testLoadPackageFromFileSystemWithoutVersion(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $versionGuesser = null; - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'without-version')); - $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl)); $packages = $repository->getPackages(); $this->assertGreaterThanOrEqual(1, $repository->count()); @@ -70,14 +57,8 @@ public function testLoadPackageFromFileSystemWithoutVersion(): void public function testLoadPackageFromFileSystemWithWildcard(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $versionGuesser = null; - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl)); $packages = $repository->getPackages(); $names = array(); @@ -95,12 +76,6 @@ public function testLoadPackageFromFileSystemWithWildcard(): void public function testLoadPackageWithExplicitVersions(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $versionGuesser = null; - $options = array( 'versions' => array( 'test/path-unversioned' => '4.3.2.1', @@ -108,7 +83,7 @@ public function testLoadPackageWithExplicitVersions(): void ), ); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = new PathRepository(array('url' => $repositoryUrl, 'options' => $options), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl, 'options' => $options)); $packages = $repository->getPackages(); $versions = array(); @@ -130,12 +105,6 @@ public function testLoadPackageWithExplicitVersions(): void */ public function testUrlRemainsRelative(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $versionGuesser = null; - // realpath() does not fully expand the paths // PHP Bug https://bugs.php.net/bug.php?id=72642 $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(realpath(realpath(__DIR__)), 'Fixtures', 'path', 'with-version')); @@ -143,7 +112,7 @@ public function testUrlRemainsRelative(): void // PHP Bug https://bugs.php.net/bug.php?id=73797 $relativeUrl = ltrim(substr($repositoryUrl, strlen(realpath(realpath(Platform::getCwd())))), DIRECTORY_SEPARATOR); - $repository = new PathRepository(array('url' => $relativeUrl), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $relativeUrl)); $packages = $repository->getPackages(); $this->assertSame(1, $repository->count()); @@ -158,16 +127,11 @@ public function testUrlRemainsRelative(): void public function testReferenceNone(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $options = array( 'reference' => 'none', ); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = new PathRepository(array('url' => $repositoryUrl, 'options' => $options), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl, 'options' => $options)); $packages = $repository->getPackages(); $this->assertGreaterThanOrEqual(2, $repository->count()); @@ -179,17 +143,12 @@ public function testReferenceNone(): void public function testReferenceConfig(): void { - $ioInterface = $this->getMockBuilder('Composer\IO\IOInterface') - ->getMock(); - - $config = new \Composer\Config(); - $options = array( 'reference' => 'config', 'relative' => true, ); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = new PathRepository(array('url' => $repositoryUrl, 'options' => $options), $ioInterface, $config); + $repository = $this->createPathRepo(array('url' => $repositoryUrl, 'options' => $options)); $packages = $repository->getPackages(); $this->assertGreaterThanOrEqual(2, $repository->count()); @@ -201,4 +160,19 @@ public function testReferenceConfig(): void ); } } + + /** + * @param array $options + */ + private function createPathRepo(array $options): PathRepository + { + $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); + + $config = new \Composer\Config(); + $proc = new ProcessExecutor(); + $loop = new Loop(new HttpDownloader($io, $config), $proc); + + + return new PathRepository($options, $io, $config, null, null, $proc); + } } From 732bdbde4bbedbeca3f26306251576d99632479f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 28 Apr 2022 21:21:20 +0200 Subject: [PATCH 023/618] Fix missing validation of local auth file before loading it --- src/Composer/Factory.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index d84d9ee880bd..7b575f76ce71 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -331,6 +331,7 @@ public function createComposer(IOInterface $io, $localConfig = null, bool $disab $localAuthFile = new JsonFile(dirname(realpath($composerFile)) . '/auth.json', null, $io); if ($localAuthFile->exists()) { $io->writeError('Loading config file ' . $localAuthFile->getPath(), true, IOInterface::DEBUG); + self::validateJsonSchema($io, $localAuthFile, JsonFile::AUTH_SCHEMA); $config->merge(array('config' => $localAuthFile->read()), $localAuthFile->getPath()); $config->setAuthConfigSource(new JsonConfigSource($localAuthFile, true)); } From 3b4a3d63bf7ccc2189d6a81228c453fcc358c732 Mon Sep 17 00:00:00 2001 From: Stephan Vock Date: Thu, 21 Apr 2022 09:37:55 +0100 Subject: [PATCH 024/618] GitLab: prevent invalid loop during composer install with invalid credentials --- src/Composer/Util/AuthHelper.php | 7 ++++ tests/Composer/Test/Util/AuthHelperTest.php | 36 +++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index 28c4aba68163..c208a1018fb1 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -137,6 +137,7 @@ public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $ $message = "\n".'Could not fetch '.$url.', enter your ' . $origin . ' credentials ' .($statusCode === 401 ? 'to access private repos' : 'to go over the API rate limit'); $gitLabUtil = new GitLab($this->io, $this->config, null); + $auth = null; if ($this->io->hasAuthentication($origin)) { $auth = $this->io->getAuthentication($origin); if (in_array($auth['password'], array('gitlab-ci-token', 'private-token', 'oauth2'), true)) { @@ -149,6 +150,12 @@ public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $ ) { throw new TransportException('Could not authenticate against '.$origin, 401); } + + if ($auth !== null && $this->io->hasAuthentication($origin)) { + if ($auth === $this->io->getAuthentication($origin)) { + throw new TransportException("Invalid credentials for '" . $url . "', aborting.", $statusCode); + } + } } elseif ($origin === 'bitbucket.org' || $origin === 'api.bitbucket.org') { $askForOAuthToken = true; $origin = 'bitbucket.org'; diff --git a/tests/Composer/Test/Util/AuthHelperTest.php b/tests/Composer/Test/Util/AuthHelperTest.php index d7018cd1ca3d..9372e691f88f 100644 --- a/tests/Composer/Test/Util/AuthHelperTest.php +++ b/tests/Composer/Test/Util/AuthHelperTest.php @@ -12,6 +12,7 @@ namespace Composer\Test\Util; +use Composer\Downloader\TransportException; use Composer\IO\IOInterface; use Composer\Test\TestCase; use Composer\Util\AuthHelper; @@ -513,6 +514,41 @@ public function testStoreAuthWithPromptInvalidAnswer() $this->authHelper->storeAuth($origin, $storeAuth); } + public function testPromptAuthIfNeededGitLabNoAuthChange() + { + $this->setExpectedException('Composer\Downloader\TransportException'); + + $origin = 'gitlab.com'; + + $this->io + ->method('hasAuthentication') + ->with($origin) + ->willReturn(true); + + $this->io + ->method('getAuthentication') + ->with($origin) + ->willReturn(array( + 'username' => 'gitlab-user', + 'password' => 'gitlab-password', + )); + + $this->io + ->expects($this->once()) + ->method('setAuthentication') + ->with('gitlab.com', 'gitlab-user', 'gitlab-password'); + + $this->config + ->method('get') + ->willReturnMap(array( + array('github-domains', 0, array()), + array('gitlab-domains', 0, array('gitlab.com')), + array('gitlab-token', 0, array('gitlab.com' => array('username' => 'gitlab-user', 'token' => 'gitlab-password'))), + )); + + $this->authHelper->promptAuthIfNeeded('https://gitlab.com/acme/archive.zip', $origin, 404, 'GitLab requires authentication and it was not provided'); + } + /** * @param string $origin * @param array $auth From 89721ab32203c41a9904e83921e543c550aae89f Mon Sep 17 00:00:00 2001 From: Stephan Vock Date: Thu, 21 Apr 2022 09:47:23 +0100 Subject: [PATCH 025/618] GitLab: detect invalid token setup and attempt to automatically resolve the issue for the user --- src/Composer/Util/GitLab.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Composer/Util/GitLab.php b/src/Composer/Util/GitLab.php index 4c1376ad4b01..57b87c576499 100644 --- a/src/Composer/Util/GitLab.php +++ b/src/Composer/Util/GitLab.php @@ -92,7 +92,14 @@ public function authorizeOAuth($originUrl) if (isset($token)) { $username = is_array($token) && array_key_exists("username", $token) ? $token["username"] : $token; $password = is_array($token) && array_key_exists("token", $token) ? $token["token"] : 'private-token'; - $this->io->setAuthentication($originUrl, $username, $password); + + // Composer expects the GitLab token to be stored as username and 'private-token' or 'gitlab-ci-token' to be stored as password + // Detect cases where this is reversed and resolve automatically resolve it + if (in_array($username, array('private-token', 'gitlab-ci-token', 'oauth2'), true)) { + $this->io->setAuthentication($originUrl, $password, $username); + } else { + $this->io->setAuthentication($originUrl, $username, $password); + } return true; } From d40c3a89c010b7ed1123de6a6e6b25f98138ea82 Mon Sep 17 00:00:00 2001 From: Stephan Vock Date: Thu, 28 Apr 2022 21:27:16 +0100 Subject: [PATCH 026/618] GitLab: add warning in case GitLab authentication is misconfigured --- tests/Composer/Test/Util/AuthHelperTest.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/Composer/Test/Util/AuthHelperTest.php b/tests/Composer/Test/Util/AuthHelperTest.php index 9372e691f88f..9dd4bacf49b3 100644 --- a/tests/Composer/Test/Util/AuthHelperTest.php +++ b/tests/Composer/Test/Util/AuthHelperTest.php @@ -474,6 +474,9 @@ public function testStoreAuthWithPromptNoAnswer() $this->authHelper->storeAuth($origin, $storeAuth); } + /** + * @return void + */ public function testStoreAuthWithPromptInvalidAnswer() { $this->setExpectedException('RuntimeException'); @@ -514,6 +517,9 @@ public function testStoreAuthWithPromptInvalidAnswer() $this->authHelper->storeAuth($origin, $storeAuth); } + /** + * @return void + */ public function testPromptAuthIfNeededGitLabNoAuthChange() { $this->setExpectedException('Composer\Downloader\TransportException'); From 474d0dc82dfeaa8ac09a87224e5aa037ab964493 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 09:04:02 +0200 Subject: [PATCH 027/618] Extract phpstan extension config into its own file --- phpstan/config.neon | 7 +------ phpstan/rules.neon | 10 ++++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 phpstan/rules.neon diff --git a/phpstan/config.neon b/phpstan/config.neon index 500e97ed41be..a074715755f6 100644 --- a/phpstan/config.neon +++ b/phpstan/config.neon @@ -4,6 +4,7 @@ includes: - ../vendor/phpstan/phpstan-strict-rules/rules.neon - ../vendor/phpstan/phpstan-symfony/extension.neon - ../vendor/phpstan/phpstan-symfony/rules.neon + - ./rules.neon # Composer-specific PHPStan extensions, can be reused by third party packages by including 'vendor/composer/composer/phpstan/rules.neon' in your phpstan config - ./baseline.neon - ./ignore-by-php-version.neon.php @@ -58,9 +59,3 @@ parameters: - Composer\Composer::VERSION - Composer\Composer::RELEASE_DATE - Composer\Composer::SOURCE_VERSION - -services: - - - class: Composer\PHPStan\ConfigReturnTypeExtension - tags: - - phpstan.broker.dynamicMethodReturnTypeExtension diff --git a/phpstan/rules.neon b/phpstan/rules.neon new file mode 100644 index 000000000000..8d81b0dd3683 --- /dev/null +++ b/phpstan/rules.neon @@ -0,0 +1,10 @@ +# Composer-specific PHPStan extensions +# +# These can be reused by third party packages by including 'vendor/composer/composer/phpstan/rules.neon' +# in your phpstan config + +services: + - + class: Composer\PHPStan\ConfigReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension From 06ef742a6608d61cb5769d0754c76abac194fc40 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 10:30:00 +0200 Subject: [PATCH 028/618] Update phpstan, fix InstalledVersions key ordering to be more logical/consistent --- composer.lock | 26 ++--- src/Composer/InstalledVersions.php | 14 +-- .../Repository/FilesystemRepository.php | 110 +++++++++++------- ...reNothingPlatformRequirementFilterTest.php | 2 +- tests/Composer/Test/InstalledVersionsTest.php | 4 +- tests/Composer/Test/Json/JsonFileTest.php | 28 +++-- .../Repository/FilesystemRepositoryTest.php | 3 +- .../Test/Repository/Fixtures/installed.php | 16 +-- tests/Composer/Test/TestCase.php | 2 +- 9 files changed, 119 insertions(+), 86 deletions(-) diff --git a/composer.lock b/composer.lock index e7effec9897b..7d19af4f9d4e 100644 --- a/composer.lock +++ b/composer.lock @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.6.2", + "version": "1.6.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "becb9603a31d70f5007d505877a7b812598dfe46" + "reference": "6128620b98292e0b69ea6d799871d77163681c8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/becb9603a31d70f5007d505877a7b812598dfe46", - "reference": "becb9603a31d70f5007d505877a7b812598dfe46", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6128620b98292e0b69ea6d799871d77163681c8e", + "reference": "6128620b98292e0b69ea6d799871d77163681c8e", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.6.2" + "source": "https://github.com/phpstan/phpstan/tree/1.6.3" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-04-27T11:05:24+00:00" + "time": "2022-04-28T11:27:53+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -1986,21 +1986,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "afbe1e3235c51ee3f10ba4c8b32449099016ea02" + "reference": "f3ca6464eae640a556c69a02b3b77a2507475d2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/afbe1e3235c51ee3f10ba4c8b32449099016ea02", - "reference": "afbe1e3235c51ee3f10ba4c8b32449099016ea02", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/f3ca6464eae640a556c69a02b3b77a2507475d2f", + "reference": "f3ca6464eae640a556c69a02b3b77a2507475d2f", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.6.0" + "phpstan/phpstan": "^1.6.3" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -2028,9 +2028,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.0" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.1" }, - "time": "2022-04-21T13:07:43+00:00" + "time": "2022-04-28T07:20:18+00:00" }, { "name": "phpstan/phpstan-symfony", diff --git a/src/Composer/InstalledVersions.php b/src/Composer/InstalledVersions.php index 41bc143c1148..c6b54af7ba2e 100644 --- a/src/Composer/InstalledVersions.php +++ b/src/Composer/InstalledVersions.php @@ -28,7 +28,7 @@ class InstalledVersions { /** * @var mixed[]|null - * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null */ private static $installed; @@ -39,7 +39,7 @@ class InstalledVersions /** * @var array[] - * @psalm-var array}> + * @psalm-var array}> */ private static $installedByVendor = array(); @@ -243,7 +243,7 @@ public static function getInstallPath($packageName) /** * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} */ public static function getRootPackage() { @@ -257,7 +257,7 @@ public static function getRootPackage() * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ public static function getRawData() { @@ -280,7 +280,7 @@ public static function getRawData() * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] - * @psalm-return list}> + * @psalm-return list}> */ public static function getAllRawData() { @@ -303,7 +303,7 @@ public static function getAllRawData() * @param array[] $data A vendor/composer/installed.php data set * @return void * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data */ public static function reload($data) { @@ -313,7 +313,7 @@ public static function reload($data) /** * @return array[] - * @psalm-return list}> + * @psalm-return list}> */ private static function getInstalled() { diff --git a/src/Composer/Repository/FilesystemRepository.php b/src/Composer/Repository/FilesystemRepository.php index cd677c18fc1a..b811dbe79cb6 100644 --- a/src/Composer/Repository/FilesystemRepository.php +++ b/src/Composer/Repository/FilesystemRepository.php @@ -14,6 +14,8 @@ use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; +use Composer\Package\PackageInterface; +use Composer\Package\RootAliasPackage; use Composer\Package\RootPackageInterface; use Composer\Package\AliasPackage; use Composer\Package\Dumper\ArrayDumper; @@ -207,25 +209,26 @@ private function dumpToPhpCode(array $array = array(), int $level = 0): string /** * @param array $installPaths - * @param bool $devMode - * @param string $repoDir * - * @return ?array + * @return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} */ - private function generateInstalledVersions(InstallationManager $installationManager, array $installPaths, bool $devMode, string $repoDir): ?array + private function generateInstalledVersions(InstallationManager $installationManager, array $installPaths, bool $devMode, string $repoDir): array { - if (!$this->dumpVersions) { - return null; - } - $devPackages = array_flip($this->devPackageNames); - $versions = array('versions' => array()); $packages = $this->getPackages(); + if (null === $this->rootPackage) { + throw new \LogicException('It should not be possible to dump packages if no root package is given'); + } $packages[] = $rootPackage = $this->rootPackage; - while ($rootPackage instanceof AliasPackage) { + + while ($rootPackage instanceof RootAliasPackage) { $rootPackage = $rootPackage->getAliasOf(); $packages[] = $rootPackage; } + $versions = [ + 'root' => $this->dumpRootPackage($rootPackage, $installPaths, $devMode, $repoDir, $devPackages), + 'versions' => [], + ]; // add real installed packages foreach ($packages as $package) { @@ -233,36 +236,7 @@ private function generateInstalledVersions(InstallationManager $installationMana continue; } - $reference = null; - if ($package->getInstallationSource()) { - $reference = $package->getInstallationSource() === 'source' ? $package->getSourceReference() : $package->getDistReference(); - } - if (null === $reference) { - $reference = ($package->getSourceReference() ?: $package->getDistReference()) ?: null; - } - - if ($package instanceof RootPackageInterface) { - $to = $this->filesystem->normalizePath(realpath(Platform::getCwd())); - $installPath = $this->filesystem->findShortestPath($repoDir, $to, true); - } else { - $installPath = $installPaths[$package->getName()]; - } - - $versions['versions'][$package->getName()] = array( - 'pretty_version' => $package->getPrettyVersion(), - 'version' => $package->getVersion(), - 'type' => $package->getType(), - 'install_path' => $installPath, - 'aliases' => array(), - 'reference' => $reference, - 'dev_requirement' => isset($devPackages[$package->getName()]), - ); - if ($package instanceof RootPackageInterface) { - $versions['root'] = $versions['versions'][$package->getName()]; - unset($versions['root']['dev_requirement']); - $versions['root']['name'] = $package->getName(); - $versions['root']['dev'] = $devMode; - } + $versions['versions'][$package->getName()] = $this->dumpInstalledPackage($package, $installPaths, $repoDir, $devPackages); } // add provided/replaced packages @@ -322,4 +296,60 @@ private function generateInstalledVersions(InstallationManager $installationMana return $versions; } + + /** + * @param array $installPaths + * @param array $devPackages + * @return array{pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev_requirement: bool} + */ + private function dumpInstalledPackage(PackageInterface $package, array $installPaths, string $repoDir, array $devPackages): array + { + $reference = null; + if ($package->getInstallationSource()) { + $reference = $package->getInstallationSource() === 'source' ? $package->getSourceReference() : $package->getDistReference(); + } + if (null === $reference) { + $reference = ($package->getSourceReference() ?: $package->getDistReference()) ?: null; + } + + if ($package instanceof RootPackageInterface) { + $to = $this->filesystem->normalizePath(realpath(Platform::getCwd())); + $installPath = $this->filesystem->findShortestPath($repoDir, $to, true); + } else { + $installPath = $installPaths[$package->getName()]; + } + + $data = [ + 'pretty_version' => $package->getPrettyVersion(), + 'version' => $package->getVersion(), + 'reference' => $reference, + 'type' => $package->getType(), + 'install_path' => $installPath, + 'aliases' => array(), + 'dev_requirement' => isset($devPackages[$package->getName()]), + ]; + + return $data; + } + + /** + * @param array $installPaths + * @param array $devPackages + * @return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + private function dumpRootPackage(RootPackageInterface $package, array $installPaths, bool $devMode, string $repoDir, array $devPackages) + { + $data = $this->dumpInstalledPackage($package, $installPaths, $repoDir, $devPackages); + + return [ + 'name' => $package->getName(), + 'pretty_version' => $data['pretty_version'], + 'version' => $data['version'], + 'reference' => $data['reference'], + 'type' => $data['type'], + 'install_path' => $data['install_path'], + 'aliases' => $data['aliases'], + 'dev' => $devMode, + ]; + } } diff --git a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php index 239c954c1e29..fa4f32fdff89 100644 --- a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php +++ b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php @@ -26,7 +26,7 @@ public function testIsIgnored(string $req): void { $platformRequirementFilter = new IgnoreNothingPlatformRequirementFilter(); - $this->assertFalse($platformRequirementFilter->isIgnored($req)); + $this->assertFalse($platformRequirementFilter->isIgnored($req)); // @phpstan-ignore-line } /** diff --git a/tests/Composer/Test/InstalledVersionsTest.php b/tests/Composer/Test/InstalledVersionsTest.php index 9e06f4c2cb3e..0268d7cc54cc 100644 --- a/tests/Composer/Test/InstalledVersionsTest.php +++ b/tests/Composer/Test/InstalledVersionsTest.php @@ -215,15 +215,15 @@ public function testGetVersionOutOfBounds(): void public function testGetRootPackage(): void { $this->assertSame(array( + 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => 'sourceref-by-default', 'type' => 'library', 'install_path' => $this->root . '/./', 'aliases' => array( '1.10.x-dev', ), - 'reference' => 'sourceref-by-default', - 'name' => '__root__', 'dev' => true, ), InstalledVersions::getRootPackage()); } diff --git a/tests/Composer/Test/Json/JsonFileTest.php b/tests/Composer/Test/Json/JsonFileTest.php index 8e79fad6ba1f..8f07eee57551 100644 --- a/tests/Composer/Test/Json/JsonFileTest.php +++ b/tests/Composer/Test/Json/JsonFileTest.php @@ -92,9 +92,11 @@ public function testParseErrorDetectMissingComma(): void public function testSchemaValidation(): void { + self::expectNotToPerformAssertions(); + $json = new JsonFile(__DIR__.'/Fixtures/composer.json'); - $this->assertTrue($json->validateSchema()); - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(); + $json->validateSchema(JsonFile::LAX_SCHEMA); } public function testSchemaValidationError(): void @@ -133,7 +135,7 @@ public function testSchemaValidationLaxAdditionalProperties(): void $this->assertEquals(sprintf('"%s" does not match the expected JSON schema', $file), $e->getMessage()); $this->assertEquals(array('The property foo is not defined and the definition does not allow additional properties'), $e->getErrors()); } - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(JsonFile::LAX_SCHEMA); unlink($file); } @@ -154,7 +156,7 @@ public function testSchemaValidationLaxRequired(): void $this->assertContains('name : The property name is required', $errors); $this->assertContains('description : The property description is required', $errors); } - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(JsonFile::LAX_SCHEMA); file_put_contents($file, '{ "name": "vendor/package" }'); try { @@ -164,7 +166,7 @@ public function testSchemaValidationLaxRequired(): void $this->assertEquals($expectedMessage, $e->getMessage()); $this->assertEquals(array('description : The property description is required'), $e->getErrors()); } - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(JsonFile::LAX_SCHEMA); file_put_contents($file, '{ "description": "generic description" }'); try { @@ -174,7 +176,7 @@ public function testSchemaValidationLaxRequired(): void $this->assertEquals($expectedMessage, $e->getMessage()); $this->assertEquals(array('name : The property name is required'), $e->getErrors()); } - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(JsonFile::LAX_SCHEMA); file_put_contents($file, '{ "type": "library" }'); try { @@ -186,7 +188,7 @@ public function testSchemaValidationLaxRequired(): void $this->assertContains('name : The property name is required', $errors); $this->assertContains('description : The property description is required', $errors); } - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(JsonFile::LAX_SCHEMA); file_put_contents($file, '{ "type": "project" }'); try { @@ -198,17 +200,18 @@ public function testSchemaValidationLaxRequired(): void $this->assertContains('name : The property name is required', $errors); $this->assertContains('description : The property description is required', $errors); } - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(JsonFile::LAX_SCHEMA); file_put_contents($file, '{ "name": "vendor/package", "description": "generic description" }'); - $this->assertTrue($json->validateSchema()); - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA)); + $json->validateSchema(); + $json->validateSchema(JsonFile::LAX_SCHEMA); unlink($file); } public function testCustomSchemaValidationLax(): void { + self::expectNotToPerformAssertions(); $file = $this->createTempFile(); file_put_contents($file, '{ "custom": "property", "another custom": "property" }'); @@ -217,7 +220,7 @@ public function testCustomSchemaValidationLax(): void $json = new JsonFile($file); - $this->assertTrue($json->validateSchema(JsonFile::LAX_SCHEMA, $schema)); + $json->validateSchema(JsonFile::LAX_SCHEMA, $schema); unlink($file); unlink($schema); @@ -225,6 +228,7 @@ public function testCustomSchemaValidationLax(): void public function testCustomSchemaValidationStrict(): void { + self::expectNotToPerformAssertions(); $file = $this->createTempFile(); file_put_contents($file, '{ "custom": "property" }'); @@ -233,7 +237,7 @@ public function testCustomSchemaValidationStrict(): void $json = new JsonFile($file); - $this->assertTrue($json->validateSchema(JsonFile::STRICT_SCHEMA, $schema)); + $json->validateSchema(JsonFile::STRICT_SCHEMA, $schema); unlink($file); unlink($schema); diff --git a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php index e16938334777..3e54098530cd 100644 --- a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php +++ b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php @@ -132,11 +132,10 @@ public function testRepositoryWritesInstalledPhp(): void $json = new JsonFile($dir.'/installed.json'); - $rootPackage = $this->getPackage('__root__', 'dev-master', 'Composer\Package\RootPackage'); + $rootPackage = $this->getRootPackage('__root__', 'dev-master'); $rootPackage->setSourceReference('sourceref-by-default'); $rootPackage->setDistReference('distref'); $this->configureLinks($rootPackage, array('provide' => array('foo/impl' => '2.0'))); - /** @var RootAliasPackage $rootPackage */ $rootPackage = $this->getAliasPackage($rootPackage, '1.10.x-dev'); $repository = new FilesystemRepository($json, true, $rootPackage); diff --git a/tests/Composer/Test/Repository/Fixtures/installed.php b/tests/Composer/Test/Repository/Fixtures/installed.php index fb9870deff21..cd918997cd53 100644 --- a/tests/Composer/Test/Repository/Fixtures/installed.php +++ b/tests/Composer/Test/Repository/Fixtures/installed.php @@ -12,70 +12,70 @@ return array( 'root' => array( + 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => 'sourceref-by-default', 'type' => 'library', // @phpstan-ignore-next-line 'install_path' => $dir . '/./', 'aliases' => array( '1.10.x-dev', ), - 'reference' => 'sourceref-by-default', - 'name' => '__root__', 'dev' => true, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', + 'reference' => 'sourceref-by-default', 'type' => 'library', // @phpstan-ignore-next-line 'install_path' => $dir . '/./', 'aliases' => array( '1.10.x-dev', ), - 'reference' => 'sourceref-by-default', 'dev_requirement' => false, ), 'a/provider' => array( 'pretty_version' => '1.1', 'version' => '1.1.0.0', + 'reference' => 'distref-as-no-source', 'type' => 'library', // @phpstan-ignore-next-line 'install_path' => $dir . '/vendor/a/provider', 'aliases' => array(), - 'reference' => 'distref-as-no-source', 'dev_requirement' => false, ), 'a/provider2' => array( 'pretty_version' => '1.2', 'version' => '1.2.0.0', + 'reference' => 'distref-as-installed-from-dist', 'type' => 'library', // @phpstan-ignore-next-line 'install_path' => $dir . '/vendor/a/provider2', 'aliases' => array( '1.4', ), - 'reference' => 'distref-as-installed-from-dist', 'dev_requirement' => false, ), 'b/replacer' => array( 'pretty_version' => '2.2', 'version' => '2.2.0.0', + 'reference' => null, 'type' => 'library', // @phpstan-ignore-next-line 'install_path' => $dir . '/vendor/b/replacer', 'aliases' => array(), - 'reference' => null, 'dev_requirement' => false, ), 'c/c' => array( 'pretty_version' => '3.0', 'version' => '3.0.0.0', + 'reference' => null, 'type' => 'library', 'install_path' => '/foo/bar/vendor/c/c', 'aliases' => array(), - 'reference' => null, 'dev_requirement' => true, ), 'foo/impl' => array( @@ -105,10 +105,10 @@ 'meta/package' => array( 'pretty_version' => '3.0', 'version' => '3.0.0.0', + 'reference' => null, 'type' => 'metapackage', 'install_path' => null, 'aliases' => array(), - 'reference' => null, 'dev_requirement' => false, ) ), diff --git a/tests/Composer/Test/TestCase.php b/tests/Composer/Test/TestCase.php index ff04e79d19a1..8b727f4bc82c 100644 --- a/tests/Composer/Test/TestCase.php +++ b/tests/Composer/Test/TestCase.php @@ -141,7 +141,7 @@ protected function getRootPackage(string $name = '__root__', string $version = ' /** * @param string $version - * @return AliasPackage|RootAliasPackage|CompleteAliasPackage + * @return ($package is RootPackage ? RootAliasPackage : ($package is CompletePackage ? CompleteAliasPackage : AliasPackage)) */ protected function getAliasPackage(Package $package, string $version): AliasPackage { From 470735001185af775e32cd63bf3a2a4df635cc53 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 10:53:56 +0200 Subject: [PATCH 029/618] Upgrade phpunit configs --- phpunit.xml.dist | 17 ++++++++--------- tests/complete.phpunit.xml | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c10b2486552b..fe20f2caa614 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,7 +1,6 @@ - - - + + ./src/Composer/ - - ./src/Composer/Autoload/ClassLoader.php - - - + + + ./src/Composer/Autoload/ClassLoader.php + + diff --git a/tests/complete.phpunit.xml b/tests/complete.phpunit.xml index 14b2de0939dc..1b0b12ea36e3 100644 --- a/tests/complete.phpunit.xml +++ b/tests/complete.phpunit.xml @@ -1,7 +1,6 @@ - + @@ -29,12 +29,12 @@ - - - ../src/Composer/ - - ../src/Composer/Autoload/ClassLoader.php - - - + + + ./src/Composer/ + + + ./src/Composer/Autoload/ClassLoader.php + + From 25012170b21e334a1e42a37cb17fd162bb3500db Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 10:57:44 +0200 Subject: [PATCH 030/618] Fix bootstrap path --- tests/complete.phpunit.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/complete.phpunit.xml b/tests/complete.phpunit.xml index 1b0b12ea36e3..125f3fb22a28 100644 --- a/tests/complete.phpunit.xml +++ b/tests/complete.phpunit.xml @@ -11,7 +11,7 @@ failOnRisky="true" processIsolation="false" stopOnFailure="false" - bootstrap="tests/bootstrap.php" + bootstrap="./bootstrap.php" > From d5a8d2be22157b14f1683e3085ffe5ac895ba403 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 11:10:21 +0200 Subject: [PATCH 031/618] Enable phpstan bleedingEdge --- phpstan/config.neon | 1 + src/Composer/DependencyResolver/RuleSet.php | 2 +- src/Composer/Repository/ArrayRepository.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/phpstan/config.neon b/phpstan/config.neon index a074715755f6..2390fa97c439 100644 --- a/phpstan/config.neon +++ b/phpstan/config.neon @@ -1,4 +1,5 @@ includes: + - ../vendor/phpstan/phpstan/conf/bleedingEdge.neon - ../vendor/phpstan/phpstan-phpunit/extension.neon - ../vendor/phpstan/phpstan-deprecation-rules/rules.neon - ../vendor/phpstan/phpstan-strict-rules/rules.neon diff --git a/src/Composer/DependencyResolver/RuleSet.php b/src/Composer/DependencyResolver/RuleSet.php index 69159fd79124..0eb714238aba 100644 --- a/src/Composer/DependencyResolver/RuleSet.php +++ b/src/Composer/DependencyResolver/RuleSet.php @@ -42,7 +42,7 @@ class RuleSet implements \IteratorAggregate, \Countable /** @var array */ protected $rules; - /** @var int */ + /** @var 0|positive-int */ protected $nextRuleId = 0; /** @var array */ diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index 92de7a614df1..b0a0e3b6cd4d 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -321,7 +321,7 @@ public function getPackages() /** * Returns the number of packages in this repository * - * @return int Number of packages + * @return 0|positive-int Number of packages */ public function count(): int { From f8eed283476ade852f743e0e0aea37952d3708c2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 11:25:23 +0200 Subject: [PATCH 032/618] Update baseline (2030, 104) --- phpstan/baseline.neon | 162 +----------------------------------------- 1 file changed, 1 insertion(+), 161 deletions(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 522d6ce3421e..94faaa523c5a 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -10,11 +10,6 @@ parameters: count: 2 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Casting to bool something that's already bool\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 10 @@ -40,11 +35,6 @@ parameters: count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Only booleans are allowed in &&, mixed given on the left side\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#" count: 1 @@ -390,16 +380,6 @@ parameters: count: 3 path: ../src/Composer/Command/ConfigCommand.php - - - message: "#^Only booleans are allowed in &&, mixed given on the right side\\.$#" - count: 2 - path: ../src/Composer/Command/ConfigCommand.php - - - - message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" - count: 1 - path: ../src/Composer/Command/ConfigCommand.php - - message: "#^Only booleans are allowed in an elseif condition, int\\<0, max\\>\\|false given\\.$#" count: 1 @@ -525,11 +505,6 @@ parameters: count: 1 path: ../src/Composer/Command/DiagnoseCommand.php - - - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" - count: 1 - path: ../src/Composer/Command/DiagnoseCommand.php - - message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#" count: 1 @@ -570,11 +545,6 @@ parameters: count: 3 path: ../src/Composer/Command/DiagnoseCommand.php - - - message: "#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#" - count: 3 - path: ../src/Composer/Command/DumpAutoloadCommand.php - - message: "#^Only booleans are allowed in a negated boolean, array\\ given\\.$#" count: 1 @@ -715,11 +685,6 @@ parameters: count: 8 path: ../src/Composer/Command/InitCommand.php - - - message: "#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#" - count: 3 - path: ../src/Composer/Command/InstallCommand.php - - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" count: 2 @@ -740,11 +705,6 @@ parameters: count: 1 path: ../src/Composer/Command/ReinstallCommand.php - - - message: "#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#" - count: 3 - path: ../src/Composer/Command/ReinstallCommand.php - - message: "#^Foreach overwrites \\$type with its key variable\\.$#" count: 1 @@ -765,11 +725,6 @@ parameters: count: 1 path: ../src/Composer/Command/RemoveCommand.php - - - message: "#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#" - count: 3 - path: ../src/Composer/Command/RemoveCommand.php - - message: "#^Cannot call method getRepoName\\(\\) on Composer\\\\Repository\\\\RepositoryInterface\\|null\\.$#" count: 4 @@ -805,11 +760,6 @@ parameters: count: 2 path: ../src/Composer/Command/RequireCommand.php - - - message: "#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#" - count: 4 - path: ../src/Composer/Command/RequireCommand.php - - message: "#^Parameter \\#1 \\$contents of class Composer\\\\Json\\\\JsonManipulator constructor expects string, string\\|false given\\.$#" count: 1 @@ -880,11 +830,6 @@ parameters: count: 1 path: ../src/Composer/Command/SearchCommand.php - - - message: "#^Only booleans are allowed in &&, mixed given on the right side\\.$#" - count: 1 - path: ../src/Composer/Command/SelfUpdateCommand.php - - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" count: 1 @@ -1285,16 +1230,6 @@ parameters: count: 1 path: ../src/Composer/Command/UpdateCommand.php - - - message: "#^Only booleans are allowed in \\|\\|, mixed given on the right side\\.$#" - count: 3 - path: ../src/Composer/Command/UpdateCommand.php - - - - message: "#^Only booleans are allowed in &&, mixed given on the right side\\.$#" - count: 1 - path: ../src/Composer/Command/ValidateCommand.php - - message: "#^Only booleans are allowed in a negated boolean, array\\ given\\.$#" count: 1 @@ -1385,11 +1320,6 @@ parameters: count: 1 path: ../src/Composer/Config.php - - - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" - count: 1 - path: ../src/Composer/Config.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 1 @@ -2555,21 +2485,11 @@ parameters: count: 3 path: ../src/Composer/Factory.php - - - message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" - count: 1 - path: ../src/Composer/Factory.php - - message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#" count: 3 path: ../src/Composer/Factory.php - - - message: "#^Only booleans are allowed in a ternary operator condition, mixed given\\.$#" - count: 1 - path: ../src/Composer/Factory.php - - message: "#^Only booleans are allowed in an if condition, Composer\\\\Util\\\\ProcessExecutor\\|null given\\.$#" count: 1 @@ -2577,7 +2497,7 @@ parameters: - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" - count: 4 + count: 2 path: ../src/Composer/Factory.php - @@ -2710,11 +2630,6 @@ parameters: count: 1 path: ../src/Composer/Installer.php - - - message: "#^Only booleans are allowed in &&, mixed given on the right side\\.$#" - count: 2 - path: ../src/Composer/Installer.php - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Repository\\\\LockArrayRepository\\|null given\\.$#" count: 1 @@ -3470,11 +3385,6 @@ parameters: count: 1 path: ../src/Composer/Package/Locker.php - - - message: "#^Only booleans are allowed in an if condition, array\\ given\\.$#" - count: 1 - path: ../src/Composer/Package/Locker.php - - message: "#^Parameter \\#1 \\$aliasOf of class Composer\\\\Package\\\\CompleteAliasPackage constructor expects Composer\\\\Package\\\\CompletePackage, Composer\\\\Package\\\\CompleteAliasPackage\\|Composer\\\\Package\\\\CompletePackage given\\.$#" count: 1 @@ -3930,56 +3840,6 @@ parameters: count: 1 path: ../src/Composer/Repository/CompositeRepository.php - - - message: "#^Cannot call method getDistReference\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 2 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getInstallationSource\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 2 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getName\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 3 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getName\\(\\) on Composer\\\\Package\\\\BasePackage\\|null\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getPrettyVersion\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 3 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getProvides\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getReplaces\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getSourceReference\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 2 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getType\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Cannot call method getVersion\\(\\) on Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\RootPackageInterface\\|null\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 1 @@ -3995,16 +3855,6 @@ parameters: count: 1 path: ../src/Composer/Repository/FilesystemRepository.php - - - message: "#^Parameter \\#1 \\$array of method Composer\\\\Repository\\\\FilesystemRepository\\:\\:dumpToPhpCode\\(\\) expects array, array\\|null given\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - - - message: "#^Parameter \\#1 \\$data of static method Composer\\\\InstalledVersions\\:\\:reload\\(\\) expects array\\{root\\: array\\{name\\: string, version\\: string, reference\\: string, pretty_version\\: string, aliases\\: array\\, dev\\: bool, install_path\\: string, type\\: string\\}, versions\\: array\\, reference\\?\\: string, replaced\\?\\: array\\, provided\\?\\: array\\, install_path\\?\\: string, \\.\\.\\.\\}\\>\\}, array\\|null given\\.$#" - count: 1 - path: ../src/Composer/Repository/FilesystemRepository.php - - message: "#^Parameter \\#1 \\$path of method Composer\\\\Util\\\\Filesystem\\:\\:normalizePath\\(\\) expects string, string\\|false given\\.$#" count: 2 @@ -4458,11 +4308,6 @@ parameters: count: 8 path: ../src/Composer/Repository/Vcs/GitLabDriver.php - - - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" - count: 1 - path: ../src/Composer/Repository/Vcs/GitLabDriver.php - - message: "#^Only booleans are allowed in an if condition, string given\\.$#" count: 1 @@ -5768,11 +5613,6 @@ parameters: count: 1 path: ../src/Composer/Util/TlsHelper.php - - - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" - count: 1 - path: ../src/Composer/Util/Url.php - - message: "#^Only booleans are allowed in an if condition, int\\|false\\|null given\\.$#" count: 1 From 1f75af6f89fef058bbc373d439144b7c3b43c099 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 13:40:17 +0200 Subject: [PATCH 033/618] Move comment where it belongs --- src/Composer/SelfUpdate/Versions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/SelfUpdate/Versions.php b/src/Composer/SelfUpdate/Versions.php index 22f57af9014a..af5b552def71 100644 --- a/src/Composer/SelfUpdate/Versions.php +++ b/src/Composer/SelfUpdate/Versions.php @@ -79,9 +79,9 @@ public function setChannel(string $channel, IOInterface $io = null): void $channelFile = $this->config->get('home').'/update-channel'; $this->channel = $channel; + // rewrite '2' and '1' channels to stable for future self-updates, but LTS ones like '2.2' remain pinned $storedChannel = Preg::isMatch('{^\d+$}D', $channel) ? 'stable' : $channel; $previouslyStored = file_exists($channelFile) ? trim((string) file_get_contents($channelFile)) : null; - // rewrite '2' and '1' channels to stable for future self-updates, but LTS ones like '2.2' remain pinned file_put_contents($channelFile, $storedChannel.PHP_EOL); if ($io !== null && $previouslyStored !== $storedChannel) { From da322643d6b107157b5cc2faf67c118016814871 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 14:50:58 +0200 Subject: [PATCH 034/618] Fix retry to add a small pause between retries after the second one, refs #10716 --- phpstan/baseline-8.1.neon | 2 +- phpstan/baseline.neon | 27 +---------------- src/Composer/Util/AuthHelper.php | 10 +++---- src/Composer/Util/Http/CurlDownloader.php | 36 ++++++++++++++++++----- 4 files changed, 35 insertions(+), 40 deletions(-) diff --git a/phpstan/baseline-8.1.neon b/phpstan/baseline-8.1.neon index bd3c458f240e..72a234af4733 100644 --- a/phpstan/baseline-8.1.neon +++ b/phpstan/baseline-8.1.neon @@ -256,7 +256,7 @@ parameters: path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$jobs \\(array\\\\) does not accept non\\-empty\\-array\\\\.$#" + message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$jobs \\(array\\, retries\\: int\\<0, max\\>, storeAuth\\: 'prompt'\\|bool\\}, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|null, headerHandle\\: resource, \\.\\.\\.\\}\\>\\) does not accept non\\-empty\\-array\\, retries\\: int\\<0, max\\>, storeAuth\\: 'prompt'\\|bool\\}, options\\: array, progress\\: array, curlHandle\\: CurlHandle\\|resource, filename\\: string\\|null, headerHandle\\: resource, \\.\\.\\.\\}\\>\\.$#" count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 94faaa523c5a..9fd8b8af72fc 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -4813,16 +4813,6 @@ parameters: count: 3 path: ../src/Composer/Util/Http/CurlDownloader.php - - - message: "#^Method Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:isAuthenticatedRetryNeeded\\(\\) should return array\\{retry\\: bool, storeAuth\\: bool\\|string\\} but returns array\\{retry\\: bool, storeAuth\\: bool\\|string\\}\\|null\\.$#" - count: 2 - path: ../src/Composer/Util/Http/CurlDownloader.php - - - - message: "#^Offset 'retry' does not exist on array\\{retry\\: bool, storeAuth\\: bool\\|string\\}\\|null\\.$#" - count: 2 - path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Only booleans are allowed in &&, int given on the right side\\.$#" count: 2 @@ -4938,11 +4928,6 @@ parameters: count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php - - - message: "#^Parameter \\#3 \\$attributes of method Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:restartJob\\(\\) expects array\\{retryAuthFailure\\?\\: bool, redirects\\?\\: int, storeAuth\\?\\: bool\\}, array\\{storeAuth\\: bool\\|string\\} given\\.$#" - count: 1 - path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Parameter \\#3 \\$errorMessage of method Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:failResponse\\(\\) expects string, string\\|null given\\.$#" count: 1 @@ -4954,7 +4939,7 @@ parameters: path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$jobs \\(array\\\\) does not accept non\\-empty\\-array\\\\.$#" + message: "#^Property Composer\\\\Util\\\\Http\\\\CurlDownloader\\:\\:\\$jobs \\(array\\, retries\\: int\\<0, max\\>, storeAuth\\: 'prompt'\\|bool\\}, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|null, headerHandle\\: resource, \\.\\.\\.\\}\\>\\) does not accept non\\-empty\\-array\\, retries\\: int\\<0, max\\>, storeAuth\\: 'prompt'\\|bool\\}, options\\: array, progress\\: array, curlHandle\\: resource, filename\\: string\\|null, headerHandle\\: resource, \\.\\.\\.\\}\\>\\.$#" count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php @@ -5363,16 +5348,6 @@ parameters: count: 1 path: ../src/Composer/Util/RemoteFilesystem.php - - - message: "#^Offset 'retry' does not exist on array\\{retry\\: bool, storeAuth\\: bool\\|string\\}\\|null\\.$#" - count: 1 - path: ../src/Composer/Util/RemoteFilesystem.php - - - - message: "#^Offset 'storeAuth' does not exist on array\\{retry\\: bool, storeAuth\\: bool\\|string\\}\\|null\\.$#" - count: 1 - path: ../src/Composer/Util/RemoteFilesystem.php - - message: "#^Only booleans are allowed in &&, bool\\|string given on the left side\\.$#" count: 1 diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index 1787e1362702..148122fd1e05 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -37,7 +37,7 @@ public function __construct(IOInterface $io, Config $config) /** * @param string $origin - * @param string|bool $storeAuth + * @param 'prompt'|bool $storeAuth * * @return void */ @@ -79,11 +79,11 @@ function ($value): string { * @param int $statusCode HTTP status code that triggered this call * @param string|null $reason a message/description explaining why this was called * @param string[] $headers - * @return array|null containing retry (bool) and storeAuth (string|bool) keys, if retry is true the request should be + * @return array containing retry (bool) and storeAuth (string|bool) keys, if retry is true the request should be * retried, if storeAuth is true then on a successful retry the authentication should be persisted to auth.json - * @phpstan-return ?array{retry: bool, storeAuth: string|bool} + * @phpstan-return array{retry: bool, storeAuth: 'prompt'|bool} */ - public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, ?string $reason = null, array $headers = array()): ?array + public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, ?string $reason = null, array $headers = array()): array { $storeAuth = false; @@ -185,7 +185,7 @@ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, } else { // 404s are only handled for github if ($statusCode === 404) { - return null; + return ['retry' => false, 'storeAuth' => false]; } // fail if the console is not interactive diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 54628204ef00..93b76f305a78 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -27,7 +27,7 @@ * @internal * @author Jordi Boggiano * @author Nicolas Grekas - * @phpstan-type Attributes array{retryAuthFailure: bool, redirects: int, retries: int, storeAuth: bool} + * @phpstan-type Attributes array{retryAuthFailure: bool, redirects: int<0, max>, retries: int<0, max>, storeAuth: 'prompt'|bool} * @phpstan-type Job array{url: string, origin: string, attributes: Attributes, options: mixed[], progress: mixed[], curlHandle: resource, filename: string|null, headerHandle: resource, bodyHandle: resource, resolve: callable, reject: callable} */ class CurlDownloader @@ -152,7 +152,7 @@ public function download(callable $resolve, callable $reject, string $origin, st * @param mixed[] $options * @param null|string $copyTo * - * @param array{retryAuthFailure?: bool, redirects?: int, retries?: int, storeAuth?: bool} $attributes + * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, retries?: int<0, max>, storeAuth?: 'prompt'|bool} $attributes * * @return int internal job id */ @@ -177,6 +177,7 @@ private function initDownload(callable $resolve, callable $reject, string $origi throw new \RuntimeException('Failed to open a temp stream to store curl headers'); } + if ($copyTo) { $errorMessage = ''; // @phpstan-ignore-next-line @@ -363,7 +364,7 @@ public function tick(): void ) && $job['attributes']['retries'] < $this->maxRetries ) { $this->io->writeError('Retrying ('.($job['attributes']['retries'] + 1).') ' . Url::sanitize($job['url']) . ' due to curl error '. $errno, true, IOInterface::DEBUG); - $this->restartJob($job, $job['url'], array('retries' => $job['attributes']['retries'] + 1)); + $this->restartJobWithDelay($job, $job['url'], array('retries' => $job['attributes']['retries'] + 1)); continue; } @@ -427,14 +428,14 @@ public function tick(): void && $job['attributes']['retries'] < $this->maxRetries ) { $this->io->writeError('Retrying ('.($job['attributes']['retries'] + 1).') ' . Url::sanitize($job['url']) . ' due to status code '. $statusCode, true, IOInterface::DEBUG); - $this->restartJob($job, $job['url'], array('retries' => $job['attributes']['retries'] + 1)); + $this->restartJobWithDelay($job, $job['url'], array('retries' => $job['attributes']['retries'] + 1)); continue; } throw $this->failResponse($job, $response, $response->getStatusMessage()); } - if ($job['attributes']['storeAuth']) { + if ($job['attributes']['storeAuth'] !== false) { $this->authHelper->storeAuth($job['origin'], $job['attributes']['storeAuth']); } @@ -524,8 +525,8 @@ private function handleRedirect(array $job, Response $response): string } /** - * @param Job $job - * @return array{retry: bool, storeAuth: string|bool} + * @param Job $job + * @return array{retry: bool, storeAuth: 'prompt'|bool} */ private function isAuthenticatedRetryNeeded(array $job, Response $response): array { @@ -578,7 +579,7 @@ private function isAuthenticatedRetryNeeded(array $job, Response $response): arr * @param Job $job * @param string $url * - * @param array{retryAuthFailure?: bool, redirects?: int, storeAuth?: bool} $attributes + * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, storeAuth?: 'prompt'|bool, retries?: int<1, max>} $attributes * * @return void */ @@ -594,6 +595,25 @@ private function restartJob(array $job, string $url, array $attributes = array() $this->initDownload($job['resolve'], $job['reject'], $origin, $url, $job['options'], $job['filename'], $attributes); } + /** + * @param Job $job + * @param string $url + * + * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, storeAuth?: 'prompt'|bool, retries: int<1, max>} $attributes + * + * @return void + */ + private function restartJobWithDelay(array $job, string $url, array $attributes): void + { + if ($attributes['retries'] >= 3) { + usleep(500000); // half a second delay for 3rd retry and beyond + } elseif ($attributes['retries'] >= 2) { + usleep(100000); // 100ms delay for 2nd retry + } // no sleep for the first retry + + $this->restartJob($job, $url, $attributes); + } + /** * @param Job $job * @param string $errorMessage From f1f013edde6528e58a47dfd94af527f5b9af801c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 29 Apr 2022 14:58:38 +0200 Subject: [PATCH 035/618] Downgrade naming errors to warnings again in package links to avoid BC issues with tags on packagist --- .../Package/Loader/ValidatingArrayLoader.php | 4 ++-- .../Loader/ValidatingArrayLoaderTest.php | 24 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Composer/Package/Loader/ValidatingArrayLoader.php b/src/Composer/Package/Loader/ValidatingArrayLoader.php index e341b18db134..ac7fff385ebb 100644 --- a/src/Composer/Package/Loader/ValidatingArrayLoader.php +++ b/src/Composer/Package/Loader/ValidatingArrayLoader.php @@ -258,9 +258,9 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa continue; } if ($err = self::hasPackageNamingError($package, true)) { - $this->errors[] = $linkType.'.'.$err; + $this->warnings[] = $linkType.'.'.$err; } elseif (!Preg::isMatch('{^[A-Za-z0-9_./-]+$}', $package)) { - $this->warnings[] = $linkType.'.'.$package.' : invalid key, package names must be strings containing only [A-Za-z0-9_./-]'; + $this->errors[] = $linkType.'.'.$package.' : invalid key, package names must be strings containing only [A-Za-z0-9_./-]'; } if (!is_string($constraint)) { $this->errors[] = $linkType.'.'.$package.' : invalid value, must be a string containing a version constraint'; diff --git a/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php index ad368bf24b82..e3d6103e1bdc 100644 --- a/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php @@ -352,18 +352,6 @@ public function errorProvider(): array 'name : Foo/Bar is invalid, it should not contain uppercase characters. We suggest using foo/bar instead.', ), ), - array( - array( - 'name' => 'foo/bar', - 'require' => array( - 'Foo/Baz' => '^1.0', - ), - ), - array( - 'require.Foo/Baz is invalid, it should not contain uppercase characters. Please use foo/baz instead.', - ), - false, - ), array( array( 'name' => 'foo/bar', @@ -523,6 +511,18 @@ public function warningProvider(): array ), false, ), + array( + array( + 'name' => 'foo/bar', + 'require' => array( + 'Foo/Baz' => '^1.0', + ), + ), + array( + 'require.Foo/Baz is invalid, it should not contain uppercase characters. Please use foo/baz instead.', + ), + false, + ), ); } } From a812853fe4a5a08bdd66bf667a212e7c3ef1885c Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 2 May 2022 11:51:40 +0200 Subject: [PATCH 036/618] Inline PackageEvents constants --- .../Installer/InstallationManager.php | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index 34701c2b9a82..05f2062d379e 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -430,9 +430,14 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati } $installer = $this->getInstaller($package->getType()); - $event = 'Composer\Installer\PackageEvents::PRE_PACKAGE_'.strtoupper($opType); - if (defined($event) && $runScripts && $this->eventDispatcher) { - $this->eventDispatcher->dispatchPackageEvent(constant($event), $devMode, $repo, $allOperations, $operation); + $eventName = [ + 'install' => PackageEvents::PRE_PACKAGE_INSTALL, + 'update' => PackageEvents::PRE_PACKAGE_UPDATE, + 'uninstall' => PackageEvents::PRE_PACKAGE_UNINSTALL, + ][$opType] ?? null; + + if (null !== $eventName && $runScripts && $this->eventDispatcher) { + $this->eventDispatcher->dispatchPackageEvent($eventName, $devMode, $repo, $allOperations, $operation); } $dispatcher = $this->eventDispatcher; @@ -454,12 +459,17 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati throw $e; }); - $postExecCallbacks[] = function () use ($opType, $runScripts, $dispatcher, $devMode, $repo, $allOperations, $operation): void { - $event = 'Composer\Installer\PackageEvents::POST_PACKAGE_'.strtoupper($opType); - if (defined($event) && $runScripts && $dispatcher) { - $dispatcher->dispatchPackageEvent(constant($event), $devMode, $repo, $allOperations, $operation); - } - }; + $eventName = [ + 'install' => PackageEvents::POST_PACKAGE_INSTALL, + 'update' => PackageEvents::POST_PACKAGE_UPDATE, + 'uninstall' => PackageEvents::POST_PACKAGE_UNINSTALL, + ][$opType] ?? null; + + if (null !== $eventName && $runScripts && $dispatcher) { + $postExecCallbacks[] = function () use ($dispatcher, $eventName, $devMode, $repo, $allOperations, $operation): void { + $dispatcher->dispatchPackageEvent($eventName, $devMode, $repo, $allOperations, $operation); + }; + } $promises[] = $promise; } From c27dca83ef21bd44c41c1a60dd2e7ab1afa70a13 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 8 May 2022 10:39:36 +0200 Subject: [PATCH 037/618] Fix deprecated syntax since PHP 8.2 (#10766) --- src/Composer/Autoload/AutoloadGenerator.php | 2 +- src/Composer/DependencyResolver/Problem.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 87b34659576c..802cf1b528d6 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -889,7 +889,7 @@ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $de // platform_check.php @generated by Composer \$issues = array(); -${requiredPhp}${requiredExtensions} +{$requiredPhp}{$requiredExtensions} if (\$issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index 124a544cbff8..0ebe14c2a64e 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -363,7 +363,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $providersStr = implode(array_map(function ($p) { $description = $p['description'] ? ' '.substr($p['description'], 0, 100) : ''; - return " - ${p['name']}".$description."\n"; + return ' - '.$p['name'].$description."\n"; }, count($providers) > $maxProviders + 1 ? array_slice($providers, 0, $maxProviders) : $providers)); if (count($providers) > $maxProviders + 1) { $providersStr .= ' ... and '.(count($providers) - $maxProviders).' more.'."\n"; From 1d0fa9349563565452474d131d33dc23317febb1 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 09:39:56 +0200 Subject: [PATCH 038/618] Fix lock:false still outputting lock file changes --- phpstan/baseline.neon | 94 +++++--------------------------------- src/Composer/Installer.php | 44 ++++++++++-------- 2 files changed, 36 insertions(+), 102 deletions(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 1dfceca48f25..a3f616c0cc65 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -12,11 +12,6 @@ parameters: - message: "#^Casting to bool something that's already bool\\.$#" - count: 6 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - - - message: "#^Casting to string something that's already string\\.$#" count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php @@ -65,14 +60,9 @@ parameters: count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" - count: 4 + count: 3 path: ../src/Composer/Autoload/AutoloadGenerator.php - @@ -157,7 +147,7 @@ parameters: - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 2 + count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - @@ -275,11 +265,6 @@ parameters: count: 1 path: ../src/Composer/Autoload/ClassMapGenerator.php - - - message: "#^Casting to bool something that's already bool\\.$#" - count: 2 - path: ../src/Composer/Cache.php - - message: "#^Only booleans are allowed in a negated boolean, int given\\.$#" count: 1 @@ -2475,11 +2460,6 @@ parameters: count: 2 path: ../src/Composer/Config.php - - - message: "#^Casting to bool something that's already bool\\.$#" - count: 1 - path: ../src/Composer/Config.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 2 @@ -3745,11 +3725,6 @@ parameters: count: 1 path: ../src/Composer/EventDispatcher/EventDispatcher.php - - - message: "#^Casting to bool something that's already bool\\.$#" - count: 1 - path: ../src/Composer/EventDispatcher/EventDispatcher.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 1 @@ -4011,17 +3986,17 @@ parameters: path: ../src/Composer/Installer.php - - message: "#^Casting to bool something that's already bool\\.$#" - count: 15 + message: "#^Only booleans are allowed in &&, array\\\\> given on the right side\\.$#" + count: 1 path: ../src/Composer/Installer.php - - message: "#^Only booleans are allowed in &&, array\\\\> given on the right side\\.$#" + message: "#^Only booleans are allowed in &&, array\\\\|null given on the left side\\.$#" count: 1 path: ../src/Composer/Installer.php - - message: "#^Only booleans are allowed in &&, array\\\\|null given on the left side\\.$#" + message: "#^Only booleans are allowed in &&, mixed given on the left side\\.$#" count: 1 path: ../src/Composer/Installer.php @@ -4075,6 +4050,11 @@ parameters: count: 1 path: ../src/Composer/Installer.php + - + message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" + count: 2 + path: ../src/Composer/Installer.php + - message: "#^Only booleans are allowed in \\|\\|, array\\\\|null given on the left side\\.$#" count: 2 @@ -4445,11 +4425,6 @@ parameters: count: 4 path: ../src/Composer/Json/JsonManipulator.php - - - message: "#^Casting to string something that's already string\\.$#" - count: 1 - path: ../src/Composer/Json/JsonValidationException.php - - message: "#^Variable method call on Composer\\\\Package\\\\BasePackage\\.$#" count: 1 @@ -4625,21 +4600,11 @@ parameters: count: 2 path: ../src/Composer/Package/Dumper/ArrayDumper.php - - - message: "#^Call to function is_string\\(\\) with string will always evaluate to true\\.$#" - count: 1 - path: ../src/Composer/Package/Loader/ArrayLoader.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 10 path: ../src/Composer/Package/Loader/ArrayLoader.php - - - message: "#^Instanceof between Composer\\\\Package\\\\CompletePackage and Composer\\\\Package\\\\CompletePackage will always evaluate to true\\.$#" - count: 1 - path: ../src/Composer/Package/Loader/ArrayLoader.php - - message: "#^Instanceof between Composer\\\\Package\\\\CompletePackage and Composer\\\\Package\\\\CompletePackageInterface will always evaluate to true\\.$#" count: 1 @@ -4680,11 +4645,6 @@ parameters: count: 1 path: ../src/Composer/Package/Loader/ArrayLoader.php - - - message: "#^Call to function is_string\\(\\) with string will always evaluate to true\\.$#" - count: 1 - path: ../src/Composer/Package/Loader/JsonLoader.php - - message: "#^Parameter \\#1 \\$json of static method Composer\\\\Json\\\\JsonFile\\:\\:parseJson\\(\\) expects string\\|null, string\\|false given\\.$#" count: 1 @@ -5120,11 +5080,6 @@ parameters: count: 1 path: ../src/Composer/Plugin/PostFileDownloadEvent.php - - - message: "#^Casting to bool something that's already bool\\.$#" - count: 1 - path: ../src/Composer/Question/StrictConfirmationQuestion.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 2 @@ -5455,16 +5410,6 @@ parameters: count: 1 path: ../src/Composer/Repository/FilesystemRepository.php - - - message: "#^Call to function is_array\\(\\) with array\\ will always evaluate to true\\.$#" - count: 2 - path: ../src/Composer/Repository/FilterRepository.php - - - - message: "#^Call to function is_bool\\(\\) with bool will always evaluate to true\\.$#" - count: 1 - path: ../src/Composer/Repository/FilterRepository.php - - message: "#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#" count: 1 @@ -6582,7 +6527,7 @@ parameters: - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 4 + count: 3 path: ../src/Composer/Util/Http/CurlDownloader.php - @@ -6860,11 +6805,6 @@ parameters: count: 1 path: ../src/Composer/Util/Http/RequestProxy.php - - - message: "#^Casting to int something that's already int\\.$#" - count: 1 - path: ../src/Composer/Util/Http/Response.php - - message: "#^Anonymous function uses \\$this assigned to variable \\$downloader\\. Use \\$this directly in the function body\\.$#" count: 2 @@ -7140,11 +7080,6 @@ parameters: count: 1 path: ../src/Composer/Util/Platform.php - - - message: "#^Casting to string something that's already string\\.$#" - count: 1 - path: ../src/Composer/Util/Platform.php - - message: "#^Only booleans are allowed in &&, array\\|false given on the left side\\.$#" count: 1 @@ -8088,11 +8023,6 @@ parameters: count: 4 path: ../tests/Composer/Test/InstallerTest.php - - - message: "#^Call to function is_array\\(\\) with array\\ will always evaluate to true\\.$#" - count: 1 - path: ../tests/Composer/Test/InstallerTest.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 9 diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 31aacde001c8..6326158dd614 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -507,23 +507,25 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, $doInstall) } } - $this->io->writeError(sprintf( - "Lock file operations: %d install%s, %d update%s, %d removal%s", - count($installNames), - 1 === count($installNames) ? '' : 's', - count($updateNames), - 1 === count($updateNames) ? '' : 's', - count($uninstalls), - 1 === count($uninstalls) ? '' : 's' - )); - if ($installNames) { - $this->io->writeError("Installs: ".implode(', ', $installNames), true, IOInterface::VERBOSE); - } - if ($updateNames) { - $this->io->writeError("Updates: ".implode(', ', $updateNames), true, IOInterface::VERBOSE); - } - if ($uninstalls) { - $this->io->writeError("Removals: ".implode(', ', $uninstallNames), true, IOInterface::VERBOSE); + if ($this->config->get('lock')) { + $this->io->writeError(sprintf( + "Lock file operations: %d install%s, %d update%s, %d removal%s", + count($installNames), + 1 === count($installNames) ? '' : 's', + count($updateNames), + 1 === count($updateNames) ? '' : 's', + count($uninstalls), + 1 === count($uninstalls) ? '' : 's' + )); + if ($installNames) { + $this->io->writeError("Installs: ".implode(', ', $installNames), true, IOInterface::VERBOSE); + } + if ($updateNames) { + $this->io->writeError("Updates: ".implode(', ', $updateNames), true, IOInterface::VERBOSE); + } + if ($uninstalls) { + $this->io->writeError("Removals: ".implode(', ', $uninstallNames), true, IOInterface::VERBOSE); + } } } @@ -550,8 +552,8 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, $doInstall) $this->suggestedPackagesReporter->addSuggestionsFromPackage($operation->getPackage()); } - // output op, but alias op only in debug verbosity - if (false === strpos($operation->getOperationType(), 'Alias') || $this->io->isDebug()) { + // output op if lock file is enabled, but alias op only in debug verbosity + if ($this->config->get('lock') && (false === strpos($operation->getOperationType(), 'Alias') || $this->io->isDebug())) { $this->io->writeError(' - ' . $operation->show(true)); } } @@ -655,7 +657,9 @@ protected function extractDevPackages(LockTransaction $lockTransaction, Platform */ protected function doInstall(InstalledRepositoryInterface $localRepo, $alreadySolved = false) { - $this->io->writeError('Installing dependencies from lock file'.($this->devMode ? ' (including require-dev)' : '').''); + if ($this->config->get('lock')) { + $this->io->writeError('Installing dependencies from lock file'.($this->devMode ? ' (including require-dev)' : '').''); + } $lockedRepository = $this->locker->getLockedRepository($this->devMode); From 1b81b540252c3cff9a5a995636580a2e3c103ab1 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 10:16:26 +0200 Subject: [PATCH 039/618] Fix type issue in require command abort --- src/Composer/Command/RequireCommand.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 373d0451adf1..230e449c6ef4 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -117,9 +117,9 @@ protected function execute(InputInterface $input, OutputInterface $output) { if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { pcntl_async_signals(true); - pcntl_signal(SIGINT, array($this, 'revertComposerFile')); - pcntl_signal(SIGTERM, array($this, 'revertComposerFile')); - pcntl_signal(SIGHUP, array($this, 'revertComposerFile')); + pcntl_signal(SIGINT, function () { $this->revertComposerFile(); }); + pcntl_signal(SIGTERM, function () { $this->revertComposerFile(); }); + pcntl_signal(SIGHUP, function () { $this->revertComposerFile(); }); } $this->file = Factory::getComposerFile(); From aeb204bb1dd284127cc3b18f0b237eb88063dacc Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 13:06:59 +0200 Subject: [PATCH 040/618] Fix race condition where multiple http requests requiring auth end up failing, fixes #10763 --- src/Composer/Util/AuthHelper.php | 10 +++++++++- src/Composer/Util/Http/CurlDownloader.php | 4 ++-- src/Composer/Util/RemoteFilesystem.php | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index c208a1018fb1..305746f179a4 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -79,11 +79,12 @@ function ($value) { * @param int $statusCode HTTP status code that triggered this call * @param string|null $reason a message/description explaining why this was called * @param string[] $headers + * @param int $retryCount the amount of retries already done on this URL * @return array|null containing retry (bool) and storeAuth (string|bool) keys, if retry is true the request should be * retried, if storeAuth is true then on a successful retry the authentication should be persisted to auth.json * @phpstan-return ?array{retry: bool, storeAuth: string|bool} */ - public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $headers = array()) + public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $headers = array(), $retryCount = 0) { $storeAuth = false; @@ -200,8 +201,15 @@ public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $ throw new TransportException($message, $statusCode); } + // fail if we already have auth if ($this->io->hasAuthentication($origin)) { + // if two or more requests are started together for the same host, and the first + // received authentication already, we let the others retry before failing them + if ($retryCount === 0) { + return array('retry' => true, 'storeAuth' => false); + } + throw new TransportException("Invalid credentials for '" . $url . "', aborting.", $statusCode); } diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 3cbdf4079dce..ed85b2c83e05 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -528,7 +528,7 @@ private function handleRedirect(array $job, Response $response) private function isAuthenticatedRetryNeeded(array $job, Response $response) { if (in_array($response->getStatusCode(), array(401, 403)) && $job['attributes']['retryAuthFailure']) { - $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], $response->getStatusCode(), $response->getStatusMessage(), $response->getHeaders()); + $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], $response->getStatusCode(), $response->getStatusMessage(), $response->getHeaders(), $job['attributes']['retries']); if ($result['retry']) { return $result; @@ -560,7 +560,7 @@ private function isAuthenticatedRetryNeeded(array $job, Response $response) if ($needsAuthRetry) { if ($job['attributes']['retryAuthFailure']) { - $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], 401); + $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], 401, null, array(), $job['attributes']['retries']); if ($result['retry']) { return $result; } diff --git a/src/Composer/Util/RemoteFilesystem.php b/src/Composer/Util/RemoteFilesystem.php index f35964975056..fb27a34e3293 100644 --- a/src/Composer/Util/RemoteFilesystem.php +++ b/src/Composer/Util/RemoteFilesystem.php @@ -645,7 +645,7 @@ protected function callbackGet($notificationCode, $severity, $message, $messageC */ protected function promptAuthAndRetry($httpStatus, $reason = null, $headers = array()) { - $result = $this->authHelper->promptAuthIfNeeded($this->fileUrl, $this->originUrl, $httpStatus, $reason, $headers); + $result = $this->authHelper->promptAuthIfNeeded($this->fileUrl, $this->originUrl, $httpStatus, $reason, $headers, 1 /** always pass 1 as RemoteFilesystem is single threaded there is no race condition possible */); $this->storeAuth = $result['storeAuth']; $this->retry = $result['retry']; From ebfdae888363b983d692af23b618d6e882c3825c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 13:52:49 +0200 Subject: [PATCH 041/618] Fix unsetting of existing props, fixes #10767, refs #10756 --- src/Composer/Command/ConfigCommand.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index e893e7983f82..9045f043cf03 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -634,6 +634,11 @@ function ($vals) { if ($input->getOption('global') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]) || strpos($settingKey, 'extra.') === 0)) { throw new \InvalidArgumentException('The ' . $settingKey . ' property can not be set in the global config.json file. Use `composer global config` to apply changes to the global composer.json'); } + if ($input->getOption('unset') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]))) { + $this->configSource->removeProperty($settingKey); + + return 0; + } if (isset($uniqueProps[$settingKey])) { $this->handleSingleValue($settingKey, $uniqueProps[$settingKey], $values, 'addProperty'); @@ -796,6 +801,7 @@ function ($vals) { return 0; } + // handle unsetting other top level properties if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); From fdab6657c799e5e5f499f400b7f6595d93f1e5f7 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 16:05:35 +0200 Subject: [PATCH 042/618] Add command testing utilities to TestCase, add tests for ConfigCommand --- src/Composer/Command/ConfigCommand.php | 2 +- .../Test/Autoload/AutoloadGeneratorTest.php | 2 +- .../Test/Autoload/ClassMapGeneratorTest.php | 4 +- tests/Composer/Test/CacheTest.php | 2 +- .../Test/Command/ConfigCommandTest.php | 146 ++++++++++++++++++ .../Test/Command/RunScriptCommandTest.php | 39 +---- .../Test/Config/JsonConfigSourceTest.php | 2 +- .../Test/Downloader/FileDownloaderTest.php | 12 +- .../Test/Downloader/FossilDownloaderTest.php | 2 +- .../Test/Downloader/GitDownloaderTest.php | 2 +- .../Test/Downloader/HgDownloaderTest.php | 2 +- .../Downloader/PerforceDownloaderTest.php | 2 +- .../Test/Downloader/XzDownloaderTest.php | 2 +- .../Test/Downloader/ZipDownloaderTest.php | 2 +- tests/Composer/Test/InstalledVersionsTest.php | 2 +- .../Test/Installer/BinaryInstallerTest.php | 2 +- .../Test/Installer/LibraryInstallerTest.php | 2 +- tests/Composer/Test/InstallerTest.php | 2 +- .../Archiver/ArchivableFilesFinderTest.php | 2 +- .../Test/Package/Archiver/ArchiverTest.php | 2 +- .../Package/Archiver/PharArchiverTest.php | 4 +- .../Test/Plugin/PluginInstallerTest.php | 2 +- .../Repository/FilesystemRepositoryTest.php | 2 +- .../Test/Repository/RepositoryManagerTest.php | 2 +- .../Test/Repository/Vcs/FossilDriverTest.php | 2 +- .../Repository/Vcs/GitBitbucketDriverTest.php | 2 +- .../Test/Repository/Vcs/GitHubDriverTest.php | 2 +- .../Test/Repository/Vcs/GitLabDriverTest.php | 2 +- .../Test/Repository/Vcs/HgDriverTest.php | 2 +- .../Repository/Vcs/PerforceDriverTest.php | 2 +- .../Test/Repository/Vcs/SvnDriverTest.php | 2 +- .../Test/Repository/VcsRepositoryTest.php | 4 +- tests/Composer/Test/TestCase.php | 56 +++++++ tests/Composer/Test/Util/FilesystemTest.php | 4 +- tests/bootstrap.php | 5 + 35 files changed, 253 insertions(+), 73 deletions(-) create mode 100644 tests/Composer/Test/Command/ConfigCommandTest.php diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index 9045f043cf03..dc3738a24fac 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -305,7 +305,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } if (is_array($value)) { - $value = json_encode($value); + $value = JsonFile::encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } $sourceOfConfigValue = ''; diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index 73e46ed07636..f74f2d6b0aa9 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -91,7 +91,7 @@ protected function setUp(): void { $this->fs = new Filesystem; - $this->workingDir = $this->getUniqueTmpDirectory(); + $this->workingDir = self::getUniqueTmpDirectory(); $this->vendorDir = $this->workingDir.DIRECTORY_SEPARATOR.'composer-test-autoload'; $this->ensureDirectoryExistsAndClear($this->vendorDir); diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index f384026208eb..148bfbce40a9 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -148,7 +148,7 @@ public function testAmbiguousReference(): void { $this->checkIfFinderIsAvailable(); - $tempDir = $this->getUniqueTmpDirectory(); + $tempDir = self::getUniqueTmpDirectory(); $this->ensureDirectoryExistsAndClear($tempDir . '/other'); $finder = new Finder(); @@ -190,7 +190,7 @@ public function testAmbiguousReference(): void */ public function testUnambiguousReference(): void { - $tempDir = $this->getUniqueTmpDirectory(); + $tempDir = self::getUniqueTmpDirectory(); file_put_contents($tempDir . '/A.php', "root = $this->getUniqueTmpDirectory(); + $this->root = self::getUniqueTmpDirectory(); $this->files = array(); $zeros = str_repeat('0', 1000); diff --git a/tests/Composer/Test/Command/ConfigCommandTest.php b/tests/Composer/Test/Command/ConfigCommandTest.php new file mode 100644 index 000000000000..942d052d49fa --- /dev/null +++ b/tests/Composer/Test/Command/ConfigCommandTest.php @@ -0,0 +1,146 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Composer; +use Composer\Config; +use Composer\Script\Event as ScriptEvent; +use Composer\Test\TestCase; +use Composer\Util\Filesystem; + +class ConfigCommandTest extends TestCase +{ + /** + * @dataProvider provideConfigUpdates + * @param array $before + * @param array $command + * @param array $expected + */ + public function testConfigUpdates(array $before, array $command, array $expected): void + { + $this->initTempComposer($before); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'config'], $command)); + + $appTester->assertCommandIsSuccessful($appTester->getDisplay()); + + $this->assertSame($expected, json_decode((string) file_get_contents('composer.json'), true)); + } + + public function provideConfigUpdates(): \Generator + { + yield 'set scripts' => [ + [], + ['setting-key' => 'scripts.test', 'setting-value' => ['foo bar']], + ['scripts' => ['test' => 'foo bar']], + ]; + yield 'unset scripts' => [ + ['scripts' => ['test' => 'foo bar', 'lala' => 'baz']], + ['setting-key' => 'scripts.lala', '--unset' => true], + ['scripts' => ['test' => 'foo bar']], + ]; + yield 'set single config with bool normalizer' => [ + [], + ['setting-key' => 'use-github-api', 'setting-value' => ['1']], + ['config' => ['use-github-api' => true]], + ]; + yield 'set multi config' => [ + [], + ['setting-key' => 'github-protocols', 'setting-value' => ['https', 'git']], + ['config' => ['github-protocols' => ['https', 'git']]], + ]; + yield 'set version' => [ + [], + ['setting-key' => 'version', 'setting-value' => ['1.0.0']], + ['version' => '1.0.0'], + ]; + yield 'unset version' => [ + ['version' => '1.0.0'], + ['setting-key' => 'version', '--unset' => true], + [], + ]; + yield 'unset arbitrary property' => [ + ['random-prop' => '1.0.0'], + ['setting-key' => 'random-prop', '--unset' => true], + [], + ]; + yield 'set preferred-install' => [ + [], + ['setting-key' => 'preferred-install.foo/*', 'setting-value' => ['source']], + ['config' => ['preferred-install' => ['foo/*' => 'source']]], + ]; + yield 'unset preferred-install' => [ + ['config' => ['preferred-install' => ['foo/*' => 'source']]], + ['setting-key' => 'preferred-install.foo/*', '--unset' => true], + ['config' => ['preferred-install' => []]], + ]; + } + + /** + * @dataProvider provideConfigReads + * @param array $composerJson + * @param array $command + */ + public function testConfigReads(array $composerJson, array $command, string $expected): void + { + $this->initTempComposer($composerJson); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'config'], $command)); + + $appTester->assertCommandIsSuccessful(); + + $this->assertSame($expected, trim($appTester->getDisplay(true))); + $this->assertSame($composerJson, json_decode((string) file_get_contents('composer.json'), true), 'The composer.json should not be modified by config reads'); + } + + public function provideConfigReads(): \Generator + { + yield 'read description' => [ + ['description' => 'foo bar'], + ['setting-key' => 'description'], + 'foo bar', + ]; + yield 'read vendor-dir with source' => [ + ['config' => ['vendor-dir' => 'lala']], + ['setting-key' => 'vendor-dir', '--source' => true], + 'lala (./composer.json)', + ]; + yield 'read default vendor-dir' => [ + [], + ['setting-key' => 'vendor-dir'], + 'vendor', + ]; + yield 'read repos by named key' => [ + ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org']]], + ['setting-key' => 'repositories.foo'], + '{"type":"vcs","url":"https://example.org"}', + ]; + yield 'read repos by numeric index' => [ + ['repositories' => [['type' => 'vcs', 'url' => 'https://example.org']]], + ['setting-key' => 'repos.0'], + '{"type":"vcs","url":"https://example.org"}', + ]; + yield 'read all repos includes the default packagist' => [ + ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org']]], + ['setting-key' => 'repos'], + '{"foo":{"type":"vcs","url":"https://example.org"},"packagist.org":{"type":"composer","url":"https://repo.packagist.org"}}', + ]; + yield 'read all repos does not include the disabled packagist' => [ + ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org'], 'packagist.org' => false]], + ['setting-key' => 'repos'], + '{"foo":{"type":"vcs","url":"https://example.org"}}', + ]; + } +} diff --git a/tests/Composer/Test/Command/RunScriptCommandTest.php b/tests/Composer/Test/Command/RunScriptCommandTest.php index e5cb54dcbf9d..2f9fc53c781b 100644 --- a/tests/Composer/Test/Command/RunScriptCommandTest.php +++ b/tests/Composer/Test/Command/RunScriptCommandTest.php @@ -12,35 +12,14 @@ namespace Composer\Test\Command; -use Composer\Command\RunScriptCommand; use Composer\Composer; use Composer\Config; -use Composer\Console\Application; use Composer\Script\Event as ScriptEvent; use Composer\Test\TestCase; use Composer\Util\Filesystem; -use Symfony\Component\Console\Tester\ApplicationTester; class RunScriptCommandTest extends TestCase { - /** - * @var string - */ - private $home; - - public function setUp(): void - { - $this->home = $this->getUniqueTmpDirectory(); - } - - protected function tearDown(): void - { - parent::tearDown(); - - $fs = new Filesystem(); - $fs->removeDirectory($this->home); - } - /** * @dataProvider getDevOptions * @param bool $dev @@ -112,7 +91,7 @@ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool public function testCanListScripts(): void { - $manifest = [ + $this->initTempComposer([ 'scripts' => [ 'test' => '@php test', 'fix-cs' => 'php-cs-fixer fix', @@ -120,20 +99,14 @@ public function testCanListScripts(): void 'scripts-descriptions' => [ 'fix-cs' => 'Run the codestyle fixer', ], - ]; - - file_put_contents($this->home.'/composer.json', json_encode($manifest)); - - $application = new Application(); - $application->setAutoExit(false); - $application->add(new RunScriptCommand()); + ]); - $tester = new ApplicationTester($application); - $tester->run(['command' => 'run-script', '--list' => true, '-d' => $this->home]); + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'run-script', '--list' => true]); - $tester->assertCommandIsSuccessful(); + $appTester->assertCommandIsSuccessful(); - $output = $tester->getDisplay(); + $output = $appTester->getDisplay(); $this->assertStringContainsString('Runs the test script as defined in composer.json.', $output, 'The default description for the test script should be printed'); $this->assertStringContainsString('Run the codestyle fixer', $output, 'The custom description for the fix-cs script should be printed'); diff --git a/tests/Composer/Test/Config/JsonConfigSourceTest.php b/tests/Composer/Test/Config/JsonConfigSourceTest.php index 6192fd5a3349..f3e6021a0bdd 100644 --- a/tests/Composer/Test/Config/JsonConfigSourceTest.php +++ b/tests/Composer/Test/Config/JsonConfigSourceTest.php @@ -37,7 +37,7 @@ protected function fixturePath(string $name): string protected function setUp(): void { $this->fs = new Filesystem; - $this->workingDir = $this->getUniqueTmpDirectory(); + $this->workingDir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Downloader/FileDownloaderTest.php b/tests/Composer/Test/Downloader/FileDownloaderTest.php index 8ed93f9ac2a6..2bbbdb103c21 100644 --- a/tests/Composer/Test/Downloader/FileDownloaderTest.php +++ b/tests/Composer/Test/Downloader/FileDownloaderTest.php @@ -69,7 +69,7 @@ public function testDownloadToExistingFile(): void $package = $this->getPackage(); $package->setDistUrl('url'); - $path = $this->createTempFile($this->getUniqueTmpDirectory()); + $path = $this->createTempFile(self::getUniqueTmpDirectory()); $downloader = $this->getDownloader(); try { @@ -105,7 +105,7 @@ public function testDownloadButFileIsUnsaved(): void $package = $this->getPackage(); $package->setDistUrl('http://example.com/script.js'); - $path = $this->getUniqueTmpDirectory(); + $path = self::getUniqueTmpDirectory(); $ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $ioMock->expects($this->any()) ->method('write') @@ -142,7 +142,7 @@ public function testDownloadButFileIsUnsaved(): void public function testDownloadWithCustomProcessedUrl(): void { - $path = $this->getUniqueTmpDirectory(); + $path = self::getUniqueTmpDirectory(); $package = $this->getPackage(); $package->setDistUrl('url'); @@ -225,7 +225,7 @@ public function testDownloadWithCustomProcessedUrl(): void public function testDownloadWithCustomCacheKey(): void { - $path = $this->getUniqueTmpDirectory(); + $path = self::getUniqueTmpDirectory(); $package = $this->getPackage(); $package->setDistUrl('url'); @@ -339,7 +339,7 @@ public function testDownloadFileWithInvalidChecksum(): void $filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock(); - $path = $this->getUniqueTmpDirectory(); + $path = self::getUniqueTmpDirectory(); $config = $this->getConfig(['vendor-dir' => $path.'/vendor']); $downloader = $this->getDownloader(null, $config, null, null, null, $filesystem); @@ -384,7 +384,7 @@ public function testDowngradeShowsAppropriateMessage(): void [$this->stringContains('Downgrading')] ); - $path = $this->getUniqueTmpDirectory(); + $path = self::getUniqueTmpDirectory(); $config = $this->getConfig(['vendor-dir' => $path.'/vendor']); $filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock(); diff --git a/tests/Composer/Test/Downloader/FossilDownloaderTest.php b/tests/Composer/Test/Downloader/FossilDownloaderTest.php index 7a080c8b8d7f..d6daa53bb286 100644 --- a/tests/Composer/Test/Downloader/FossilDownloaderTest.php +++ b/tests/Composer/Test/Downloader/FossilDownloaderTest.php @@ -23,7 +23,7 @@ class FossilDownloaderTest extends TestCase protected function setUp(): void { - $this->workingDir = $this->getUniqueTmpDirectory(); + $this->workingDir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Downloader/GitDownloaderTest.php b/tests/Composer/Test/Downloader/GitDownloaderTest.php index 8a65686d635f..afcf69af0c07 100644 --- a/tests/Composer/Test/Downloader/GitDownloaderTest.php +++ b/tests/Composer/Test/Downloader/GitDownloaderTest.php @@ -33,7 +33,7 @@ protected function setUp(): void $this->initGitVersion('1.0.0'); $this->fs = new Filesystem; - $this->workingDir = $this->getUniqueTmpDirectory(); + $this->workingDir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Downloader/HgDownloaderTest.php b/tests/Composer/Test/Downloader/HgDownloaderTest.php index 45b84a1ff98f..1e861f32b8df 100644 --- a/tests/Composer/Test/Downloader/HgDownloaderTest.php +++ b/tests/Composer/Test/Downloader/HgDownloaderTest.php @@ -23,7 +23,7 @@ class HgDownloaderTest extends TestCase protected function setUp(): void { - $this->workingDir = $this->getUniqueTmpDirectory(); + $this->workingDir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Downloader/PerforceDownloaderTest.php b/tests/Composer/Test/Downloader/PerforceDownloaderTest.php index f814861066e5..bb9be8a4d7a5 100644 --- a/tests/Composer/Test/Downloader/PerforceDownloaderTest.php +++ b/tests/Composer/Test/Downloader/PerforceDownloaderTest.php @@ -43,7 +43,7 @@ class PerforceDownloaderTest extends TestCase protected function setUp(): void { - $this->testPath = $this->getUniqueTmpDirectory(); + $this->testPath = self::getUniqueTmpDirectory(); $this->repoConfig = $this->getRepoConfig(); $this->config = $this->getConfig(); $this->io = $this->getMockIoInterface(); diff --git a/tests/Composer/Test/Downloader/XzDownloaderTest.php b/tests/Composer/Test/Downloader/XzDownloaderTest.php index 1f060c16a2d7..200ae49acb9d 100644 --- a/tests/Composer/Test/Downloader/XzDownloaderTest.php +++ b/tests/Composer/Test/Downloader/XzDownloaderTest.php @@ -36,7 +36,7 @@ public function setUp(): void if (Platform::isWindows()) { $this->markTestSkipped('Skip test on Windows'); } - $this->testDir = $this->getUniqueTmpDirectory(); + $this->testDir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Downloader/ZipDownloaderTest.php b/tests/Composer/Test/Downloader/ZipDownloaderTest.php index 2d3e319eecba..65581a87728e 100644 --- a/tests/Composer/Test/Downloader/ZipDownloaderTest.php +++ b/tests/Composer/Test/Downloader/ZipDownloaderTest.php @@ -37,7 +37,7 @@ class ZipDownloaderTest extends TestCase public function setUp(): void { - $this->testDir = $this->getUniqueTmpDirectory(); + $this->testDir = self::getUniqueTmpDirectory(); $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $this->config = $this->getMockBuilder('Composer\Config')->getMock(); $dlConfig = $this->getMockBuilder('Composer\Config')->getMock(); diff --git a/tests/Composer/Test/InstalledVersionsTest.php b/tests/Composer/Test/InstalledVersionsTest.php index 0268d7cc54cc..4eab8d028470 100644 --- a/tests/Composer/Test/InstalledVersionsTest.php +++ b/tests/Composer/Test/InstalledVersionsTest.php @@ -46,7 +46,7 @@ public static function tearDownAfterClass(): void public function setUp(): void { - $this->root = $this->getUniqueTmpDirectory(); + $this->root = self::getUniqueTmpDirectory(); $dir = $this->root; InstalledVersions::reload(require __DIR__.'/Repository/Fixtures/installed.php'); diff --git a/tests/Composer/Test/Installer/BinaryInstallerTest.php b/tests/Composer/Test/Installer/BinaryInstallerTest.php index a7e49fe685b0..2bcc9b61052e 100644 --- a/tests/Composer/Test/Installer/BinaryInstallerTest.php +++ b/tests/Composer/Test/Installer/BinaryInstallerTest.php @@ -48,7 +48,7 @@ protected function setUp(): void { $this->fs = new Filesystem; - $this->rootDir = $this->getUniqueTmpDirectory(); + $this->rootDir = self::getUniqueTmpDirectory(); $this->vendorDir = $this->rootDir.DIRECTORY_SEPARATOR.'vendor'; $this->ensureDirectoryExistsAndClear($this->vendorDir); diff --git a/tests/Composer/Test/Installer/LibraryInstallerTest.php b/tests/Composer/Test/Installer/LibraryInstallerTest.php index f236c5913632..173ba361f45d 100644 --- a/tests/Composer/Test/Installer/LibraryInstallerTest.php +++ b/tests/Composer/Test/Installer/LibraryInstallerTest.php @@ -74,7 +74,7 @@ protected function setUp(): void $this->config = new Config(false); $this->composer->setConfig($this->config); - $this->rootDir = $this->getUniqueTmpDirectory(); + $this->rootDir = self::getUniqueTmpDirectory(); $this->vendorDir = $this->rootDir.DIRECTORY_SEPARATOR.'vendor'; self::ensureDirectoryExistsAndClear($this->vendorDir); diff --git a/tests/Composer/Test/InstallerTest.php b/tests/Composer/Test/InstallerTest.php index 1fc54dc4d4de..baed74379fab 100644 --- a/tests/Composer/Test/InstallerTest.php +++ b/tests/Composer/Test/InstallerTest.php @@ -45,7 +45,7 @@ class InstallerTest extends TestCase { /** @var string */ - protected $prevCwd; + private $prevCwd; /** @var ?string */ protected $tempComposerHome; diff --git a/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php b/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php index 7fe88cb4196e..4aa222fd50a1 100644 --- a/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php +++ b/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php @@ -39,7 +39,7 @@ protected function setUp(): void $this->fs = $fs; $this->sources = $fs->normalizePath( - $this->getUniqueTmpDirectory() + self::getUniqueTmpDirectory() ); $fileTree = array( diff --git a/tests/Composer/Test/Package/Archiver/ArchiverTest.php b/tests/Composer/Test/Package/Archiver/ArchiverTest.php index 13c4ed0f7d97..e94ffa8ae7f4 100644 --- a/tests/Composer/Test/Package/Archiver/ArchiverTest.php +++ b/tests/Composer/Test/Package/Archiver/ArchiverTest.php @@ -38,7 +38,7 @@ public function setUp(): void { $this->filesystem = new Filesystem(); $this->process = new ProcessExecutor(); - $this->testDir = $this->getUniqueTmpDirectory(); + $this->testDir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Package/Archiver/PharArchiverTest.php b/tests/Composer/Test/Package/Archiver/PharArchiverTest.php index 0ad1d4eb58c5..4b81b2b210e9 100644 --- a/tests/Composer/Test/Package/Archiver/PharArchiverTest.php +++ b/tests/Composer/Test/Package/Archiver/PharArchiverTest.php @@ -22,7 +22,7 @@ public function testTarArchive(): void // Set up repository $this->setupDummyRepo(); $package = $this->setupPackage(); - $target = $this->getUniqueTmpDirectory().'/composer_archiver_test.tar'; + $target = self::getUniqueTmpDirectory().'/composer_archiver_test.tar'; // Test archive $archiver = new PharArchiver(); @@ -37,7 +37,7 @@ public function testZipArchive(): void // Set up repository $this->setupDummyRepo(); $package = $this->setupPackage(); - $target = $this->getUniqueTmpDirectory().'/composer_archiver_test.zip'; + $target = self::getUniqueTmpDirectory().'/composer_archiver_test.zip'; // Test archive $archiver = new PharArchiver(); diff --git a/tests/Composer/Test/Plugin/PluginInstallerTest.php b/tests/Composer/Test/Plugin/PluginInstallerTest.php index 80a919d2fb9c..44d06292ace5 100644 --- a/tests/Composer/Test/Plugin/PluginInstallerTest.php +++ b/tests/Composer/Test/Plugin/PluginInstallerTest.php @@ -73,7 +73,7 @@ protected function setUp(): void { $loader = new JsonLoader(new ArrayLoader()); $this->packages = array(); - $this->directory = $this->getUniqueTmpDirectory(); + $this->directory = self::getUniqueTmpDirectory(); for ($i = 1; $i <= 8; $i++) { $filename = '/Fixtures/plugin-v'.$i.'/composer.json'; mkdir(dirname($this->directory . $filename), 0777, true); diff --git a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php index 3e54098530cd..8d02e573c6bb 100644 --- a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php +++ b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php @@ -127,7 +127,7 @@ public function testRepositoryWrite(): void public function testRepositoryWritesInstalledPhp(): void { - $dir = $this->getUniqueTmpDirectory(); + $dir = self::getUniqueTmpDirectory(); chdir($dir); $json = new JsonFile($dir.'/installed.json'); diff --git a/tests/Composer/Test/Repository/RepositoryManagerTest.php b/tests/Composer/Test/Repository/RepositoryManagerTest.php index e5b4c84da338..898540775edb 100644 --- a/tests/Composer/Test/Repository/RepositoryManagerTest.php +++ b/tests/Composer/Test/Repository/RepositoryManagerTest.php @@ -24,7 +24,7 @@ class RepositoryManagerTest extends TestCase public function setUp(): void { - $this->tmpdir = $this->getUniqueTmpDirectory(); + $this->tmpdir = self::getUniqueTmpDirectory(); } protected function tearDown(): void diff --git a/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php b/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php index f43e8c02e8b8..ba15e30900ea 100644 --- a/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php @@ -30,7 +30,7 @@ class FossilDriverTest extends TestCase public function setUp(): void { - $this->home = $this->getUniqueTmpDirectory(); + $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); $this->config->merge(array( 'config' => array( diff --git a/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php index bc99e65c4f20..ff55e90a04ec 100644 --- a/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php @@ -37,7 +37,7 @@ protected function setUp(): void { $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $this->home = $this->getUniqueTmpDirectory(); + $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); $this->config->merge(array( diff --git a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php index c4e607566edc..fd24a4bd45f6 100644 --- a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php @@ -28,7 +28,7 @@ class GitHubDriverTest extends TestCase public function setUp(): void { - $this->home = $this->getUniqueTmpDirectory(); + $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); $this->config->merge(array( 'config' => array( diff --git a/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php index 1aeeb23d457b..c38ef15566cb 100644 --- a/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php @@ -51,7 +51,7 @@ class GitLabDriverTest extends TestCase public function setUp(): void { - $this->home = $this->getUniqueTmpDirectory(); + $this->home = self::getUniqueTmpDirectory(); $this->config = $this->getConfig([ 'home' => $this->home, 'gitlab-domains' => array( diff --git a/tests/Composer/Test/Repository/Vcs/HgDriverTest.php b/tests/Composer/Test/Repository/Vcs/HgDriverTest.php index 812ccbc7edb5..57c1677cfd4c 100644 --- a/tests/Composer/Test/Repository/Vcs/HgDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/HgDriverTest.php @@ -30,7 +30,7 @@ class HgDriverTest extends TestCase public function setUp(): void { $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $this->home = $this->getUniqueTmpDirectory(); + $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); $this->config->merge(array( 'config' => array( diff --git a/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php b/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php index 98ee5f3eacc5..fef713a773fe 100644 --- a/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php @@ -63,7 +63,7 @@ class PerforceDriverTest extends TestCase protected function setUp(): void { - $this->testPath = $this->getUniqueTmpDirectory(); + $this->testPath = self::getUniqueTmpDirectory(); $this->config = $this->getTestConfig($this->testPath); $this->repoConfig = array( 'url' => self::TEST_URL, diff --git a/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php b/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php index d6310ebf5a8a..8edb3266cd65 100644 --- a/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php @@ -31,7 +31,7 @@ class SvnDriverTest extends TestCase public function setUp(): void { - $this->home = $this->getUniqueTmpDirectory(); + $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); $this->config->merge(array( 'config' => array( diff --git a/tests/Composer/Test/Repository/VcsRepositoryTest.php b/tests/Composer/Test/Repository/VcsRepositoryTest.php index ac5884584123..71a40e42cb56 100644 --- a/tests/Composer/Test/Repository/VcsRepositoryTest.php +++ b/tests/Composer/Test/Repository/VcsRepositoryTest.php @@ -53,8 +53,8 @@ protected function initialize(): void } $oldCwd = Platform::getCwd(); - self::$composerHome = $this->getUniqueTmpDirectory(); - self::$gitRepo = $this->getUniqueTmpDirectory(); + self::$composerHome = self::getUniqueTmpDirectory(); + self::$gitRepo = self::getUniqueTmpDirectory(); if (!@chdir(self::$gitRepo)) { $this->skipped = 'Could not move into the temp git repo '.self::$gitRepo; diff --git a/tests/Composer/Test/TestCase.php b/tests/Composer/Test/TestCase.php index 8b727f4bc82c..9ed75c4b1e59 100644 --- a/tests/Composer/Test/TestCase.php +++ b/tests/Composer/Test/TestCase.php @@ -13,7 +13,9 @@ namespace Composer\Test; use Composer\Config; +use Composer\Console\Application; use Composer\IO\IOInterface; +use Composer\Json\JsonFile; use Composer\Pcre\Preg; use Composer\Semver\VersionParser; use Composer\Package\PackageInterface; @@ -23,6 +25,7 @@ use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\Silencer; +use Symfony\Component\Console\Tester\ApplicationTester; use Symfony\Component\Process\ExecutableFinder; use Composer\Package\Loader\ArrayLoader; use Composer\Package\BasePackage; @@ -53,6 +56,12 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase * @var list */ private $processExecutorMocks = []; + /** + * @var list + */ + private $tempComposerDirs = []; + /** @var string|null */ + private $prevCwd = null; protected function tearDown(): void { @@ -63,6 +72,17 @@ protected function tearDown(): void foreach ($this->processExecutorMocks as $mock) { $mock->assertComplete(); } + + if (null !== $this->prevCwd) { + chdir($this->prevCwd); + $this->prevCwd = null; + Platform::clearEnv('COMPOSER_HOME'); + Platform::clearEnv('COMPOSER_DISABLE_XDEBUG_WARN'); + } + $fs = new Filesystem(); + foreach ($this->tempComposerDirs as $dir) { + $fs->removeDirectory($dir); + } } /** @@ -84,6 +104,42 @@ public static function getUniqueTmpDirectory(): string throw new \RuntimeException('Failed to create a unique temporary directory.'); } + /** + * Creates a composer.json / auth.json inside a temp dir and chdir() into it + * + * The directory will be cleaned up on tearDown automatically. + * + * @param mixed[] $composerJson + * @param mixed[] $authJson + * @return string the newly created temp dir + */ + public function initTempComposer(array $composerJson = [], array $authJson = []): string + { + $dir = self::getUniqueTmpDirectory(); + + $this->tempComposerDirs[] = $dir; + + $this->prevCwd = Platform::getCwd(); + + Platform::putEnv('COMPOSER_HOME', $dir.'/composer-home'); + Platform::putEnv('COMPOSER_DISABLE_XDEBUG_WARN', '1'); + + chdir($dir); + file_put_contents($dir.'/composer.json', JsonFile::encode($composerJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT)); + file_put_contents($dir.'/auth.json', JsonFile::encode($authJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT)); + + return $dir; + } + + public function getApplicationTester(): ApplicationTester + { + $application = new Application(); + $application->setAutoExit(false); + $application->setCatchExceptions(false); + + return new ApplicationTester($application); + } + /** * @return VersionParser */ diff --git a/tests/Composer/Test/Util/FilesystemTest.php b/tests/Composer/Test/Util/FilesystemTest.php index e035f24fc6b1..abb5d1b4813f 100644 --- a/tests/Composer/Test/Util/FilesystemTest.php +++ b/tests/Composer/Test/Util/FilesystemTest.php @@ -35,8 +35,8 @@ class FilesystemTest extends TestCase public function setUp(): void { $this->fs = new Filesystem; - $this->workingDir = $this->getUniqueTmpDirectory(); - $this->testFile = $this->getUniqueTmpDirectory() . '/composer_test_file'; + $this->workingDir = self::getUniqueTmpDirectory(); + $this->testFile = self::getUniqueTmpDirectory() . '/composer_test_file'; } protected function tearDown(): void diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 19279f406b98..e4fa7fa3c001 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -23,3 +23,8 @@ require __DIR__.'/Composer/Test/TestCase.php'; Platform::putEnv('COMPOSER_TESTS_ARE_RUNNING', '1'); + +// symfony/phpunit-bridge sets some default env vars which we do not need polluting the test env +Platform::clearEnv('COMPOSER'); +Platform::clearEnv('COMPOSER_VENDOR_DIR'); +Platform::clearEnv('COMPOSER_BIN_DIR'); From 6ac4de19d719745918d6feedf93830fcea99c34e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 16:25:24 +0200 Subject: [PATCH 043/618] Fix ApplicationTest interacting with other tests --- src/Composer/Command/SelfUpdateCommand.php | 4 + tests/Composer/Test/ApplicationTest.php | 117 ++++----------------- 2 files changed, 27 insertions(+), 94 deletions(-) diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index c9418b0a6ebf..5e025b486e68 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -80,6 +80,10 @@ protected function configure(): void */ protected function execute(InputInterface $input, OutputInterface $output): int { + if ($_SERVER['argv'][0] === 'Standard input code') { + return 1; + } + // trigger autoloading of a few classes which may be needed when verifying/swapping the phar file // to ensure we do not try to load them from the new phar, see https://github.com/composer/composer/issues/10252 class_exists('Composer\Util\Platform'); diff --git a/tests/Composer/Test/ApplicationTest.php b/tests/Composer/Test/ApplicationTest.php index 8effc0684b45..f30374b2d5e8 100644 --- a/tests/Composer/Test/ApplicationTest.php +++ b/tests/Composer/Test/ApplicationTest.php @@ -13,7 +13,9 @@ namespace Composer\Test; use Composer\Console\Application; +use Composer\Util\Platform; use Composer\XdebugHandler\XdebugHandler; +use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; class ApplicationTest extends TestCase @@ -22,124 +24,51 @@ protected function tearDown(): void { parent::tearDown(); - putenv('COMPOSER_NO_INTERACTION'); + Platform::clearEnv('COMPOSER_DISABLE_XDEBUG_WARN'); } - public function testDevWarning(): void + protected function setUp(): void { - $application = new Application; - - $inputMock = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface')->getMock(); - $outputMock = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface')->getMock(); - - putenv('COMPOSER_NO_INTERACTION=1'); - - $inputMock->expects($this->any()) - ->method('hasParameterOption') - ->willReturnCallback(function ($opt): bool { - switch ($opt) { - case '--no-plugins': - return true; - case '--no-scripts': - return false; - case '--no-cache': - return false; - } - - return false; - }); - - $inputMock->expects($this->once()) - ->method('setInteractive') - ->with($this->equalTo(false)); - - $inputMock->expects($this->once()) - ->method('getParameterOption') - ->with($this->equalTo(array('--working-dir', '-d')), $this->equalTo(null)) - ->will($this->returnValue(null)); - - $inputMock->expects($this->any()) - ->method('getFirstArgument') - ->will($this->returnValue('about')); + parent::setUp(); - $output = new BufferedOutput(); - $expectedOutput = ''; - - if (XdebugHandler::isXdebugActive()) { - $expectedOutput .= 'Composer is operating slower than normal because you have Xdebug enabled. See https://getcomposer.org/xdebug'.PHP_EOL; - } + Platform::putEnv('COMPOSER_DISABLE_XDEBUG_WARN', '1'); + } - $expectedOutput .= sprintf('Warning: This development build of Composer is over 60 days old. It is recommended to update it by running "%s self-update" to get the latest version.', $_SERVER['PHP_SELF']).PHP_EOL; + /** + * @runInSeparateProcess + * @preserveGlobalState disabled + */ + public function testDevWarning(): void + { + $application = new Application; if (!defined('COMPOSER_DEV_WARNING_TIME')) { define('COMPOSER_DEV_WARNING_TIME', time() - 1); } - $application->doRun($inputMock, $output); + $output = new BufferedOutput(); + $application->doRun(new ArrayInput(['command' => 'about']), $output); + $expectedOutput = sprintf('Warning: This development build of Composer is over 60 days old. It is recommended to update it by running "%s self-update" to get the latest version.', $_SERVER['PHP_SELF']).PHP_EOL; $this->assertStringContainsString($expectedOutput, $output->fetch()); } /** - * @param string $command - * @return void + * @runInSeparateProcess + * @preserveGlobalState disabled */ - public function ensureNoDevWarning(string $command): void + public function testDevWarningSuppressedForSelfUpdate(): void { $application = new Application; - $application->add(new \Composer\Command\SelfUpdateCommand); - $inputMock = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface')->getMock(); - $outputMock = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface')->getMock(); - - putenv('COMPOSER_NO_INTERACTION=1'); - - $inputMock->expects($this->any()) - ->method('hasParameterOption') - ->willReturnCallback(function ($opt): bool { - switch ($opt) { - case '--no-plugins': - return true; - case '--no-scripts': - return false; - case '--no-cache': - return false; - } - - return false; - }); - - $inputMock->expects($this->once()) - ->method('setInteractive') - ->with($this->equalTo(false)); - - $inputMock->expects($this->once()) - ->method('getParameterOption') - ->with($this->equalTo(array('--working-dir', '-d')), $this->equalTo(null)) - ->will($this->returnValue(null)); - - $inputMock->expects($this->any()) - ->method('getFirstArgument') - ->will($this->returnValue('about')); - - $outputMock->expects($this->never()) - ->method("writeln"); - if (!defined('COMPOSER_DEV_WARNING_TIME')) { define('COMPOSER_DEV_WARNING_TIME', time() - 1); } - $application->doRun($inputMock, $outputMock); - } - - public function testDevWarningPrevented(): void - { - $this->ensureNoDevWarning('self-update'); - } + $output = new BufferedOutput(); + $application->doRun(new ArrayInput(['command' => 'self-update']), $output); - public function testDevWarningPreventedAlias(): void - { - $this->ensureNoDevWarning('self-up'); + $this->assertSame('', $output->fetch()); } } From fb486b43e442e98e94009a1e7b3d78fef8654a51 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 16:51:17 +0200 Subject: [PATCH 044/618] Update phpstan --- composer.lock | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index 7d19af4f9d4e..d2c0111dbbc1 100644 --- a/composer.lock +++ b/composer.lock @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.6.3", + "version": "1.6.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "6128620b98292e0b69ea6d799871d77163681c8e" + "reference": "d76498c5531232cb8386ceb6004f7e013138d3ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6128620b98292e0b69ea6d799871d77163681c8e", - "reference": "6128620b98292e0b69ea6d799871d77163681c8e", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d76498c5531232cb8386ceb6004f7e013138d3ba", + "reference": "d76498c5531232cb8386ceb6004f7e013138d3ba", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.6.3" + "source": "https://github.com/phpstan/phpstan/tree/1.6.8" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-04-28T11:27:53+00:00" + "time": "2022-05-10T06:54:21+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -1986,16 +1986,16 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.2.1", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "f3ca6464eae640a556c69a02b3b77a2507475d2f" + "reference": "0c82c96f2a55d8b91bbc7ee6512c94f68a206b43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/f3ca6464eae640a556c69a02b3b77a2507475d2f", - "reference": "f3ca6464eae640a556c69a02b3b77a2507475d2f", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/0c82c96f2a55d8b91bbc7ee6512c94f68a206b43", + "reference": "0c82c96f2a55d8b91bbc7ee6512c94f68a206b43", "shasum": "" }, "require": { @@ -2028,9 +2028,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.1" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.3" }, - "time": "2022-04-28T07:20:18+00:00" + "time": "2022-05-04T15:20:40+00:00" }, { "name": "phpstan/phpstan-symfony", From df9721d21b3a1600d9c68d2b804ab20e8b57bc75 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 11 May 2022 16:52:58 +0200 Subject: [PATCH 045/618] Skip broken test on windows --- tests/Composer/Test/ApplicationTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Composer/Test/ApplicationTest.php b/tests/Composer/Test/ApplicationTest.php index f30374b2d5e8..7588e830b724 100644 --- a/tests/Composer/Test/ApplicationTest.php +++ b/tests/Composer/Test/ApplicationTest.php @@ -59,6 +59,10 @@ public function testDevWarning(): void */ public function testDevWarningSuppressedForSelfUpdate(): void { + if (Platform::isWindows()) { + $this->markTestSkipped('Does not run on windows'); + } + $application = new Application; $application->add(new \Composer\Command\SelfUpdateCommand); From b171d5531d84b10dbd4eec3f5c664924e3702cad Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Wed, 11 May 2022 19:17:58 +0200 Subject: [PATCH 046/618] CurlDownloader: Always cast Content-Type header value to string when passing to strtolower() (#10768) --- src/Composer/Util/Http/CurlDownloader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 6fe22e713871..051fca277bc1 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -626,7 +626,7 @@ private function failResponse(array $job, Response $response, string $errorMessa } $details = ''; - if (in_array(strtolower($response->getHeader('content-type')), array('application/json', 'application/json; charset=utf-8'), true)) { + if (in_array(strtolower((string) $response->getHeader('content-type')), array('application/json', 'application/json; charset=utf-8'), true)) { $details = ':'.PHP_EOL.substr($response->getBody(), 0, 200).(strlen($response->getBody()) > 200 ? '...' : ''); } From bc1fd3c8b725ca6bfecb7d9b0d78fe605e639089 Mon Sep 17 00:00:00 2001 From: Carlos Buenosvinos Date: Thu, 12 May 2022 10:24:53 +0200 Subject: [PATCH 047/618] Move navigation arrows to the bottom (#10769) Probably by merging other PR the arrows were not at the bottom. --- doc/03-cli.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index b76891b6f542..9fd8256b610b 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -1168,8 +1168,6 @@ fully offline with `1`. If set to `1`, outputs information about events being dispatched, which can be useful for plugin authors to identify what is firing when exactly. -← [Libraries](02-libraries.md) | [Schema](04-schema.md) → - ### COMPOSER_NO_DEV If set to `1`, it is the equivalent of passing the `--no-dev` argument to `install` or @@ -1180,5 +1178,6 @@ If set to `1`, it is the equivalent of passing the `--no-dev` argument to `insta If `COMPOSER_IGNORE_PLATFORM_REQS` set to `1`, it is the equivalent of passing the `--ignore-platform-reqs` argument. Otherwise, specifying a comma separated list in `COMPOSER_IGNORE_PLATFORM_REQ` will ignore those specific requirements. -For example, if a development workstation will never run database queries, this can be used to ignore the requirement for the database extensions to be available. -If you set `COMPOSER_IGNORE_PLATFORM_REQ=ext-oci8`, then composer will allow packages to be installed even if the `oci8` PHP extension is not enabled. +For example, if a development workstation will never run database queries, this can be used to ignore the requirement for the database extensions to be available. If you set `COMPOSER_IGNORE_PLATFORM_REQ=ext-oci8`, then composer will allow packages to be installed even if the `oci8` PHP extension is not enabled. + +← [Libraries](02-libraries.md) | [Schema](04-schema.md) → From 3366271d736c3b1f3991688dad1fd95f0efe6fa0 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 10:32:38 +0200 Subject: [PATCH 048/618] Fix outdated list when no new version can be matched, refs #10770 --- src/Composer/Command/ShowCommand.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index c9ac503264fe..0194662b7c8e 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -472,7 +472,11 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($writeLatest && $latestPackage) { $packageViewData['latest'] = $latestPackage->getFullPrettyVersion(); $packageViewData['latest-status'] = $this->getUpdateStatus($latestPackage, $package); - $latestLength = max($latestLength, strlen($latestPackage->getFullPrettyVersion())); + $latestLength = max($latestLength, strlen($packageViewData['latest'])); + } elseif ($writeLatest) { + $packageViewData['latest'] = '[none matched]'; + $packageViewData['latest-status'] = 'up-to-date'; + $latestLength = max($latestLength, strlen($packageViewData['latest'])); } if ($writeDescription && $package instanceof CompletePackageInterface) { $packageViewData['description'] = $package->getDescription(); From 8c7ab194c6a7c47ff5455376234a870b1d62e815 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 10:34:12 +0200 Subject: [PATCH 049/618] Fix coverage config for complete test suite --- tests/complete.phpunit.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/complete.phpunit.xml b/tests/complete.phpunit.xml index 125f3fb22a28..b30398e96533 100644 --- a/tests/complete.phpunit.xml +++ b/tests/complete.phpunit.xml @@ -31,10 +31,10 @@ - ./src/Composer/ + ../src/Composer/ - ./src/Composer/Autoload/ClassLoader.php + ../src/Composer/Autoload/ClassLoader.php From 96314b483c9f7083355f387bdb20b83e35091c6b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 14:39:49 +0200 Subject: [PATCH 050/618] Update target version to 2.4 --- composer.json | 2 +- src/Composer/Composer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 7696422998dc..625452ba4c3d 100644 --- a/composer.json +++ b/composer.json @@ -62,7 +62,7 @@ }, "extra": { "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.4-dev" } }, "autoload": { diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 93e8c0a6f5d6..e07bac101417 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -54,7 +54,7 @@ class Composer extends PartialComposer public const VERSION = '@package_version@'; public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.3.999-dev+source'; + public const SOURCE_VERSION = '2.4.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 766943c76733411f177cef6464d950cf1240a784 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 15:00:00 +0200 Subject: [PATCH 051/618] Update lock file --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index d2c0111dbbc1..28eda92d6584 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9e35cddef900ba721bf84c8cda25db75", + "content-hash": "11dd7e3505d8c3d1a04825b956ae2832", "packages": [ { "name": "composer/ca-bundle", From fe6be142b1a84a1e935b8953be18626336a2bf36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20TAMARELLE?= Date: Tue, 30 Nov 2021 01:03:23 +0100 Subject: [PATCH 052/618] Add completion on commands --- src/Composer/Command/ArchiveCommand.php | 13 +++ src/Composer/Command/BaseCommand.php | 100 +++++++++++++++- src/Composer/Command/CreateProjectCommand.php | 7 ++ src/Composer/Command/DependsCommand.php | 7 ++ src/Composer/Command/ExecCommand.php | 53 ++++++--- src/Composer/Command/GlobalCommand.php | 13 +++ src/Composer/Command/HomeCommand.php | 7 ++ src/Composer/Command/InitCommand.php | 10 ++ src/Composer/Command/InstallCommand.php | 7 ++ src/Composer/Command/OutdatedCommand.php | 7 ++ src/Composer/Command/ProhibitsCommand.php | 7 ++ src/Composer/Command/ReinstallCommand.php | 7 ++ src/Composer/Command/RemoveCommand.php | 7 ++ src/Composer/Command/RequireCommand.php | 7 ++ src/Composer/Command/RunScriptCommand.php | 9 ++ src/Composer/Command/SearchCommand.php | 9 ++ src/Composer/Command/ShowCommand.php | 14 ++- src/Composer/Command/SuggestsCommand.php | 7 ++ src/Composer/Command/UpdateCommand.php | 7 ++ .../Package/Version/VersionGuesser.php | 6 + src/Composer/Util/HttpDownloader.php | 38 ++++-- .../Test/CompletionFunctionalTest.php | 109 ++++++++++++++++++ 22 files changed, 423 insertions(+), 28 deletions(-) create mode 100644 tests/Composer/Test/CompletionFunctionalTest.php diff --git a/src/Composer/Command/ArchiveCommand.php b/src/Composer/Command/ArchiveCommand.php index fa450a6da7d1..2629db7e95c1 100644 --- a/src/Composer/Command/ArchiveCommand.php +++ b/src/Composer/Command/ArchiveCommand.php @@ -27,6 +27,8 @@ use Composer\Util\Loop; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -39,6 +41,17 @@ */ class ArchiveCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($this->completeAvailablePackage($input, $suggestions)) { + return; + } + + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues(['tar', 'tar.gz', 'tar.bz2', 'zip']); + } + } + /** * @return void */ diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index c4f2ace111fb..dc88c5e17908 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -20,10 +20,19 @@ use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\IO\IOInterface; use Composer\IO\NullIO; +use Composer\Package\Package; +use Composer\Package\PackageInterface; use Composer\Plugin\PreCommandRunEvent; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginEvents; +use Composer\Repository\CompositeRepository; +use Composer\Repository\InstalledRepository; +use Composer\Repository\PlatformRepository; +use Composer\Repository\RepositoryInterface; +use Composer\Repository\RootPackageRepository; use Composer\Util\Platform; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Helper\TableSeparator; use Symfony\Component\Console\Input\InputInterface; @@ -317,7 +326,96 @@ protected function getPlatformRequirementFilter(InputInterface $input): Platform } /** - * @param array $requirements + * Suggestion values for "prefer-install" option + */ + protected function completePreferInstall(CompletionInput $input, CompletionSuggestions $suggestions): bool + { + if ($input->mustSuggestOptionValuesFor('prefer-install')) { + $suggestions->suggestValues(['dist', 'source', 'auto']); + + return true; + } + + return false; + } + + /** + * Suggest package names from installed ones. + */ + protected function completeInstalledPackage(CompletionInput $input, CompletionSuggestions $suggestions): bool + { + if (!$input->mustSuggestArgumentValuesFor('packages') && + !$input->mustSuggestArgumentValuesFor('package') && + !$input->mustSuggestOptionValuesFor('ignore') + ) { + return false; + } + + $composer = $this->getComposer(); + $installedRepos = [new RootPackageRepository(clone $composer->getPackage())]; + + $locker = $composer->getLocker(); + if ($locker->isLocked()) { + $installedRepos[] = $locker->getLockedRepository(true); + } else { + $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); + } + + $installedRepo = new InstalledRepository($installedRepos); + $suggestions->suggestValues(array_map(function (PackageInterface $package) { + return $package->getName(); + }, $installedRepo->getPackages())); + + return true; + } + + /** + * Suggest package names available on all configured repositories. + */ + protected function completeAvailablePackage(CompletionInput $input, CompletionSuggestions $suggestions): bool + { + if (!$input->mustSuggestArgumentValuesFor('packages') && + !$input->mustSuggestArgumentValuesFor('package') && + !$input->mustSuggestOptionValuesFor('require') && + !$input->mustSuggestOptionValuesFor('require-dev') + ) { + return false; + } + + $composer = $this->getComposer(); + $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); + + $packages = $repos->search('^'.preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); + + foreach (array_slice($packages, 0, 150) as $package) { + $suggestions->suggestValue($package['name']); + } + + return true; + } + + /** + * Suggests ext- packages from the ones available on the currently-running PHP + */ + protected function completePlatformPackage(CompletionInput $input, CompletionSuggestions $suggestions): bool + { + if (!$input->mustSuggestOptionValuesFor('require') && + !$input->mustSuggestOptionValuesFor('require-dev') && + !str_starts_with($input->getCompletionValue(), 'ext-') + ) { + return false; + } + + $repos = new PlatformRepository([], $this->getComposer()->getConfig()->get('platform') ?? []); + $suggestions->suggestValues(array_map(function (PackageInterface $package) { + return $package->getName(); + }, $repos->getPackages())); + + return true; + } + + /** + * @param array $requirements * * @return array */ diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 1e98f836df96..341caaaa8fce 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -33,6 +33,8 @@ use Composer\Repository\RepositorySet; use Composer\Script\ScriptEvents; use Composer\Util\Silencer; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -55,6 +57,11 @@ */ class CreateProjectCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeAvailablePackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); + } + /** * @var SuggestedPackagesReporter */ diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index 0dbbb03f2cf7..d5c65ed46438 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -12,6 +12,8 @@ namespace Composer\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; @@ -22,6 +24,11 @@ */ class DependsCommand extends BaseDependencyCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions); + } + /** * Configure command metadata. * diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index 049f6b687a05..1afdb6e8d7b5 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -12,6 +12,8 @@ namespace Composer\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -22,6 +24,13 @@ */ class ExecCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestArgumentValuesFor('binary')) { + $suggestions->suggestValues($this->getBinaries(false)); + } + } + /** * @return void */ @@ -52,14 +61,11 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->requireComposer(); - $binDir = $composer->getConfig()->get('bin-dir'); - if ($input->getOption('list') || null === $input->getArgument('binary')) { - $bins = glob($binDir . '/*'); - $bins = array_merge($bins, array_map(function ($e) { - return "$e (local)"; - }, $composer->getPackage()->getBinaries())); + if ($input->getOption('list') || !$input->getArgument('binary')) { + $bins = $this->getBinaries(true); + if (count($bins) > 0) { + $binDir = $composer->getConfig()->get('bin-dir'); - if (!$bins) { throw new \RuntimeException("No binaries found in composer.json or in bin-dir ($binDir)"); } @@ -70,13 +76,6 @@ protected function execute(InputInterface $input, OutputInterface $output) ); foreach ($bins as $bin) { - // skip .bat copies - if (isset($previousBin) && $bin === $previousBin.'.bat') { - continue; - } - - $previousBin = $bin; - $bin = basename($bin); $this->getIO()->write( <<- $bin @@ -105,4 +104,30 @@ protected function execute(InputInterface $input, OutputInterface $output) return $dispatcher->dispatchScript('__exec_command', true, $input->getArgument('args')); } + + private function getBinaries(bool $forDisplay): array + { + $composer = $this->getComposer(); + $binDir = $composer->getConfig()->get('bin-dir'); + $bins = glob($binDir . '/*'); + $localBins = $composer->getPackage()->getBinaries(); + if ($forDisplay) { + $localBins = array_map(function ($e) { + return "$e (local)"; + }, $localBins); + } + + $binaries = []; + foreach (array_merge($bins, $localBins) as $bin) { + // skip .bat copies + if (isset($previousBin) && $bin === $previousBin.'.bat') { + continue; + } + + $previousBin = $bin; + $binaries[] = basename($bin); + } + + return $binaries; + } } diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index 3ec1254271f0..ea9b496e3d1a 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -16,6 +16,9 @@ use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\StringInput; @@ -26,6 +29,16 @@ */ class GlobalCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $application = $this->getApplication(); + if ($input->mustSuggestArgumentValuesFor('command-name')) { + $suggestions->suggestValues(array_filter(array_map(function (Command $command) { + return $command->isHidden() ? null : $command->getName(); + }, $application->all()))); + } + } + /** * @return void */ diff --git a/src/Composer/Command/HomeCommand.php b/src/Composer/Command/HomeCommand.php index dad4e3a7540f..db715617cfc9 100644 --- a/src/Composer/Command/HomeCommand.php +++ b/src/Composer/Command/HomeCommand.php @@ -18,6 +18,8 @@ use Composer\Repository\RepositoryFactory; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; @@ -28,6 +30,11 @@ */ class HomeCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions); + } + /** * @inheritDoc * diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index f923f692913d..8af6719c491b 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -23,6 +23,8 @@ use Composer\Repository\RepositoryFactory; use Composer\Util\Filesystem; use Composer\Util\Silencer; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -42,6 +44,14 @@ class InitCommand extends BaseCommand /** @var array */ private $gitConfig; + /** @var RepositorySet[] */ + private $repositorySets; + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeAvailablePackage($input, $suggestions); + } + /** * @inheritDoc * diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 13b6ff400628..cbc51042dd31 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -16,6 +16,8 @@ use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\HttpDownloader; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; @@ -29,6 +31,11 @@ */ class InstallCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completePreferInstall($input, $suggestions) || $this->completeInstalledPackage($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index def190c04d7b..120291b6a8d5 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -12,6 +12,8 @@ namespace Composer\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\ArrayInput; @@ -23,6 +25,11 @@ */ class OutdatedCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Command/ProhibitsCommand.php b/src/Composer/Command/ProhibitsCommand.php index 6da462084f7b..45908ec40b7f 100644 --- a/src/Composer/Command/ProhibitsCommand.php +++ b/src/Composer/Command/ProhibitsCommand.php @@ -12,6 +12,8 @@ namespace Composer\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; @@ -22,6 +24,11 @@ */ class ProhibitsCommand extends BaseDependencyCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeAvailablePackage($input, $suggestions); + } + /** * Configure command metadata. * diff --git a/src/Composer/Command/ReinstallCommand.php b/src/Composer/Command/ReinstallCommand.php index 8150bfa22736..c845fc3f596b 100644 --- a/src/Composer/Command/ReinstallCommand.php +++ b/src/Composer/Command/ReinstallCommand.php @@ -22,6 +22,8 @@ use Composer\Plugin\PluginEvents; use Composer\Script\ScriptEvents; use Composer\Util\Platform; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; @@ -32,6 +34,11 @@ */ class ReinstallCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 9d1fa4965027..d558e4c0c54a 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -20,6 +20,8 @@ use Composer\Plugin\PluginEvents; use Composer\Json\JsonFile; use Composer\Factory; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; @@ -32,6 +34,11 @@ */ class RemoveCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 230e449c6ef4..ff8d399762d1 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -14,6 +14,8 @@ use Composer\DependencyResolver\Request; use Composer\Util\Filesystem; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; @@ -58,6 +60,11 @@ class RequireCommand extends BaseCommand /** @var bool */ private $dependencyResolutionCompleted = false; + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completePlatformPackage($input, $suggestions) || $this->completeAvailablePackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Command/RunScriptCommand.php b/src/Composer/Command/RunScriptCommand.php index c626d9ccf04f..2b035cab2ee5 100644 --- a/src/Composer/Command/RunScriptCommand.php +++ b/src/Composer/Command/RunScriptCommand.php @@ -16,6 +16,8 @@ use Composer\Script\ScriptEvents; use Composer\Util\ProcessExecutor; use Composer\Util\Platform; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; @@ -44,6 +46,13 @@ class RunScriptCommand extends BaseCommand ScriptEvents::POST_AUTOLOAD_DUMP, ); + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestArgumentValuesFor('script')) { + $suggestions->suggestValues(array_keys($this->getComposer()->getPackage()->getScripts())); + } + } + /** * @return void */ diff --git a/src/Composer/Command/SearchCommand.php b/src/Composer/Command/SearchCommand.php index f701e40d91d4..f7dfa2001724 100644 --- a/src/Composer/Command/SearchCommand.php +++ b/src/Composer/Command/SearchCommand.php @@ -14,6 +14,8 @@ use Composer\Factory; use Composer\Json\JsonFile; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; @@ -30,6 +32,13 @@ */ class SearchCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues(['json', 'text']); + } + } + /** * @return void */ diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 0194662b7c8e..c128295c47f4 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -20,7 +20,6 @@ use Composer\Package\CompletePackageInterface; use Composer\Package\Link; use Composer\Package\AliasPackage; -use Composer\Package\Package; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; @@ -41,6 +40,8 @@ use Composer\Semver\Semver; use Composer\Spdx\SpdxLicenses; use Composer\Util\PackageInfo; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Input\InputArgument; @@ -64,6 +65,17 @@ class ShowCommand extends BaseCommand /** @var ?RepositorySet */ private $repositorySet; + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($this->completeInstalledPackage($input, $suggestions)) { + return; + } + + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues(['json', 'text']); + } + } + /** * @return void */ diff --git a/src/Composer/Command/SuggestsCommand.php b/src/Composer/Command/SuggestsCommand.php index 23776abb5ba2..173337691f7b 100644 --- a/src/Composer/Command/SuggestsCommand.php +++ b/src/Composer/Command/SuggestsCommand.php @@ -16,6 +16,8 @@ use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Installer\SuggestedPackagesReporter; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -23,6 +25,11 @@ class SuggestsCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 8bd3a9bfe26f..c89f1a58aa8e 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -24,6 +24,8 @@ use Composer\Util\HttpDownloader; use Composer\Semver\Constraint\MultiConstraint; use Composer\Package\Link; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -37,6 +39,11 @@ */ class UpdateCommand extends BaseCommand { + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $this->completeInstalledPackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); + } + /** * @return void */ diff --git a/src/Composer/Package/Version/VersionGuesser.php b/src/Composer/Package/Version/VersionGuesser.php index bc2610a63bed..96384b128690 100644 --- a/src/Composer/Package/Version/VersionGuesser.php +++ b/src/Composer/Package/Version/VersionGuesser.php @@ -74,6 +74,12 @@ public function guessVersion(array $packageConfig, string $path): ?array return null; } + // bypass version guessing in bash completions as it takes time to create + // new processes and the root version is usually not that important + if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] === '_complete') { + return null; + } + $versionData = $this->guessGitVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); diff --git a/src/Composer/Util/HttpDownloader.php b/src/Composer/Util/HttpDownloader.php index 581e17226a26..4fb6b9f76e4e 100644 --- a/src/Composer/Util/HttpDownloader.php +++ b/src/Composer/Util/HttpDownloader.php @@ -44,8 +44,12 @@ class HttpDownloader private $config; /** @var array */ private $jobs = array(); + /** @var bool */ + private $disableTls; /** @var mixed[] */ private $options = array(); + /** @var mixed[]|null */ + private $tlsDefaultOptions = null; /** @var int */ private $runningJobs = 0; /** @var int */ @@ -73,22 +77,19 @@ public function __construct(IOInterface $io, Config $config, array $options = ar $this->disabled = (bool) Platform::getEnv('COMPOSER_DISABLE_NETWORK'); - // Setup TLS options - // The cafile option can be set via config.json - if ($disableTls === false) { - $this->options = StreamContextFactory::getTlsDefaults($options, $io); + if ($disableTls === true) { + // make sure the tlsDefaultOptions are not loaded later + $this->tlsDefaultOptions = []; } - // handle the other externally set options normally. - $this->options = array_replace_recursive($this->options, $options); + $this->disableTls = $disableTls; + $this->options = $options; $this->config = $config; if (self::isCurlEnabled()) { $this->curl = new CurlDownloader($io, $config, $options, $disableTls); } - $this->rfs = new RemoteFilesystem($io, $config, $options, $disableTls); - if (is_numeric($maxJobs = Platform::getEnv('COMPOSER_MAX_PARALLEL_HTTP'))) { $this->maxJobs = max(1, min(50, (int) $maxJobs)); } @@ -171,7 +172,13 @@ public function addCopy(string $url, string $to, array $options = array()) */ public function getOptions() { - return $this->options; + if ($this->tlsDefaultOptions === null) { + // Setup TLS options + // The cafile option can be set via config.json + $this->tlsDefaultOptions = StreamContextFactory::getTlsDefaults($this->options, $this->io); + } + + return array_replace_recursive($this->tlsDefaultOptions, $this->options); } /** @@ -191,7 +198,7 @@ public function setOptions(array $options) */ private function addJob(array $request, bool $sync = false): array { - $request['options'] = array_replace_recursive($this->options, $request['options']); + $request['options'] = array_replace_recursive($this->getOptions(), $request['options']); /** @var Job */ $job = array( @@ -211,8 +218,6 @@ private function addJob(array $request, bool $sync = false): array $this->io->setAuthentication($job['origin'], rawurldecode($match[1]), rawurldecode($match[2])); } - $rfs = $this->rfs; - if ($this->canUseCurl($job)) { $resolver = function ($resolve, $reject) use (&$job): void { $job['status'] = HttpDownloader::STATUS_QUEUED; @@ -285,6 +290,15 @@ private function addJob(array $request, bool $sync = false): array return array($job, $promise); } + private function getRFS(): RemoteFilesystem + { + if (null === $this->rfs) { + $this->rfs = new RemoteFilesystem($this->io, $this->config, $this->options, $this->disableTls); + } + + return $this->rfs; + } + /** * @param int $id * @return void diff --git a/tests/Composer/Test/CompletionFunctionalTest.php b/tests/Composer/Test/CompletionFunctionalTest.php new file mode 100644 index 000000000000..a2f1ce8c0dcf --- /dev/null +++ b/tests/Composer/Test/CompletionFunctionalTest.php @@ -0,0 +1,109 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test; + +use Composer\Console\Application; +use Symfony\Component\Console\Tester\CommandCompletionTester; + +/** + * Validate autocompletion for all commands. + * + * @author Jérôme Tamarelle + */ +class CompletionFunctionalTest extends TestCase +{ + public function getCommandSuggestions(): iterable + { + $randomProject = '104corp/cache'; + $installedPackages = ['composer/semver', 'psr/log']; + $preferInstall = ['dist', 'source', 'auto']; + + yield ['archive ', [$randomProject]]; + yield ['archive symfony/http-', ['symfony/http-kernel', 'symfony/http-foundation']]; + yield ['archive --format ', ['tar', 'zip']]; + + yield ['create-project ', [$randomProject]]; + yield ['create-project symfony/skeleton --prefer-install ', $preferInstall]; + + yield ['depends ', $installedPackages]; + yield ['why ', $installedPackages]; + + yield ['exec ', ['composer', 'compile']]; + + yield ['browse ', $installedPackages]; + yield ['home -H ', $installedPackages]; + + yield ['init --require ', [$randomProject]]; + yield ['init --require-dev foo/bar --require-dev ', [$randomProject]]; + + yield ['install --prefer-install ', $preferInstall]; + yield ['install ', $installedPackages]; + + yield ['outdated ', $installedPackages]; + + yield ['prohibits ', [$randomProject]]; + yield ['why-not symfony/http-ker', ['symfony/http-kernel']]; + + yield ['reinstall --prefer-install ', $preferInstall]; + yield ['reinstall ', $installedPackages]; + + yield ['remove ', $installedPackages]; + + yield ['require --prefer-install ', $preferInstall]; + yield ['require ', [$randomProject]]; + yield ['require --dev symfony/http-', ['symfony/http-kernel', 'symfony/http-foundation']]; + + yield ['run-script ', ['compile', 'test', 'phpstan']]; + yield ['run-script test ', null]; + + yield ['search --format ', ['text', 'json']]; + + yield ['show --format ', ['text', 'json']]; + yield ['info ', $installedPackages]; + + yield ['suggests ', $installedPackages]; + + yield ['update --prefer-install ', $preferInstall]; + yield ['update ', $installedPackages]; + } + + /** + * @dataProvider getCommandSuggestions + * + * @param string $input The command that is typed + * @param string[]|null $expectedSuggestions Sample expected suggestions. Null if nothing is expected. + */ + public function testComplete(string $input, ?array $expectedSuggestions): void + { + $input = explode(' ', $input); + $commandName = array_shift($input); + $command = $this->getApplication()->get($commandName); + + $tester = new CommandCompletionTester($command); + $suggestions = $tester->complete($input); + + if (null === $expectedSuggestions) { + $this->assertEmpty($suggestions); + + return; + } + + $diff = array_diff($expectedSuggestions, $suggestions); + $this->assertEmpty($diff, sprintf('Suggestions must contain "%s". Got "%s".', implode('", "', $diff), implode('", "', $suggestions))); + } + + private function getApplication(): Application + { + return new Application(); + } +} From ed7d8219addbc9d1abe7ae6224a035d57530dea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Thu, 14 Apr 2022 22:24:33 +0200 Subject: [PATCH 053/618] Backport bash completion suggestion definition from symfony/console 6.1 --- src/Composer/Command/ArchiveCommand.php | 21 +-- src/Composer/Command/BaseCommand.php | 124 ++++-------------- src/Composer/Command/CompletionTrait.php | 102 ++++++++++++++ src/Composer/Command/CreateProjectCommand.php | 15 +-- src/Composer/Command/DependsCommand.php | 13 +- src/Composer/Command/ExecCommand.php | 23 ++-- src/Composer/Command/FundCommand.php | 4 +- src/Composer/Command/GlobalCommand.php | 2 +- src/Composer/Command/HomeCommand.php | 13 +- src/Composer/Command/InitCommand.php | 17 +-- src/Composer/Command/InstallCommand.php | 15 +-- src/Composer/Command/OutdatedCommand.php | 15 +-- src/Composer/Command/ProhibitsCommand.php | 13 +- src/Composer/Command/ReinstallCommand.php | 15 +-- src/Composer/Command/RemoveCommand.php | 13 +- src/Composer/Command/RequireCommand.php | 16 +-- src/Composer/Command/RunScriptCommand.php | 17 +-- src/Composer/Command/ScriptAliasCommand.php | 4 +- src/Composer/Command/SearchCommand.php | 15 +-- src/Composer/Command/SelfUpdateCommand.php | 4 +- src/Composer/Command/ShowCommand.php | 25 +--- src/Composer/Command/StatusCommand.php | 2 +- src/Composer/Command/SuggestsCommand.php | 13 +- src/Composer/Command/UpdateCommand.php | 15 +-- src/Composer/Console/Input/InputArgument.php | 61 +++++++++ src/Composer/Console/Input/InputOption.php | 65 +++++++++ src/Composer/Factory.php | 14 +- .../Package/Version/VersionGuesser.php | 3 +- src/Composer/Util/HttpDownloader.php | 38 ++---- src/Composer/Util/Platform.php | 8 ++ 30 files changed, 376 insertions(+), 329 deletions(-) create mode 100644 src/Composer/Command/CompletionTrait.php create mode 100644 src/Composer/Console/Input/InputArgument.php create mode 100644 src/Composer/Console/Input/InputOption.php diff --git a/src/Composer/Command/ArchiveCommand.php b/src/Composer/Command/ArchiveCommand.php index 2629db7e95c1..1114ed02904c 100644 --- a/src/Composer/Command/ArchiveCommand.php +++ b/src/Composer/Command/ArchiveCommand.php @@ -27,11 +27,9 @@ use Composer\Util\Loop; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** @@ -41,16 +39,9 @@ */ class ArchiveCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($this->completeAvailablePackage($input, $suggestions)) { - return; - } + use CompletionTrait; - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues(['tar', 'tar.gz', 'tar.bz2', 'zip']); - } - } + private const FORMATS = ['tar', 'tar.gz', 'tar.bz2', 'zip']; /** * @return void @@ -61,9 +52,9 @@ protected function configure(): void ->setName('archive') ->setDescription('Creates an archive of this composer package.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'The package to archive instead of the current project'), + new InputArgument('package', InputArgument::OPTIONAL, 'The package to archive instead of the current project', null, $this->suggestAvailablePackage()), new InputArgument('version', InputArgument::OPTIONAL, 'A version constraint to find the package to archive'), - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the resulting archive: tar, tar.gz, tar.bz2 or zip (default tar)'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the resulting archive: tar, tar.gz, tar.bz2 or zip (default tar)', null, self::FORMATS), new InputOption('dir', null, InputOption::VALUE_REQUIRED, 'Write the archive to this directory'), new InputOption('file', null, InputOption::VALUE_REQUIRED, 'Write the archive with the given file name.' .' Note that the format will be appended.'), diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index dc88c5e17908..7ab897d5d054 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -15,21 +15,16 @@ use Composer\Composer; use Composer\Config; use Composer\Console\Application; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; use Composer\Factory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\IO\IOInterface; use Composer\IO\NullIO; -use Composer\Package\Package; -use Composer\Package\PackageInterface; use Composer\Plugin\PreCommandRunEvent; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginEvents; -use Composer\Repository\CompositeRepository; -use Composer\Repository\InstalledRepository; -use Composer\Repository\PlatformRepository; -use Composer\Repository\RepositoryInterface; -use Composer\Repository\RootPackageRepository; use Composer\Util\Platform; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; @@ -191,6 +186,30 @@ public function setIO(IOInterface $io) $this->io = $io; } + /** + * @inheritdoc + * + * Backport suggested values definition from symfony/console 6.1+ + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $definition = $this->getDefinition(); + $name = (string) $input->getCompletionName(); + if (CompletionInput::TYPE_OPTION_VALUE === $input->getCompletionType() + && $definition->hasOption($name) + && ($option = $definition->getOption($name)) instanceof InputOption + ) { + $option->complete($input, $suggestions); + } elseif (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() + && $definition->hasArgument($name) + && ($argument = $definition->getArgument($name)) instanceof InputArgument + ) { + $argument->complete($input, $suggestions); + } else { + parent::complete($input, $suggestions); + } + } + /** * @inheritDoc * @@ -326,96 +345,7 @@ protected function getPlatformRequirementFilter(InputInterface $input): Platform } /** - * Suggestion values for "prefer-install" option - */ - protected function completePreferInstall(CompletionInput $input, CompletionSuggestions $suggestions): bool - { - if ($input->mustSuggestOptionValuesFor('prefer-install')) { - $suggestions->suggestValues(['dist', 'source', 'auto']); - - return true; - } - - return false; - } - - /** - * Suggest package names from installed ones. - */ - protected function completeInstalledPackage(CompletionInput $input, CompletionSuggestions $suggestions): bool - { - if (!$input->mustSuggestArgumentValuesFor('packages') && - !$input->mustSuggestArgumentValuesFor('package') && - !$input->mustSuggestOptionValuesFor('ignore') - ) { - return false; - } - - $composer = $this->getComposer(); - $installedRepos = [new RootPackageRepository(clone $composer->getPackage())]; - - $locker = $composer->getLocker(); - if ($locker->isLocked()) { - $installedRepos[] = $locker->getLockedRepository(true); - } else { - $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); - } - - $installedRepo = new InstalledRepository($installedRepos); - $suggestions->suggestValues(array_map(function (PackageInterface $package) { - return $package->getName(); - }, $installedRepo->getPackages())); - - return true; - } - - /** - * Suggest package names available on all configured repositories. - */ - protected function completeAvailablePackage(CompletionInput $input, CompletionSuggestions $suggestions): bool - { - if (!$input->mustSuggestArgumentValuesFor('packages') && - !$input->mustSuggestArgumentValuesFor('package') && - !$input->mustSuggestOptionValuesFor('require') && - !$input->mustSuggestOptionValuesFor('require-dev') - ) { - return false; - } - - $composer = $this->getComposer(); - $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); - - $packages = $repos->search('^'.preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); - - foreach (array_slice($packages, 0, 150) as $package) { - $suggestions->suggestValue($package['name']); - } - - return true; - } - - /** - * Suggests ext- packages from the ones available on the currently-running PHP - */ - protected function completePlatformPackage(CompletionInput $input, CompletionSuggestions $suggestions): bool - { - if (!$input->mustSuggestOptionValuesFor('require') && - !$input->mustSuggestOptionValuesFor('require-dev') && - !str_starts_with($input->getCompletionValue(), 'ext-') - ) { - return false; - } - - $repos = new PlatformRepository([], $this->getComposer()->getConfig()->get('platform') ?? []); - $suggestions->suggestValues(array_map(function (PackageInterface $package) { - return $package->getName(); - }, $repos->getPackages())); - - return true; - } - - /** - * @param array $requirements + * @param array $requirements * * @return array */ diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php new file mode 100644 index 000000000000..c16c3a8f5cac --- /dev/null +++ b/src/Composer/Command/CompletionTrait.php @@ -0,0 +1,102 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Command; + +use Composer\Composer; +use Composer\Package\PackageInterface; +use Composer\Repository\CompositeRepository; +use Composer\Repository\InstalledRepository; +use Composer\Repository\PlatformRepository; +use Composer\Repository\RepositoryInterface; +use Composer\Repository\RootPackageRepository; +use Symfony\Component\Console\Completion\CompletionInput; + +/** + * Adds completion to arguments and options. + * + * @internal + */ +trait CompletionTrait +{ + /** + * @see BaseCommand::requireComposer() + */ + abstract public function requireComposer(bool $disablePlugins = null, bool $disableScripts = null): Composer; + + /** + * Suggestion values for "prefer-install" option + */ + private function suggestPreferInstall(): array + { + return ['dist', 'source', 'auto']; + } + + /** + * Suggest package names from installed. + */ + private function suggestInstalledPackage(): \Closure + { + return function (): array { + $composer = $this->requireComposer(); + $installedRepos = [new RootPackageRepository(clone $composer->getPackage())]; + + $locker = $composer->getLocker(); + if ($locker->isLocked()) { + $installedRepos[] = $locker->getLockedRepository(true); + } else { + $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); + } + + $installedRepo = new InstalledRepository($installedRepos); + + return array_map(function (PackageInterface $package) { + return $package->getName(); + }, $installedRepo->getPackages()); + }; + } + + /** + * Suggest package names available on all configured repositories. + * @todo rework to list packages from cache + */ + private function suggestAvailablePackage(): \Closure + { + return function (CompletionInput $input) { + $composer = $this->requireComposer(); + $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); + + $packages = $repos->search('^' . preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); + + return array_column(array_slice($packages, 0, 150), 'name'); + }; + } + + /** + * Suggest package names available on all configured repositories or + * ext- packages from the ones available on the currently-running PHP + */ + private function suggestAvailablePackageOrExtension(): \Closure + { + return function (CompletionInput $input) { + if (!str_starts_with($input->getCompletionValue(), 'ext-')) { + return $this->suggestAvailablePackage()($input); + } + + $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform') ?? []); + + return array_map(function (PackageInterface $package) { + return $package->getName(); + }, $repos->getPackages()); + }; + } +} diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 341caaaa8fce..23356c267c1c 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -33,11 +33,9 @@ use Composer\Repository\RepositorySet; use Composer\Script\ScriptEvents; use Composer\Util\Silencer; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Finder\Finder; use Composer\Json\JsonFile; @@ -57,10 +55,7 @@ */ class CreateProjectCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeAvailablePackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); - } + use CompletionTrait; /** * @var SuggestedPackagesReporter @@ -76,13 +71,13 @@ protected function configure(): void ->setName('create-project') ->setDescription('Creates new project from a package into given directory.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed'), + new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed', null, $this->suggestAvailablePackage()), new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'), new InputArgument('version', InputArgument::OPTIONAL, 'Version, will default to latest'), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum-stability allowed (unless a version is specified).'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), - new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).'), + new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories to look the package up, either by URL or using JSON arrays'), new InputOption('repository-url', null, InputOption::VALUE_REQUIRED, 'DEPRECATED: Use --repository instead.'), new InputOption('add-repository', null, InputOption::VALUE_NONE, 'Add the custom repository in the composer.json. If a lock file is present it will be deleted and an update will be run instead of install.'), diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index d5c65ed46438..53ba7115f804 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -12,22 +12,17 @@ namespace Composer\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; /** * @author Niels Keurentjes */ class DependsCommand extends BaseDependencyCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeInstalledPackage($input, $suggestions); - } + use CompletionTrait; /** * Configure command metadata. @@ -41,7 +36,7 @@ protected function configure(): void ->setAliases(array('why')) ->setDescription('Shows which packages cause the given package to be installed.') ->setDefinition(array( - new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect'), + new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage()), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), )) diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index 1afdb6e8d7b5..49df0a83244f 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -12,25 +12,16 @@ namespace Composer\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputArgument; /** * @author Davey Shafik */ class ExecCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestArgumentValuesFor('binary')) { - $suggestions->suggestValues($this->getBinaries(false)); - } - } - /** * @return void */ @@ -41,7 +32,9 @@ protected function configure() ->setDescription('Executes a vendored binary/script.') ->setDefinition(array( new InputOption('list', 'l', InputOption::VALUE_NONE), - new InputArgument('binary', InputArgument::OPTIONAL, 'The binary to run, e.g. phpunit'), + new InputArgument('binary', InputArgument::OPTIONAL, 'The binary to run, e.g. phpunit', null, function () { + return $this->getBinaries(false); + }), new InputArgument( 'args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, @@ -61,9 +54,9 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->requireComposer(); - if ($input->getOption('list') || !$input->getArgument('binary')) { + if ($input->getOption('list') || null === $input->getArgument('binary')) { $bins = $this->getBinaries(true); - if (count($bins) > 0) { + if ([] === $bins) { $binDir = $composer->getConfig()->get('bin-dir'); throw new \RuntimeException("No binaries found in composer.json or in bin-dir ($binDir)"); @@ -107,7 +100,7 @@ protected function execute(InputInterface $input, OutputInterface $output) private function getBinaries(bool $forDisplay): array { - $composer = $this->getComposer(); + $composer = $this->requireComposer(); $binDir = $composer->getConfig()->get('bin-dir'); $bins = glob($binDir . '/*'); $localBins = $composer->getPackage()->getBinaries(); diff --git a/src/Composer/Command/FundCommand.php b/src/Composer/Command/FundCommand.php index 057fea5d6eab..15960d294523 100644 --- a/src/Composer/Command/FundCommand.php +++ b/src/Composer/Command/FundCommand.php @@ -21,7 +21,7 @@ use Composer\Semver\Constraint\MatchAllConstraint; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** @@ -38,7 +38,7 @@ protected function configure(): void $this->setName('fund') ->setDescription('Discover how to help fund the maintenance of your dependencies.') ->setDefinition(array( - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['text', 'json']), )) ; } diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index ea9b496e3d1a..d74bf2b14279 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -20,7 +20,7 @@ use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Output\OutputInterface; diff --git a/src/Composer/Command/HomeCommand.php b/src/Composer/Command/HomeCommand.php index db715617cfc9..5e792af6398c 100644 --- a/src/Composer/Command/HomeCommand.php +++ b/src/Composer/Command/HomeCommand.php @@ -18,10 +18,8 @@ use Composer\Repository\RepositoryFactory; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -30,10 +28,7 @@ */ class HomeCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeInstalledPackage($input, $suggestions); - } + use CompletionTrait; /** * @inheritDoc @@ -47,7 +42,7 @@ protected function configure(): void ->setAliases(array('home')) ->setDescription('Opens the package\'s repository URL or homepage in your browser.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY, 'Package(s) to browse to.'), + new InputArgument('packages', InputArgument::IS_ARRAY, 'Package(s) to browse to.', null, $this->suggestInstalledPackage()), new InputOption('homepage', 'H', InputOption::VALUE_NONE, 'Open the homepage instead of the repository URL.'), new InputOption('show', 's', InputOption::VALUE_NONE, 'Only show the homepage or repository URL.'), )) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 8af6719c491b..6677da1019ef 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -23,11 +23,9 @@ use Composer\Repository\RepositoryFactory; use Composer\Util\Filesystem; use Composer\Util\Silencer; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Process\ExecutableFinder; use Symfony\Component\Process\Process; @@ -39,19 +37,12 @@ */ class InitCommand extends BaseCommand { + use CompletionTrait; use PackageDiscoveryTrait; /** @var array */ private $gitConfig; - /** @var RepositorySet[] */ - private $repositorySets; - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeAvailablePackage($input, $suggestions); - } - /** * @inheritDoc * @@ -68,8 +59,8 @@ protected function configure() new InputOption('author', null, InputOption::VALUE_REQUIRED, 'Author name of package'), new InputOption('type', null, InputOption::VALUE_OPTIONAL, 'Type of package (e.g. library, project, metapackage, composer-plugin)'), new InputOption('homepage', null, InputOption::VALUE_REQUIRED, 'Homepage of package'), - new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"'), - new InputOption('require-dev', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require for development with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"'), + new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackage()), + new InputOption('require-dev', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require for development with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackage()), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum stability (empty or one of: '.implode(', ', array_keys(BasePackage::$stabilities)).')'), new InputOption('license', 'l', InputOption::VALUE_REQUIRED, 'License of package'), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories, either by URL or using JSON arrays'), diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index cbc51042dd31..35c7f664e26c 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -16,11 +16,9 @@ use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\HttpDownloader; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; /** @@ -31,10 +29,7 @@ */ class InstallCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completePreferInstall($input, $suggestions) || $this->completeInstalledPackage($input, $suggestions); - } + use CompletionTrait; /** * @return void @@ -48,7 +43,7 @@ protected function configure() ->setDefinition(array( new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), - new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).'), + new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('dev', null, InputOption::VALUE_NONE, 'DEPRECATED: Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), @@ -63,7 +58,7 @@ protected function configure() new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.'), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.', null, $this->suggestInstalledPackage()), )) ->setHelp( <<completeInstalledPackage($input, $suggestions); - } + use CompletionTrait; /** * @return void @@ -39,7 +34,7 @@ protected function configure(): void ->setName('outdated') ->setDescription('Shows a list of installed packages that have updates available, including their latest version.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.'), + new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage()), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated (this is the default, but present here for compat with `show`'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show all installed packages with their latest versions'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Shows updates for packages from the lock file, regardless of what is currently in vendor dir'), @@ -48,7 +43,7 @@ protected function configure(): void new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('patch-only', 'p', InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --outdated option.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), - new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'), + new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), diff --git a/src/Composer/Command/ProhibitsCommand.php b/src/Composer/Command/ProhibitsCommand.php index 45908ec40b7f..d536a314161a 100644 --- a/src/Composer/Command/ProhibitsCommand.php +++ b/src/Composer/Command/ProhibitsCommand.php @@ -12,22 +12,17 @@ namespace Composer\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; /** * @author Niels Keurentjes */ class ProhibitsCommand extends BaseDependencyCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeAvailablePackage($input, $suggestions); - } + use CompletionTrait; /** * Configure command metadata. @@ -41,7 +36,7 @@ protected function configure(): void ->setAliases(array('why-not')) ->setDescription('Shows which packages prevent the given package from being installed.') ->setDefinition(array( - new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect'), + new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestAvailablePackage()), new InputArgument(self::ARGUMENT_CONSTRAINT, InputArgument::REQUIRED, 'Version constraint, which version you expected to be installed'), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), diff --git a/src/Composer/Command/ReinstallCommand.php b/src/Composer/Command/ReinstallCommand.php index c845fc3f596b..40a376134bdf 100644 --- a/src/Composer/Command/ReinstallCommand.php +++ b/src/Composer/Command/ReinstallCommand.php @@ -22,11 +22,9 @@ use Composer\Plugin\PluginEvents; use Composer\Script\ScriptEvents; use Composer\Util\Platform; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; /** @@ -34,10 +32,7 @@ */ class ReinstallCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeInstalledPackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); - } + use CompletionTrait; /** * @return void @@ -50,7 +45,7 @@ protected function configure(): void ->setDefinition(array( new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), - new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).'), + new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), @@ -59,7 +54,7 @@ protected function configure(): void new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'List of package names to reinstall, can include a wildcard (*) to match any substring.'), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'List of package names to reinstall, can include a wildcard (*) to match any substring.', null, $this->suggestInstalledPackage()), )) ->setHelp( <<completeInstalledPackage($input, $suggestions); - } + use CompletionTrait; /** * @return void @@ -48,7 +43,7 @@ protected function configure() ->setName('remove') ->setDescription('Removes a package from the require or require-dev.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.'), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index ff8d399762d1..d8fead4f91cc 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -14,11 +14,9 @@ use Composer\DependencyResolver\Request; use Composer\Util\Filesystem; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Factory; use Composer\Installer; @@ -41,6 +39,7 @@ */ class RequireCommand extends BaseCommand { + use CompletionTrait; use PackageDiscoveryTrait; /** @var bool */ @@ -60,11 +59,6 @@ class RequireCommand extends BaseCommand /** @var bool */ private $dependencyResolutionCompleted = false; - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completePlatformPackage($input, $suggestions) || $this->completeAvailablePackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); - } - /** * @return void */ @@ -74,12 +68,12 @@ protected function configure() ->setName('require') ->setDescription('Adds required packages to your composer.json and installs them.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"'), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageOrExtension()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Add requirement to require-dev.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), - new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).'), + new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('fixed', null, InputOption::VALUE_NONE, 'Write fixed version to the composer.json.'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), diff --git a/src/Composer/Command/RunScriptCommand.php b/src/Composer/Command/RunScriptCommand.php index 2b035cab2ee5..cdc262b1af3b 100644 --- a/src/Composer/Command/RunScriptCommand.php +++ b/src/Composer/Command/RunScriptCommand.php @@ -16,11 +16,9 @@ use Composer\Script\ScriptEvents; use Composer\Util\ProcessExecutor; use Composer\Util\Platform; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; /** @@ -46,13 +44,6 @@ class RunScriptCommand extends BaseCommand ScriptEvents::POST_AUTOLOAD_DUMP, ); - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestArgumentValuesFor('script')) { - $suggestions->suggestValues(array_keys($this->getComposer()->getPackage()->getScripts())); - } - } - /** * @return void */ @@ -63,7 +54,9 @@ protected function configure(): void ->setAliases(array('run')) ->setDescription('Runs the scripts defined in composer.json.') ->setDefinition(array( - new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.'), + new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.', null, function () { + return array_keys($this->requireComposer()->getPackage()->getScripts()); + }), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), new InputOption('timeout', null, InputOption::VALUE_REQUIRED, 'Sets script timeout in seconds, or 0 for never.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), diff --git a/src/Composer/Command/ScriptAliasCommand.php b/src/Composer/Command/ScriptAliasCommand.php index 4c34368ad237..603ea1059010 100644 --- a/src/Composer/Command/ScriptAliasCommand.php +++ b/src/Composer/Command/ScriptAliasCommand.php @@ -13,8 +13,8 @@ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; /** diff --git a/src/Composer/Command/SearchCommand.php b/src/Composer/Command/SearchCommand.php index f7dfa2001724..32ceaa9bc9eb 100644 --- a/src/Composer/Command/SearchCommand.php +++ b/src/Composer/Command/SearchCommand.php @@ -14,12 +14,10 @@ use Composer\Factory; use Composer\Json\JsonFile; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; @@ -32,13 +30,6 @@ */ class SearchCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues(['json', 'text']); - } - } - /** * @return void */ @@ -51,7 +42,7 @@ protected function configure(): void new InputOption('only-name', 'N', InputOption::VALUE_NONE, 'Search only in package names'), new InputOption('only-vendor', 'O', InputOption::VALUE_NONE, 'Search only for vendor / organization names, returns only "vendor" as result'), new InputOption('type', 't', InputOption::VALUE_REQUIRED, 'Search for a specific package type'), - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputArgument('tokens', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'tokens to search for'), )) ->setHelp( diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index 5e025b486e68..f8291f133907 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -24,8 +24,8 @@ use Composer\Downloader\FilesystemException; use Composer\Downloader\TransportException; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Finder\Finder; diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index c128295c47f4..dcce4f16a68a 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -40,13 +40,11 @@ use Composer\Semver\Semver; use Composer\Spdx\SpdxLicenses; use Composer\Util\PackageInfo; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** @@ -57,6 +55,8 @@ */ class ShowCommand extends BaseCommand { + use CompletionTrait; + /** @var VersionParser */ protected $versionParser; /** @var string[] */ @@ -65,17 +65,6 @@ class ShowCommand extends BaseCommand /** @var ?RepositorySet */ private $repositorySet; - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - if ($this->completeInstalledPackage($input, $suggestions)) { - return; - } - - if ($input->mustSuggestOptionValuesFor('format')) { - $suggestions->suggestValues(['json', 'text']); - } - } - /** * @return void */ @@ -86,7 +75,7 @@ protected function configure() ->setAliases(array('info')) ->setDescription('Shows information about packages.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.'), + new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage()), new InputArgument('version', InputArgument::OPTIONAL, 'Version or version constraint to inspect'), new InputOption('all', null, InputOption::VALUE_NONE, 'List all packages'), new InputOption('locked', null, InputOption::VALUE_NONE, 'List all locked packages'), @@ -99,12 +88,12 @@ protected function configure() new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'), new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), - new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'), + new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('patch-only', null, InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --outdated option.'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), diff --git a/src/Composer/Command/StatusCommand.php b/src/Composer/Command/StatusCommand.php index c749294d97a0..0f8e2b530a9e 100644 --- a/src/Composer/Command/StatusCommand.php +++ b/src/Composer/Command/StatusCommand.php @@ -13,7 +13,7 @@ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Downloader\ChangeReportInterface; use Composer\Downloader\DvcsDownloaderInterface; diff --git a/src/Composer/Command/SuggestsCommand.php b/src/Composer/Command/SuggestsCommand.php index 173337691f7b..0dd1653b496e 100644 --- a/src/Composer/Command/SuggestsCommand.php +++ b/src/Composer/Command/SuggestsCommand.php @@ -16,19 +16,14 @@ use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Installer\SuggestedPackagesReporter; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; +use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class SuggestsCommand extends BaseCommand { - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - $this->completeInstalledPackage($input, $suggestions); - } + use CompletionTrait; /** * @return void @@ -44,7 +39,7 @@ protected function configure(): void new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show suggestions from all dependencies, including transitive ones'), new InputOption('list', null, InputOption::VALUE_NONE, 'Show only list of suggested package names'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Exclude suggestions from require-dev packages'), - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that you want to list suggestions from.'), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that you want to list suggestions from.', null, $this->suggestInstalledPackage()), )) ->setHelp( <<completeInstalledPackage($input, $suggestions) || $this->completePreferInstall($input, $suggestions); - } + use CompletionTrait; /** * @return void @@ -54,11 +49,11 @@ protected function configure() ->setAliases(array('u', 'upgrade')) ->setDescription('Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.'), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.', null, $this->suggestInstalledPackage()), new InputOption('with', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), - new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).'), + new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('dev', null, InputOption::VALUE_NONE, 'DEPRECATED: Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), diff --git a/src/Composer/Console/Input/InputArgument.php b/src/Composer/Console/Input/InputArgument.php new file mode 100644 index 000000000000..88fe62b3cb40 --- /dev/null +++ b/src/Composer/Console/Input/InputArgument.php @@ -0,0 +1,61 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Console\Input; + +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Input\InputArgument as BaseInputArgument; + +/** + * Backport suggested values definition from symfony/console 6.1+ + * + * @author Jérôme Tamarelle + * + * @internal + */ +class InputArgument extends BaseInputArgument +{ + /** + * @var string[]|\Closure + */ + private $suggestedValues; + + /** + * @inheritdoc + * + * @param string[]|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + */ + public function __construct(string $name, int $mode = null, string $description = '', $default = null, $suggestedValues = []) + { + parent::__construct($name, $mode, $description, $default, $suggestedValues); + + $this->suggestedValues = $suggestedValues; + } + + /** + * Adds suggestions to $suggestions for the current completion input. + * + * @see Command::complete() + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $values = $this->suggestedValues; + if ($values instanceof \Closure && !\is_array($values = $values($input))) { + throw new LogicException(sprintf('Closure for option "%s" must return an array. Got "%s".', $this->getName(), get_debug_type($values))); + } + if ($values) { + $suggestions->suggestValues($values); + } + } +} diff --git a/src/Composer/Console/Input/InputOption.php b/src/Composer/Console/Input/InputOption.php new file mode 100644 index 000000000000..0d4ca2722aa8 --- /dev/null +++ b/src/Composer/Console/Input/InputOption.php @@ -0,0 +1,65 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Console\Input; + +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\LogicException; +use Symfony\Component\Console\Input\InputOption as BaseInputOption; + +/** + * Backport suggested values definition from symfony/console 6.1+ + * + * @author Jérôme Tamarelle + * + * @internal + */ +class InputOption extends BaseInputOption +{ + /** + * @var string[]|\Closure + */ + private $suggestedValues; + + /** + * @inheritdoc + * + * @param string[]|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + */ + public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null, $suggestedValues = []) + { + parent::__construct($name, $shortcut, $mode, $description, $default, $suggestedValues); + + $this->suggestedValues = $suggestedValues; + + if ($suggestedValues && !$this->acceptValue()) { + throw new LogicException('Cannot set suggested values if the option does not accept a value.'); + } + } + + /** + * Adds suggestions to $suggestions for the current completion input. + * + * @see Command::complete() + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + $values = $this->suggestedValues; + if ($values instanceof \Closure && !\is_array($values = $values($input))) { + throw new LogicException(sprintf('Closure for argument "%s" must return an array. Got "%s".', $this->getName(), get_debug_type($values))); + } + if ($values) { + $suggestions->suggestValues($values); + } + } +} diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 93253b0b35a3..af468ab803c4 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -309,12 +309,14 @@ public function createComposer(IOInterface $io, $localConfig = null, bool $disab throw new \InvalidArgumentException($message.PHP_EOL.$instructions); } - try { - $file->validateSchema(JsonFile::LAX_SCHEMA); - } catch (JsonValidationException $e) { - $errors = ' - ' . implode(PHP_EOL . ' - ', $e->getErrors()); - $message = $e->getMessage() . ':' . PHP_EOL . $errors; - throw new JsonValidationException($message); + if (!Platform::isInputCompletionProcess()) { + try { + $file->validateSchema(JsonFile::LAX_SCHEMA); + } catch (JsonValidationException $e) { + $errors = ' - ' . implode(PHP_EOL . ' - ', $e->getErrors()); + $message = $e->getMessage() . ':' . PHP_EOL . $errors; + throw new JsonValidationException($message); + } } $localConfig = $file->read(); diff --git a/src/Composer/Package/Version/VersionGuesser.php b/src/Composer/Package/Version/VersionGuesser.php index 96384b128690..d768f3247c49 100644 --- a/src/Composer/Package/Version/VersionGuesser.php +++ b/src/Composer/Package/Version/VersionGuesser.php @@ -19,6 +19,7 @@ use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Util\Git as GitUtil; use Composer\Util\HttpDownloader; +use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Svn as SvnUtil; use React\Promise\CancellablePromiseInterface; @@ -76,7 +77,7 @@ public function guessVersion(array $packageConfig, string $path): ?array // bypass version guessing in bash completions as it takes time to create // new processes and the root version is usually not that important - if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] === '_complete') { + if (Platform::isInputCompletionProcess()) { return null; } diff --git a/src/Composer/Util/HttpDownloader.php b/src/Composer/Util/HttpDownloader.php index 4fb6b9f76e4e..581e17226a26 100644 --- a/src/Composer/Util/HttpDownloader.php +++ b/src/Composer/Util/HttpDownloader.php @@ -44,12 +44,8 @@ class HttpDownloader private $config; /** @var array */ private $jobs = array(); - /** @var bool */ - private $disableTls; /** @var mixed[] */ private $options = array(); - /** @var mixed[]|null */ - private $tlsDefaultOptions = null; /** @var int */ private $runningJobs = 0; /** @var int */ @@ -77,19 +73,22 @@ public function __construct(IOInterface $io, Config $config, array $options = ar $this->disabled = (bool) Platform::getEnv('COMPOSER_DISABLE_NETWORK'); - if ($disableTls === true) { - // make sure the tlsDefaultOptions are not loaded later - $this->tlsDefaultOptions = []; + // Setup TLS options + // The cafile option can be set via config.json + if ($disableTls === false) { + $this->options = StreamContextFactory::getTlsDefaults($options, $io); } - $this->disableTls = $disableTls; - $this->options = $options; + // handle the other externally set options normally. + $this->options = array_replace_recursive($this->options, $options); $this->config = $config; if (self::isCurlEnabled()) { $this->curl = new CurlDownloader($io, $config, $options, $disableTls); } + $this->rfs = new RemoteFilesystem($io, $config, $options, $disableTls); + if (is_numeric($maxJobs = Platform::getEnv('COMPOSER_MAX_PARALLEL_HTTP'))) { $this->maxJobs = max(1, min(50, (int) $maxJobs)); } @@ -172,13 +171,7 @@ public function addCopy(string $url, string $to, array $options = array()) */ public function getOptions() { - if ($this->tlsDefaultOptions === null) { - // Setup TLS options - // The cafile option can be set via config.json - $this->tlsDefaultOptions = StreamContextFactory::getTlsDefaults($this->options, $this->io); - } - - return array_replace_recursive($this->tlsDefaultOptions, $this->options); + return $this->options; } /** @@ -198,7 +191,7 @@ public function setOptions(array $options) */ private function addJob(array $request, bool $sync = false): array { - $request['options'] = array_replace_recursive($this->getOptions(), $request['options']); + $request['options'] = array_replace_recursive($this->options, $request['options']); /** @var Job */ $job = array( @@ -218,6 +211,8 @@ private function addJob(array $request, bool $sync = false): array $this->io->setAuthentication($job['origin'], rawurldecode($match[1]), rawurldecode($match[2])); } + $rfs = $this->rfs; + if ($this->canUseCurl($job)) { $resolver = function ($resolve, $reject) use (&$job): void { $job['status'] = HttpDownloader::STATUS_QUEUED; @@ -290,15 +285,6 @@ private function addJob(array $request, bool $sync = false): array return array($job, $promise); } - private function getRFS(): RemoteFilesystem - { - if (null === $this->rfs) { - $this->rfs = new RemoteFilesystem($this->io, $this->config, $this->options, $this->disableTls); - } - - return $this->rfs; - } - /** * @param int $id * @return void diff --git a/src/Composer/Util/Platform.php b/src/Composer/Util/Platform.php index be37ba6214ee..83fe71bd4353 100644 --- a/src/Composer/Util/Platform.php +++ b/src/Composer/Util/Platform.php @@ -225,6 +225,14 @@ public static function isTty($fd = null): bool return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; } + /** + * @return bool Whether the current command is for bash completion + */ + public static function isInputCompletionProcess(): bool + { + return '_complete' === ($_SERVER['argv'][1] ?? null); + } + /** * @return void */ From 68fd80b630d75c6e441a9d77313cd92b0eb61f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Fri, 15 Apr 2022 15:11:01 +0200 Subject: [PATCH 054/618] PHPStan annotations --- src/Composer/Command/CompletionTrait.php | 2 ++ src/Composer/Command/ExecCommand.php | 4 ++++ src/Composer/Console/Input/InputArgument.php | 18 ++++++++++++------ src/Composer/Console/Input/InputOption.php | 19 ++++++++++++------- .../Test/CompletionFunctionalTest.php | 3 +++ 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index c16c3a8f5cac..f49c484717d5 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -35,6 +35,8 @@ abstract public function requireComposer(bool $disablePlugins = null, bool $disa /** * Suggestion values for "prefer-install" option + * + * @return string[] */ private function suggestPreferInstall(): array { diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index 49df0a83244f..f30467bd8100 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -98,6 +98,10 @@ protected function execute(InputInterface $input, OutputInterface $output) return $dispatcher->dispatchScript('__exec_command', true, $input->getArgument('args')); } + /** + * @param bool $forDisplay + * @return string[] + */ private function getBinaries(bool $forDisplay): array { $composer = $this->requireComposer(); diff --git a/src/Composer/Console/Input/InputArgument.php b/src/Composer/Console/Input/InputArgument.php index 88fe62b3cb40..697556b3bc70 100644 --- a/src/Composer/Console/Input/InputArgument.php +++ b/src/Composer/Console/Input/InputArgument.php @@ -14,6 +14,8 @@ use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Completion\Suggestion; +use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Exception\LogicException; use Symfony\Component\Console\Input\InputArgument as BaseInputArgument; @@ -27,18 +29,22 @@ class InputArgument extends BaseInputArgument { /** - * @var string[]|\Closure + * @var string[]|\Closure(CompletionInput,CompletionSuggestions):list */ private $suggestedValues; /** - * @inheritdoc - * + * @param string $name The argument name + * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL + * @param string $description A description text + * @param string|bool|int|float|string[]|null $default The default value (for self::OPTIONAL mode only) * @param string[]|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * + * @throws InvalidArgumentException When argument mode is not valid */ public function __construct(string $name, int $mode = null, string $description = '', $default = null, $suggestedValues = []) { - parent::__construct($name, $mode, $description, $default, $suggestedValues); + parent::__construct($name, $mode, $description, $default); $this->suggestedValues = $suggestedValues; } @@ -51,10 +57,10 @@ public function __construct(string $name, int $mode = null, string $description public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void { $values = $this->suggestedValues; - if ($values instanceof \Closure && !\is_array($values = $values($input))) { + if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { throw new LogicException(sprintf('Closure for option "%s" must return an array. Got "%s".', $this->getName(), get_debug_type($values))); } - if ($values) { + if ([] !== $values) { $suggestions->suggestValues($values); } } diff --git a/src/Composer/Console/Input/InputOption.php b/src/Composer/Console/Input/InputOption.php index 0d4ca2722aa8..72807355b29f 100644 --- a/src/Composer/Console/Input/InputOption.php +++ b/src/Composer/Console/Input/InputOption.php @@ -14,6 +14,8 @@ use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Completion\Suggestion; +use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Exception\LogicException; use Symfony\Component\Console\Input\InputOption as BaseInputOption; @@ -27,22 +29,25 @@ class InputOption extends BaseInputOption { /** - * @var string[]|\Closure + * @var string[]|\Closure(CompletionInput,CompletionSuggestions):list */ private $suggestedValues; /** - * @inheritdoc + * @param string|string[]|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param int|null $mode The option mode: One of the VALUE_* constants + * @param string|bool|int|float|string[]|null $default The default value (must be null for self::VALUE_NONE) + * @param string[]|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completionnull for self::VALUE_NONE) * - * @param string[]|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * @throws InvalidArgumentException If option mode is invalid or incompatible */ public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null, $suggestedValues = []) { - parent::__construct($name, $shortcut, $mode, $description, $default, $suggestedValues); + parent::__construct($name, $shortcut, $mode, $description, $default); $this->suggestedValues = $suggestedValues; - if ($suggestedValues && !$this->acceptValue()) { + if ([] !== $suggestedValues && !$this->acceptValue()) { throw new LogicException('Cannot set suggested values if the option does not accept a value.'); } } @@ -55,10 +60,10 @@ public function __construct(string $name, $shortcut = null, int $mode = null, st public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void { $values = $this->suggestedValues; - if ($values instanceof \Closure && !\is_array($values = $values($input))) { + if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { throw new LogicException(sprintf('Closure for argument "%s" must return an array. Got "%s".', $this->getName(), get_debug_type($values))); } - if ($values) { + if ([] !== $values) { $suggestions->suggestValues($values); } } diff --git a/tests/Composer/Test/CompletionFunctionalTest.php b/tests/Composer/Test/CompletionFunctionalTest.php index a2f1ce8c0dcf..422abea79aeb 100644 --- a/tests/Composer/Test/CompletionFunctionalTest.php +++ b/tests/Composer/Test/CompletionFunctionalTest.php @@ -22,6 +22,9 @@ */ class CompletionFunctionalTest extends TestCase { + /** + * @return iterable> + */ public function getCommandSuggestions(): iterable { $randomProject = '104corp/cache'; From 3f848cdb9ae937d74169ffab8107bb2c21a76d35 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 16:05:27 +0200 Subject: [PATCH 055/618] Add TODOs --- src/Composer/Command/BaseCommand.php | 2 ++ src/Composer/Console/Input/InputArgument.php | 2 ++ src/Composer/Console/Input/InputOption.php | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 7ab897d5d054..89c3996247c3 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -190,6 +190,8 @@ public function setIO(IOInterface $io) * @inheritdoc * * Backport suggested values definition from symfony/console 6.1+ + * + * TODO drop when PHP 8.1 / symfony 6.1+ can be required */ public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void { diff --git a/src/Composer/Console/Input/InputArgument.php b/src/Composer/Console/Input/InputArgument.php index 697556b3bc70..b9ee541f6185 100644 --- a/src/Composer/Console/Input/InputArgument.php +++ b/src/Composer/Console/Input/InputArgument.php @@ -25,6 +25,8 @@ * @author Jérôme Tamarelle * * @internal + * + * TODO drop when PHP 8.1 / symfony 6.1+ can be required */ class InputArgument extends BaseInputArgument { diff --git a/src/Composer/Console/Input/InputOption.php b/src/Composer/Console/Input/InputOption.php index 72807355b29f..70654c0d87e8 100644 --- a/src/Composer/Console/Input/InputOption.php +++ b/src/Composer/Console/Input/InputOption.php @@ -25,6 +25,8 @@ * @author Jérôme Tamarelle * * @internal + * + * TODO drop when PHP 8.1 / symfony 6.1+ can be required */ class InputOption extends BaseInputOption { From 2837585e47d4192fa3931aa09e9810bdab6487db Mon Sep 17 00:00:00 2001 From: John Stevenson Date: Thu, 12 May 2022 20:13:55 +0100 Subject: [PATCH 056/618] Fix cmd splitting paths on commas (#10775) --- src/Composer/Util/ProcessExecutor.php | 3 ++- tests/Composer/Test/Util/ProcessExecutorTest.php | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 16352bbcf7de..ca181d7d3a2b 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -490,7 +490,8 @@ private static function escapeArgument($argument) // New lines break cmd.exe command parsing $argument = strtr($argument, "\n", ' '); - $quote = strpbrk($argument, " \t") !== false; + // In addition to whitespace, commas need quoting to preserve paths + $quote = strpbrk($argument, " \t,") !== false; $argument = Preg::replace('/(\\\\*)"/', '$1$1\\"', $argument, -1, $dquotes); $meta = $dquotes || Preg::isMatch('/%[^%]+%|![^!]+!/', $argument); diff --git a/tests/Composer/Test/Util/ProcessExecutorTest.php b/tests/Composer/Test/Util/ProcessExecutorTest.php index ff2acd82ebcc..13bf31cbcc53 100644 --- a/tests/Composer/Test/Util/ProcessExecutorTest.php +++ b/tests/Composer/Test/Util/ProcessExecutorTest.php @@ -178,6 +178,9 @@ public function dataEscapeArguments() // no whitespace must not be quoted 'no-ws' => array('abc', 'abc', "'abc'"), + // commas must be quoted + 'comma' => array('a,bc', '"a,bc"', "'a,bc'"), + // double-quotes must be backslash-escaped 'dq' => array('a"bc', 'a\^"bc', "'a\"bc'"), From ce45d15bb5dfec0baa444a56ec0a8aacf070f063 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 16:05:49 +0200 Subject: [PATCH 057/618] Skip schema validation when running completion for increased bootstrap performance --- src/Composer/Factory.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index af468ab803c4..ee7e045868f9 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -704,6 +704,10 @@ private static function getUserDir(): string */ private static function validateJsonSchema(?IOInterface $io, $fileOrData, int $schema = JsonFile::LAX_SCHEMA, ?string $source = null): void { + if (Platform::isInputCompletionProcess()) { + return; + } + try { if ($fileOrData instanceof JsonFile) { $fileOrData->validateSchema($schema); From 1162629a172dcfb5c6bdede132dc1bf69b1b3b09 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 16:13:24 +0200 Subject: [PATCH 058/618] Try and add completion for global subcommands --- src/Composer/Command/GlobalCommand.php | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index d74bf2b14279..a99898e2835a 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -37,6 +37,14 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti return $command->isHidden() ? null : $command->getName(); }, $application->all()))); } + + if ($application->has($commandName = $input->getArgument('command-name'))) { + $input = $this->prepareSubcommandInput($input, true); + $input = CompletionInput::fromString($input->__toString(), 3); + $command = $this->getApplication()->find($commandName); + $input->bind($command->getDefinition()); + $command->complete($input, $suggestions); + } } /** @@ -100,6 +108,13 @@ public function run(InputInterface $input, OutputInterface $output): int return parent::run($input, $output); } + $input = $this->prepareSubcommandInput($input); + + return $this->getApplication()->run($input, $output); + } + + private function prepareSubcommandInput(InputInterface $input, bool $quiet = false): StringInput + { // The COMPOSER env var should not apply to the global execution scope if (Platform::getEnv('COMPOSER')) { Platform::clearEnv('COMPOSER'); @@ -122,13 +137,15 @@ public function run(InputInterface $input, OutputInterface $output): int } catch (\Exception $e) { throw new \RuntimeException('Could not switch to home directory "'.$home.'"', 0, $e); } - $this->getIO()->writeError('Changed current directory to '.$home.''); + if (!$quiet) { + $this->getIO()->writeError('Changed current directory to '.$home.''); + } // create new input without "global" command prefix $input = new StringInput(Preg::replace('{\bg(?:l(?:o(?:b(?:a(?:l)?)?)?)?)?\b}', '', $input->__toString(), 1)); $this->getApplication()->resetComposer(); - return $this->getApplication()->run($input, $output); + return $input; } /** From 3b2745a00d025fc1ec0e830f1552fe40ce57ba79 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 22:51:11 +0200 Subject: [PATCH 059/618] Improve package suggestions, show only vendors by default when showing all available packages, add support for -p/-a in show command --- src/Composer/Command/CompletionTrait.php | 103 +++++++++++++++++++---- src/Composer/Command/DependsCommand.php | 2 +- src/Composer/Command/InitCommand.php | 4 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/RequireCommand.php | 2 +- src/Composer/Command/ShowCommand.php | 18 +++- 6 files changed, 108 insertions(+), 23 deletions(-) diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index f49c484717d5..e7773035ddf1 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -13,7 +13,9 @@ namespace Composer\Command; use Composer\Composer; +use Composer\Package\BasePackage; use Composer\Package\PackageInterface; +use Composer\Pcre\Preg; use Composer\Repository\CompositeRepository; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; @@ -46,9 +48,9 @@ private function suggestPreferInstall(): array /** * Suggest package names from installed. */ - private function suggestInstalledPackage(): \Closure + private function suggestInstalledPackage(bool $includePlatformPackages = false): \Closure { - return function (): array { + return function (CompletionInput $input) use ($includePlatformPackages): array { $composer = $this->requireComposer(); $installedRepos = [new RootPackageRepository(clone $composer->getPackage())]; @@ -59,46 +61,113 @@ private function suggestInstalledPackage(): \Closure $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); } + $platformHint = []; + if ($includePlatformPackages) { + if ($locker->isLocked()) { + $platformRepo = new PlatformRepository(array(), $locker->getPlatformOverrides()); + } else { + $platformRepo = new PlatformRepository(array(), $composer->getConfig()->get('platform') ?: array()); + } + if ($input->getCompletionValue() === '') { + // to reduce noise, when no text is yet entered we list only two entries for ext- and lib- prefixes + $hintsToFind = ['ext-' => 0, 'lib-' => 0, 'php' => 99, 'composer' => 99]; + foreach ($platformRepo->getPackages() as $pkg) { + foreach ($hintsToFind as $hintPrefix => $hintCount) { + if (str_starts_with($pkg->getName(), $hintPrefix)) { + if ($hintCount === 0 || $hintCount >= 99) { + $platformHint[] = $pkg->getName(); + $hintsToFind[$hintPrefix]++; + } elseif ($hintCount === 1) { + unset($hintsToFind[$hintPrefix]); + $platformHint[] = substr($pkg->getName(), 0, max(strlen($pkg->getName()) - 3, strlen($hintPrefix) + 1)).'...'; + } + continue 2; + } + } + } + } else { + $installedRepos[] = $platformRepo; + } + } + $installedRepo = new InstalledRepository($installedRepos); - return array_map(function (PackageInterface $package) { - return $package->getName(); - }, $installedRepo->getPackages()); + return array_merge( + array_map(function (PackageInterface $package) { + return $package->getName(); + }, $installedRepo->getPackages()), + $platformHint + ); }; } /** * Suggest package names available on all configured repositories. - * @todo rework to list packages from cache */ - private function suggestAvailablePackage(): \Closure + private function suggestAvailablePackage(int $max = 99): \Closure { - return function (CompletionInput $input) { + return function (CompletionInput $input) use ($max): array { + if ($max < 1) { + return []; + } + $composer = $this->requireComposer(); $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); - $packages = $repos->search('^' . preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); + $results = []; + if (!str_contains($input->getCompletionValue(), '/')) { + $results = $repos->search('^' . preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_VENDOR); + $vendors = true; + } + + // if we get a single vendor, we expand it into its contents already + if (\count($results) <= 1) { + $results = $repos->search('^'.preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); + $vendors = false; + } - return array_column(array_slice($packages, 0, 150), 'name'); + $results = array_column(array_slice($results, 0, $max), 'name'); + if ($vendors) { + $results = array_map(function (string $name): string { + return $name.'/'; + }, $results); + } + + return $results; }; } /** * Suggest package names available on all configured repositories or - * ext- packages from the ones available on the currently-running PHP + * platform packages from the ones available on the currently-running PHP */ - private function suggestAvailablePackageOrExtension(): \Closure + private function suggestAvailablePackageInclPlatform(): \Closure { - return function (CompletionInput $input) { - if (!str_starts_with($input->getCompletionValue(), 'ext-')) { - return $this->suggestAvailablePackage()($input); + return function (CompletionInput $input): array { + if (Preg::isMatch('{^(ext|lib|php)(-|$)|^com}', $input->getCompletionValue())) { + $matches = $this->suggestPlatformPackage()($input); + } else { + $matches = []; } + return array_merge($matches, $this->suggestAvailablePackage(99 - \count($matches))($input)); + }; + } + + /** + * Suggest platform packages from the ones available on the currently-running PHP + */ + private function suggestPlatformPackage(): \Closure + { + return function (CompletionInput $input): array { $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform') ?? []); - return array_map(function (PackageInterface $package) { + $pattern = BasePackage::packageNameToRegexp($input->getCompletionValue().'*'); + return array_filter(array_map(function (PackageInterface $package) { return $package->getName(); - }, $repos->getPackages()); + }, $repos->getPackages()), function (string $name) use ($pattern): bool { + return Preg::isMatch($pattern, $name); + }); }; } } diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index 53ba7115f804..1b353807aad4 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -36,7 +36,7 @@ protected function configure(): void ->setAliases(array('why')) ->setDescription('Shows which packages cause the given package to be installed.') ->setDefinition(array( - new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage()), + new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(true)), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), )) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 6677da1019ef..29382606fbf3 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -59,8 +59,8 @@ protected function configure() new InputOption('author', null, InputOption::VALUE_REQUIRED, 'Author name of package'), new InputOption('type', null, InputOption::VALUE_OPTIONAL, 'Type of package (e.g. library, project, metapackage, composer-plugin)'), new InputOption('homepage', null, InputOption::VALUE_REQUIRED, 'Homepage of package'), - new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackage()), - new InputOption('require-dev', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require for development with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackage()), + new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), + new InputOption('require-dev', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require for development with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum stability (empty or one of: '.implode(', ', array_keys(BasePackage::$stabilities)).')'), new InputOption('license', 'l', InputOption::VALUE_REQUIRED, 'License of package'), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories, either by URL or using JSON arrays'), diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 86a11193f246..6db97660242d 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -43,7 +43,7 @@ protected function configure() ->setName('remove') ->setDescription('Removes a package from the require or require-dev.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage()), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage(true)), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index d8fead4f91cc..3feb98e6c77d 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -68,7 +68,7 @@ protected function configure() ->setName('require') ->setDescription('Adds required packages to your composer.json and installs them.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageOrExtension()), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Add requirement to require-dev.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index dcce4f16a68a..d96a409fe1e7 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -40,6 +40,7 @@ use Composer\Semver\Semver; use Composer\Spdx\SpdxLicenses; use Composer\Util\PackageInfo; +use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Composer\Console\Input\InputArgument; @@ -75,7 +76,7 @@ protected function configure() ->setAliases(array('info')) ->setDescription('Shows information about packages.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage()), + new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestPackageBasedOnMode()), new InputArgument('version', InputArgument::OPTIONAL, 'Version or version constraint to inspect'), new InputOption('all', null, InputOption::VALUE_NONE, 'List all packages'), new InputOption('locked', null, InputOption::VALUE_NONE, 'List all locked packages'), @@ -109,6 +110,21 @@ protected function configure() ; } + protected function suggestPackageBasedOnMode(): \Closure + { + return function (CompletionInput $input) { + if ($input->getOption('available') || $input->getOption('all')) { + return $this->suggestAvailablePackageInclPlatform()($input); + } + + if ($input->getOption('platform')) { + return $this->suggestPlatformPackage()($input); + } + + return $this->suggestInstalledPackage()($input); + }; + } + protected function execute(InputInterface $input, OutputInterface $output) { $this->versionParser = new VersionParser; From 0089a69c57621fa79dc7d4948a364dde3791736e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 22:51:38 +0200 Subject: [PATCH 060/618] Avoid outputting network errors or others while loading suggestions --- src/Composer/Console/Application.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index ba140a1496ea..c45dec711863 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -466,7 +466,7 @@ public function getComposer(bool $required = true, ?bool $disablePlugins = null, if (null === $this->composer) { try { - $this->composer = Factory::create($this->io, null, $disablePlugins, $disableScripts); + $this->composer = Factory::create(Platform::isInputCompletionProcess() ? new NullIO() : $this->io, null, $disablePlugins, $disableScripts); } catch (\InvalidArgumentException $e) { if ($required) { $this->io->writeError($e->getMessage()); From 6aa7e15373e1d0bd2bb060e09f360e07b6004fd6 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 23:11:22 +0200 Subject: [PATCH 061/618] Fixes to global completion, working in some cases now --- src/Composer/Command/GlobalCommand.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index a99898e2835a..902ed4cb224e 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -36,12 +36,16 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti $suggestions->suggestValues(array_filter(array_map(function (Command $command) { return $command->isHidden() ? null : $command->getName(); }, $application->all()))); + + return; } if ($application->has($commandName = $input->getArgument('command-name'))) { $input = $this->prepareSubcommandInput($input, true); - $input = CompletionInput::fromString($input->__toString(), 3); - $command = $this->getApplication()->find($commandName); + $input = CompletionInput::fromString($input->__toString(), 2); + $command = $application->find($commandName); + $command->mergeApplicationDefinition(); + $input->bind($command->getDefinition()); $command->complete($input, $suggestions); } From 55dc80862ea81748df77153fdf14f861759c68b3 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 12 May 2022 23:22:34 +0200 Subject: [PATCH 062/618] Improve sorting of vendor results for available packages --- src/Composer/Command/CompletionTrait.php | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index e7773035ddf1..8fa7632d5f38 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -126,14 +126,31 @@ private function suggestAvailablePackage(int $max = 99): \Closure $vendors = false; } - $results = array_column(array_slice($results, 0, $max), 'name'); + $results = array_column($results, 'name'); + if ($vendors) { $results = array_map(function (string $name): string { return $name.'/'; }, $results); + + // sort shorter results first to avoid auto-expanding the completion to a longer string than needed + usort($results, function (string $a, string $b) { + return \strlen($a) - \strlen($b); + }); + + $pinned = []; + + // ensure if the input is an exact match that it is always in the result set + $completionInput = $input->getCompletionValue().'/'; + if (in_array($completionInput, $results, true)) { + $pinned[] = $completionInput; + array_splice($results, array_search($completionInput, $results, true), 1); + } + + return array_merge($pinned, array_slice($results, 0, $max - \count($pinned))); } - return $results; + return array_slice($results, 0, $max); }; } From b52053893c35aaaee0ce07a155d8c00717e06d1f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 13 May 2022 09:52:02 +0200 Subject: [PATCH 063/618] Fix type errors and tests --- src/Composer/Command/CompletionTrait.php | 23 +++++++---- src/Composer/Command/CreateProjectCommand.php | 6 +-- src/Composer/Command/GlobalCommand.php | 4 ++ .../Command/PackageDiscoveryTrait.php | 38 ++++++------------- src/Composer/Command/ShowCommand.php | 2 +- src/Composer/Command/SuggestsCommand.php | 2 +- src/Composer/Console/Input/InputArgument.php | 2 +- src/Composer/Console/Input/InputOption.php | 2 +- .../Test/CompletionFunctionalTest.php | 16 ++++---- 9 files changed, 45 insertions(+), 50 deletions(-) diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index 8fa7632d5f38..5134aac3a1e8 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -66,7 +66,7 @@ private function suggestInstalledPackage(bool $includePlatformPackages = false): if ($locker->isLocked()) { $platformRepo = new PlatformRepository(array(), $locker->getPlatformOverrides()); } else { - $platformRepo = new PlatformRepository(array(), $composer->getConfig()->get('platform') ?: array()); + $platformRepo = new PlatformRepository(array(), $composer->getConfig()->get('platform')); } if ($input->getCompletionValue() === '') { // to reduce noise, when no text is yet entered we list only two entries for ext- and lib- prefixes @@ -115,36 +115,43 @@ private function suggestAvailablePackage(int $max = 99): \Closure $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $results = []; + $showVendors = false; if (!str_contains($input->getCompletionValue(), '/')) { $results = $repos->search('^' . preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_VENDOR); - $vendors = true; + $showVendors = true; } // if we get a single vendor, we expand it into its contents already if (\count($results) <= 1) { $results = $repos->search('^'.preg_quote($input->getCompletionValue()), RepositoryInterface::SEARCH_NAME); - $vendors = false; + $showVendors = false; } $results = array_column($results, 'name'); - if ($vendors) { + if ($showVendors) { $results = array_map(function (string $name): string { return $name.'/'; }, $results); // sort shorter results first to avoid auto-expanding the completion to a longer string than needed usort($results, function (string $a, string $b) { - return \strlen($a) - \strlen($b); + $lenA = \strlen($a); + $lenB = \strlen($b); + if ($lenA === $lenB) { + return $a <=> $b; + } + + return $lenA - $lenB; }); $pinned = []; // ensure if the input is an exact match that it is always in the result set $completionInput = $input->getCompletionValue().'/'; - if (in_array($completionInput, $results, true)) { + if (false !== ($exactIndex = array_search($completionInput, $results, true))) { $pinned[] = $completionInput; - array_splice($results, array_search($completionInput, $results, true), 1); + array_splice($results, $exactIndex, 1); } return array_merge($pinned, array_slice($results, 0, $max - \count($pinned))); @@ -177,7 +184,7 @@ private function suggestAvailablePackageInclPlatform(): \Closure private function suggestPlatformPackage(): \Closure { return function (CompletionInput $input): array { - $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform') ?? []); + $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform')); $pattern = BasePackage::packageNameToRegexp($input->getCompletionValue().'*'); return array_filter(array_map(function (PackageInterface $package) { diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 23356c267c1c..e04c0fdcf335 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -159,7 +159,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $preferSource, $preferDist, !$input->getOption('no-dev'), - $input->getOption('repository') ?: $input->getOption('repository-url'), + \count($input->getOption('repository')) > 0 ? $input->getOption('repository') : $input->getOption('repository-url'), $input->getOption('no-plugins'), $input->getOption('no-scripts'), $input->getOption('no-progress'), @@ -197,7 +197,7 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ $repositories = (array) $repositories; } - $platformRequirementFilter = $platformRequirementFilter ?: PlatformRequirementFilterFactory::ignoreNothing(); + $platformRequirementFilter = $platformRequirementFilter ?? PlatformRequirementFilterFactory::ignoreNothing(); // we need to manually load the configuration to pass the auth credentials to the io interface! $io->loadConfiguration($config); @@ -424,7 +424,7 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p } } - $platformOverrides = $config->get('platform') ?: array(); + $platformOverrides = $config->get('platform'); $platformRepo = new PlatformRepository(array(), $platformOverrides); // find the latest version if there are multiple diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index 902ed4cb224e..e9195ca1e72a 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -119,6 +119,10 @@ public function run(InputInterface $input, OutputInterface $output): int private function prepareSubcommandInput(InputInterface $input, bool $quiet = false): StringInput { + if (!method_exists($input, '__toString')) { + throw new \LogicException('Expected an Input instance that is stringable, got '.get_class($input)); + } + // The COMPOSER env var should not apply to the global execution scope if (Platform::getEnv('COMPOSER')) { Platform::clearEnv('COMPOSER'); diff --git a/src/Composer/Command/PackageDiscoveryTrait.php b/src/Composer/Command/PackageDiscoveryTrait.php index 99fb0f39b707..c8ab0e9bfdbf 100644 --- a/src/Composer/Command/PackageDiscoveryTrait.php +++ b/src/Composer/Command/PackageDiscoveryTrait.php @@ -99,7 +99,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte foreach ($requires as $requirement) { if (!isset($requirement['version'])) { // determine the best version automatically - list($name, $version) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, null, null, $fixed); + list($name, $version) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, $fixed); $requirement['version'] = $version; // replace package name from packagist.org @@ -268,7 +268,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte * @throws \InvalidArgumentException * @return array{string, string} name version */ - private function findBestVersionAndNameForPackage(InputInterface $input, string $name, ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', ?string $requiredVersion = null, ?string $minimumStability = null, bool $fixed = false): array + private function findBestVersionAndNameForPackage(InputInterface $input, string $name, ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $fixed = false): array { // handle ignore-platform-reqs flag if present if ($input->hasOption('ignore-platform-reqs') && $input->hasOption('ignore-platform-req')) { @@ -278,17 +278,17 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string } // find the latest version allowed in this repo set - $repoSet = $this->getRepositorySet($input, $minimumStability); + $repoSet = $this->getRepositorySet($input); $versionSelector = new VersionSelector($repoSet, $platformRepo); - $effectiveMinimumStability = $minimumStability ?? $this->getMinimumStability($input); + $effectiveMinimumStability = $this->getMinimumStability($input); - $package = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, $platformRequirementFilter); + $package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter); if (false === $package) { // platform packages can not be found in the pool in versions other than the local platform's has // so if platform reqs are ignored we just take the user's word for it if ($platformRequirementFilter->isIgnored($name)) { - return array($name, $requiredVersion ?: '*'); + return array($name, '*'); } // Check if it is a virtual package provided by others @@ -308,17 +308,16 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string } // Check whether the package requirements were the problem - if (!($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter) && false !== ($candidate = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, PlatformRequirementFilterFactory::ignoreAll()))) { + if (!($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter) && false !== ($candidate = $versionSelector->findBestCandidate($name, null, $preferredStability, PlatformRequirementFilterFactory::ignoreAll()))) { throw new \InvalidArgumentException(sprintf( - 'Package %s%s has requirements incompatible with your PHP version, PHP extensions and Composer version' . $this->getPlatformExceptionDetails($candidate, $platformRepo), - $name, - is_string($requiredVersion) ? ' at version '.$requiredVersion : '' + 'Package %s has requirements incompatible with your PHP version, PHP extensions and Composer version' . $this->getPlatformExceptionDetails($candidate, $platformRepo), + $name )); } // Check whether the minimum stability was the problem but the package exists - if (false !== ($package = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, $platformRequirementFilter, RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES))) { + if (false !== ($package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter, RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES))) { // we must first verify if a valid package would be found in a lower priority repository - if (false !== ($allReposPackage = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, $platformRequirementFilter, RepositorySet::ALLOW_SHADOWED_REPOSITORIES))) { + if (false !== ($allReposPackage = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter, RepositorySet::ALLOW_SHADOWED_REPOSITORIES))) { throw new \InvalidArgumentException( 'Package '.$name.' exists in '.$allReposPackage->getRepository()->getRepoName().' and '.$package->getRepository()->getRepoName().' which has a higher repository priority. The packages from the higher priority repository do not match your minimum-stability and are therefore not installable. That repository is canonical so the lower priority repo\'s packages are not installable. See https://getcomposer.org/repoprio for details and assistance.' ); @@ -330,21 +329,6 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string $effectiveMinimumStability )); } - // Check whether the required version was the problem - if (is_string($requiredVersion) && false !== ($package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter))) { - // we must first verify if a valid package would be found in a lower priority repository - if (false !== ($allReposPackage = $versionSelector->findBestCandidate($name, $requiredVersion, $preferredStability, PlatformRequirementFilterFactory::ignoreNothing(), RepositorySet::ALLOW_SHADOWED_REPOSITORIES))) { - throw new \InvalidArgumentException( - 'Package '.$name.' exists in '.$allReposPackage->getRepository()->getRepoName().' and '.$package->getRepository()->getRepoName().' which has a higher repository priority. The packages from the higher priority repository do not match your constraint and are therefore not installable. That repository is canonical so the lower priority repo\'s packages are not installable. See https://getcomposer.org/repoprio for details and assistance.' - ); - } - - throw new \InvalidArgumentException(sprintf( - 'Could not find package %s in a version matching "%s" and a stability matching "'.$effectiveMinimumStability.'".', - $name, - $requiredVersion - )); - } // Check whether the PHP version was the problem for all versions if (!$platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter && false !== ($candidate = $versionSelector->findBestCandidate($name, null, $preferredStability, PlatformRequirementFilterFactory::ignoreAll(), RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES))) { $additional = ''; diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index d96a409fe1e7..1fbb444b9ad6 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -187,7 +187,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // init repos $platformOverrides = array(); if ($composer) { - $platformOverrides = $composer->getConfig()->get('platform') ?: array(); + $platformOverrides = $composer->getConfig()->get('platform'); } $platformRepo = new PlatformRepository(array(), $platformOverrides); $lockedRepo = null; diff --git a/src/Composer/Command/SuggestsCommand.php b/src/Composer/Command/SuggestsCommand.php index 0dd1653b496e..0e28b6089da7 100644 --- a/src/Composer/Command/SuggestsCommand.php +++ b/src/Composer/Command/SuggestsCommand.php @@ -65,7 +65,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $installedRepos[] = new PlatformRepository(array(), $locker->getPlatformOverrides()); $installedRepos[] = $locker->getLockedRepository(!$input->getOption('no-dev')); } else { - $installedRepos[] = new PlatformRepository(array(), $composer->getConfig()->get('platform') ?: array()); + $installedRepos[] = new PlatformRepository(array(), $composer->getConfig()->get('platform')); $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); } diff --git a/src/Composer/Console/Input/InputArgument.php b/src/Composer/Console/Input/InputArgument.php index b9ee541f6185..69c6dfb02c23 100644 --- a/src/Composer/Console/Input/InputArgument.php +++ b/src/Composer/Console/Input/InputArgument.php @@ -59,7 +59,7 @@ public function __construct(string $name, int $mode = null, string $description public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void { $values = $this->suggestedValues; - if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { + if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { // @phpstan-ignore-line throw new LogicException(sprintf('Closure for option "%s" must return an array. Got "%s".', $this->getName(), get_debug_type($values))); } if ([] !== $values) { diff --git a/src/Composer/Console/Input/InputOption.php b/src/Composer/Console/Input/InputOption.php index 70654c0d87e8..2d370ba5135e 100644 --- a/src/Composer/Console/Input/InputOption.php +++ b/src/Composer/Console/Input/InputOption.php @@ -62,7 +62,7 @@ public function __construct(string $name, $shortcut = null, int $mode = null, st public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void { $values = $this->suggestedValues; - if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { + if ($values instanceof \Closure && !\is_array($values = $values($input, $suggestions))) { // @phpstan-ignore-line throw new LogicException(sprintf('Closure for argument "%s" must return an array. Got "%s".', $this->getName(), get_debug_type($values))); } if ([] !== $values) { diff --git a/tests/Composer/Test/CompletionFunctionalTest.php b/tests/Composer/Test/CompletionFunctionalTest.php index 422abea79aeb..36aa3fe8d52f 100644 --- a/tests/Composer/Test/CompletionFunctionalTest.php +++ b/tests/Composer/Test/CompletionFunctionalTest.php @@ -27,34 +27,34 @@ class CompletionFunctionalTest extends TestCase */ public function getCommandSuggestions(): iterable { - $randomProject = '104corp/cache'; + $randomVendor = 'a/'; $installedPackages = ['composer/semver', 'psr/log']; $preferInstall = ['dist', 'source', 'auto']; - yield ['archive ', [$randomProject]]; + yield ['archive ', [$randomVendor]]; yield ['archive symfony/http-', ['symfony/http-kernel', 'symfony/http-foundation']]; yield ['archive --format ', ['tar', 'zip']]; - yield ['create-project ', [$randomProject]]; + yield ['create-project ', [$randomVendor]]; yield ['create-project symfony/skeleton --prefer-install ', $preferInstall]; yield ['depends ', $installedPackages]; yield ['why ', $installedPackages]; - yield ['exec ', ['composer', 'compile']]; + yield ['exec ', ['composer', 'jsonlint', 'phpstan', 'phpstan.phar', 'simple-phpunit', 'validate-json']]; yield ['browse ', $installedPackages]; yield ['home -H ', $installedPackages]; - yield ['init --require ', [$randomProject]]; - yield ['init --require-dev foo/bar --require-dev ', [$randomProject]]; + yield ['init --require ', [$randomVendor]]; + yield ['init --require-dev foo/bar --require-dev ', [$randomVendor]]; yield ['install --prefer-install ', $preferInstall]; yield ['install ', $installedPackages]; yield ['outdated ', $installedPackages]; - yield ['prohibits ', [$randomProject]]; + yield ['prohibits ', [$randomVendor]]; yield ['why-not symfony/http-ker', ['symfony/http-kernel']]; yield ['reinstall --prefer-install ', $preferInstall]; @@ -63,7 +63,7 @@ public function getCommandSuggestions(): iterable yield ['remove ', $installedPackages]; yield ['require --prefer-install ', $preferInstall]; - yield ['require ', [$randomProject]]; + yield ['require ', [$randomVendor]]; yield ['require --dev symfony/http-', ['symfony/http-kernel', 'symfony/http-foundation']]; yield ['run-script ', ['compile', 'test', 'phpstan']]; From eac83aad5c05c0ca359e6b8381e6fcdeef22180b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 13 May 2022 10:35:39 +0200 Subject: [PATCH 064/618] Avoid running cache GC within completion processes --- src/Composer/Cache.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index c6e2585aaa31..27fc282179cb 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -248,6 +248,10 @@ public function gcIsNecessary() return false; } + if (Platform::isInputCompletionProcess()) { + return false; + } + return !random_int(0, 50); } From d99e059aa37a51376125f65c26b360d461df01a5 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 13 May 2022 13:58:02 +0200 Subject: [PATCH 065/618] Add bash completions to docs --- doc/03-cli.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/03-cli.md b/doc/03-cli.md index 9fd8256b610b..30d21c673b5d 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -13,6 +13,12 @@ php composer.phar dump ``` calls `composer dump-autoload`. +## Bash Completions + +To install bash completions you can run `composer completion bash > completion.bash` (put the file +in /etc/bash_completion.d/composer to make it load automatically in new terminals) and then +`source completion.bash` to enable it in the current terminal session. + ## Global Options The following options are available with every command: From 72f4e9ba63238946cd8053d9633335a0e0787157 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 13 May 2022 13:58:37 +0200 Subject: [PATCH 066/618] Remove package name completion from install command as it is not a recommended use case --- src/Composer/Command/InstallCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 35c7f664e26c..6e27a5815b3a 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -58,7 +58,7 @@ protected function configure() new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.', null, $this->suggestInstalledPackage()), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.'), )) ->setHelp( << Date: Fri, 13 May 2022 14:09:09 +0200 Subject: [PATCH 067/618] Add a couple missing --format completions --- src/Composer/Command/LicensesCommand.php | 4 ++-- src/Composer/Command/OutdatedCommand.php | 2 +- tests/Composer/Test/CompletionFunctionalTest.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Command/LicensesCommand.php b/src/Composer/Command/LicensesCommand.php index 748b5b85d4fd..52d0d0122959 100644 --- a/src/Composer/Command/LicensesCommand.php +++ b/src/Composer/Command/LicensesCommand.php @@ -12,6 +12,7 @@ namespace Composer\Command; +use Composer\Console\Input\InputOption; use Composer\Json\JsonFile; use Composer\Package\CompletePackageInterface; use Composer\Plugin\CommandEvent; @@ -22,7 +23,6 @@ use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; @@ -40,7 +40,7 @@ protected function configure(): void ->setName('licenses') ->setDescription('Shows information about licenses of dependencies.') ->setDefinition(array( - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text, json or summary', 'text'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text, json or summary', 'text', ['text', 'json', 'summary']), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), )) ->setHelp( diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index 8a8b8b0e682e..ffa9ba3af731 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -42,7 +42,7 @@ protected function configure(): void new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('patch-only', 'p', InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --outdated option.'), - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), diff --git a/tests/Composer/Test/CompletionFunctionalTest.php b/tests/Composer/Test/CompletionFunctionalTest.php index 36aa3fe8d52f..32baa33ce315 100644 --- a/tests/Composer/Test/CompletionFunctionalTest.php +++ b/tests/Composer/Test/CompletionFunctionalTest.php @@ -50,7 +50,7 @@ public function getCommandSuggestions(): iterable yield ['init --require-dev foo/bar --require-dev ', [$randomVendor]]; yield ['install --prefer-install ', $preferInstall]; - yield ['install ', $installedPackages]; + yield ['install ', null]; yield ['outdated ', $installedPackages]; From 1c6ba6af4746d425213568e367af686b60df05b3 Mon Sep 17 00:00:00 2001 From: James Watts <403296+jameswatts@users.noreply.github.com> Date: Fri, 13 May 2022 14:37:32 +0200 Subject: [PATCH 068/618] Minor rewording from autoloader to bin directory (#10776) --- doc/articles/vendor-binaries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/articles/vendor-binaries.md b/doc/articles/vendor-binaries.md index 6ce952a4ea43..9c0de3240f55 100644 --- a/doc/articles/vendor-binaries.md +++ b/doc/articles/vendor-binaries.md @@ -97,7 +97,7 @@ gets installed with a Composer version supporting the feature. As of Composer 2.2.2, a new `$_composer_bin_dir` global variable is defined by the bin proxy file, so that when your binary gets executed -it can use it to easily locate the project's autoloader. +it can use it to easily locate the project's Composer bin directory. For non-PHP binaries, as of Composer 2.2.6, the bin proxy sets a `COMPOSER_RUNTIME_BIN_DIR` environment variable. From 176d25851d1f99345c652a6ecbc7c3787071218d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 13 May 2022 15:55:51 +0200 Subject: [PATCH 069/618] Fix docs quoting, fixes #10778 --- doc/articles/aliases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/articles/aliases.md b/doc/articles/aliases.md index 193396e06dbf..1b03d42e505c 100644 --- a/doc/articles/aliases.md +++ b/doc/articles/aliases.md @@ -92,7 +92,7 @@ Add this to your project's root `composer.json`: Or let Composer add it for you with: ``` -php composer.phar require monolog/monolog:"dev-bugfix as 1.0.x-dev" +php composer.phar require "monolog/monolog:dev-bugfix as 1.0.x-dev" ``` That will fetch the `dev-bugfix` version of `monolog/monolog` from your GitHub From 76813a9cd0704278ec38e28fa8d1d9ea78e685b3 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 13 May 2022 14:58:25 +0100 Subject: [PATCH 070/618] CurlDownloader: detect max file size for gziped responses with missing content-length header (#10771) --- src/Composer/Util/Http/CurlDownloader.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 051fca277bc1..3799074f19c5 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -17,6 +17,7 @@ use Composer\IO\IOInterface; use Composer\Downloader\TransportException; use Composer\Pcre\Preg; +use Composer\Util\Platform; use Composer\Util\StreamContextFactory; use Composer\Util\AuthHelper; use Composer\Util\Url; @@ -394,8 +395,19 @@ public function tick(): void $response = new CurlResponse(array('url' => $progress['url']), $statusCode, $headers, $contents, $progress); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } else { + $maxFileSize = $job['options']['max_file_size'] ?? null; rewind($job['bodyHandle']); - $contents = stream_get_contents($job['bodyHandle']); + if ($maxFileSize !== null) { + $contents = stream_get_contents($job['bodyHandle'], $maxFileSize); + // Gzipped responses with missing Content-Length header cannot be detected during the file download + // because $progress['size_download'] refers to the gzipped size downloaded, not the actual file size + if ($contents !== false && Platform::strlen($contents) >= $maxFileSize) { + throw new MaxFileSizeExceededException('Maximum allowed download size reached. Downloaded ' . Platform::strlen($contents) . ' of allowed ' . $maxFileSize . ' bytes'); + } + } else { + $contents = stream_get_contents($job['bodyHandle']); + } + $response = new CurlResponse(array('url' => $progress['url']), $statusCode, $headers, $contents, $progress); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } From e496b1362fe559e8a3ee95ab2a7431caeb821457 Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 20 May 2022 12:15:59 +0100 Subject: [PATCH 071/618] GitHub: add support for files >1MB to getFileContent (#10785) --- src/Composer/Repository/Vcs/GitHubDriver.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Composer/Repository/Vcs/GitHubDriver.php b/src/Composer/Repository/Vcs/GitHubDriver.php index 6e81bc584ee7..0e60070bbf37 100644 --- a/src/Composer/Repository/Vcs/GitHubDriver.php +++ b/src/Composer/Repository/Vcs/GitHubDriver.php @@ -295,6 +295,13 @@ public function getFileContent(string $file, string $identifier): ?string $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/contents/' . $file . '?ref='.urlencode($identifier); $resource = $this->getContents($resource)->decodeJson(); + + // The GitHub contents API only returns files up to 1MB as base64 encoded files + // larger files either need be fetched with a raw accept header or by using the git blob endpoint + if ((!isset($resource['content']) || $resource['content'] === '') && $resource['encoding'] === 'none' && isset($resource['git_url'])) { + $resource = $this->getContents($resource['git_url'])->decodeJson(); + } + if (empty($resource['content']) || $resource['encoding'] !== 'base64' || !($content = base64_decode($resource['content']))) { throw new \RuntimeException('Could not retrieve ' . $file . ' for '.$identifier); } From 44a52e4157eb3a8c529204d6799ae7e0909d4de0 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 14:32:18 +0200 Subject: [PATCH 072/618] Fix backtracking in name validation regex --- res/composer-schema.json | 2 +- src/Composer/Package/Loader/ValidatingArrayLoader.php | 2 +- tests/Composer/Test/Json/ComposerSchemaTest.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index 166a80820264..e4e460b89d3d 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -6,7 +6,7 @@ "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix.", - "pattern": "^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$" + "pattern": "^[a-z0-9]([_.-]?[a-z0-9]++)*+/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$" }, "description": { "type": "string", diff --git a/src/Composer/Package/Loader/ValidatingArrayLoader.php b/src/Composer/Package/Loader/ValidatingArrayLoader.php index 7fb2c3b793ee..f05ba512f58d 100644 --- a/src/Composer/Package/Loader/ValidatingArrayLoader.php +++ b/src/Composer/Package/Loader/ValidatingArrayLoader.php @@ -456,7 +456,7 @@ public static function hasPackageNamingError($name, $isLink = false) return null; } - if (!Preg::isMatch('{^[a-z0-9](?:[_.-]?[a-z0-9]+)*/[a-z0-9](?:(?:[_.]?|-{0,2})[a-z0-9]+)*$}iD', $name)) { + if (!Preg::isMatch('{^[a-z0-9](?:[_.-]?[a-z0-9]++)*+/[a-z0-9](?:(?:[_.]|-{1,2})?[a-z0-9]++)*+$}iD', $name)) { return $name.' is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match "^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$".'; } diff --git a/tests/Composer/Test/Json/ComposerSchemaTest.php b/tests/Composer/Test/Json/ComposerSchemaTest.php index e45da5df300a..8c252a04643a 100644 --- a/tests/Composer/Test/Json/ComposerSchemaTest.php +++ b/tests/Composer/Test/Json/ComposerSchemaTest.php @@ -25,9 +25,9 @@ public function testNamePattern() $expectedError = array( array( 'property' => 'name', - 'message' => 'Does not match the regex pattern ^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$', + 'message' => 'Does not match the regex pattern ^[a-z0-9]([_.-]?[a-z0-9]++)*+/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$', 'constraint' => 'pattern', - 'pattern' => '^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$', + 'pattern' => '^[a-z0-9]([_.-]?[a-z0-9]++)*+/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$', ), ); From d131be009dea0c08d136493b1db1af807486db10 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 14:46:47 +0200 Subject: [PATCH 073/618] Update deps --- composer.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/composer.lock b/composer.lock index 718e800cd76e..d5437dabf2cb 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "composer/ca-bundle", - "version": "1.3.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + "reference": "fd5dd441932a7e10ca6e5b490e272d34c8430640" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/fd5dd441932a7e10ca6e5b490e272d34c8430640", + "reference": "fd5dd441932a7e10ca6e5b490e272d34c8430640", "shasum": "" }, "require": { @@ -64,7 +64,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.1" + "source": "https://github.com/composer/ca-bundle/tree/1.3.2" }, "funding": [ { @@ -80,7 +80,7 @@ "type": "tidelift" } ], - "time": "2021-10-28T20:44:15+00:00" + "time": "2022-05-24T11:56:16+00:00" }, { "name": "composer/metadata-minifier", @@ -305,16 +305,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.6", + "version": "1.5.7", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "a30d487169d799745ca7280bc90fdfa693536901" + "reference": "c848241796da2abf65837d51dce1fae55a960149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a30d487169d799745ca7280bc90fdfa693536901", - "reference": "a30d487169d799745ca7280bc90fdfa693536901", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", + "reference": "c848241796da2abf65837d51dce1fae55a960149", "shasum": "" }, "require": { @@ -365,7 +365,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.6" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" }, "funding": [ { @@ -381,7 +381,7 @@ "type": "tidelift" } ], - "time": "2021-11-18T10:14:14+00:00" + "time": "2022-05-23T07:37:50+00:00" }, { "name": "composer/xdebug-handler", @@ -451,16 +451,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.11", + "version": "5.2.12", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, "require": { @@ -515,9 +515,9 @@ ], "support": { "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" }, - "time": "2021-07-22T09:24:00+00:00" + "time": "2022-04-13T08:02:27+00:00" }, { "name": "psr/log", @@ -1682,5 +1682,5 @@ "platform-overrides": { "php": "5.3.9" }, - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } From 865886e5c5d8d0fe1877da967ae6c087993c0a26 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 17:35:50 +0200 Subject: [PATCH 074/618] Always show deprecation notices even if silenced --- src/Composer/Util/ErrorHandler.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Composer/Util/ErrorHandler.php b/src/Composer/Util/ErrorHandler.php index 80a0f9eed806..5fa1a3dd309a 100644 --- a/src/Composer/Util/ErrorHandler.php +++ b/src/Composer/Util/ErrorHandler.php @@ -38,8 +38,10 @@ class ErrorHandler */ public static function handle(int $level, string $message, string $file, int $line): bool { + $isDeprecationNotice = $level === E_DEPRECATED || $level === E_USER_DEPRECATED; + // error code is not included in error_reporting - if (!(error_reporting() & $level)) { + if (!$isDeprecationNotice && !(error_reporting() & $level)) { return true; } @@ -48,7 +50,7 @@ public static function handle(int $level, string $message, string $file, int $li "\na legitimately suppressed error that you were not supposed to see."; } - if ($level !== E_DEPRECATED && $level !== E_USER_DEPRECATED) { + if (!$isDeprecationNotice) { throw new \ErrorException($message, 0, $level, $file, $line); } From b2006fbe9c31821edd6b169f5b72ed60bfceab6e Mon Sep 17 00:00:00 2001 From: Subhan Shamsoddini Date: Tue, 24 May 2022 23:42:10 +0430 Subject: [PATCH 075/618] replace 'for' loop with 'str_repeat' function (#10788) --- src/Composer/Json/JsonFormatter.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Composer/Json/JsonFormatter.php b/src/Composer/Json/JsonFormatter.php index 8ea6f75099d6..e75012fa3501 100644 --- a/src/Composer/Json/JsonFormatter.php +++ b/src/Composer/Json/JsonFormatter.php @@ -108,9 +108,7 @@ public static function format(string $json, bool $unescapeUnicode, bool $unescap // If this character is the end of an element, // output a new line and indent the next line $result .= $newLine; - for ($j = 0; $j < $pos; $j++) { - $result .= $indentStr; - } + $result .= str_repeat($indentStr, $pos); } else { // Collapse empty {} and [] $result = rtrim($result); @@ -128,9 +126,7 @@ public static function format(string $json, bool $unescapeUnicode, bool $unescap $pos++; } - for ($j = 0; $j < $pos; $j++) { - $result .= $indentStr; - } + $result .= str_repeat($indentStr, $pos); } } From 654ecc759a021d27c011519d74483b0ed5ba095c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 21:21:47 +0200 Subject: [PATCH 076/618] Check that symlink function exists before using it in path repo, fixes #10786 --- src/Composer/Downloader/PathDownloader.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Composer/Downloader/PathDownloader.php b/src/Composer/Downloader/PathDownloader.php index 5482bf43d01d..0a09fc4a8a58 100644 --- a/src/Composer/Downloader/PathDownloader.php +++ b/src/Composer/Downloader/PathDownloader.php @@ -279,6 +279,15 @@ private function computeAllowedStrategies(array $transportOptions) $allowedStrategies = array(self::STRATEGY_MIRROR); } + // Check we can use symlink() otherwise + if (!Platform::isWindows() && self::STRATEGY_SYMLINK === $currentStrategy && !function_exists('symlink')) { + if (!in_array(self::STRATEGY_MIRROR, $allowedStrategies, true)) { + throw new \RuntimeException('Your PHP has the symlink() function disabled which does not allow Composer to use symlinks and this path repository has symlink:true in its options so copying is not allowed'); + } + $currentStrategy = self::STRATEGY_MIRROR; + $allowedStrategies = array(self::STRATEGY_MIRROR); + } + return array($currentStrategy, $allowedStrategies); } From 25542aca7095edfb47467c0bf3f1e9f8c2707dbc Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 21:26:37 +0200 Subject: [PATCH 077/618] Update baseline --- phpstan/baseline.neon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index a3f616c0cc65..ac39f66e861f 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -3472,7 +3472,7 @@ parameters: - message: "#^Call to function in_array\\(\\) with arguments 20, array\\{0\\: 10\\|20, 1\\?\\: 20\\} and true will always evaluate to true\\.$#" - count: 1 + count: 2 path: ../src/Composer/Downloader/PathDownloader.php - From 88e1f0f9b58e677a85ac2661f632926a439ee7e8 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 21:32:36 +0200 Subject: [PATCH 078/618] Make sure repos are always initialized with a repo manager if possible, and make sure async is always enabled on the process executor, fixes #10783 (#10799) --- src/Composer/Command/ArchiveCommand.php | 2 +- .../Command/BaseDependencyCommand.php | 3 +- src/Composer/Command/HomeCommand.php | 2 +- src/Composer/Command/InitCommand.php | 7 +++- .../Command/PackageDiscoveryTrait.php | 2 +- src/Composer/Command/ShowCommand.php | 4 +- src/Composer/Repository/RepositoryFactory.php | 37 ++++++++++++++++--- .../DependencyResolver/PoolBuilderTest.php | 4 +- 8 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/Composer/Command/ArchiveCommand.php b/src/Composer/Command/ArchiveCommand.php index fa450a6da7d1..a35f3aecf00a 100644 --- a/src/Composer/Command/ArchiveCommand.php +++ b/src/Composer/Command/ArchiveCommand.php @@ -159,7 +159,7 @@ protected function selectPackage(IOInterface $io, string $packageName, ?string $ $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $repo = new CompositeRepository(array_merge(array($localRepo), $composer->getRepositoryManager()->getRepositories())); } else { - $defaultRepos = RepositoryFactory::defaultRepos($this->getIO()); + $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $io->writeError('No composer.json found in the current directory, searching packages from ' . implode(', ', array_keys($defaultRepos))); $repo = new CompositeRepository($defaultRepos); } diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 7222319ff1bb..2d4dea40feda 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -18,6 +18,7 @@ use Composer\Package\RootPackage; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\CompositeRepository; +use Composer\Repository\RepositoryInterface; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; @@ -80,7 +81,7 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo // If the version we ask for is not installed then we need to locate it in remote repos and add it. // This is needed for why-not to resolve conflicts from an uninstalled version against installed packages. if (!$installedRepo->findPackage($needle, $textConstraint)) { - $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO())); + $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO(), $composer->getConfig(), $composer->getRepositoryManager())); if ($match = $defaultRepos->findPackage($needle, $textConstraint)) { $installedRepo->addRepository(new InstalledArrayRepository(array(clone $match))); } diff --git a/src/Composer/Command/HomeCommand.php b/src/Composer/Command/HomeCommand.php index dad4e3a7540f..c4457ac4c54a 100644 --- a/src/Composer/Command/HomeCommand.php +++ b/src/Composer/Command/HomeCommand.php @@ -170,6 +170,6 @@ private function initializeRepos(): array ); } - return RepositoryFactory::defaultRepos($this->getIO()); + return RepositoryFactory::defaultReposWithDefaultManager($this->getIO()); } } diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index f923f692913d..ae8bc6c9bf70 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -225,6 +225,9 @@ protected function interact(InputInterface $input, OutputInterface $output) $repositories = $input->getOption('repository'); if (count($repositories) > 0) { $config = Factory::createConfig($io); + $io->loadConfiguration($config); + $repoManager = RepositoryFactory::manager($io, $config); + $repos = array(new PlatformRepository); $createDefaultPackagistRepo = true; foreach ($repositories as $repo) { @@ -236,14 +239,14 @@ protected function interact(InputInterface $input, OutputInterface $output) $createDefaultPackagistRepo = false; continue; } - $repos[] = RepositoryFactory::createRepo($io, $config, $repoConfig); + $repos[] = RepositoryFactory::createRepo($io, $config, $repoConfig, $repoManager); } if ($createDefaultPackagistRepo) { $repos[] = RepositoryFactory::createRepo($io, $config, array( 'type' => 'composer', 'url' => 'https://repo.packagist.org', - )); + ), $repoManager); } $this->repos = new CompositeRepository($repos); diff --git a/src/Composer/Command/PackageDiscoveryTrait.php b/src/Composer/Command/PackageDiscoveryTrait.php index 99fb0f39b707..5e210bd7c763 100644 --- a/src/Composer/Command/PackageDiscoveryTrait.php +++ b/src/Composer/Command/PackageDiscoveryTrait.php @@ -47,7 +47,7 @@ protected function getRepos(): CompositeRepository if (null === $this->repos) { $this->repos = new CompositeRepository(array_merge( array(new PlatformRepository), - RepositoryFactory::defaultRepos($this->getIO()) + RepositoryFactory::defaultReposWithDefaultManager($this->getIO()) )); } diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 0194662b7c8e..72242073b205 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -194,7 +194,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $installedRepo->addRepository($composer->getRepositoryManager()->getLocalRepository()); } else { - $defaultRepos = RepositoryFactory::defaultRepos($io); + $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $repos = new CompositeRepository($defaultRepos); $io->writeError('No composer.json found in the current directory, showing available packages from ' . implode(', ', array_keys($defaultRepos))); } @@ -209,7 +209,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $repos = new CompositeRepository(array_merge(array(new FilterRepository($installedRepo, array('canonical' => false))), $composer->getRepositoryManager()->getRepositories())); } elseif ($input->getOption('all')) { - $defaultRepos = RepositoryFactory::defaultRepos($io); + $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $io->writeError('No composer.json found in the current directory, showing available packages from ' . implode(', ', array_keys($defaultRepos))); $installedRepo = new InstalledRepository(array($platformRepo)); $repos = new CompositeRepository(array_merge(array($installedRepo), $defaultRepos)); diff --git a/src/Composer/Repository/RepositoryFactory.php b/src/Composer/Repository/RepositoryFactory.php index b31f77530689..e24fa159685e 100644 --- a/src/Composer/Repository/RepositoryFactory.php +++ b/src/Composer/Repository/RepositoryFactory.php @@ -80,7 +80,8 @@ public static function fromString(IOInterface $io, Config $config, string $repos public static function createRepo(IOInterface $io, Config $config, array $repoConfig, RepositoryManager $rm = null): RepositoryInterface { if (!$rm) { - $rm = static::manager($io, $config, Factory::createHttpDownloader($io, $config)); + @trigger_error('Not passing a repository manager when calling createRepo is deprecated since Composer 2.3.6', E_USER_DEPRECATED); + $rm = static::manager($io, $config); } $repos = self::createRepos($rm, array($repoConfig)); @@ -95,14 +96,18 @@ public static function createRepo(IOInterface $io, Config $config, array $repoCo */ public static function defaultRepos(IOInterface $io = null, Config $config = null, RepositoryManager $rm = null): array { - if (!$config) { + if (null === $rm) { + @trigger_error('Not passing a repository manager when calling defaultRepos is deprecated since Composer 2.3.6, use defaultReposWithDefaultManager() instead if you cannot get a manager.', E_USER_DEPRECATED); + } + + if (null === $config) { $config = Factory::createConfig($io); } - if ($io) { + if (null !== $io) { $io->loadConfiguration($config); } - if (!$rm) { - if (!$io) { + if (null === $rm) { + if (null === $io) { throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager'); } $rm = static::manager($io, $config, Factory::createHttpDownloader($io, $config)); @@ -118,8 +123,16 @@ public static function defaultRepos(IOInterface $io = null, Config $config = nul * @param HttpDownloader $httpDownloader * @return RepositoryManager */ - public static function manager(IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null, ProcessExecutor $process = null): RepositoryManager + public static function manager(IOInterface $io, Config $config, HttpDownloader $httpDownloader = null, EventDispatcher $eventDispatcher = null, ProcessExecutor $process = null): RepositoryManager { + if ($httpDownloader === null) { + $httpDownloader = Factory::createHttpDownloader($io, $config); + } + if ($process === null) { + $process = new ProcessExecutor($io); + $process->enableAsync(); + } + $rm = new RepositoryManager($io, $config, $httpDownloader, $eventDispatcher, $process); $rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository'); $rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository'); @@ -140,6 +153,18 @@ public static function manager(IOInterface $io, Config $config, HttpDownloader $ return $rm; } + /** + * @return RepositoryInterface[] + */ + public static function defaultReposWithDefaultManager(IOInterface $io): array + { + $manager = RepositoryFactory::manager($io, $config = Factory::createConfig($io)); + $io->loadConfiguration($config); + + return RepositoryFactory::defaultRepos($io, $config, $manager); + } + + /** * @param array $repoConfigs * diff --git a/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php b/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php index 7e62491134ef..316fd82b55cb 100644 --- a/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php +++ b/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php @@ -87,9 +87,11 @@ public function testPoolBuilder(string $file, string $message, array $expect, ar chdir(__DIR__.'/Fixtures/poolbuilder/'); $repositorySet = new RepositorySet($minimumStability, $stabilityFlags, $rootAliases, $rootReferences); + $config = new Config(false); + $rm = RepositoryFactory::manager($io = new NullIO(), $config); foreach ($packageRepos as $packages) { if (isset($packages['type'])) { - $repo = RepositoryFactory::createRepo(new NullIO, new Config(false), $packages); + $repo = RepositoryFactory::createRepo($io, $config, $packages, $rm); $repositorySet->addRepository($repo); continue; } From 10d3895f187b0be4346781eac5788e15753b2d7c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 24 May 2022 22:14:17 +0200 Subject: [PATCH 079/618] Ensure that dotfiles can be excluded, fixes #8866 --- .../Test/Package/Archiver/ArchivableFilesFinderTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php b/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php index 6aad38c2c919..bd5cffe05ce9 100644 --- a/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php +++ b/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php @@ -43,6 +43,7 @@ protected function setUp() ); $fileTree = array( + '.foo', 'A/prefixA.foo', 'A/prefixB.foo', 'A/prefixC.foo', @@ -109,6 +110,7 @@ public function testManualExcludes() '/prefixA.foo', 'prefixC.*', '!*/*/*/prefixC.foo', + '.*', ); $this->finder = new ArchivableFilesFinder($this->sources, $excludes); @@ -213,6 +215,7 @@ public function testSkipExcludes() '/!important!.txt', '/!important_too!.txt', '/#weirdfile', + '/.foo', '/A/prefixA.foo', '/A/prefixB.foo', '/A/prefixC.foo', From 86dcc7ac23a548ae6ffcacff44e8ed304b7c4686 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 25 May 2022 21:36:44 +0200 Subject: [PATCH 080/618] Update changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ff872a264d7..ccca38d7765f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### [2.2.13] 2022-05-25 + + * Fixed invalid credentials loop when setting up GitLab token (#10748) + * Fixed PHP 8.2 deprecations (#10766) + * Fixed lock file changes being output even when the lock file creation is disabled + * Fixed race condition when multiple requests asking for auth on the same hostname fired concurrently (#10763) + * Fixed quoting of commas on Windows (#10775) + * Fixed issue installing path repos with a disabled symlink function (#10786) + ### [2.2.12] 2022-04-13 * Security: Fixed command injection vulnerability in HgDriver/GitDriver (GHSA-x7cr-6qr6-2hh6 / CVE-2022-24828) @@ -1427,6 +1436,7 @@ * Initial release +[2.2.13]: https://github.com/composer/composer/compare/2.2.12...2.2.13 [2.2.12]: https://github.com/composer/composer/compare/2.2.11...2.2.12 [2.2.11]: https://github.com/composer/composer/compare/2.2.10...2.2.11 [2.2.10]: https://github.com/composer/composer/compare/2.2.9...2.2.10 From de11c9819ac45659fb0fafb2e704912f9994ed60 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 25 May 2022 21:37:25 +0200 Subject: [PATCH 081/618] Release 2.2.13 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 624e0250764e..3f837a9bbe54 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '@package_version@'; - const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - const RELEASE_DATE = '@release_date@'; - const SOURCE_VERSION = '2.2.999-dev+source'; + const VERSION = '2.2.13'; + const BRANCH_ALIAS_VERSION = ''; + const RELEASE_DATE = '2022-05-25 21:37:25'; + const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 5d353716d3baa636e48021e2c208a24265c3caff Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 25 May 2022 21:37:26 +0200 Subject: [PATCH 082/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 3f837a9bbe54..624e0250764e 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '2.2.13'; - const BRANCH_ALIAS_VERSION = ''; - const RELEASE_DATE = '2022-05-25 21:37:25'; - const SOURCE_VERSION = ''; + const VERSION = '@package_version@'; + const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + const RELEASE_DATE = '@release_date@'; + const SOURCE_VERSION = '2.2.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 5b067a1b298bf9485015df76b5cab0777a92b964 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 25 May 2022 22:02:22 +0200 Subject: [PATCH 083/618] Update phpstan to latest --- composer.lock | 12 ++++++------ src/Composer/Console/Application.php | 3 ++- src/Composer/DependencyResolver/RuleSetIterator.php | 4 ++-- src/Composer/Package/BasePackage.php | 1 - src/Composer/Util/Platform.php | 3 +++ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/composer.lock b/composer.lock index 6c6c67a8c039..5850e2813516 100644 --- a/composer.lock +++ b/composer.lock @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.6.8", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "d76498c5531232cb8386ceb6004f7e013138d3ba" + "reference": "e3baed2ee2ef322e0f9b8fe8f87fdbe024c7c719" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d76498c5531232cb8386ceb6004f7e013138d3ba", - "reference": "d76498c5531232cb8386ceb6004f7e013138d3ba", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e3baed2ee2ef322e0f9b8fe8f87fdbe024c7c719", + "reference": "e3baed2ee2ef322e0f9b8fe8f87fdbe024c7c719", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.6.8" + "source": "https://github.com/phpstan/phpstan/tree/1.7.1" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-05-10T06:54:21+00:00" + "time": "2022-05-24T09:05:09+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index ba140a1496ea..dac353a94cc1 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -135,7 +135,8 @@ public function doRun(InputInterface $input, OutputInterface $output): int $this->disablePluginsByDefault = $input->hasParameterOption('--no-plugins'); $this->disableScriptsByDefault = $input->hasParameterOption('--no-scripts'); - if (Platform::getEnv('COMPOSER_NO_INTERACTION') || !Platform::isTty(defined('STDIN') ? STDIN : fopen('php://stdin', 'r'))) { + $stdin = defined('STDIN') ? STDIN : fopen('php://stdin', 'r'); + if (Platform::getEnv('COMPOSER_NO_INTERACTION') || $stdin === false || !Platform::isTty($stdin)) { $input->setInteractive(false); } diff --git a/src/Composer/DependencyResolver/RuleSetIterator.php b/src/Composer/DependencyResolver/RuleSetIterator.php index 3d30c5d7efbb..2bf67f55bf11 100644 --- a/src/Composer/DependencyResolver/RuleSetIterator.php +++ b/src/Composer/DependencyResolver/RuleSetIterator.php @@ -75,7 +75,7 @@ public function next(): void } $this->currentType = $this->types[$this->currentTypeOffset]; - } while (isset($this->types[$this->currentTypeOffset]) && !\count($this->rules[$this->currentType])); + } while (0 === \count($this->rules[$this->currentType])); } } @@ -95,7 +95,7 @@ public function rewind(): void } $this->currentType = $this->types[$this->currentTypeOffset]; - } while (isset($this->types[$this->currentTypeOffset]) && !\count($this->rules[$this->currentType])); + } while (0 === \count($this->rules[$this->currentType])); } public function valid(): bool diff --git a/src/Composer/Package/BasePackage.php b/src/Composer/Package/BasePackage.php index b815aec53d9e..df9b3ce290ee 100644 --- a/src/Composer/Package/BasePackage.php +++ b/src/Composer/Package/BasePackage.php @@ -53,7 +53,6 @@ abstract class BasePackage implements PackageInterface * READ-ONLY: The package id, public for fast access in dependency solver * @var int * @internal - * @readonly */ public $id; /** @var string */ diff --git a/src/Composer/Util/Platform.php b/src/Composer/Util/Platform.php index be37ba6214ee..d27bda08c387 100644 --- a/src/Composer/Util/Platform.php +++ b/src/Composer/Util/Platform.php @@ -201,6 +201,9 @@ public static function isTty($fd = null): bool { if ($fd === null) { $fd = defined('STDOUT') ? STDOUT : fopen('php://stdout', 'w'); + if ($fd === false) { + return false; + } } // detect msysgit/mingw and assume this is a tty because detection From 556450b15b6c47c55ffa46bd9048b410d56c3983 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 27 May 2022 14:51:46 +0200 Subject: [PATCH 084/618] Allow using temporary update constraints on all packages (incl non-root), fixes #10436 (#10773) --- src/Composer/Command/UpdateCommand.php | 44 ++------- .../DependencyResolver/PoolBuilder.php | 30 ++++-- src/Composer/DependencyResolver/Problem.php | 10 ++ src/Composer/Installer.php | 14 ++- src/Composer/Repository/RepositorySet.php | 20 +++- .../Test/Command/UpdateCommandTest.php | 95 +++++++++++++++++++ tests/Composer/Test/TestCase.php | 11 ++- 7 files changed, 174 insertions(+), 50 deletions(-) create mode 100644 tests/Composer/Test/Command/UpdateCommandTest.php diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 8bd3a9bfe26f..2bd15c9f550c 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -21,6 +21,7 @@ use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Package\Version\VersionParser; +use Composer\Semver\Constraint\ConstraintInterface; use Composer\Util\HttpDownloader; use Composer\Semver\Constraint\MultiConstraint; use Composer\Package\Link; @@ -144,20 +145,13 @@ protected function execute(InputInterface $input, OutputInterface $output) } } - $rootPackage = $composer->getPackage(); - $rootRequires = $rootPackage->getRequires(); - $rootDevRequires = $rootPackage->getDevRequires(); + $parser = new VersionParser; + $temporaryConstraints = []; foreach ($reqs as $package => $constraint) { - if (isset($rootRequires[$package])) { - $rootRequires[$package] = $this->appendConstraintToLink($rootRequires[$package], $constraint); - } elseif (isset($rootDevRequires[$package])) { - $rootDevRequires[$package] = $this->appendConstraintToLink($rootDevRequires[$package], $constraint); - } else { - throw new \UnexpectedValueException('Only root package requirements can receive temporary constraints and '.$package.' is not one'); - } + $temporaryConstraints[strtolower($package)] = $parser->parseConstraints($constraint); } - $rootPackage->setRequires($rootRequires); - $rootPackage->setDevRequires($rootDevRequires); + + $rootPackage = $composer->getPackage(); $rootPackage->setReferences(RootPackageLoader::extractReferences($reqs, $rootPackage->getReferences())); $rootPackage->setStabilityFlags(RootPackageLoader::extractStabilityFlags($reqs, $rootPackage->getMinimumStability(), $rootPackage->getStabilityFlags())); @@ -166,9 +160,9 @@ protected function execute(InputInterface $input, OutputInterface $output) } if ($input->getOption('root-reqs')) { - $requires = array_keys($rootRequires); + $requires = array_keys($rootPackage->getRequires()); if (!$input->getOption('no-dev')) { - $requires = array_merge($requires, array_keys($rootDevRequires)); + $requires = array_merge($requires, array_keys($rootPackage->getDevRequires())); } if (!empty($packages)) { @@ -232,6 +226,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) + ->setTemporaryConstraints($temporaryConstraints) ; if ($input->getOption('no-plugins')) { @@ -307,25 +302,4 @@ private function getPackagesInteractively(IOInterface $io, InputInterface $input throw new \RuntimeException('Installation aborted.'); } - - /** - * @param string $constraint - * @return Link - */ - private function appendConstraintToLink(Link $link, string $constraint): Link - { - $parser = new VersionParser; - $oldPrettyString = $link->getConstraint()->getPrettyString(); - $newConstraint = MultiConstraint::create(array($link->getConstraint(), $parser->parseConstraints($constraint))); - $newConstraint->setPrettyString($oldPrettyString.', '.$constraint); - - return new Link( - $link->getSource(), - $link->getTarget(), - $newConstraint, - /** @phpstan-ignore-next-line */ - $link->getDescription(), - $link->getPrettyConstraint() . ', ' . $constraint - ); - } } diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index 676ebfefc1d9..54223fba4a8f 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -58,6 +58,10 @@ class PoolBuilder * @phpstan-var array */ private $rootReferences; + /** + * @var array + */ + private $temporaryConstraints; /** * @var ?EventDispatcher */ @@ -142,8 +146,9 @@ class PoolBuilder * @phpstan-param array> $rootAliases * @param string[] $rootReferences an array of package name => source reference * @phpstan-param array $rootReferences + * @param array $temporaryConstraints Runtime temporary constraints that will be used to filter packages */ - public function __construct(array $acceptableStabilities, array $stabilityFlags, array $rootAliases, array $rootReferences, IOInterface $io, EventDispatcher $eventDispatcher = null, PoolOptimizer $poolOptimizer = null) + public function __construct(array $acceptableStabilities, array $stabilityFlags, array $rootAliases, array $rootReferences, IOInterface $io, EventDispatcher $eventDispatcher = null, PoolOptimizer $poolOptimizer = null, array $temporaryConstraints = []) { $this->acceptableStabilities = $acceptableStabilities; $this->stabilityFlags = $stabilityFlags; @@ -152,6 +157,7 @@ public function __construct(array $acceptableStabilities, array $stabilityFlags, $this->eventDispatcher = $eventDispatcher; $this->poolOptimizer = $poolOptimizer; $this->io = $io; + $this->temporaryConstraints = $temporaryConstraints; } /** @@ -234,24 +240,28 @@ public function buildPool(array $repositories, Request $request): Pool $this->loadPackagesMarkedForLoading($request, $repositories); } - foreach ($this->packages as $i => $package) { - // we check all alias related packages at once, so no need to check individual aliases - // isset also checks non-null value - if (!$package instanceof AliasPackage) { - $constraint = new Constraint('==', $package->getVersion()); - $aliasedPackages = array($i => $package); + if (\count($this->temporaryConstraints) > 0) { + foreach ($this->packages as $i => $package) { + // we check all alias related packages at once, so no need to check individual aliases + if (!isset($this->temporaryConstraints[$package->getName()]) || $package instanceof AliasPackage) { + continue; + } + + $constraint = $this->temporaryConstraints[$package->getName()]; + $packageAndAliases = array($i => $package); if (isset($this->aliasMap[spl_object_hash($package)])) { - $aliasedPackages += $this->aliasMap[spl_object_hash($package)]; + $packageAndAliases += $this->aliasMap[spl_object_hash($package)]; } $found = false; - foreach ($aliasedPackages as $packageOrAlias) { + foreach ($packageAndAliases as $packageOrAlias) { if (CompilingMatcher::match($constraint, Constraint::OP_EQ, $packageOrAlias->getVersion())) { $found = true; } } + if (!$found) { - foreach ($aliasedPackages as $index => $packageOrAlias) { + foreach ($packageAndAliases as $index => $packageOrAlias) { unset($this->packages[$index]); } } diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index b3bddb1b088c..07cecb836997 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -294,6 +294,16 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req } } + $tempReqs = $repositorySet->getTemporaryConstraints(); + if (isset($tempReqs[$packageName])) { + $filtered = array_filter($packages, function ($p) use ($tempReqs, $packageName): bool { + return $tempReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); + }); + if (0 === count($filtered)) { + return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts').' with your temporary update constraint ('.$packageName.':'.$tempReqs[$packageName]->getPrettyString().').'); + } + } + if ($lockedPackage) { $fixedConstraint = new Constraint('==', $lockedPackage->getVersion()); $filtered = array_filter($packages, function ($p) use ($fixedConstraint): bool { diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index dbfb5f03171f..c4cf9785eed6 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -60,6 +60,7 @@ use Composer\Repository\RepositoryManager; use Composer\Repository\LockArrayRepository; use Composer\Script\ScriptEvents; +use Composer\Semver\Constraint\ConstraintInterface; use Composer\Util\Platform; /** @@ -189,6 +190,9 @@ class Installer */ protected $additionalFixedRepository; + /** @var array */ + protected $temporaryConstraints = []; + /** * Constructor * @@ -837,7 +841,7 @@ private function createRepositorySet(bool $forUpdate, PlatformRepository $platfo $stabilityFlags[$this->package->getName()] = BasePackage::$stabilities[VersionParser::parseStability($this->package->getVersion())]; - $repositorySet = new RepositorySet($minimumStability, $stabilityFlags, $rootAliases, $this->package->getReferences(), $rootRequires); + $repositorySet = new RepositorySet($minimumStability, $stabilityFlags, $rootAliases, $this->package->getReferences(), $rootRequires, $this->temporaryConstraints); $repositorySet->addRepository(new RootPackageRepository($this->fixedRootPackage)); $repositorySet->addRepository($platformRepo); if ($this->additionalFixedRepository) { @@ -1065,6 +1069,14 @@ public function setAdditionalFixedRepository(RepositoryInterface $additionalFixe return $this; } + /** + * @param array $constraints + */ + public function setTemporaryConstraints(array $constraints): void + { + $this->temporaryConstraints = $constraints; + } + /** * Whether to run in drymode or not * diff --git a/src/Composer/Repository/RepositorySet.php b/src/Composer/Repository/RepositorySet.php index e3ad49dfe0de..e656d18c5415 100644 --- a/src/Composer/Repository/RepositorySet.php +++ b/src/Composer/Repository/RepositorySet.php @@ -73,6 +73,11 @@ class RepositorySet */ private $rootRequires; + /** + * @var array + */ + private $temporaryConstraints; + /** @var bool */ private $locked = false; /** @var bool */ @@ -92,8 +97,9 @@ class RepositorySet * @phpstan-param array $rootReferences * @param ConstraintInterface[] $rootRequires an array of package name => constraint from the root package * @phpstan-param array $rootRequires + * @param array $temporaryConstraints Runtime temporary constraints that will be used to filter packages */ - public function __construct(string $minimumStability = 'stable', array $stabilityFlags = array(), array $rootAliases = array(), array $rootReferences = array(), array $rootRequires = array()) + public function __construct(string $minimumStability = 'stable', array $stabilityFlags = array(), array $rootAliases = array(), array $rootReferences = array(), array $rootRequires = array(), array $temporaryConstraints = []) { $this->rootAliases = self::getRootAliasesPerPackage($rootAliases); $this->rootReferences = $rootReferences; @@ -111,6 +117,8 @@ public function __construct(string $minimumStability = 'stable', array $stabilit unset($this->rootRequires[$name]); } } + + $this->temporaryConstraints = $temporaryConstraints; } /** @@ -132,6 +140,14 @@ public function getRootRequires(): array return $this->rootRequires; } + /** + * @return array Runtime temporary constraints that will be used to filter packages + */ + public function getTemporaryConstraints(): array + { + return $this->temporaryConstraints; + } + /** * Adds a repository to this repository set * @@ -247,7 +263,7 @@ public function isPackageAcceptable(array $names, string $stability): bool */ public function createPool(Request $request, IOInterface $io, EventDispatcher $eventDispatcher = null, PoolOptimizer $poolOptimizer = null): Pool { - $poolBuilder = new PoolBuilder($this->acceptableStabilities, $this->stabilityFlags, $this->rootAliases, $this->rootReferences, $io, $eventDispatcher, $poolOptimizer); + $poolBuilder = new PoolBuilder($this->acceptableStabilities, $this->stabilityFlags, $this->rootAliases, $this->rootReferences, $io, $eventDispatcher, $poolOptimizer, $this->temporaryConstraints); foreach ($this->repositories as $repo) { if (($repo instanceof InstalledRepositoryInterface || $repo instanceof InstalledRepository) && !$this->allowInstalledRepositories) { diff --git a/tests/Composer/Test/Command/UpdateCommandTest.php b/tests/Composer/Test/Command/UpdateCommandTest.php new file mode 100644 index 000000000000..fdc876b9c83f --- /dev/null +++ b/tests/Composer/Test/Command/UpdateCommandTest.php @@ -0,0 +1,95 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Test\TestCase; + +class UpdateCommandTest extends TestCase +{ + /** + * @dataProvider provideUpdates + * @param array $composerJson + * @param array $command + */ + public function testUpdate(array $composerJson, array $command, string $expected): void + { + $this->initTempComposer($composerJson); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'update', '--dry-run' => true], $command)); + + $this->assertSame(trim($expected), trim($appTester->getDisplay())); + } + + public function provideUpdates(): \Generator + { + $rootDepAndTransitiveDep = [ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'root/req', 'version' => '1.0.0', 'require' => ['dep/pkg' => '^1']], + ['name' => 'dep/pkg', 'version' => '1.0.0'], + ['name' => 'dep/pkg', 'version' => '1.0.1'], + ['name' => 'dep/pkg', 'version' => '1.0.2'], + ], + ], + ], + 'require' => [ + 'root/req' => '1.*', + ], + ]; + + yield 'simple update' => [ + $rootDepAndTransitiveDep, + [], + << [ + $rootDepAndTransitiveDep, + ['--with' => ['dep/pkg:1.0.0'], '--no-install' => true], + << [ + $rootDepAndTransitiveDep, + ['--with' => ['dep/pkg:^2']], + << satisfiable by root/req[1.0.0]. + - root/req 1.0.0 requires dep/pkg ^1 -> found dep/pkg[1.0.0, 1.0.1, 1.0.2] but it conflicts with your temporary update constraint (dep/pkg:^2). +OUTPUT + ]; + } +} diff --git a/tests/Composer/Test/TestCase.php b/tests/Composer/Test/TestCase.php index 9ed75c4b1e59..fe7e279bffe6 100644 --- a/tests/Composer/Test/TestCase.php +++ b/tests/Composer/Test/TestCase.php @@ -124,9 +124,16 @@ public function initTempComposer(array $composerJson = [], array $authJson = []) Platform::putEnv('COMPOSER_HOME', $dir.'/composer-home'); Platform::putEnv('COMPOSER_DISABLE_XDEBUG_WARN', '1'); + if ($composerJson === []) { + $composerJson = new \stdClass; + } + if ($authJson === []) { + $authJson = new \stdClass; + } + chdir($dir); - file_put_contents($dir.'/composer.json', JsonFile::encode($composerJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT)); - file_put_contents($dir.'/auth.json', JsonFile::encode($authJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT)); + file_put_contents($dir.'/composer.json', JsonFile::encode($composerJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + file_put_contents($dir.'/auth.json', JsonFile::encode($authJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); return $dir; } From 955194f8969bdbf110475f3eda604f869d059133 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Tue, 31 May 2022 13:24:38 +0200 Subject: [PATCH 085/618] docs: Fix inconsist semver operator suggestion (#10810) Using caret over tilde is better since it behaves the same as in npm: https://jubianchi.github.io/semver-check/#/constraint/~3.0 But when this change was introduced in https://github.com/composer/composer/pull/5396, it was not complete. --- doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md b/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md index 2039fa81bd67..d9df4e5d8189 100644 --- a/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md +++ b/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md @@ -12,7 +12,7 @@ The only good alternative is to define an upper bound on your constraints, which you can increase in a new release after testing that your package is compatible with the new major version of your dependency. -For example instead of using `>=3.4` you should use `~3.4` which allows all +For example instead of using `>=3.4` you should use `^3.4` which allows all versions up to `3.999` but does not include `4.0` and above. The `^` operator works very well with libraries following [semantic versioning](https://semver.org). From 313142c6cd64ac5d7d37aaa327ee244068512b03 Mon Sep 17 00:00:00 2001 From: Matronator <5470780+matronator@users.noreply.github.com> Date: Tue, 31 May 2022 01:44:07 +0200 Subject: [PATCH 086/618] Escape forward slash in `properties.name` --- res/composer-schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index e4e460b89d3d..b09c095ccaab 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -6,7 +6,7 @@ "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix.", - "pattern": "^[a-z0-9]([_.-]?[a-z0-9]++)*+/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$" + "pattern": "^[a-z0-9]([_.-]?[a-z0-9]++)*+\/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$" }, "description": { "type": "string", From 70a7b592e994cc8c042e3c869af34ff1e72db777 Mon Sep 17 00:00:00 2001 From: Nicolas Hedger <649677+nhedger@users.noreply.github.com> Date: Wed, 1 Jun 2022 21:23:07 +0200 Subject: [PATCH 087/618] Fix JSON schema regex pattern (#10811) --- res/composer-schema.json | 2 +- tests/Composer/Test/Json/ComposerSchemaTest.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index b09c095ccaab..9516e4590b35 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -6,7 +6,7 @@ "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix.", - "pattern": "^[a-z0-9]([_.-]?[a-z0-9]++)*+\/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$" + "pattern": "^[a-z0-9]([_.-]?[a-z0-9]+)*\/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$" }, "description": { "type": "string", diff --git a/tests/Composer/Test/Json/ComposerSchemaTest.php b/tests/Composer/Test/Json/ComposerSchemaTest.php index 8c252a04643a..2cda98e4e0c7 100644 --- a/tests/Composer/Test/Json/ComposerSchemaTest.php +++ b/tests/Composer/Test/Json/ComposerSchemaTest.php @@ -25,9 +25,9 @@ public function testNamePattern() $expectedError = array( array( 'property' => 'name', - 'message' => 'Does not match the regex pattern ^[a-z0-9]([_.-]?[a-z0-9]++)*+/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$', + 'message' => 'Does not match the regex pattern ^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$', 'constraint' => 'pattern', - 'pattern' => '^[a-z0-9]([_.-]?[a-z0-9]++)*+/[a-z0-9](([_.]|-{1,2})?[a-z0-9]++)*+$', + 'pattern' => '^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$', ), ); From 3ead6c01197da9ec0793a9d7669cae8e2befdb8b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 21:32:29 +0200 Subject: [PATCH 088/618] Backport schema fixes for gitlab-token, fixes #10800 --- res/composer-schema.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index 9516e4590b35..f3f0ca2a92cc 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -349,7 +349,18 @@ "type": "object", "description": "An object of domain name => gitlab private tokens, typically {\"gitlab.com\":\"\"}.", "additionalProperties": { - "type": "string" + "type": ["string", "object"], + "required": ["username", "token"], + "properties": { + "username": { + "type": "string", + "description": "The username used for GitLab authentication" + }, + "token": { + "type": "string", + "description": "The token used for GitLab authentication" + } + } } }, "gitlab-protocol": { From 3ebf82e4912a2878422fe02dd54c8b94ba0228ca Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 21:40:56 +0200 Subject: [PATCH 089/618] Update deps --- composer.lock | 77 +++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/composer.lock b/composer.lock index 5850e2813516..2c5954377e7a 100644 --- a/composer.lock +++ b/composer.lock @@ -807,16 +807,16 @@ }, { "name": "symfony/console", - "version": "v5.4.8", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b" + "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b", - "reference": "ffe3aed36c4d60da2cf1b0a1cee6b8f2e5fa881b", + "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", + "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", "shasum": "" }, "require": { @@ -886,7 +886,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.8" + "source": "https://github.com/symfony/console/tree/v5.4.9" }, "funding": [ { @@ -902,7 +902,7 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:02:29+00:00" + "time": "2022-05-18T06:17:34+00:00" }, { "name": "symfony/deprecation-contracts", @@ -973,16 +973,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.7", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f" + "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3a4442138d80c9f7b600fb297534ac718b61d37f", - "reference": "3a4442138d80c9f7b600fb297534ac718b61d37f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", "shasum": "" }, "require": { @@ -1017,7 +1017,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.7" + "source": "https://github.com/symfony/filesystem/tree/v5.4.9" }, "funding": [ { @@ -1033,7 +1033,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T12:33:59+00:00" + "time": "2022-05-20T13:55:35+00:00" }, { "name": "symfony/finder", @@ -1737,16 +1737,16 @@ }, { "name": "symfony/string", - "version": "v5.4.8", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8" + "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8", - "reference": "3c061a76bff6d6ea427d85e12ad1bb8ed8cd43e8", + "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", "shasum": "" }, "require": { @@ -1803,7 +1803,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.8" + "source": "https://github.com/symfony/string/tree/v5.4.9" }, "funding": [ { @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.7.1", + "version": "1.7.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e3baed2ee2ef322e0f9b8fe8f87fdbe024c7c719" + "reference": "2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e3baed2ee2ef322e0f9b8fe8f87fdbe024c7c719", - "reference": "e3baed2ee2ef322e0f9b8fe8f87fdbe024c7c719", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a", + "reference": "2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.7.1" + "source": "https://github.com/phpstan/phpstan/tree/1.7.8" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T09:05:09+00:00" + "time": "2022-06-01T13:43:17+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -2034,22 +2034,22 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "1.1.8", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "4bdffcf1033b6c60662a28419d0192e0dda5684f" + "reference": "30f12aeab960c7f324eee3b39645655cf8a84146" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/4bdffcf1033b6c60662a28419d0192e0dda5684f", - "reference": "4bdffcf1033b6c60662a28419d0192e0dda5684f", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/30f12aeab960c7f324eee3b39645655cf8a84146", + "reference": "30f12aeab960c7f324eee3b39645655cf8a84146", "shasum": "" }, "require": { "ext-simplexml": "*", - "php": "^7.1 || ^8.0", - "phpstan/phpstan": "^1.4" + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.6" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -2073,9 +2073,6 @@ }, "type": "phpstan-extension", "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - }, "phpstan": { "includes": [ "extension.neon", @@ -2102,22 +2099,22 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.1.8" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.2.2" }, - "time": "2022-03-24T07:56:03+00:00" + "time": "2022-05-28T15:18:51+00:00" }, { "name": "symfony/phpunit-bridge", - "version": "v6.0.8", + "version": "v6.1.0", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "4959a1eedd473bdb3f19db5b1525d5415dfab471" + "reference": "092ccc3b364925cd8ed6046bc31dcf3a022bd5a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/4959a1eedd473bdb3f19db5b1525d5415dfab471", - "reference": "4959a1eedd473bdb3f19db5b1525d5415dfab471", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/092ccc3b364925cd8ed6046bc31dcf3a022bd5a4", + "reference": "092ccc3b364925cd8ed6046bc31dcf3a022bd5a4", "shasum": "" }, "require": { @@ -2171,7 +2168,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.0.8" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.1.0" }, "funding": [ { @@ -2187,7 +2184,7 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:11:42+00:00" + "time": "2022-04-12T16:22:53+00:00" } ], "aliases": [], From 932aa4b8a753fce11233297baa3d23835324d08c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 21:57:09 +0200 Subject: [PATCH 090/618] Update changelog --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21f52c39ea8f..2254fafdf358 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +### [2.3.6] 2022-06-01 + + * Added `Composer\PHPStan\ConfigReturnTypeExtension` to improve return types of `Config::get()` which you can also use in plugins CI (#10635) + * Fixed name validation regex in schema causing issues with JS IDEs like VS Code (#10811) + * Fixed unnecessary HTTP request in BitbucketDriver (#10729) + * Fixed invalid credentials loop when setting up GitLab token (#10748) + * Fixed PHP 8.2 deprecations (#10766) + * Fixed lock file changes being output even when the lock file creation is disabled + * Fixed race condition when multiple requests asking for auth on the same hostname fired concurrently (#10763) + * Fixed quoting of commas on Windows (#10775) + * Fixed issue installing path repos with a disabled symlink function (#10786) + * Fixed various type errors (#10753, #10739, #10751) + ### [2.3.5] 2022-04-13 * Security: Fixed command injection vulnerability in HgDriver/GitDriver (GHSA-x7cr-6qr6-2hh6 / CVE-2022-24828) @@ -1509,6 +1522,7 @@ * Initial release +[2.3.6]: https://github.com/composer/composer/compare/2.3.5...2.3.6 [2.3.5]: https://github.com/composer/composer/compare/2.3.4...2.3.5 [2.3.4]: https://github.com/composer/composer/compare/2.3.3...2.3.4 [2.3.3]: https://github.com/composer/composer/compare/2.3.2...2.3.3 From 0f43aa1652c447a6bc7c9217ec133313b1d32e72 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 21:57:13 +0200 Subject: [PATCH 091/618] Release 2.3.6 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 93e8c0a6f5d6..b7b8b29fd1be 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.3.999-dev+source'; + public const VERSION = '2.3.6'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-06-01 21:57:13'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From f58b72a43be171faaf328f938b8af4faf499dc69 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 21:57:14 +0200 Subject: [PATCH 092/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index b7b8b29fd1be..93e8c0a6f5d6 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.3.6'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-06-01 21:57:13'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.3.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 6f0ac07ebe25c4aa0fb09a2ca8a4f00d431ab75e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 22:08:31 +0200 Subject: [PATCH 093/618] Include completion file for bash completion generation, refs #10320 --- src/Composer/Compiler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Compiler.php b/src/Composer/Compiler.php index fac62fbb5363..c63c5564b3e5 100644 --- a/src/Composer/Compiler.php +++ b/src/Composer/Compiler.php @@ -120,7 +120,6 @@ public function compile(string $pharFile = 'composer.phar'): void ->ignoreVCS(true) ->notPath('/\/(composer\.(json|lock)|[A-Z]+\.md|\.gitignore|appveyor.yml|phpunit\.xml\.dist|phpstan\.neon\.dist|phpstan-config\.neon|phpstan-baseline\.neon)$/') ->notPath('/bin\/(jsonlint|validate-json|simple-phpunit|phpstan|phpstan\.phar)(\.bat)?$/') - ->notPath('symfony/console/Resources/completion.bash') ->notPath('justinrainbow/json-schema/demo/') ->notPath('justinrainbow/json-schema/dist/') ->notPath('composer/installed.json') @@ -138,6 +137,7 @@ public function compile(string $pharFile = 'composer.phar'): void __DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-licenses.json', CaBundle::getBundledCaBundlePath(), __DIR__ . '/../../vendor/symfony/console/Resources/bin/hiddeninput.exe', + __DIR__ . '/../../vendor/symfony/console/Resources/completion.bash', ) as $file) { $extraFiles[$file] = realpath($file); if (!file_exists($file)) { From 5888945c302b675c02435aee804d59bc9710236e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 22:10:48 +0200 Subject: [PATCH 094/618] Fix tests on windows --- tests/Composer/Test/Command/UpdateCommandTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Composer/Test/Command/UpdateCommandTest.php b/tests/Composer/Test/Command/UpdateCommandTest.php index fdc876b9c83f..90b614389410 100644 --- a/tests/Composer/Test/Command/UpdateCommandTest.php +++ b/tests/Composer/Test/Command/UpdateCommandTest.php @@ -28,7 +28,7 @@ public function testUpdate(array $composerJson, array $command, string $expected $appTester = $this->getApplicationTester(); $appTester->run(array_merge(['command' => 'update', '--dry-run' => true], $command)); - $this->assertSame(trim($expected), trim($appTester->getDisplay())); + $this->assertSame(strtr(trim($expected), "\r", ''), strtr(trim($appTester->getDisplay()), "\r", '')); } public function provideUpdates(): \Generator From 829fca0be17ee8b852db8f1c3c7c37ac47e78f54 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 1 Jun 2022 22:14:01 +0200 Subject: [PATCH 095/618] Split direct/transitive dependencies in two groups in outdated command, fixes #10447 (#10779) --- src/Composer/Command/ShowCommand.php | 101 ++++++++++++++++++--------- 1 file changed, 69 insertions(+), 32 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 18291cc29caf..bdfb5c8cf3bf 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -15,6 +15,7 @@ use Composer\Composer; use Composer\DependencyResolver\DefaultPolicy; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; +use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; @@ -477,6 +478,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $packageViewData['name'] = $package->getPrettyName(); + $packageViewData['direct-dependency'] = in_array($package->getName(), $this->getRootRequires(), true); if ($format !== 'json' || true !== $input->getOption('name-only')) { $packageViewData['homepage'] = $package instanceof CompletePackageInterface ? $package->getHomepage() : null; $packageViewData['source'] = PackageInfo::getViewSourceUrl($package); @@ -580,43 +582,33 @@ protected function execute(InputInterface $input, OutputInterface $output) } } - foreach ($packages as $package) { - $link = $package['source'] ?? $package['homepage'] ?? ''; - if ($link !== '') { - $io->write($indent . ''.$package['name'].''. str_repeat(' ', $nameLength - strlen($package['name'])), false); - } else { - $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); - } - if (isset($package['version']) && $writeVersion) { - $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); - } - if (isset($package['latest']) && isset($package['latest-status']) && $writeLatest) { - $latestVersion = $package['latest']; - $updateStatus = $package['latest-status']; - $style = $this->updateStatusToVersionStyle($updateStatus); - if (!$io->isDecorated()) { - $latestVersion = str_replace(array('up-to-date', 'semver-safe-update', 'update-possible'), array('=', '!', '~'), $updateStatus) . ' ' . $latestVersion; + if ($writeLatest && !$input->getOption('direct')) { + $directDeps = []; + $transitiveDeps = []; + foreach ($packages as $pkg) { + if ($pkg['direct-dependency'] ?? false) { + $directDeps[] = $pkg; + } else { + $transitiveDeps[] = $pkg; } - $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '', false); } - if (isset($package['description']) && $writeDescription) { - $description = strtok($package['description'], "\r\n"); - $remaining = $width - $nameLength - $versionLength - 4; - if ($writeLatest) { - $remaining -= $latestLength; - } - if (strlen($description) > $remaining) { - $description = substr($description, 0, $remaining - 3) . '...'; - } - $io->write(' ' . $description, false); - } - if (isset($package['path'])) { - $io->write(' ' . $package['path'], false); + + $io->write(''); + $io->write('Direct dependencies:'); + if (\count($directDeps) > 0) { + $this->printPackages($io, $directDeps, $indent, $writeVersion, $writeLatest, $writeDescription, $width, $versionLength, $nameLength, $latestLength); + } else { + $io->write('Everything up to date'); } $io->write(''); - if (isset($package['warning'])) { - $io->write('' . $package['warning'] . ''); + $io->write('Transitive dependencies:'); + if (\count($transitiveDeps) > 0) { + $this->printPackages($io, $transitiveDeps, $indent, $writeVersion, $writeLatest, $writeDescription, $width, $versionLength, $nameLength, $latestLength); + } else { + $io->write('Everything up to date'); } + } else { + $this->printPackages($io, $packages, $indent, $writeVersion, $writeLatest, $writeDescription, $width, $versionLength, $nameLength, $latestLength); } if ($showAllTypes) { @@ -628,6 +620,51 @@ protected function execute(InputInterface $input, OutputInterface $output) return $exitCode; } + /** + * @param array $packages + */ + private function printPackages(IOInterface $io, array $packages, string $indent, bool $writeVersion, bool $writeLatest, bool $writeDescription, int $width, int $versionLength, int $nameLength, int $latestLength): void + { + foreach ($packages as $package) { + $link = $package['source'] ?? $package['homepage'] ?? ''; + if ($link !== '') { + $io->write($indent . ''.$package['name'].''. str_repeat(' ', $nameLength - strlen($package['name'])), false); + } else { + $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); + } + if (isset($package['version']) && $writeVersion) { + $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); + } + if (isset($package['latest']) && isset($package['latest-status']) && $writeLatest) { + $latestVersion = $package['latest']; + $updateStatus = $package['latest-status']; + $style = $this->updateStatusToVersionStyle($updateStatus); + if (!$io->isDecorated()) { + $latestVersion = str_replace(array('up-to-date', 'semver-safe-update', 'update-possible'), array('=', '!', '~'), $updateStatus) . ' ' . $latestVersion; + } + $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '', false); + } + if (isset($package['description']) && $writeDescription) { + $description = strtok($package['description'], "\r\n"); + $remaining = $width - $nameLength - $versionLength - 4; + if ($writeLatest) { + $remaining -= $latestLength; + } + if (strlen($description) > $remaining) { + $description = substr($description, 0, $remaining - 3) . '...'; + } + $io->write(' ' . $description, false); + } + if (isset($package['path'])) { + $io->write(' ' . $package['path'], false); + } + $io->write(''); + if (isset($package['warning'])) { + $io->write('' . $package['warning'] . ''); + } + } + } + /** * @return string[] */ From 509c0fffbed65b41bfafc4717b6d784fbba1bf96 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 2 Jun 2022 21:05:00 +0200 Subject: [PATCH 096/618] Include phpstan rules file, closes #10813 --- .gitattributes | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 2ee43db45c93..a929b3528836 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,4 +15,5 @@ .travis.yml export-ignore appveyor.yml export-ignore phpunit.xml.dist export-ignore -/phpstan/ export-ignore +/phpstan/* export-ignore +/phpstan/rules.neon -export-ignore \ No newline at end of file From 15f7d24e7edfb74927b3d9416be5802d3ea31178 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 2 Jun 2022 21:15:18 +0200 Subject: [PATCH 097/618] Parse openssl 3 versions cleaner --- src/Composer/Platform/Version.php | 9 +++++++-- tests/Composer/Test/Platform/VersionTest.php | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Composer/Platform/Version.php b/src/Composer/Platform/Version.php index 6c9cd8fa57d9..a04d279f4221 100644 --- a/src/Composer/Platform/Version.php +++ b/src/Composer/Platform/Version.php @@ -32,11 +32,16 @@ public static function parseOpenssl($opensslVersion, &$isFips) return null; } + // OpenSSL 1 used 1.2.3a style versioning, 3+ uses semver + $patch = ''; + if (version_compare($matches['version'], '3.0.0', '<')) { + $patch = '.'.self::convertAlphaVersionToIntVersion($matches['patch']); + } + $isFips = strpos($matches['suffix'], 'fips') !== false; $suffix = strtr('-'.ltrim($matches['suffix'], '-'), array('-fips' => '', '-pre' => '-alpha')); - $patch = self::convertAlphaVersionToIntVersion($matches['patch']); - return rtrim($matches['version'].'.'.$patch.$suffix, '-'); + return rtrim($matches['version'].$patch.$suffix, '-'); } /** diff --git a/tests/Composer/Test/Platform/VersionTest.php b/tests/Composer/Test/Platform/VersionTest.php index 3ebb03724495..edcca00413da 100644 --- a/tests/Composer/Test/Platform/VersionTest.php +++ b/tests/Composer/Test/Platform/VersionTest.php @@ -69,6 +69,9 @@ public static function provideOpenSslVersions() array('1.2.3za', '1.2.3.27'), array('1.2.3zy', '1.2.3.51'), array('1.2.3zz', '1.2.3.52'), + // 3.x + array('3.0.0', '3.0.0', false, '3.0.0.0'), + array('3.2.4-dev', '3.2.4-dev', false, '3.2.4.0-dev'), ); } From 3b204cb6f27e75e3fd0e7e5672fa4b2c86181d6d Mon Sep 17 00:00:00 2001 From: Martin Herndl Date: Thu, 2 Jun 2022 12:55:21 +0200 Subject: [PATCH 098/618] Specify optional array keys in `ConfigReturnTypeExtension` --- src/Composer/PHPStan/ConfigReturnTypeExtension.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index fc1de219ea7e..574d7f921a4b 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -123,19 +123,23 @@ private function parseType(array $def, string $path): Type if (isset($def['properties'])) { $keyNames = []; $valTypes = []; + $optionalKeys = []; + $propIndex = 0; foreach ($def['properties'] as $propName => $propdef) { $keyNames[] = new ConstantStringType($propName); $valType = $this->parseType($propdef, $path.'.'.$propName); if (!isset($def['required']) || !in_array($propName, $def['required'], true)) { $valType = TypeCombinator::addNull($valType); + $optionalKeys[] = $propIndex; } $valTypes[] = $valType; + $propIndex++; } if ($addlPropType !== null) { $types[] = new ArrayType(TypeCombinator::union(new StringType(), ...$keyNames), TypeCombinator::union($addlPropType, ...$valTypes)); } else { - $types[] = new ConstantArrayType($keyNames, $valTypes); + $types[] = new ConstantArrayType($keyNames, $valTypes, [0], $optionalKeys); } } else { $types[] = new ArrayType(new StringType(), $addlPropType ?? new MixedType()); From 1e9210f7b1fc66984a891ea58f13c8c5d2dff81d Mon Sep 17 00:00:00 2001 From: Fabien Villepinte Date: Sat, 4 Jun 2022 15:20:58 +0200 Subject: [PATCH 099/618] Fix TypeError when a JSON file can not be read (#10818) --- phpstan/baseline.neon | 5 ----- src/Composer/Json/JsonFile.php | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index ac39f66e861f..c335349c582b 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -4365,11 +4365,6 @@ parameters: count: 1 path: ../src/Composer/Json/JsonFile.php - - - message: "#^Parameter \\#1 \\$json of static method Composer\\\\Json\\\\JsonFile\\:\\:parseJson\\(\\) expects string\\|null, string\\|false\\|null given\\.$#" - count: 1 - path: ../src/Composer/Json/JsonFile.php - - message: "#^Parameter \\#1 \\$json of static method Composer\\\\Json\\\\JsonFile\\:\\:validateSyntax\\(\\) expects string, string\\|false given\\.$#" count: 1 diff --git a/src/Composer/Json/JsonFile.php b/src/Composer/Json/JsonFile.php index 2202530d93e0..bbcd24206ee8 100644 --- a/src/Composer/Json/JsonFile.php +++ b/src/Composer/Json/JsonFile.php @@ -110,6 +110,10 @@ public function read() throw new \RuntimeException('Could not read '.$this->path."\n\n".$e->getMessage()); } + if ($json === false) { + throw new \RuntimeException('Could not read '.$this->path); + } + return static::parseJson($json, $this->path); } From a0b78962315d4fd225c7ca25d46354e3cd7dd161 Mon Sep 17 00:00:00 2001 From: Anatoly Pashin Date: Fri, 3 Jun 2022 15:43:37 +1000 Subject: [PATCH 100/618] Fix processing null config value in DiagnoseCommand Fixes #10814 --- src/Composer/Config.php | 13 ++++++------- src/Composer/IO/BaseIO.php | 12 ++++++------ tests/Composer/Test/ConfigTest.php | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/Composer/Config.php b/src/Composer/Config.php index 166d9cbf6caf..5a0ded2a1097 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -76,13 +76,12 @@ class Config 'use-github-api' => true, 'lock' => true, 'platform-check' => 'php-only', - // valid keys without defaults (auth config stuff): - // bitbucket-oauth - // github-oauth - // gitlab-oauth - // gitlab-token - // http-basic - // bearer + 'bitbucket-oauth' => array(), + 'github-oauth' => array(), + 'gitlab-oauth' => array(), + 'gitlab-token' => array(), + 'http-basic' => array(), + 'bearer' => array(), ); /** @var array */ diff --git a/src/Composer/IO/BaseIO.php b/src/Composer/IO/BaseIO.php index 56715b709474..d53d0b0978ab 100644 --- a/src/Composer/IO/BaseIO.php +++ b/src/Composer/IO/BaseIO.php @@ -114,12 +114,12 @@ protected function checkAndSetAuthentication(string $repositoryName, string $use */ public function loadConfiguration(Config $config) { - $bitbucketOauth = $config->get('bitbucket-oauth') ?: array(); - $githubOauth = $config->get('github-oauth') ?: array(); - $gitlabOauth = $config->get('gitlab-oauth') ?: array(); - $gitlabToken = $config->get('gitlab-token') ?: array(); - $httpBasic = $config->get('http-basic') ?: array(); - $bearerToken = $config->get('bearer') ?: array(); + $bitbucketOauth = $config->get('bitbucket-oauth'); + $githubOauth = $config->get('github-oauth'); + $gitlabOauth = $config->get('gitlab-oauth'); + $gitlabToken = $config->get('gitlab-token'); + $httpBasic = $config->get('http-basic'); + $bearerToken = $config->get('bearer'); // reload oauth tokens from config if available diff --git a/tests/Composer/Test/ConfigTest.php b/tests/Composer/Test/ConfigTest.php index 201fa7832217..855f4c2efd32 100644 --- a/tests/Composer/Test/ConfigTest.php +++ b/tests/Composer/Test/ConfigTest.php @@ -390,4 +390,22 @@ public function testGetSourceOfValueEnvVariables(): void $this->assertEquals('COMPOSER_HTACCESS_PROTECT', $result); } + + public function testGetDefaultsToAnEmptyArray(): void + { + $config = new Config; + $keys = [ + 'bitbucket-oauth', + 'github-oauth', + 'gitlab-oauth', + 'gitlab-token', + 'http-basic', + 'bearer', + ]; + foreach ($keys as $key) { + $value = $config->get($key); + $this->assertIsArray($value); + $this->assertCount(0, $value); + } + } } From 0fad6a07a11b2f25d66524785a949ae2669414fb Mon Sep 17 00:00:00 2001 From: Pen y Fan <40126936+Pen-y-Fan@users.noreply.github.com> Date: Mon, 6 Jun 2022 09:18:22 +0100 Subject: [PATCH 101/618] Add Docker information (#9910) --- doc/00-intro.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/doc/00-intro.md b/doc/00-intro.md index 96df2e21f2c6..464b58ff9bd8 100644 --- a/doc/00-intro.md +++ b/doc/00-intro.md @@ -160,6 +160,29 @@ C:\Users\username>composer -V Composer version 2.0.12 2021-04-01 10:14:59 ``` +## Docker Image + +Composer is published as Docker container in a few places, see the list in the [composer/docker README](https://github.com/composer/docker). + +Example usage: + +```sh +docker pull composer/composer +docker run --rm -it -v "$(pwd):/app" composer/composer install +``` + +To add Composer to an existing **Dockerfile**: + +```Dockerfile +COPY --from=composer/composer /usr/bin/composer /usr/bin/composer +``` + +Read the [image description](https://hub.docker.com/r/composer/composer) for further usage information. + +**Note:** Docker specific issues should be filed [on the composer/docker repository](https://github.com/composer/docker/issues). + +**Note:** You may also use `composer` instead of `composer/composer` as image name above. It is shorter and is a Docker official image but is not published directly by us and thus usually receives new releases with a delay of a few days. + ## Using Composer Now that you've installed Composer, you are ready to use it! Head on over to the From 3c11895c1efb0d2cbb2fe4809fc59f667e213d4e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 10:48:42 +0200 Subject: [PATCH 102/618] Command tests --- .../Test/Command/DiagnoseCommandTest.php | 57 +++++++++++++++++++ .../Test/Command/UpdateCommandTest.php | 2 +- 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 tests/Composer/Test/Command/DiagnoseCommandTest.php diff --git a/tests/Composer/Test/Command/DiagnoseCommandTest.php b/tests/Composer/Test/Command/DiagnoseCommandTest.php new file mode 100644 index 000000000000..e79c9ee49e10 --- /dev/null +++ b/tests/Composer/Test/Command/DiagnoseCommandTest.php @@ -0,0 +1,57 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Test\TestCase; + +class DiagnoseCommandTest extends TestCase +{ + public function testCmdFail(): void + { + $this->initTempComposer(['name' => 'foo/bar', 'description' => 'test pkg']); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'diagnose']); + + $this->assertSame(1, $appTester->getStatusCode()); + + $output = $appTester->getDisplay(true); + $this->assertStringContainsString('Checking composer.json: WARNING +No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.', $output); + + $this->assertStringContainsString('Checking git settings: OK +Checking http connectivity to packagist: OK +Checking https connectivity to packagist: OK +Checking github.com rate limit: OK +Checking disk free space: ', $output); + } + + public function testCmdSuccess(): void + { + $this->initTempComposer(['name' => 'foo/bar', 'description' => 'test pkg', 'license' => 'MIT']); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'diagnose']); + + $appTester->assertCommandIsSuccessful(); + + $output = $appTester->getDisplay(true); + $this->assertStringContainsString('Checking composer.json: OK', $output); + + $this->assertStringContainsString('Checking git settings: OK +Checking http connectivity to packagist: OK +Checking https connectivity to packagist: OK +Checking github.com rate limit: OK +Checking disk free space: ', $output); + } +} diff --git a/tests/Composer/Test/Command/UpdateCommandTest.php b/tests/Composer/Test/Command/UpdateCommandTest.php index 90b614389410..9a12a49bd3e8 100644 --- a/tests/Composer/Test/Command/UpdateCommandTest.php +++ b/tests/Composer/Test/Command/UpdateCommandTest.php @@ -28,7 +28,7 @@ public function testUpdate(array $composerJson, array $command, string $expected $appTester = $this->getApplicationTester(); $appTester->run(array_merge(['command' => 'update', '--dry-run' => true], $command)); - $this->assertSame(strtr(trim($expected), "\r", ''), strtr(trim($appTester->getDisplay()), "\r", '')); + $this->assertSame(trim($expected), trim($appTester->getDisplay(true))); } public function provideUpdates(): \Generator From 11bf27933f6d22847d92c56ab4b8a066a39b2c82 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 13:18:10 +0200 Subject: [PATCH 103/618] Update deps --- composer.json | 2 +- composer.lock | 98 +++++++++++++++++++++++++-------------------------- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/composer.json b/composer.json index 625452ba4c3d..0673b7abb12f 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,7 @@ "composer/ca-bundle": "^1.0", "composer/metadata-minifier": "^1.0", "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.2", + "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", "psr/log": "^1.0 || ^2.0 || ^3.0", diff --git a/composer.lock b/composer.lock index cbbbcdb0f68f..7b7a80d2385c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11dd7e3505d8c3d1a04825b956ae2832", + "content-hash": "d5c4595c89878e938186d057052a82d1", "packages": [ { "name": "composer/ca-bundle", @@ -1100,16 +1100,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { @@ -1124,7 +1124,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1162,7 +1162,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -1178,20 +1178,20 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "433d05519ce6990bf3530fba6957499d327395c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", "shasum": "" }, "require": { @@ -1203,7 +1203,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1243,7 +1243,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -1259,20 +1259,20 @@ "type": "tidelift" } ], - "time": "2021-11-23T21:10:46+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -1284,7 +1284,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1327,7 +1327,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -1343,20 +1343,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { @@ -1371,7 +1371,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1410,7 +1410,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -1426,20 +1426,20 @@ "type": "tidelift" } ], - "time": "2021-11-30T18:21:41+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -1448,7 +1448,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1489,7 +1489,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -1505,20 +1505,20 @@ "type": "tidelift" } ], - "time": "2021-06-05T21:20:04+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -1527,7 +1527,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1572,7 +1572,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -1588,7 +1588,7 @@ "type": "tidelift" } ], - "time": "2022-03-04T08:16:47+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/process", @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.7.8", + "version": "1.7.10", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a" + "reference": "25e069474cf00215b0f64c60a26230908ef3eefa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a", - "reference": "2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/25e069474cf00215b0f64c60a26230908ef3eefa", + "reference": "25e069474cf00215b0f64c60a26230908ef3eefa", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.7.8" + "source": "https://github.com/phpstan/phpstan/tree/1.7.10" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-06-01T13:43:17+00:00" + "time": "2022-06-03T14:12:23+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", From a76a1c9fc2ee786d81e1bd91c0773045ee20c362 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 14:49:37 +0200 Subject: [PATCH 104/618] Fix parsing of multi-line arrays in funding yml, fixes #10784 --- src/Composer/Repository/Vcs/GitHubDriver.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Composer/Repository/Vcs/GitHubDriver.php b/src/Composer/Repository/Vcs/GitHubDriver.php index 33d7e8cd37ce..96f7ed99604e 100644 --- a/src/Composer/Repository/Vcs/GitHubDriver.php +++ b/src/Composer/Repository/Vcs/GitHubDriver.php @@ -234,6 +234,10 @@ private function getFundingInfo() foreach (Preg::split('{\r?\n}', $funding) as $line) { $line = trim($line); if (Preg::isMatch('{^(\w+)\s*:\s*(.+)$}', $line, $match)) { + if ($match[2] === '[') { + $key = $match[1]; + continue; + } if (Preg::isMatch('{^\[(.*)\](?:\s*#.*)?$}', $match[2], $match2)) { foreach (array_map('trim', Preg::split('{[\'"]?\s*,\s*[\'"]?}', $match2[1])) as $item) { $result[] = array('type' => $match[1], 'url' => trim($item, '"\' ')); @@ -244,8 +248,13 @@ private function getFundingInfo() $key = null; } elseif (Preg::isMatch('{^(\w+)\s*:\s*#\s*$}', $line, $match)) { $key = $match[1]; - } elseif ($key && Preg::isMatch('{^-\s*(.+)(\s+#.*)?$}', $line, $match)) { + } elseif ($key && ( + Preg::isMatch('{^-\s*(.+)(\s+#.*)?$}', $line, $match) + || Preg::isMatch('{^(.+),(\s*#.*)?$}', $line, $match) + )) { $result[] = array('type' => $key, 'url' => trim($match[1], '"\' ')); + } elseif ($key && $line === ']') { + $key = null; } } From e3527ea37f26cb357401b1d9c57cdc51a96972cd Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 15:22:41 +0200 Subject: [PATCH 105/618] Detect broken symlinks when checking for a package's presence, fixes #6708 --- src/Composer/Installer/LibraryInstaller.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Composer/Installer/LibraryInstaller.php b/src/Composer/Installer/LibraryInstaller.php index 71f45e8e4173..d05b8e63fa67 100644 --- a/src/Composer/Installer/LibraryInstaller.php +++ b/src/Composer/Installer/LibraryInstaller.php @@ -90,7 +90,19 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface return true; } - return (Platform::isWindows() && $this->filesystem->isJunction($installPath)) || is_link($installPath); + if (Platform::isWindows() && $this->filesystem->isJunction($installPath)) { + return true; + } + + if (is_link($installPath)) { + if (realpath($installPath) === false) { + return false; + } + + return true; + } + + return false; } /** From fbc85dede80a9d4adfdd29d5081a8f92fcdd9bd1 Mon Sep 17 00:00:00 2001 From: Stephan Jorek <38257959+brandung-sjorek@users.noreply.github.com> Date: Mon, 6 Jun 2022 16:14:54 +0200 Subject: [PATCH 106/618] allow chained proxy-binary php-inclusions (#10823) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * allow chained proxy-binary php-inclusion by skipping redundant “phpvfscomposer†stream-wrapper registration --- src/Composer/Installer/BinaryInstaller.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Composer/Installer/BinaryInstaller.php b/src/Composer/Installer/BinaryInstaller.php index 417e9be2b17f..a96bfce0aa11 100644 --- a/src/Composer/Installer/BinaryInstaller.php +++ b/src/Composer/Installer/BinaryInstaller.php @@ -379,7 +379,10 @@ public function url_stat(\$path, \$flags) } } - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { include("phpvfscomposer://" . $binPathExported); exit(0); } From 7cb994fade868cd4fe83506c8aec61e0d8fa6e75 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:32:44 +0200 Subject: [PATCH 107/618] Update changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccca38d7765f..9ed45a499409 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +### [2.2.14] 2022-06-06 + + * Fixed handling of broken symlinks when checking whether a package is still installed (#6708) + * Fixed JSON schema regex pattern for name to be JS compatible (#10811) + * Fixed bin proxies to allow a proxy to include another one safely (#10823) + * Fixed gitlab-token JSON schema definition (#10800) + * Fixed openssl 3.x version parsing as it is now semver compliant + * Fixed type error when a json file cannot be read (#10818) + * Fixed parsing of multi-line arrays in funding.yml (#10784) + ### [2.2.13] 2022-05-25 * Fixed invalid credentials loop when setting up GitLab token (#10748) @@ -1436,6 +1446,7 @@ * Initial release +[2.2.14]: https://github.com/composer/composer/compare/2.2.13...2.2.14 [2.2.13]: https://github.com/composer/composer/compare/2.2.12...2.2.13 [2.2.12]: https://github.com/composer/composer/compare/2.2.11...2.2.12 [2.2.11]: https://github.com/composer/composer/compare/2.2.10...2.2.11 From 8c7a2d200bb0e66d6fafeff2f9c9a27188e52842 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:32:50 +0200 Subject: [PATCH 108/618] Release 2.2.14 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 624e0250764e..8f8ce63cccf3 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '@package_version@'; - const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - const RELEASE_DATE = '@release_date@'; - const SOURCE_VERSION = '2.2.999-dev+source'; + const VERSION = '2.2.14'; + const BRANCH_ALIAS_VERSION = ''; + const RELEASE_DATE = '2022-06-06 16:32:50'; + const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From ba2ce37cd9c9db582d593d418f1729dc0e3d120d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:32:51 +0200 Subject: [PATCH 109/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 8f8ce63cccf3..624e0250764e 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '2.2.14'; - const BRANCH_ALIAS_VERSION = ''; - const RELEASE_DATE = '2022-06-06 16:32:50'; - const SOURCE_VERSION = ''; + const VERSION = '@package_version@'; + const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + const RELEASE_DATE = '@release_date@'; + const SOURCE_VERSION = '2.2.999-dev+source'; /** * Version number of the internal composer-runtime-api package From ab9e18027e643802be5c51e76e28d78d3cb0c90a Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 6 Jun 2022 16:42:24 +0200 Subject: [PATCH 110/618] plugins: mention static analysis support (#10812) --- composer.json | 5 +++++ doc/articles/plugins.md | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/composer.json b/composer.json index 7696422998dc..c346aa009c99 100644 --- a/composer.json +++ b/composer.json @@ -63,6 +63,11 @@ "extra": { "branch-alias": { "dev-main": "2.3-dev" + }, + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] } }, "autoload": { diff --git a/doc/articles/plugins.md b/doc/articles/plugins.md index bcbbe2cadd5f..e26d16385135 100644 --- a/doc/articles/plugins.md +++ b/doc/articles/plugins.md @@ -339,6 +339,25 @@ depend on other packages can function correctly, a runtime autoloader is created a plugin is loaded. That autoloader is only configured to load with the plugin dependencies, so you may not have access to all the packages which are installed. +## Static Analysis support + +As of Composer 2.3.7 we ship a `phpstan/rules.neon` PHPStan config file, which provides additional error checking when working on Composer plugins. + +### Usage with [PHPStan Extension Installer][13] + +The necessary configuration files are automatically loaded, in case your plugin projects declares a dependency to `phpstan/extension-installer`. + +### Alternative manual installation + +To make use of it, your Composer plugin project needs a [PHPStan config file][12], which includes the `phpstan/rules.neon` file: + +``` +includes: + - vendor/composer/composer/phpstan/rules.neon + +// your remaining config.. +``` + [1]: ../04-schema.md#type [2]: ../04-schema.md#extra [3]: https://github.com/composer/composer/blob/main/src/Composer/Plugin/PluginInterface.php @@ -350,3 +369,5 @@ so you may not have access to all the packages which are installed. [9]: https://github.com/composer/composer/blob/main/src/Composer/Plugin/Capability/CommandProvider.php [10]: https://symfony.com/doc/current/components/console.html [11]: https://github.com/composer/composer/blob/main/src/Composer/Util/SyncHelper.php +[12]: https://phpstan.org/config-reference#multiple-files +[13]: https://github.com/phpstan/extension-installer#usage From a33f6585969bb28362c589e27871af8d7d4c4add Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:39:27 +0200 Subject: [PATCH 111/618] Update changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff1b0a09f092..c9fe7206fedc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +### [2.3.7] 2022-06-06 + + * Fixed a few PHPStan ConfigReturnTypeExtension bugs + * Fixed Config default for auth configs to be empty arrays instead of null, fixes issues with diagnose command (#10814) + * Fixed handling of broken symlinks when checking whether a package is still installed (#6708) + * Fixed bin proxies to allow a proxy to include another one safely (#10823) + * Fixed openssl 3.x version parsing as it is now semver compliant + * Fixed type error when a json file cannot be read (#10818) + * Fixed parsing of multi-line arrays in funding.yml (#10784) + ### [2.3.6] 2022-06-01 * Added `Composer\PHPStan\ConfigReturnTypeExtension` to improve return types of `Config::get()` which you can also use in plugins CI (#10635) @@ -1532,6 +1542,7 @@ * Initial release +[2.3.7]: https://github.com/composer/composer/compare/2.3.6...2.3.7 [2.3.6]: https://github.com/composer/composer/compare/2.3.5...2.3.6 [2.3.5]: https://github.com/composer/composer/compare/2.3.4...2.3.5 [2.3.4]: https://github.com/composer/composer/compare/2.3.3...2.3.4 From e6d061c68244c0c7fd38f4e2d959d34fb856b96d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:43:22 +0200 Subject: [PATCH 112/618] Update hash --- composer.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.lock b/composer.lock index 2c5954377e7a..c1f0ad6c589c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9e35cddef900ba721bf84c8cda25db75", + "content-hash": "1f572d2fe0d3c7200c3887bd2fc9e991", "packages": [ { "name": "composer/ca-bundle", From 10cd375cf85dede2ff417ceab517ef9a0dc55407 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:43:28 +0200 Subject: [PATCH 113/618] Release 2.3.7 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 93e8c0a6f5d6..a4cb3e1a6d70 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.3.999-dev+source'; + public const VERSION = '2.3.7'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-06-06 16:43:28'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From b39608753b917f567a2a5341006739993e4dcbf3 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 16:43:28 +0200 Subject: [PATCH 114/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index a4cb3e1a6d70..93e8c0a6f5d6 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.3.7'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-06-06 16:43:28'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.3.999-dev+source'; /** * Version number of the internal composer-runtime-api package From ab1de96fcbd53f00c97c73fe1415f640451bbbcb Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 6 Jun 2022 17:01:31 +0200 Subject: [PATCH 115/618] Do not verify rate limit OK as part of test as these might randomly fail --- tests/Composer/Test/Command/DiagnoseCommandTest.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/Composer/Test/Command/DiagnoseCommandTest.php b/tests/Composer/Test/Command/DiagnoseCommandTest.php index e79c9ee49e10..0f071ef5cfc8 100644 --- a/tests/Composer/Test/Command/DiagnoseCommandTest.php +++ b/tests/Composer/Test/Command/DiagnoseCommandTest.php @@ -32,8 +32,7 @@ public function testCmdFail(): void $this->assertStringContainsString('Checking git settings: OK Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK -Checking github.com rate limit: OK -Checking disk free space: ', $output); +Checking github.com rate limit: ', $output); } public function testCmdSuccess(): void @@ -51,7 +50,6 @@ public function testCmdSuccess(): void $this->assertStringContainsString('Checking git settings: OK Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK -Checking github.com rate limit: OK -Checking disk free space: ', $output); +Checking github.com rate limit: ', $output); } } From 7cf3b01631977eb40d041fb016ea7e26e0711184 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 7 Jun 2022 14:04:04 +0200 Subject: [PATCH 116/618] Added documentation about HTTP Bearer Auth (#10780) Bearer Auth has been added here: - https://github.com/composer/composer/commit/548505f103d4e55a4044bedcd17bd93eba2fe68b - https://github.com/composer/composer/commit/f964b8301837a49ee1a4cf77dbfb38d0c2c2a340 - #8671 - #8642 but it was not documented in this file. --- .../authentication-for-private-packages.md | 64 +++++++++++++++++-- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/doc/articles/authentication-for-private-packages.md b/doc/articles/authentication-for-private-packages.md index 1c6081afdc11..8e4b142b9826 100644 --- a/doc/articles/authentication-for-private-packages.md +++ b/doc/articles/authentication-for-private-packages.md @@ -18,6 +18,7 @@ for credentials and save them (or a token if Composer is able to retrieve one). |---|---| |[http-basic](#http-basic)|yes| |[Inline http-basic](#inline-http-basic)|no| +|[HTTP Bearer](#http-bearer)|no| |[Custom header](#custom-token-authentication)|no| |[gitlab-oauth](#gitlab-oauth)|yes| |[gitlab-token](#gitlab-token)|yes| @@ -50,6 +51,7 @@ Composer home directory. For all authentication methods it is possible to edit them using the command line; - [http-basic](#command-line-http-basic) - [Inline http-basic](#command-line-inline-http-basic) + - [HTTP Bearer](#http-bearer) - [gitlab-oauth](#command-line-gitlab-oauth) - [gitlab-token](#command-line-gitlab-token) - [github-oauth](#command-line-github-oauth) @@ -69,6 +71,7 @@ php composer.phar config --global --editor [--auth] For specific authentication implementations, see their sections; - [http-basic](#manual-http-basic) - [Inline http-basic](#manual-inline-http-basic) + - [HTTP Bearer](#http-bearer) - [custom header](#manual-custom-token-authentication) - [gitlab-oauth](#manual-gitlab-oauth) - [gitlab-token](#manual-gitlab-token) @@ -101,7 +104,7 @@ section or directly in the repository definition. > **Note:** Using the command line environment variable method also has security implications. > These credentials will most likely be stored in memory, -> and on be persisted to a file like `~/.bash_history`(linux) or `ConsoleHost_history.txt` +> and may be persisted to a file like `~/.bash_history` (linux) or `ConsoleHost_history.txt` > (PowerShell on Windows) when closing a session. The final option to supply Composer with credentials is to use the `COMPOSER_AUTH` environment variable. @@ -115,9 +118,14 @@ Read more about the usage of this environment variable [here](../03-cli.md#compo ### Command line http-basic ```sh -php composer.phar config [--global] http-basic.example.org username password +php composer.phar config [--global] http-basic.repo.example.org username password ``` +In the above command, the config key `http-basic.repo.example.org` consists of two parts: + +- `http-basic` is the authentication method. +- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. + ### Manual http-basic ```sh @@ -167,6 +175,34 @@ php composer.phar config [--global] --editor } ``` +## HTTP Bearer + +### Command line HTTP Bearer authentication + +```sh +php composer.phar config [--global] bearer.repo.example.org token +``` + +In the above command, the config key `bearer.repo.example.org` consists of two parts: + +- `bearer` is the authentication method. +- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. + +### Manual HTTP Bearer authentication + +```sh +php composer.phar config [--global] --editor --auth +``` + +```json +{ + "bearer": { + "example.org": "TOKEN" + } +} +``` + + ## Custom token authentication ### Manual custom token authentication @@ -201,9 +237,14 @@ php composer.phar config [--global] --editor ### Command line gitlab-oauth ```sh -php composer.phar config [--global] gitlab-oauth.example.org token +php composer.phar config [--global] gitlab-oauth.gitlab.example.org token ``` +In the above command, the config key `gitlab-oauth.gitlab.example.org` consists of two parts: + +- `gitlab-oauth` is the authentication method. +- `gitlab.example.org` is the host name of your GitLab instance, you should replace it with the host name of your GitLab instance or use `gitlab.com` if you don't have a self-hosted GitLab instance. + ### Manual gitlab-oauth ```sh @@ -231,9 +272,14 @@ When creating a gitlab token manually, make sure it has either the `read_api` or ### Command line gitlab-token ```sh -php composer.phar config [--global] gitlab-token.example.org token +php composer.phar config [--global] gitlab-token.gitlab.example.org token ``` +In the above command, the config key `gitlab-token.gitlab.example.org` consists of two parts: + +- `gitlab-token` is the authentication method. +- `gitlab.example.org` is the host name of your GitLab instance, you should replace it with the host name of your GitLab instance or use `gitlab.com` if you don't have a self-hosted GitLab instance. + ### Manual gitlab-token ```sh @@ -264,6 +310,11 @@ Read more about [Personal Access Tokens](https://docs.github.com/en/authenticati php composer.phar config [--global] github-oauth.github.com token ``` +In the above command, the config key `github-oauth.github.com` consists of two parts: + +- `github-oauth` is the authentication method. +- `github.com` is the host name for which this token applies. For GitHub you most likely do not need to change this. + ### Manual github-oauth ```sh @@ -288,6 +339,11 @@ The BitBucket driver uses OAuth to access your private repositories via the BitB php composer.phar config [--global] bitbucket-oauth.bitbucket.org consumer-key consumer-secret ``` +In the above command, the config key `bitbucket-oauth.bitbucket.org` consists of two parts: + +- `bitbucket-oauth` is the authentication method. +- `bitbucket.org` is the host name for which this token applies. Unless you have a private instance you don't need to change this. + ### Manual bitbucket-oauth ```sh From e9b44b449945dd7ac614c759240bb25f0617a38d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 7 Jun 2022 15:27:43 +0200 Subject: [PATCH 117/618] Document files autoloading order, fixes #10509 --- doc/04-schema.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/doc/04-schema.md b/doc/04-schema.md index bfe70d9bfcad..20bb61ac8bd0 100644 --- a/doc/04-schema.md +++ b/doc/04-schema.md @@ -646,6 +646,17 @@ Example: } ``` +Files autoload rules are included whenever `vendor/autoload.php` is included, right after +the autoloader is registered. The order of inclusion depends on package dependencies so that +if package A depends on B, files in package B will be included first to ensure package B is fully +initialized and ready to be used when files from package A are included. + +If two packages have the same amount of dependents or no dependencies, the order is alphabetical. + +Files from the root package are always loaded last, and you cannot use files autoloading +yourself to override functions from your dependencies. If you want to achieve that we recommend +you include your own functions *before* including Composer's `vendor/autoload.php`. + #### Exclude files from classmaps If you want to exclude some files or folders from the classmap you can use the `exclude-from-classmap` property. @@ -942,7 +953,7 @@ It can be boolean or a package name/URL pointing to a recommended alternative. Examples: Use `"abandoned": true` to indicate this package is abandoned. -Use `"abandoned": "monolog/monolog"` to indicate this package is abandoned, and that +Use `"abandoned": "monolog/monolog"` to indicate this package is abandoned, and that the recommended alternative is `monolog/monolog`. Defaults to false. From 203ec4b485e43f77a9aa8e5064e72d1c67f96543 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 8 Jun 2022 15:07:38 +0200 Subject: [PATCH 118/618] Update baseline (1947, 103) --- phpstan/baseline-8.1.neon | 5 - phpstan/baseline.neon | 230 +------------------------------------- 2 files changed, 5 insertions(+), 230 deletions(-) diff --git a/phpstan/baseline-8.1.neon b/phpstan/baseline-8.1.neon index 72a234af4733..12bfc559b027 100644 --- a/phpstan/baseline-8.1.neon +++ b/phpstan/baseline-8.1.neon @@ -245,11 +245,6 @@ parameters: count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php - - - message: "#^Parameter \\#1 \\$string of function strtolower expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Parameter \\#2 \\$handle of function curl_multi_remove_handle expects CurlHandle, resource given\\.$#" count: 1 diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 9e8614240005..97429dd89075 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -435,11 +435,6 @@ parameters: count: 1 path: ../src/Composer/Command/CreateProjectCommand.php - - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 3 - path: ../src/Composer/Command/CreateProjectCommand.php - - message: "#^Variable method call on Composer\\\\Package\\\\RootPackageInterface\\.$#" count: 1 @@ -545,11 +540,6 @@ parameters: count: 3 path: ../src/Composer/Command/DiagnoseCommand.php - - - message: "#^Only booleans are allowed in a negated boolean, array\\ given\\.$#" - count: 1 - path: ../src/Composer/Command/ExecCommand.php - - message: "#^Parameter \\#1 \\$arr1 of function array_merge expects array, array\\\\|false given\\.$#" count: 1 @@ -617,7 +607,7 @@ parameters: - message: "#^Cannot call method getRepoName\\(\\) on Composer\\\\Repository\\\\RepositoryInterface\\|null\\.$#" - count: 4 + count: 2 path: ../src/Composer/Command/InitCommand.php - @@ -682,7 +672,7 @@ parameters: - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 8 + count: 7 path: ../src/Composer/Command/InitCommand.php - @@ -710,11 +700,6 @@ parameters: count: 1 path: ../src/Composer/Command/RemoveCommand.php - - - message: "#^Offset 'require'\\|'require\\-dev' does not exist on array\\{require\\?\\: array\\, require\\-dev\\?\\: array\\\\}\\.$#" - count: 8 - path: ../src/Composer/Command/RemoveCommand.php - - message: "#^Only booleans are allowed in an if condition, Composer\\\\Composer\\|null given\\.$#" count: 1 @@ -727,7 +712,7 @@ parameters: - message: "#^Cannot call method getRepoName\\(\\) on Composer\\\\Repository\\\\RepositoryInterface\\|null\\.$#" - count: 4 + count: 2 path: ../src/Composer/Command/RequireCommand.php - @@ -780,11 +765,6 @@ parameters: count: 1 path: ../src/Composer/Command/RequireCommand.php - - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 1 - path: ../src/Composer/Command/RequireCommand.php - - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" count: 1 @@ -1122,7 +1102,7 @@ parameters: - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 10 + count: 9 path: ../src/Composer/Command/ShowCommand.php - @@ -1205,11 +1185,6 @@ parameters: count: 2 path: ../src/Composer/Command/SuggestsCommand.php - - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 1 - path: ../src/Composer/Command/SuggestsCommand.php - - message: "#^Call to function array_search\\(\\) requires parameter \\#3 to be set\\.$#" count: 1 @@ -1750,11 +1725,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/RuleSetGenerator.php - - - message: "#^Only booleans are allowed in a negated boolean, int\\<0, max\\> given\\.$#" - count: 2 - path: ../src/Composer/DependencyResolver/RuleSetIterator.php - - message: "#^Return type \\(\\-1\\|0\\|1\\|4\\) of method Composer\\\\DependencyResolver\\\\RuleSetIterator\\:\\:key\\(\\) should be covariant with return type \\(0\\|1\\|4\\) of method Iterator\\\\:\\:key\\(\\)$#" count: 1 @@ -2530,11 +2500,6 @@ parameters: count: 1 path: ../src/Composer/IO/BaseIO.php - - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 6 - path: ../src/Composer/IO/BaseIO.php - - message: "#^Instanceof between Symfony\\\\Component\\\\Console\\\\Input\\\\StringInput and Symfony\\\\Component\\\\Console\\\\Input\\\\StreamableInputInterface will always evaluate to true\\.$#" count: 1 @@ -4033,23 +3998,8 @@ parameters: count: 1 path: ../src/Composer/Repository/RepositoryFactory.php - - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Config\\|null given\\.$#" - count: 1 - path: ../src/Composer/Repository/RepositoryFactory.php - - - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\IO\\\\IOInterface\\|null given\\.$#" - count: 1 - path: ../src/Composer/Repository/RepositoryFactory.php - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Repository\\\\RepositoryManager\\|null given\\.$#" - count: 2 - path: ../src/Composer/Repository/RepositoryFactory.php - - - - message: "#^Only booleans are allowed in an if condition, Composer\\\\IO\\\\IOInterface\\|null given\\.$#" count: 1 path: ../src/Composer/Repository/RepositoryFactory.php @@ -4785,7 +4735,7 @@ parameters: - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 3 + count: 2 path: ../src/Composer/Util/Http/CurlDownloader.php - @@ -4903,11 +4853,6 @@ parameters: count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php - - - message: "#^Parameter \\#1 \\$str of function strtolower expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Parameter \\#1 \\$string of function strlen expects string, string\\|null given\\.$#" count: 1 @@ -5073,21 +5018,6 @@ parameters: count: 1 path: ../src/Composer/Util/HttpDownloader.php - - - message: "#^Offset 'info'\\|'warning' does not exist on array\\{warning\\?\\: string, info\\?\\: string, warning\\-versions\\?\\: string, info\\-versions\\?\\: string, warnings\\?\\: array\\, infos\\?\\: array\\\\}\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - - - message: "#^Offset 'info\\-versions'\\|'warning\\-versions' does not exist on array\\{warning\\?\\: string, info\\?\\: string, warning\\-versions\\?\\: string, info\\-versions\\?\\: string, warnings\\?\\: array\\, infos\\?\\: array\\\\}\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - - - message: "#^Offset 'infos'\\|'warnings' does not exist on array\\{warning\\?\\: string, info\\?\\: string, warning\\-versions\\?\\: string, info\\-versions\\?\\: string, warnings\\?\\: array\\, infos\\?\\: array\\\\}\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - message: "#^Offset 'options' does not exist on array\\{url\\: string, options\\?\\: array, copyTo\\?\\: string\\|null\\}\\.$#" count: 3 @@ -5658,11 +5588,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Autoload/AutoloadGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Autoload/AutoloadGeneratorTest.php - - message: "#^Only booleans are allowed in an if condition, array\\ given\\.$#" count: 2 @@ -5678,11 +5603,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - message: "#^Parameter \\#1 \\$expected of method Composer\\\\Test\\\\Autoload\\\\ClassMapGeneratorTest\\:\\:assertEqualsNormalized\\(\\) expects array\\, array\\ given\\.$#" count: 3 @@ -5693,21 +5613,6 @@ parameters: count: 3 path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/CacheTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Command/RunScriptCommandTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Config/JsonConfigSourceTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 1 @@ -5838,31 +5743,16 @@ parameters: count: 1 path: ../tests/Composer/Test/Downloader/DownloadManagerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 6 - path: ../tests/Composer/Test/Downloader/FileDownloaderTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 3 path: ../tests/Composer/Test/Downloader/FileDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/FossilDownloaderTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 4 path: ../tests/Composer/Test/Downloader/FossilDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/GitDownloaderTest.php - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Config\\|null given\\.$#" count: 1 @@ -5873,31 +5763,11 @@ parameters: count: 3 path: ../tests/Composer/Test/Downloader/GitDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/HgDownloaderTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 4 path: ../tests/Composer/Test/Downloader/HgDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/PerforceDownloaderTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/XzDownloaderTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/ZipDownloaderTest.php - - message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#" count: 2 @@ -5926,11 +5796,6 @@ parameters: count: 1 path: ../tests/Composer/Test/InstalledVersionsTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/InstalledVersionsTest.php - - message: "#^Parameter \\#1 \\$path of function realpath expects string, string\\|null given\\.$#" count: 1 @@ -5946,11 +5811,6 @@ parameters: count: 3 path: ../tests/Composer/Test/Installer/BinaryInstallerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Installer/BinaryInstallerTest.php - - message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Composer\\\\\\\\Composer' and Composer\\\\Composer will always evaluate to true\\.$#" count: 1 @@ -5961,11 +5821,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Installer/InstallerEventTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Installer/LibraryInstallerTest.php - - message: "#^Call to function is_array\\(\\) with array\\ will always evaluate to true\\.$#" count: 1 @@ -6091,11 +5946,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Mock/VersionGuesserMock.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php - - message: "#^Dynamic call to static method Composer\\\\Factory\\:\\:createConfig\\(\\)\\.$#" count: 1 @@ -6106,16 +5956,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Package/Archiver/ArchiveManagerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Package/Archiver/ArchiverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Package/Archiver/PharArchiverTest.php - - message: "#^Parameter \\#1 \\$sources of method Composer\\\\Package\\\\Archiver\\\\PharArchiver\\:\\:archive\\(\\) expects string, string\\|null given\\.$#" count: 2 @@ -6211,11 +6051,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Plugin/PluginInstallerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Plugin/PluginInstallerTest.php - - message: "#^Parameter \\#2 \\$capabilityClassName of method Composer\\\\Plugin\\\\PluginManager\\:\\:getPluginCapability\\(\\) expects class\\-string\\, string given\\.$#" count: 2 @@ -6256,11 +6091,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Repository/CompositeRepositoryTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/FilesystemRepositoryTest.php - - message: "#^Parameter \\#1 \\$path of function realpath expects string, string\\|false given\\.$#" count: 2 @@ -6281,26 +6111,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Repository/RepositoryManagerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/RepositoryManagerTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/FossilDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php - - message: "#^Offset 'reference' does not exist on array\\{type\\: string, url\\: string, reference\\: string, shasum\\: string\\}\\|null\\.$#" count: 4 @@ -6321,36 +6131,11 @@ parameters: count: 1 path: ../tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/HgDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php - - message: "#^Parameter \\#1 \\$repoConfig of class Composer\\\\Repository\\\\Vcs\\\\PerforceDriver constructor expects array\\{url\\: string\\}, array\\ given\\.$#" count: 1 path: ../tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/SvnDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Repository/VcsRepositoryTest.php - - message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" count: 1 @@ -6386,11 +6171,6 @@ parameters: count: 1 path: ../tests/Composer/Test/TestCase.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Util/FilesystemTest.php - - message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Composer\\\\\\\\Util\\\\\\\\Http…' and Composer\\\\Util\\\\Http\\\\ProxyManager will always evaluate to true\\.$#" count: 1 From 73fd0f22e860494f753bb38e848f7c54f07e9d6e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 8 Jun 2022 20:03:59 +0200 Subject: [PATCH 119/618] Fix phpstan 8.1 build --- src/Composer/Command/GlobalCommand.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index e9195ca1e72a..3654e868a182 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -91,7 +91,8 @@ protected function configure(): void */ public function run(InputInterface $input, OutputInterface $output): int { - if (!method_exists($input, '__toString')) { + // TODO remove for Symfony 6+ as it is then in the interface + if (!method_exists($input, '__toString')) { // @phpstan-ignore-line throw new \LogicException('Expected an Input instance that is stringable, got '.get_class($input)); } @@ -119,7 +120,8 @@ public function run(InputInterface $input, OutputInterface $output): int private function prepareSubcommandInput(InputInterface $input, bool $quiet = false): StringInput { - if (!method_exists($input, '__toString')) { + // TODO remove for Symfony 6+ as it is then in the interface + if (!method_exists($input, '__toString')) { // @phpstan-ignore-line throw new \LogicException('Expected an Input instance that is stringable, got '.get_class($input)); } From 70f2dd6eddd5916f70b3d73dd3170a3d2d3a7681 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 9 Jun 2022 11:43:59 +0200 Subject: [PATCH 120/618] Add bump command to bump requirements to the currently installed version, fixes #7273 (#10829) --- doc/03-cli.md | 18 ++ src/Composer/Command/BumpCommand.php | 227 ++++++++++++++++++ src/Composer/Command/CompletionTrait.php | 12 + src/Composer/Command/RequireCommand.php | 22 +- src/Composer/Console/Application.php | 1 + .../Package/Version/VersionBumper.php | 114 +++++++++ .../Composer/Test/Command/BumpCommandTest.php | 136 +++++++++++ tests/Composer/Test/Mock/FactoryMock.php | 2 +- .../Test/Mock/InstallationManagerMock.php | 2 +- .../Package/Version/VersionBumperTest.php | 69 ++++++ tests/Composer/Test/TestCase.php | 44 ++++ 11 files changed, 634 insertions(+), 13 deletions(-) create mode 100644 src/Composer/Command/BumpCommand.php create mode 100644 src/Composer/Package/Version/VersionBumper.php create mode 100644 tests/Composer/Test/Command/BumpCommandTest.php create mode 100644 tests/Composer/Test/Package/Version/VersionBumperTest.php diff --git a/doc/03-cli.md b/doc/03-cli.md index 30d21c673b5d..8aab64bc5745 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -322,6 +322,24 @@ uninstalled. * **--apcu-autoloader-prefix:** Use a custom prefix for the APCu autoloader cache. Implicitly enables `--apcu-autoloader`. +## bump + +The `bump` command increases the lower limit of your composer.json requirements +to the currently installed versions. This helps to ensure your dependencies do not +accidentally get downgraded due to some other conflict, and can slightly improve +dependency resolution performance as it limits the amount of package versions +Composer has to look at. + +Running this blindly on libraries is **NOT** recommended as it will narrow down +your allowed dependencies, which may cause dependency hell for your users. +Running it with `--dev-only` on libraries may be fine however as dev requirements +are local to the library and do not affect consumers of the package. + +### Options + +* **--dev-only:** Only bump requirements in "require-dev". +* **--no-dev-only:** Only bump requirements in "require". + ## reinstall The `reinstall` command looks up installed packages by name, diff --git a/src/Composer/Command/BumpCommand.php b/src/Composer/Command/BumpCommand.php new file mode 100644 index 000000000000..3abcbc199d20 --- /dev/null +++ b/src/Composer/Command/BumpCommand.php @@ -0,0 +1,227 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Command; + +use Composer\DependencyResolver\Request; +use Composer\Package\AliasPackage; +use Composer\Package\Locker; +use Composer\Package\Version\VersionBumper; +use Composer\Package\Version\VersionSelector; +use Composer\Util\Filesystem; +use Symfony\Component\Console\Input\InputInterface; +use Composer\Console\Input\InputArgument; +use Composer\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Composer\Factory; +use Composer\Installer; +use Composer\Installer\InstallerEvents; +use Composer\Json\JsonFile; +use Composer\Json\JsonManipulator; +use Composer\Package\Version\VersionParser; +use Composer\Package\Loader\ArrayLoader; +use Composer\Package\BasePackage; +use Composer\Plugin\CommandEvent; +use Composer\Plugin\PluginEvents; +use Composer\Repository\CompositeRepository; +use Composer\Repository\PlatformRepository; +use Composer\IO\IOInterface; +use Composer\Util\Silencer; + +/** + * @author Jordi Boggiano + */ +final class BumpCommand extends BaseCommand +{ + private const ERROR_GENERIC = 1; + private const ERROR_LOCK_OUTDATED = 2; + + use CompletionTrait; + + protected function configure(): void + { + $this + ->setName('bump') + ->setDescription('Increases the lower limit of your composer.json requirements to the currently installed versions.') + ->setDefinition(array( + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name(s) to restrict which packages are bumped.', null, $this->suggestRootRequirement()), + new InputOption('dev-only', 'D', InputOption::VALUE_NONE, 'Only bump requirements in "require-dev".'), + new InputOption('no-dev-only', 'R', InputOption::VALUE_NONE, 'Only bump requirements in "require".'), + )) + ->setHelp( + <<bump command increases the lower limit of your composer.json requirements +to the currently installed versions. This helps to ensure your dependencies do not +accidentally get downgraded due to some other conflict, and can slightly improve +dependency resolution performance as it limits the amount of package versions +Composer has to look at. + +Running this blindly on libraries is **NOT** recommended as it will narrow down +your allowed dependencies, which may cause dependency hell for your users. +Running it with --dev-only on libraries may be fine however as dev requirements +are local to the library and do not affect consumers of the package. + +EOT + ) + ; + } + + /** + * @throws \Seld\JsonLint\ParsingException + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + /** @readonly */ + $composerJsonPath = Factory::getComposerFile(); + $io = $this->getIO(); + + if (!Filesystem::isReadable($composerJsonPath)) { + $io->writeError(''.$composerJsonPath.' is not readable.'); + + return self::ERROR_GENERIC; + } + + $composerJson = new JsonFile($composerJsonPath); + $contents = file_get_contents($composerJson->getPath()); + if (false === $contents) { + $io->writeError(''.$composerJsonPath.' is not readable.'); + + return self::ERROR_GENERIC; + } + + // check for writability by writing to the file as is_writable can not be trusted on network-mounts + // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 + if (!is_writable($composerJsonPath) && false === Silencer::call('file_put_contents', $composerJsonPath, $contents)) { + $io->writeError(''.$composerJsonPath.' is not writable.'); + + return self::ERROR_GENERIC; + } + unset($contents); + + $composer = $this->requireComposer(); + if ($composer->getLocker()->isLocked()) { + if (!$composer->getLocker()->isFresh()) { + $io->writeError('The lock file is not up to date with the latest changes in composer.json. Run the appropriate `update` to fix that before you use the `bump` command.'); + + return self::ERROR_LOCK_OUTDATED; + } + + $repo = $composer->getLocker()->getLockedRepository(true); + } else { + $repo = $composer->getRepositoryManager()->getLocalRepository(); + } + + if ($composer->getPackage()->getType() !== 'project' && !$input->getOption('dev-only')) { + $io->writeError('Warning: Bumping dependency constraints is not recommended for libraries as it will narrow down your dependencies and may cause problems for your users.'); + + $contents = $composerJson->read(); + if (!isset($contents['type'])) { + $io->writeError('If your package is not a library, you can explicitly specify the "type" by using "composer config type project".'); + $io->writeError('Alternatively you can use --dev to only bump dependencies within "require-dev".'); + } + unset($contents); + } + + $bumper = new VersionBumper(); + $tasks = []; + if (!$input->getOption('no-dev-only')) { + $tasks['require-dev'] = $composer->getPackage()->getDevRequires(); + }; + if (!$input->getOption('dev-only')) { + $tasks['require'] = $composer->getPackage()->getRequires(); + } + + $updates = []; + foreach ($tasks as $key => $reqs) { + foreach ($reqs as $pkgName => $link) { + if (PlatformRepository::isPlatformPackage($pkgName)) { + continue; + } + $currentConstraint = $link->getPrettyConstraint(); + + $package = $repo->findPackage($pkgName, '*'); + // name must be provided or replaced + if (null === $package) { + continue; + } + while ($package instanceof AliasPackage) { + $package = $package->getAliasOf(); + } + + $bumped = $bumper->bumpRequirement($link->getConstraint(), $package); + + if ($bumped === $currentConstraint) { + continue; + } + + $updates[$key][$pkgName] = $bumped; + } + } + + if (!$this->updateFileCleanly($composerJson, $updates)) { + $composerDefinition = $composerJson->read(); + foreach ($updates as $key => $packages) { + foreach ($packages as $package => $version) { + $composerDefinition[$key][$package] = $version; + } + } + $composerJson->write($composerDefinition); + } + + $changeCount = array_sum(array_map('count', $updates)); + if ($changeCount > 0) { + $io->write(''.$composerJsonPath.' has been updated ('.$changeCount.' changes).'); + } else { + $io->write('No requirements to update in '.$composerJsonPath.'.'); + } + + if ($composer->getLocker()->isLocked() && $changeCount > 0) { + $contents = file_get_contents($composerJson->getPath()); + if (false === $contents) { + throw new \RuntimeException('Unable to read '.$composerJson->getPath().' contents to update the lock file hash.'); + } + $lock = new JsonFile(Factory::getLockFile($composerJsonPath)); + $lockData = $lock->read(); + $lockData['content-hash'] = Locker::getContentHash($contents); + $lock->write($lockData); + } + + return 0; + } + + /** + * @param array<'require'|'require-dev', array> $updates + */ + private function updateFileCleanly(JsonFile $json, array $updates): bool + { + $contents = file_get_contents($json->getPath()); + if (false === $contents) { + throw new \RuntimeException('Unable to read '.$json->getPath().' contents.'); + } + + $manipulator = new JsonManipulator($contents); + + foreach ($updates as $key => $packages) { + foreach ($packages as $package => $version) { + if (!$manipulator->addLink($key, $package, $version)) { + return false; + } + } + } + + if (false === file_put_contents($json->getPath(), $manipulator->getContents())) { + throw new \RuntimeException('Unable to write new '.$json->getPath().' contents.'); + } + + return true; + } +} diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index 5134aac3a1e8..ffd414b39a2e 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -45,6 +45,18 @@ private function suggestPreferInstall(): array return ['dist', 'source', 'auto']; } + /** + * Suggest package names from root requirements. + */ + private function suggestRootRequirement(): \Closure + { + return function (CompletionInput $input): array { + $composer = $this->requireComposer(); + + return array_merge(array_keys($composer->getPackage()->getRequires()), array_keys($composer->getPackage()->getDevRequires())); + }; + } + /** * Suggest package names from installed. */ diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 3feb98e6c77d..9c69ba20f825 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -116,13 +116,6 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - pcntl_async_signals(true); - pcntl_signal(SIGINT, function () { $this->revertComposerFile(); }); - pcntl_signal(SIGTERM, function () { $this->revertComposerFile(); }); - pcntl_signal(SIGHUP, function () { $this->revertComposerFile(); }); - } - $this->file = Factory::getComposerFile(); $io = $this->getIO(); @@ -151,9 +144,16 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->composerBackup = file_get_contents($this->json->getPath()); $this->lockBackup = file_exists($this->lock) ? file_get_contents($this->lock) : null; + if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { + pcntl_async_signals(true); + pcntl_signal(SIGINT, function () { $this->revertComposerFile(); }); + pcntl_signal(SIGTERM, function () { $this->revertComposerFile(); }); + pcntl_signal(SIGHUP, function () { $this->revertComposerFile(); }); + } + // check for writability by writing to the file as is_writable can not be trusted on network-mounts // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 - if (!is_writable($this->file) && !Silencer::call('file_put_contents', $this->file, $this->composerBackup)) { + if (!is_writable($this->file) && false === Silencer::call('file_put_contents', $this->file, $this->composerBackup)) { $io->writeError(''.$this->file.' is not writable.'); return 1; @@ -168,10 +168,10 @@ protected function execute(InputInterface $input, OutputInterface $output) * @see https://github.com/composer/composer/pull/8313#issuecomment-532637955 */ if ($packageType !== 'project') { - $io->writeError('"--fixed" option is allowed for "project" package types only to prevent possible misuses.'); + $io->writeError('The "--fixed" option is only allowed for packages with a "project" type to prevent possible misuses.'); - if (empty($config['type'])) { - $io->writeError('If your package is not library, you should explicitly specify "type" parameter in composer.json.'); + if (!isset($config['type'])) { + $io->writeError('If your package is not a library, you can explicitly specify the "type" by using "composer config type project".'); } return 1; diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 26b3066753ed..c5fc2b0d3581 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -547,6 +547,7 @@ protected function getDefaultCommands(): array new Command\CheckPlatformReqsCommand(), new Command\FundCommand(), new Command\ReinstallCommand(), + new Command\BumpCommand(), )); if (strpos(__FILE__, 'phar:') === 0 || '1' === Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING')) { diff --git a/src/Composer/Package/Version/VersionBumper.php b/src/Composer/Package/Version/VersionBumper.php new file mode 100644 index 000000000000..c272d4da0fe0 --- /dev/null +++ b/src/Composer/Package/Version/VersionBumper.php @@ -0,0 +1,114 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Package\Version; + +use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; +use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; +use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; +use Composer\Package\BasePackage; +use Composer\Package\AliasPackage; +use Composer\Package\PackageInterface; +use Composer\Composer; +use Composer\Package\Loader\ArrayLoader; +use Composer\Package\Dumper\ArrayDumper; +use Composer\Pcre\Preg; +use Composer\Repository\RepositorySet; +use Composer\Repository\PlatformRepository; +use Composer\Semver\Constraint\Constraint; +use Composer\Semver\Constraint\ConstraintInterface; +use Composer\Semver\Intervals; +use Composer\Util\Platform; + +/** + * @author Jordi Boggiano + * @internal + */ +class VersionBumper +{ + /** + * Given a constraint, this returns a new constraint with + * the lower bound bumped to match the given package's version. + * + * For example: + * * ^1.0 + 1.2.1 -> ^1.2.1 + * * ^1.2 + 1.2.0 -> ^1.2 + * * ^1.2 || ^2.3 + 1.3.0 -> ^1.3 || ^2.3 + * * ^1.2 || ^2.3 + 2.4.0 -> ^1.2 || ^2.4 + * * ^3@dev + 3.2.99999-dev -> ^3.2@dev + * * ~2 + 2.0-beta.1 -> ~2 + * * dev-master + dev-master -> dev-master + */ + public function bumpRequirement(ConstraintInterface $constraint, PackageInterface $package): string + { + $parser = new VersionParser(); + $prettyConstraint = $constraint->getPrettyString(); + if (str_starts_with($constraint->getPrettyString(), 'dev-')) { + return $prettyConstraint; + } + + $version = $package->getVersion(); + if (str_starts_with($package->getVersion(), 'dev-')) { + $loader = new ArrayLoader($parser); + $dumper = new ArrayDumper(); + $extra = $loader->getBranchAlias($dumper->dump($package)); + + // dev packages without branch alias cannot be processed + if (null === $extra || $extra === VersionParser::DEFAULT_BRANCH_ALIAS) { + return $prettyConstraint; + } + + $version = $extra; + } + + $intervals = Intervals::get($constraint); + + // complex constraints with branch names are not bumped + if (\count($intervals['branches']['names']) > 0) { + return $prettyConstraint; + } + + $major = Preg::replace('{^(\d+).*}', '$1', $version); + $newPrettyConstraint = '^'.Preg::replace('{(?:\.(?:0|9999999))+(-dev)?$}', '', $version); + + // not a simple stable version, abort + if (!Preg::isMatch('{^\^\d+(\.\d+)*$}', $newPrettyConstraint)) { + return $prettyConstraint; + } + + $pattern = '{ + (?<=,|\ |\||^) # leading separator + (?P + \^'.$major.'(?:\.\d+)* # e.g. ^2.anything + | ~'.$major.'(?:\.\d+)? # e.g. ~2 or ~2.2 but no more + | '.$major.'(?:\.[*x])+ # e.g. 2.* or 2.*.* or 2.x.x.x etc + ) + (?=,|$|\ |\||@) # trailing separator + }x'; + if (Preg::isMatchAllWithOffsets($pattern, $prettyConstraint, $matches)) { + $modified = $prettyConstraint; + foreach (array_reverse($matches['constraint']) as $match) { + $modified = substr_replace($modified, $newPrettyConstraint, $match[1], Platform::strlen($match[0])); + } + + // if it is strictly equal to the previous one then no need to change anything + $newConstraint = $parser->parseConstraints($modified); + if (Intervals::isSubsetOf($newConstraint, $constraint) && Intervals::isSubsetOf($constraint, $newConstraint)) { + return $prettyConstraint; + } + + return $modified; + } + + return $prettyConstraint; + } +} diff --git a/tests/Composer/Test/Command/BumpCommandTest.php b/tests/Composer/Test/Command/BumpCommandTest.php new file mode 100644 index 000000000000..30770c9f515c --- /dev/null +++ b/tests/Composer/Test/Command/BumpCommandTest.php @@ -0,0 +1,136 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Json\JsonFile; +use Composer\Test\TestCase; + +class BumpCommandTest extends TestCase +{ + /** + * @dataProvider provideTests + * @param array $composerJson + * @param array $command + * @param array $expected + */ + public function testBump(array $composerJson, array $command, array $expected, bool $lock = true): void + { + $this->initTempComposer($composerJson); + + $packages = [ + $this->getPackage('first/pkg', '2.3.4'), + $this->getPackage('second/pkg', '3.4.0'), + ]; + $devPackages = [ + $this->getPackage('dev/pkg', '2.3.4.5'), + ]; + + $this->createInstalledJson($packages, $devPackages); + if ($lock) { + $this->createComposerLock($packages, $devPackages); + } + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'bump'], $command)); + + $json = new JsonFile('./composer.json'); + $this->assertSame($expected, $json->read()); + } + + public function provideTests(): \Generator + { + yield 'bump all by default' => [ + [ + 'require' => [ + 'first/pkg' => '^2.0', + 'second/pkg' => '3.*', + ], + 'require-dev' => [ + 'dev/pkg' => '~2.0', + ], + ], + [], + [ + 'require' => [ + 'first/pkg' => '^2.3.4', + 'second/pkg' => '^3.4', + ], + 'require-dev' => [ + 'dev/pkg' => '^2.3.4.5', + ], + ] + ]; + + yield 'bump only dev with --dev-only' => [ + [ + 'require' => [ + 'first/pkg' => '^2.0', + 'second/pkg' => '3.*', + ], + 'require-dev' => [ + 'dev/pkg' => '~2.0', + ], + ], + ['--dev-only' => true], + [ + 'require' => [ + 'first/pkg' => '^2.0', + 'second/pkg' => '3.*', + ], + 'require-dev' => [ + 'dev/pkg' => '^2.3.4.5', + ], + ] + ]; + + yield 'bump only non-dev with --no-dev-only' => [ + [ + 'require' => [ + 'first/pkg' => '^2.0', + 'second/pkg' => '3.*', + ], + 'require-dev' => [ + 'dev/pkg' => '~2.0', + ], + ], + ['--no-dev-only' => true], + [ + 'require' => [ + 'first/pkg' => '^2.3.4', + 'second/pkg' => '^3.4', + ], + 'require-dev' => [ + 'dev/pkg' => '~2.0', + ], + ] + ]; + + yield 'bump works from installed repo without lock file' => [ + [ + 'require' => [ + 'first/pkg' => '^2.0', + 'second/pkg' => '3.*', + ], + ], + [], + [ + 'require' => [ + 'first/pkg' => '^2.3.4', + 'second/pkg' => '^3.4', + ], + ], + false + ]; + + } +} diff --git a/tests/Composer/Test/Mock/FactoryMock.php b/tests/Composer/Test/Mock/FactoryMock.php index 6c75c3e6b6e6..a4cbe3f7745d 100644 --- a/tests/Composer/Test/Mock/FactoryMock.php +++ b/tests/Composer/Test/Mock/FactoryMock.php @@ -53,7 +53,7 @@ protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, $v $rm->setLocalRepository(new InstalledArrayRepository); } - public function createInstallationManager(Loop $loop, IOInterface $io, EventDispatcher $dispatcher = null): InstallationManager + public function createInstallationManager(Loop $loop = null, IOInterface $io = null, EventDispatcher $dispatcher = null): InstallationManager { return new InstallationManagerMock(); } diff --git a/tests/Composer/Test/Mock/InstallationManagerMock.php b/tests/Composer/Test/Mock/InstallationManagerMock.php index 593093ded3e3..31062f73620e 100644 --- a/tests/Composer/Test/Mock/InstallationManagerMock.php +++ b/tests/Composer/Test/Mock/InstallationManagerMock.php @@ -57,7 +57,7 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, $ public function getInstallPath(PackageInterface $package): string { - return ''; + return 'vendor/'.$package->getName(); } public function isPackageInstalled(InstalledRepositoryInterface $repo, PackageInterface $package): bool diff --git a/tests/Composer/Test/Package/Version/VersionBumperTest.php b/tests/Composer/Test/Package/Version/VersionBumperTest.php new file mode 100644 index 000000000000..648ffa314ed4 --- /dev/null +++ b/tests/Composer/Test/Package/Version/VersionBumperTest.php @@ -0,0 +1,69 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Package\Version; + +use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; +use Composer\Package\Version\VersionBumper; +use Composer\Package\Version\VersionSelector; +use Composer\Package\Package; +use Composer\Package\Link; +use Composer\Package\AliasPackage; +use Composer\Repository\PlatformRepository; +use Composer\Package\Version\VersionParser; +use Composer\Test\TestCase; +use Generator; + +class VersionBumperTest extends TestCase +{ + /** + * @dataProvider provideBumpRequirementTests + */ + public function testBumpRequirement(string $requirement, string $prettyVersion, string $expectedRequirement, ?string $branchAlias = null): void + { + $versionBumper = new VersionBumper(); + $versionParser = new VersionParser(); + + $package = new Package('foo/bar', $versionParser->normalize($prettyVersion), $prettyVersion); + + if ($branchAlias !== null) { + $package->setExtra(array('branch-alias' => array($prettyVersion => $branchAlias))); + } + + $newConstraint = $versionBumper->bumpRequirement($versionParser->parseConstraints($requirement), $package); + + // assert that the recommended version is what we expect + $this->assertSame($expectedRequirement, $newConstraint); + } + + public function provideBumpRequirementTests(): Generator + { + // constraint, version, expected recommendation, [branch-alias] + yield 'upgrade caret' => ['^1.0', '1.2.1', '^1.2.1']; + yield 'skip trailing .0s' => ['^1.0', '1.0.0', '^1.0']; + yield 'skip trailing .0s/2' => ['^1.2', '1.2.0', '^1.2']; + yield 'preserve multi constraints' => ['^1.2 || ^2.3', '1.3.2', '^1.3.2 || ^2.3']; + yield 'preserve multi constraints/2' => ['^1.2 || ^2.3', '2.4.0', '^1.2 || ^2.4']; + yield 'preserve multi constraints/3' => ['^1.2 || ^2.3 || ^2', '2.4.0', '^1.2 || ^2.4 || ^2.4']; + yield '@dev is preserved' => ['^3@dev', '3.2.x-dev', '^3.2@dev']; + yield 'non-stable versions abort upgrades' => ['~2', '2.1-beta.1', '~2']; + yield 'dev reqs are skipped' => ['dev-main', 'dev-foo', 'dev-main']; + yield 'dev version does not upgrade' => ['^3.2', 'dev-main', '^3.2']; + yield 'upgrade dev version if aliased' => ['^3.2', 'dev-main', '^3.3', '3.3.x-dev']; + yield 'upgrade major wildcard to caret' => ['2.*', '2.4.0', '^2.4']; + yield 'upgrade major wildcard as x to caret' => ['2.x.x', '2.4.0', '^2.4']; + yield 'leave minor wildcard alone' => ['2.4.*', '2.4.3', '2.4.*']; + yield 'leave patch wildcard alone' => ['2.4.3.*', '2.4.3.2', '2.4.3.*']; + yield 'upgrade tilde to caret when compatible' => ['~2.2', '2.4.3', '^2.4.3']; + yield 'leave patch-only-tilde alone' => ['~2.2.3', '2.2.6', '~2.2.3']; + } +} diff --git a/tests/Composer/Test/TestCase.php b/tests/Composer/Test/TestCase.php index fe7e279bffe6..fe0f9365b826 100644 --- a/tests/Composer/Test/TestCase.php +++ b/tests/Composer/Test/TestCase.php @@ -16,10 +16,13 @@ use Composer\Console\Application; use Composer\IO\IOInterface; use Composer\Json\JsonFile; +use Composer\Package\Locker; use Composer\Pcre\Preg; +use Composer\Repository\InstalledFilesystemRepository; use Composer\Semver\VersionParser; use Composer\Package\PackageInterface; use Composer\Semver\Constraint\Constraint; +use Composer\Test\Mock\FactoryMock; use Composer\Test\Mock\HttpDownloaderMock; use Composer\Test\Mock\ProcessExecutorMock; use Composer\Util\Filesystem; @@ -109,6 +112,9 @@ public static function getUniqueTmpDirectory(): string * * The directory will be cleaned up on tearDown automatically. * + * @see createInstalledJson + * @see createComposerLock + * @see getApplicationTester * @param mixed[] $composerJson * @param mixed[] $authJson * @return string the newly created temp dir @@ -138,6 +144,44 @@ public function initTempComposer(array $composerJson = [], array $authJson = []) return $dir; } + /** + * Creates a vendor/composer/installed.json in CWD with the given packages + * + * @param PackageInterface[] $packages + * @param PackageInterface[] $devPackages + */ + protected function createInstalledJson(array $packages = [], array $devPackages = [], bool $devMode = true): void + { + mkdir('vendor/composer', 0777, true); + $repo = new InstalledFilesystemRepository(new JsonFile('vendor/composer/installed.json')); + $repo->setDevPackageNames(array_map(function (PackageInterface $pkg) { return $pkg->getPrettyName(); }, $devPackages)); + foreach ($packages as $pkg) { + $repo->addPackage($pkg); + mkdir('vendor/'.$pkg->getName(), 0777, true); + } + foreach ($devPackages as $pkg) { + $repo->addPackage($pkg); + mkdir('vendor/'.$pkg->getName(), 0777, true); + } + + $factory = new FactoryMock(); + $repo->write($devMode, $factory->createInstallationManager()); + } + + /** + * Creates a composer.lock in CWD with the given packages + * + * @param PackageInterface[] $packages + * @param PackageInterface[] $devPackages + */ + protected function createComposerLock(array $packages = [], array $devPackages = []): void + { + $factory = new FactoryMock(); + + $locker = new Locker($this->getMockBuilder(IOInterface::class)->getMock(), new JsonFile('./composer.lock'), $factory->createInstallationManager(), (string) file_get_contents('./composer.json')); + $locker->setLockData($packages, $devPackages, [], [], [], 'dev', [], false, false, []); + } + public function getApplicationTester(): ApplicationTester { $application = new Application(); From 0fd845eeaf776a705e78005bb4fa3f14f56e923d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 9 Jun 2022 11:45:32 +0200 Subject: [PATCH 121/618] Add --major-only flag to outdated/show commands to restrict the list to packages with major updates available, fixes #10439 (#10827) --- doc/03-cli.md | 12 ++++-- src/Composer/Command/OutdatedCommand.php | 10 +++-- src/Composer/Command/ShowCommand.php | 47 ++++++++++++++++-------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 8aab64bc5745..2804d02ebb3f 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -497,7 +497,7 @@ php composer.phar show monolog/monolog 1.0.2 ### Options -* **--all :** List all packages available in all your repositories. +* **--all:** List all packages available in all your repositories. * **--installed (-i):** List the packages that are installed (this is enabled by default, and deprecated). * **--locked:** List the locked packages from composer.lock. * **--platform (-p):** List only platform packages (php & extensions). @@ -508,8 +508,11 @@ php composer.phar show monolog/monolog 1.0.2 * **--tree (-t):** List your dependencies as a tree. If you pass a package name it will show the dependency tree for that package. * **--latest (-l):** List all installed packages including their latest version. * **--outdated (-o):** Implies --latest, but this lists *only* packages that have a newer version available. +* **--ignore:** Ignore specified package(s). Use it with the --outdated option if you don't want to be informed about new versions of some packages * **--no-dev:** Filters dev dependencies from the package list. -* **--minor-only (-m):** Use with --latest. Only shows packages that have minor SemVer-compatible updates. +* **--major-only (-M):** Use with --latest or --outdated. Only shows packages that have major SemVer-compatible updates. +* **--minor-only (-m):** Use with --latest or --outdated. Only shows packages that have minor SemVer-compatible updates. +* **--patch-only (-p):** Use with --latest or --outdated. Only shows packages that have patch-level SemVer-compatible updates. * **--direct (-D):** Restricts the list of packages to your direct dependencies. * **--strict:** Return a non-zero exit code when there are outdated packages. * **--format (-f):** Lets you pick between text (default) or json output format. @@ -536,10 +539,13 @@ The color coding is as such: ### Options -* **--all (-a):** Show all packages, not just outdated (alias for `composer show -l`). +* **--all (-a):** Show all packages, not just outdated (alias for `composer show --latest`). * **--direct (-D):** Restricts the list of packages to your direct dependencies. * **--strict:** Returns non-zero exit code if any package is outdated. +* **--ignore:** Ignore specified package(s). Use it if you don't want to be informed about new versions of some packages +* **--major-only (-M):** Only shows packages that have major SemVer-compatible updates. * **--minor-only (-m):** Only shows packages that have minor SemVer-compatible updates. +* **--patch-only (-p):** Only shows packages that have patch-level SemVer-compatible updates. * **--format (-f):** Lets you pick between text (default) or json output format. * **--no-dev:** Do not show outdated dev dependencies. * **--locked:** Shows updates for packages from the lock file, regardless of what is currently in vendor dir. diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index ffa9ba3af731..5d3a05b164d5 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -40,10 +40,11 @@ protected function configure(): void new InputOption('locked', null, InputOption::VALUE_NONE, 'Shows updates for packages from the lock file, regardless of what is currently in vendor dir'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), - new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), - new InputOption('patch-only', 'p', InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --outdated option.'), + new InputOption('major-only', 'M', InputOption::VALUE_NONE, 'Show only packages that have major SemVer-compatible updates.'), + new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates.'), + new InputOption('patch-only', 'p', InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), - new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), + new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), @@ -84,6 +85,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($input->getOption('strict')) { $args['--strict'] = true; } + if ($input->getOption('major-only')) { + $args['--major-only'] = true; + } if ($input->getOption('minor-only')) { $args['--minor-only'] = true; } diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index bdfb5c8cf3bf..a1f359f21f72 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -91,8 +91,9 @@ protected function configure() new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), - new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), - new InputOption('patch-only', null, InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --outdated option.'), + new InputOption('major-only', 'M', InputOption::VALUE_NONE, 'Show only packages that have major SemVer-compatible updates. Use with the --latest or --outdated option.'), + new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --latest or --outdated option.'), + new InputOption('patch-only', null, InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --latest or --outdated option.'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), @@ -158,8 +159,8 @@ protected function execute(InputInterface $input, OutputInterface $output) return 1; } - if ($input->getOption('patch-only') && $input->getOption('minor-only')) { - $io->writeError('The --patch-only option is not usable in combination with --minor-only'); + if (count(array_filter([$input->getOption('patch-only'), $input->getOption('minor-only'), $input->getOption('major-only')])) > 1) { + $io->writeError('Only one of --major-only, --minor-only or --patch-only can be used at once'); return 1; } @@ -314,7 +315,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $latestPackage = null; if ($input->getOption('latest')) { - $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $input->getOption('minor-only'), $input->getOption('patch-only'), $platformReqFilter); + $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $input->getOption('major-only'), $input->getOption('minor-only'), $input->getOption('patch-only'), $platformReqFilter); } if ( $input->getOption('outdated') @@ -422,6 +423,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $showAllTypes = $input->getOption('all'); $showLatest = $input->getOption('latest'); + $showMajorOnly = $input->getOption('major-only'); $showMinorOnly = $input->getOption('minor-only'); $showPatchOnly = $input->getOption('patch-only'); $ignoredPackages = array_map('strtolower', $input->getOption('ignore')); @@ -440,7 +442,7 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($showLatest && $showVersion) { foreach ($packages[$type] as $package) { if (is_object($package)) { - $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $showMinorOnly, $showPatchOnly, $platformReqFilter); + $latestPackage = $this->findLatestPackage($package, $composer, $platformRepo, $showMajorOnly, $showMinorOnly, $showPatchOnly, $platformReqFilter); if ($latestPackage === null) { continue; } @@ -468,6 +470,8 @@ protected function execute(InputInterface $input, OutputInterface $output) // Determine if Composer is checking outdated dependencies and if current package should trigger non-default exit code $packageIsUpToDate = $latestPackage && $latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && (!$latestPackage instanceof CompletePackageInterface || !$latestPackage->isAbandoned()); + // When using --major-only, and no bigger version than current major is found then it is considered up to date + $packageIsUpToDate = $packageIsUpToDate || ($latestPackage === null && $showMajorOnly); $packageIsIgnored = \in_array($package->getPrettyName(), $ignoredPackages, true); if ($input->getOption('outdated') && ($packageIsUpToDate || $packageIsIgnored)) { continue; @@ -1354,7 +1358,7 @@ private function writeTreeLine(string $line): void /** * Given a package, this finds the latest package matching it */ - private function findLatestPackage(PackageInterface $package, Composer $composer, PlatformRepository $platformRepo, bool $minorOnly, bool $patchOnly, PlatformRequirementFilterInterface $platformReqFilter): ?PackageInterface + private function findLatestPackage(PackageInterface $package, Composer $composer, PlatformRepository $platformRepo, bool $majorOnly, bool $minorOnly, bool $patchOnly, PlatformRequirementFilterInterface $platformReqFilter): ?PackageInterface { // find the latest version allowed in this repo set $name = $package->getName(); @@ -1373,19 +1377,30 @@ private function findLatestPackage(PackageInterface $package, Composer $composer $targetVersion = null; if (0 === strpos($package->getVersion(), 'dev-')) { $targetVersion = $package->getVersion(); - } - if ($targetVersion === null && $minorOnly) { - $targetVersion = '^' . $package->getVersion(); + // dev-x branches are considered to be on the latest major version always, do not look up for a new commit as that is deemed a minor upgrade (albeit risky) + if ($majorOnly) { + return null; + } } - if ($targetVersion === null && $patchOnly) { - $trimmedVersion = Preg::replace('{(\.0)+$}D', '', $package->getVersion()); - $partsNeeded = substr($trimmedVersion, 0, 1) === '0' ? 4 : 3; - while (substr_count($trimmedVersion, '.') + 1 < $partsNeeded) { - $trimmedVersion .= '.0'; + if ($targetVersion === null) { + if ($majorOnly && Preg::isMatch('{^(\d+)\.}', $package->getVersion(), $match)) { + $targetVersion = '>='.($match[1] + 1).',<9999999-dev'; + } + + if ($minorOnly) { + $targetVersion = '^'.$package->getVersion(); + } + + if ($patchOnly) { + $trimmedVersion = Preg::replace('{(\.0)+$}D', '', $package->getVersion()); + $partsNeeded = substr($trimmedVersion, 0, 1) === '0' ? 4 : 3; + while (substr_count($trimmedVersion, '.') + 1 < $partsNeeded) { + $trimmedVersion .= '.0'; + } + $targetVersion = '~'.$trimmedVersion; } - $targetVersion = '~' . $trimmedVersion; } $candidate = $versionSelector->findBestCandidate($name, $targetVersion, $bestStability, $platformReqFilter); From 6186d0c1d5d5d9c292c22de1ee615cf7bc3fb7ff Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 9 Jun 2022 11:46:00 +0200 Subject: [PATCH 122/618] Add --gc flag to cache-cache command and ability to GC vcs/repo caches, fixes #7834 (#10826) --- doc/03-cli.md | 4 +++ src/Composer/Cache.php | 19 ++++++++++++++ src/Composer/Command/ClearCacheCommand.php | 30 +++++++++++++++++++--- 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 2804d02ebb3f..4a6a8d3732dd 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -926,6 +926,10 @@ performance. Deletes all content from Composer's cache directories. +### Options + +* **--gc:** Only run garbage collection, not a full cache clear + ## licenses Lists the name, version and license of every package installed. Use diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index 27fc282179cb..e864e163d8ef 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -339,6 +339,25 @@ public function gc(int $ttl, int $maxSize) return false; } + public function gcVcsCache(int $ttl): bool + { + if ($this->isEnabled()) { + $expire = new \DateTime(); + $expire->modify('-'.$ttl.' seconds'); + + $finder = Finder::create()->in($this->root)->directories()->depth(0)->date('until '.$expire->format('Y-m-d H:i:s')); + foreach ($finder as $file) { + $this->filesystem->removeDirectory($file->getPathname()); + } + + self::$cacheCollected = true; + + return true; + } + + return false; + } + /** * @param string $file * diff --git a/src/Composer/Command/ClearCacheCommand.php b/src/Composer/Command/ClearCacheCommand.php index e2ba384d38b3..4f3c2f4280dd 100644 --- a/src/Composer/Command/ClearCacheCommand.php +++ b/src/Composer/Command/ClearCacheCommand.php @@ -15,6 +15,7 @@ use Composer\Cache; use Composer\Factory; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** @@ -31,6 +32,9 @@ protected function configure(): void ->setName('clear-cache') ->setAliases(array('clearcache', 'cc')) ->setDescription('Clears composer\'s internal package cache.') + ->setDefinition(array( + new InputOption('gc', null, InputOption::VALUE_NONE, 'Only run garbage collection, not a full cache clear'), + )) ->setHelp( <<clear-cache deletes all cached packages from composer's @@ -55,6 +59,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int ); foreach ($cachePaths as $key => $cachePath) { + // only individual dirs get garbage collected + if ($key === 'cache-dir' && $input->getOption('gc')) { + continue; + } + $cachePath = realpath($cachePath); if (!$cachePath) { $io->writeError("Cache directory does not exist ($key): $cachePath"); @@ -69,11 +78,26 @@ protected function execute(InputInterface $input, OutputInterface $output): int continue; } - $io->writeError("Clearing cache ($key): $cachePath"); - $cache->clear(); + if ($input->getOption('gc')) { + $io->writeError("Garbage-collecting cache ($key): $cachePath"); + if ($key === 'cache-files-dir') { + $cache->gc($config->get('cache-files-ttl'), $config->get('cache-files-maxsize')); + } elseif ($key === 'cache-repo-dir') { + $cache->gc($config->get('cache-ttl'), 1024*1024*1024 /* 1GB, this should almost never clear anything that is not outdated */); + } elseif ($key === 'cache-vcs-dir') { + $cache->gcVcsCache($config->get('cache-ttl')); + } + } else { + $io->writeError("Clearing cache ($key): $cachePath"); + $cache->clear(); + } } - $io->writeError('All caches cleared.'); + if ($input->getOption('gc')) { + $io->writeError('All caches garbage-collected.'); + } else { + $io->writeError('All caches cleared.'); + } return 0; } From 03fbcdbf0722149d0ccba68474d2c0838ccd1c8d Mon Sep 17 00:00:00 2001 From: Chris Reed <55092742+cjreed121@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:56:11 -0400 Subject: [PATCH 123/618] Fix exported path with space in binary installer proxy (#10836) --- src/Composer/Installer/BinaryInstaller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Installer/BinaryInstaller.php b/src/Composer/Installer/BinaryInstaller.php index a96bfce0aa11..46c2f83dddc0 100644 --- a/src/Composer/Installer/BinaryInstaller.php +++ b/src/Composer/Installer/BinaryInstaller.php @@ -437,7 +437,7 @@ public function url_stat(\$path, \$flags) esac fi -export COMPOSER_RUNTIME_BIN_DIR=\$(cd "\${self%[/\\\\]*}" > /dev/null; pwd) +export COMPOSER_RUNTIME_BIN_DIR="\$(cd "\${self%[/\\\\]*}" > /dev/null; pwd)" # If bash is sourcing this file, we have to source the target as well bashSource="\$BASH_SOURCE" From 3e844cc48fb8bdbbdd55a06b7a59312b0cafe764 Mon Sep 17 00:00:00 2001 From: Ayesh Karunaratne Date: Mon, 13 Jun 2022 01:14:03 +0530 Subject: [PATCH 124/618] `composer bump` - Fix typo in the warning message (#10841) Change warning text 'Alternatively you can use --dev-only to only bump dependencies within "require-dev"' that said `--dev` instead of `--dev-only`. --- src/Composer/Command/BumpCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/BumpCommand.php b/src/Composer/Command/BumpCommand.php index 3abcbc199d20..3135b357f187 100644 --- a/src/Composer/Command/BumpCommand.php +++ b/src/Composer/Command/BumpCommand.php @@ -126,7 +126,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $contents = $composerJson->read(); if (!isset($contents['type'])) { $io->writeError('If your package is not a library, you can explicitly specify the "type" by using "composer config type project".'); - $io->writeError('Alternatively you can use --dev to only bump dependencies within "require-dev".'); + $io->writeError('Alternatively you can use --dev-only to only bump dependencies within "require-dev".'); } unset($contents); } From 7d4d941392cdcd2b4c843e59e70988b74f2c2209 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 19 Jun 2022 13:55:58 +0200 Subject: [PATCH 125/618] Make use of new composer/class-map-generator package and build up BC layer --- composer.json | 1 + composer.lock | 75 ++++- src/Composer/Autoload/AutoloadGenerator.php | 149 +++++----- src/Composer/Autoload/ClassMapGenerator.php | 272 ++---------------- .../Test/Autoload/ClassMapGeneratorTest.php | 11 - .../functional/installed-versions.test | 8 +- .../functional/installed-versions2.test | 12 +- 7 files changed, 180 insertions(+), 348 deletions(-) diff --git a/composer.json b/composer.json index da91c4bbd34e..1377dccb09d2 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "require": { "php": "^7.2.5 || ^8.0", "composer/ca-bundle": "^1.0", + "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", "composer/semver": "^3.0", "composer/spdx-licenses": "^1.5.7", diff --git a/composer.lock b/composer.lock index 858718d08095..d55a6d6c41c3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5626ea61968f46e5aad29824224a8783", + "content-hash": "0d8cb08c58ec6422f5894ce04cff0d41", "packages": [ { "name": "composer/ca-bundle", @@ -82,6 +82,79 @@ ], "time": "2022-05-24T11:56:16+00:00" }, + { + "name": "composer/class-map-generator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", + "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "shasum": "" + }, + "require": { + "composer/pcre": "^2 || ^3", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.6", + "phpstan/phpstan-deprecation-rules": "^1", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/filesystem": "^5.4 || ^6", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-06-19T11:31:27+00:00" + }, { "name": "composer/metadata-minifier", "version": "1.0.0", diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index a6b911e070bf..60b7388d7d07 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -12,6 +12,7 @@ namespace Composer\Autoload; +use Composer\ClassMapGenerator\ClassMapGenerator; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; @@ -19,6 +20,7 @@ use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; use Composer\Installer\InstallationManager; use Composer\IO\IOInterface; +use Composer\IO\NullIO; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; @@ -43,7 +45,7 @@ class AutoloadGenerator private $eventDispatcher; /** - * @var ?IOInterface + * @var IOInterface */ private $io; @@ -80,7 +82,7 @@ class AutoloadGenerator public function __construct(EventDispatcher $eventDispatcher, IOInterface $io = null) { $this->eventDispatcher = $eventDispatcher; - $this->io = $io; + $this->io = $io ?? new NullIO(); $this->platformRequirementFilter = PlatformRequirementFilterFactory::ignoreNothing(); } @@ -195,6 +197,9 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro )); } + $classMapGenerator = new ClassMapGenerator(['php', 'inc', 'hh']); + $classMapGenerator->avoidDuplicateScans(); + $filesystem = new Filesystem(); $filesystem->ensureDirectoryExists($config->get('vendor-dir')); // Do not remove double realpath() calls. @@ -273,18 +278,6 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro } $psr4File .= ");\n"; - $classmapFile = <<getAutoload(); @@ -323,11 +316,8 @@ public static function autoload(\$class) $excluded = $autoloads['exclude-from-classmap']; } - $classMap = array(); - $ambiguousClasses = array(); - $scannedFiles = array(); foreach ($autoloads['classmap'] as $dir) { - $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $excluded, null, null, $classMap, $ambiguousClasses, $scannedFiles); + $classMapGenerator->scanPaths($dir, $this->buildExclusionRegex($dir, $excluded)); } if ($scanPsrPackages) { @@ -350,25 +340,47 @@ public static function autoload(\$class) continue; } - $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $excluded, $namespace, $group['type'], $classMap, $ambiguousClasses, $scannedFiles); + $classMapGenerator->scanPaths($dir, $this->buildExclusionRegex($dir, $excluded), $group['type'], $namespace); } } } } - foreach ($ambiguousClasses as $className => $ambiguousPaths) { - $cleanPath = str_replace(array('$vendorDir . \'', '$baseDir . \'', "',\n"), array($vendorPath, $basePath, ''), $classMap[$className]); - - $this->io->writeError( - 'Warning: Ambiguous class resolution, "'.$className.'"'. - ' was found '. (count($ambiguousPaths) + 1) .'x: in "'.$cleanPath.'" and "'. implode('", "', $ambiguousPaths) .'", the first will be used.' - ); + $classMap = $classMapGenerator->getClassMap(); + foreach ($classMap->getAmbiguousClasses() as $className => $ambiguousPaths) { + if (count($ambiguousPaths) > 1) { + $this->io->writeError( + 'Warning: Ambiguous class resolution, "'.$className.'"'. + ' was found '. (count($ambiguousPaths) + 1) .'x: in "'.$classMap->getClassPath($className).'" and "'. implode('", "', $ambiguousPaths) .'", the first will be used.' + ); + } else { + $this->io->writeError( + 'Warning: Ambiguous class resolution, "'.$className.'"'. + ' was found in both "'.$classMap->getClassPath($className).'" and "'. implode('", "', $ambiguousPaths) .'", the first will be used.' + ); + } + } + foreach ($classMap->getPsrViolations() as $msg) { + $this->io->writeError("$msg"); } - $classMap['Composer\\InstalledVersions'] = "\$vendorDir . '/composer/InstalledVersions.php',\n"; - ksort($classMap); - foreach ($classMap as $class => $code) { - $classmapFile .= ' '.var_export($class, true).' => '.$code; + $classMap->addClass('Composer\InstalledVersions', $vendorPath . '/composer/InstalledVersions.php'); + $classMap->sort(); + + $classmapFile = <<getMap() as $className => $path) { + $pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path).",\n"; + $classmapFile .= ' '.var_export($className, true).' => '.$pathCode; } $classmapFile .= ");\n"; @@ -433,67 +445,36 @@ public static function autoload(\$class) )); } - return count($classMap); + return \count($classMap); } /** - * @param string $basePath - * @param string $vendorPath - * @param string $dir - * @param null|array $excluded - * @param null|string $namespaceFilter - * @param null|string $autoloadType - * @param array $classMap - * @param array> $ambiguousClasses - * @param array $scannedFiles - * @return array + * @param array|null $excluded + * @return non-empty-string|null */ - private function addClassMapCode(Filesystem $filesystem, string $basePath, string $vendorPath, string $dir, ?array $excluded, ?string $namespaceFilter, ?string $autoloadType, array $classMap, array &$ambiguousClasses, array &$scannedFiles): array + private function buildExclusionRegex(string $dir, ?array $excluded): ?string { - foreach ($this->generateClassMap($dir, $excluded, $namespaceFilter, $autoloadType, true, $scannedFiles) as $class => $path) { - $pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path).",\n"; - if (!isset($classMap[$class])) { - $classMap[$class] = $pathCode; - } elseif ($this->io && $classMap[$class] !== $pathCode && !Preg::isMatch('{/(test|fixture|example|stub)s?/}i', strtr($classMap[$class].' '.$path, '\\', '/'))) { - $ambiguousClasses[$class][] = $path; - } + if (null === $excluded) { + return null; } - return $classMap; - } - - /** - * @param string $dir - * @param null|array $excluded - * @param null|string $namespaceFilter - * @param null|string $autoloadType - * @param bool $showAmbiguousWarning - * @param array $scannedFiles - * @return array - */ - private function generateClassMap(string $dir, ?array $excluded, ?string $namespaceFilter, ?string $autoloadType, bool $showAmbiguousWarning, array &$scannedFiles): array - { - if ($excluded) { - // filter excluded patterns here to only use those matching $dir - // exclude-from-classmap patterns are all realpath'd so we can only filter them if $dir exists so that realpath($dir) will work - // if $dir does not exist, it should anyway not find anything there so no trouble - if (file_exists($dir)) { - // transform $dir in the same way that exclude-from-classmap patterns are transformed so we can match them against each other - $dirMatch = preg_quote(strtr(realpath($dir), '\\', '/')); - foreach ($excluded as $index => $pattern) { - // extract the constant string prefix of the pattern here, until we reach a non-escaped regex special character - $pattern = Preg::replace('{^(([^.+*?\[^\]$(){}=!<>|:\\\\#-]+|\\\\[.+*?\[^\]$(){}=!<>|:#-])*).*}', '$1', $pattern); - // if the pattern is not a subset or superset of $dir, it is unrelated and we skip it - if (0 !== strpos($pattern, $dirMatch) && 0 !== strpos($dirMatch, $pattern)) { - unset($excluded[$index]); - } + // filter excluded patterns here to only use those matching $dir + // exclude-from-classmap patterns are all realpath'd so we can only filter them if $dir exists so that realpath($dir) will work + // if $dir does not exist, it should anyway not find anything there so no trouble + if (file_exists($dir)) { + // transform $dir in the same way that exclude-from-classmap patterns are transformed so we can match them against each other + $dirMatch = preg_quote(strtr(realpath($dir), '\\', '/')); + foreach ($excluded as $index => $pattern) { + // extract the constant string prefix of the pattern here, until we reach a non-escaped regex special character + $pattern = Preg::replace('{^(([^.+*?\[^\]$(){}=!<>|:\\\\#-]+|\\\\[.+*?\[^\]$(){}=!<>|:#-])*).*}', '$1', $pattern); + // if the pattern is not a subset or superset of $dir, it is unrelated and we skip it + if (0 !== strpos($pattern, $dirMatch) && 0 !== strpos($dirMatch, $pattern)) { + unset($excluded[$index]); } } - - $excluded = $excluded ? '{(' . implode('|', $excluded) . ')}' : null; } - return ClassMapGenerator::createMap($dir, $excluded, $showAmbiguousWarning ? $this->io : null, $namespaceFilter, $autoloadType, $scannedFiles); + return \count($excluded) > 0 ? '{(' . implode('|', $excluded) . ')}' : null; } /** @@ -618,14 +599,18 @@ public function createLoader(array $autoloads, ?string $vendorDir = null) $excluded = $autoloads['exclude-from-classmap']; } - $scannedFiles = array(); + $classMapGenerator = new ClassMapGenerator(['php', 'inc', 'hh']); + $classMapGenerator->avoidDuplicateScans(); + foreach ($autoloads['classmap'] as $dir) { try { - $loader->addClassMap($this->generateClassMap($dir, $excluded, null, null, false, $scannedFiles)); + $classMapGenerator->scanPaths($dir, $this->buildExclusionRegex($dir, $excluded)); } catch (\RuntimeException $e) { $this->io->writeError(''.$e->getMessage().''); } } + + $loader->addClassMap($classMapGenerator->getClassMap()->getMap()); } return $loader; diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index bc9e0ec95fde..33dd0f324e41 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/src/Composer/Autoload/ClassMapGenerator.php @@ -18,17 +18,16 @@ namespace Composer\Autoload; -use Composer\Pcre\Preg; -use Composer\Util\Platform; -use Symfony\Component\Finder\Finder; +use Composer\ClassMapGenerator\FileList; use Composer\IO\IOInterface; -use Composer\Util\Filesystem; /** * ClassMapGenerator * * @author Gyula Sallai * @author Jordi Boggiano + * + * @deprecated Since Composer 2.4.0 use the composer/class-map-generator package instead */ class ClassMapGenerator { @@ -53,263 +52,48 @@ public static function dump(iterable $dirs, string $file): void /** * Iterate over all files in the given directory searching for classes * - * @param \Traversable<\SplFileInfo>|string|array $path The path to search in or an iterator - * @param string $excluded Regex that matches file paths to be excluded from the classmap - * @param ?IOInterface $io IO object - * @param null|string $namespace Optional namespace prefix to filter by - * @param null|string $autoloadType psr-0|psr-4 Optional autoload standard to use mapping rules - * @param array $scannedFiles - * @return array A class map array + * @param \Traversable<\SplFileInfo>|string|array<\SplFileInfo> $path The path to search in or an iterator + * @param non-empty-string|null $excluded Regex that matches file paths to be excluded from the classmap + * @param ?IOInterface $io IO object + * @param null|string $namespace Optional namespace prefix to filter by + * @param null|'psr-0'|'psr-4'|'classmap' $autoloadType psr-0|psr-4 Optional autoload standard to use mapping rules + * @param array $scannedFiles + * @return array A class map array * @throws \RuntimeException When the path is neither an existing file nor directory */ public static function createMap($path, string $excluded = null, IOInterface $io = null, ?string $namespace = null, ?string $autoloadType = null, array &$scannedFiles = array()): array { - $basePath = $path; - if (is_string($path)) { - if (is_file($path)) { - $path = array(new \SplFileInfo($path)); - } elseif (is_dir($path) || strpos($path, '*') !== false) { - $path = Finder::create()->files()->followLinks()->name('/\.(php|inc|hh)$/')->in($path); - } else { - throw new \RuntimeException( - 'Could not scan for classes inside "'.$path. - '" which does not appear to be a file nor a folder' - ); - } - } elseif (null !== $autoloadType) { - throw new \RuntimeException('Path must be a string when specifying an autoload type'); - } + $generator = new \Composer\ClassMapGenerator\ClassMapGenerator(['php', 'inc', 'hh']); + $fileList = new FileList(); + $fileList->files = $scannedFiles; + $generator->avoidDuplicateScans($fileList); - $map = array(); - $filesystem = new Filesystem(); - $cwd = realpath(Platform::getCwd()); + $generator->scanPaths($path, $excluded, $autoloadType ?? 'classmap', $namespace); - foreach ($path as $file) { - $filePath = $file->getPathname(); - if (!in_array(pathinfo($filePath, PATHINFO_EXTENSION), array('php', 'inc', 'hh'))) { - continue; - } + $classMap = $generator->getClassMap(); - if (!$filesystem->isAbsolutePath($filePath)) { - $filePath = $cwd . '/' . $filePath; - $filePath = $filesystem->normalizePath($filePath); - } else { - $filePath = Preg::replace('{[\\\\/]{2,}}', '/', $filePath); - } + $scannedFiles = $fileList->files; - $realPath = realpath($filePath); - - // if a list of scanned files is given, avoid scanning twice the same file to save cycles and avoid generating warnings - // in case a PSR-0/4 declaration follows another more specific one, or a classmap declaration, which covered this file already - if (isset($scannedFiles[$realPath])) { - continue; - } - - // check the realpath of the file against the excluded paths as the path might be a symlink and the excluded path is realpath'd so symlink are resolved - if ($excluded && Preg::isMatch($excluded, strtr($realPath, '\\', '/'))) { - continue; - } - // check non-realpath of file for directories symlink in project dir - if ($excluded && Preg::isMatch($excluded, strtr($filePath, '\\', '/'))) { - continue; + if ($io !== null) { + foreach ($classMap->getPsrViolations() as $msg) { + $io->writeError("$msg"); } - $classes = self::findClasses($filePath); - if (null !== $autoloadType) { - $classes = self::filterByNamespace($classes, $filePath, $namespace, $autoloadType, $basePath, $io); - - // if no valid class was found in the file then we do not mark it as scanned as it might still be matched by another rule later - if ($classes) { - $scannedFiles[$realPath] = true; - } - } else { - // classmap autoload rules always collect all classes so for these we definitely do not want to scan again - $scannedFiles[$realPath] = true; - } - - foreach ($classes as $class) { - // skip classes not within the given namespace prefix - if (null === $autoloadType && null !== $namespace && '' !== $namespace && 0 !== strpos($class, $namespace)) { - continue; - } - - if (!isset($map[$class])) { - $map[$class] = $filePath; - } elseif ($io && $map[$class] !== $filePath && !Preg::isMatch('{/(test|fixture|example|stub)s?/}i', strtr($map[$class].' '.$filePath, '\\', '/'))) { + foreach ($classMap->getAmbiguousClasses() as $class => $paths) { + if (count($paths) > 1) { $io->writeError( 'Warning: Ambiguous class resolution, "'.$class.'"'. - ' was found in both "'.$map[$class].'" and "'.$filePath.'", the first will be used.' + ' was found '. (count($paths) + 1) .'x: in "'.$classMap->getClassPath($class).'" and "'. implode('", "', $paths) .'", the first will be used.' ); - } - } - } - - return $map; - } - - /** - * Remove classes which could not have been loaded by namespace autoloaders - * - * @param array $classes found classes in given file - * @param string $filePath current file - * @param string $baseNamespace prefix of given autoload mapping - * @param string $namespaceType psr-0|psr-4 - * @param string $basePath root directory of given autoload mapping - * @param ?IOInterface $io IO object - * @return array valid classes - */ - private static function filterByNamespace(array $classes, string $filePath, string $baseNamespace, string $namespaceType, string $basePath, ?IOInterface $io): array - { - $validClasses = array(); - $rejectedClasses = array(); - - $realSubPath = substr($filePath, strlen($basePath) + 1); - $dotPosition = strrpos($realSubPath, '.'); - $realSubPath = substr($realSubPath, 0, $dotPosition === false ? PHP_INT_MAX : $dotPosition); - - foreach ($classes as $class) { - // silently skip if ns doesn't have common root - if ('' !== $baseNamespace && 0 !== strpos($class, $baseNamespace)) { - continue; - } - // transform class name to file path and validate - if ('psr-0' === $namespaceType) { - $namespaceLength = strrpos($class, '\\'); - if (false !== $namespaceLength) { - $namespace = substr($class, 0, $namespaceLength + 1); - $className = substr($class, $namespaceLength + 1); - $subPath = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) - . str_replace('_', DIRECTORY_SEPARATOR, $className); } else { - $subPath = str_replace('_', DIRECTORY_SEPARATOR, $class); - } - } elseif ('psr-4' === $namespaceType) { - $subNamespace = ('' !== $baseNamespace) ? substr($class, strlen($baseNamespace)) : $class; - $subPath = str_replace('\\', DIRECTORY_SEPARATOR, $subNamespace); - } else { - throw new \RuntimeException("namespaceType must be psr-0 or psr-4, $namespaceType given"); - } - if ($subPath === $realSubPath) { - $validClasses[] = $class; - } else { - $rejectedClasses[] = $class; - } - } - // warn only if no valid classes, else silently skip invalid - if (empty($validClasses)) { - foreach ($rejectedClasses as $class) { - if ($io) { - $io->writeError("Class $class located in ".Preg::replace('{^'.preg_quote(Platform::getCwd()).'}', '.', $filePath, 1)." does not comply with $namespaceType autoloading standard. Skipping."); - } - } - - return array(); - } - - return $validClasses; - } - - /** - * Extract the classes in the given file - * - * @param string $path The file to check - * @throws \RuntimeException - * @return array The found classes - */ - private static function findClasses(string $path): array - { - $extraTypes = self::getExtraTypes(); - - // Use @ here instead of Silencer to actively suppress 'unhelpful' output - // @link https://github.com/composer/composer/pull/4886 - $contents = @php_strip_whitespace($path); - if (!$contents) { - if (!file_exists($path)) { - $message = 'File at "%s" does not exist, check your classmap definitions'; - } elseif (!Filesystem::isReadable($path)) { - $message = 'File at "%s" is not readable, check its permissions'; - } elseif ('' === trim((string) file_get_contents($path))) { - // The input file was really empty and thus contains no classes - return array(); - } else { - $message = 'File at "%s" could not be parsed as PHP, it may be binary or corrupted'; - } - $error = error_get_last(); - if (isset($error['message'])) { - $message .= PHP_EOL . 'The following message may be helpful:' . PHP_EOL . $error['message']; - } - throw new \RuntimeException(sprintf($message, $path)); - } - - // return early if there is no chance of matching anything in this file - Preg::matchAll('{\b(?:class|interface|trait'.$extraTypes.')\s}i', $contents, $matches); - if (!$matches) { - return array(); - } - - $p = new PhpFileCleaner($contents, count($matches[0])); - $contents = $p->clean(); - unset($p); - - Preg::matchAll('{ - (?: - \b(?])(?Pclass|interface|trait'.$extraTypes.') \s++ (?P[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+) - | \b(?])(?Pnamespace) (?P\s++[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\s*+\\\\\s*+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+)? \s*+ [\{;] - ) - }ix', $contents, $matches); - - $classes = array(); - $namespace = ''; - - for ($i = 0, $len = count($matches['type']); $i < $len; $i++) { - if (!empty($matches['ns'][$i])) { - $namespace = str_replace(array(' ', "\t", "\r", "\n"), '', (string) $matches['nsname'][$i]) . '\\'; - } else { - $name = $matches['name'][$i]; - // skip anon classes extending/implementing - if ($name === 'extends' || $name === 'implements') { - continue; - } - if ($name[0] === ':') { - // This is an XHP class, https://github.com/facebook/xhp - $name = 'xhp'.substr(str_replace(array('-', ':'), array('_', '__'), $name), 1); - } elseif (strtolower($matches['type'][$i]) === 'enum') { - // something like: - // enum Foo: int { HERP = '123'; } - // The regex above captures the colon, which isn't part of - // the class name. - // or: - // enum Foo:int { HERP = '123'; } - // The regex above captures the colon and type, which isn't part of - // the class name. - $colonPos = strrpos($name, ':'); - if (false !== $colonPos) { - $name = substr($name, 0, $colonPos); - } + $io->writeError( + 'Warning: Ambiguous class resolution, "'.$class.'"'. + ' was found in both "'.$classMap->getClassPath($class).'" and "'. implode('", "', $paths) .'", the first will be used.' + ); } - $classes[] = ltrim($namespace . $name, '\\'); - } - } - - return $classes; - } - - /** - * @return string - */ - private static function getExtraTypes(): string - { - static $extraTypes = null; - - if (null === $extraTypes) { - $extraTypes = ''; - if (PHP_VERSION_ID >= 80100 || (defined('HHVM_VERSION') && version_compare(HHVM_VERSION, '3.3', '>='))) { - $extraTypes .= '|enum'; } - - PhpFileCleaner::setTypeConfig(array_merge(['class', 'interface', 'trait'], array_filter(explode('|', $extraTypes)))); } - return $extraTypes; + return $classMap->getMap(); } } diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php index 148bfbce40a9..89a0c9453a84 100644 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php @@ -133,17 +133,6 @@ public function testCreateMapFinderSupport(): void ), ClassMapGenerator::createMap($finder)); } - public function testFindClassesThrowsWhenFileDoesNotExist(): void - { - $r = new \ReflectionClass('Composer\\Autoload\\ClassMapGenerator'); - $find = $r->getMethod('findClasses'); - $find->setAccessible(true); - - self::expectException('RuntimeException'); - self::expectExceptionMessage('does not exist'); - $find->invoke(null, __DIR__ . '/no-file'); - } - public function testAmbiguousReference(): void { $this->checkIfFinderIsAvailable(); diff --git a/tests/Composer/Test/Fixtures/functional/installed-versions.test b/tests/Composer/Test/Fixtures/functional/installed-versions.test index 47c31bf3f643..85dfefe9dc9d 100644 --- a/tests/Composer/Test/Fixtures/functional/installed-versions.test +++ b/tests/Composer/Test/Fixtures/functional/installed-versions.test @@ -8,7 +8,7 @@ Checks that package versions in InstalledVersions are correct on initial install update --EXPECT-- > Hooks::preUpdate -!!PreUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string"] +!!PreUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% Loading composer repositories with package information %((Info|Warning) from .*\n)?%Updating dependencies @@ -26,12 +26,12 @@ Package operations: 6 installs, 0 updates, 0 removals%(\nAs there is no 'unzip' - Downloading symfony/filesystem (%v?[2-8]\.\d+\.\d+%) - Installing symfony/console (99999.1.2): Symlinking from symfony-console - Installing plugin/a (1.1.1): Symlinking from plugin-a -!!PluginAInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","root/pkg"] +!!PluginAInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","root/pkg"] !!PluginA:null !!PluginB:null !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% - Installing plugin/b (2.2.2): Symlinking from plugin-b -!!PluginBInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","root/pkg"] +!!PluginBInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","root/pkg"] !!PluginA:1.1.1.0 !!PluginB:null !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% @@ -42,7 +42,7 @@ Generating autoload files 2 packages you are using are looking for funding. Use the `composer fund` command to find out more! > Hooks::postUpdate -!!PostUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PostUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% --EXPECT-EXIT-CODE-- diff --git a/tests/Composer/Test/Fixtures/functional/installed-versions2.test b/tests/Composer/Test/Fixtures/functional/installed-versions2.test index c119c43ff43f..a9d2c5a9e5bb 100644 --- a/tests/Composer/Test/Fixtures/functional/installed-versions2.test +++ b/tests/Composer/Test/Fixtures/functional/installed-versions2.test @@ -7,14 +7,14 @@ Checks that package versions in InstalledVersions are correct during an upgrade. --RUN-- update plugin/* symfony/console symfony/filesystem symfony/process --EXPECT-- -!!PluginA:1.1.1.0["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginA:1.1.1.0["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginB:2.2.2.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% -!!PluginB:2.2.2.0["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginB:2.2.2.0["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginA:1.1.1.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% > Hooks::preUpdate -!!PreUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PreUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% Loading composer repositories with package information %((Info|Warning) from .*\n)?%Updating dependencies @@ -30,12 +30,12 @@ Package operations: 0 installs, 5 updates, 0 removals%(\nAs there is no 'unzip' - Downloading symfony/filesystem (%v?[2-8]\.\d+\.\d+%) - Upgrading symfony/console (99999.1.2 => 99999.1.3): Mirroring from symfony-console - Upgrading plugin/a (1.1.1 => 1.1.2): Mirroring from plugin-a -!!PluginAInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginAInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginA:1.1.1.0 !!PluginB:2.2.2.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% - Upgrading plugin/b (2.2.2 => 2.2.3): Mirroring from plugin-b -!!PluginBInit["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginBInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginA:1.1.2.0 !!PluginB:2.2.2.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% @@ -45,7 +45,7 @@ Generating autoload files 2 packages you are using are looking for funding. Use the `composer fund` command to find out more! > Hooks::postUpdate -!!PostUpdate:["composer/ca-bundle","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PostUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% !!PluginA:1.1.2.0 !!PluginB:2.2.3.0 From 3a945ac70ff4014344707c3673489be5db066d19 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 19 Jun 2022 14:08:02 +0200 Subject: [PATCH 126/618] Delete ClassMapGenerator tests which are not needed anymore --- .../Test/Autoload/ClassMapGeneratorTest.php | 284 ---- .../Test/Autoload/Fixtures/Namespaced/Bar.inc | 8 - .../Test/Autoload/Fixtures/Namespaced/Baz.php | 8 - .../Test/Autoload/Fixtures/Pearlike/Bar.php | 6 - .../Test/Autoload/Fixtures/Pearlike/Baz.php | 6 - .../beta/NamespaceCollision/A/B/Bar.php | 8 - .../beta/NamespaceCollision/A/B/Foo.php | 8 - .../Fixtures/beta/PrefixCollision/A/B/Bar.php | 6 - .../Fixtures/beta/PrefixCollision/A/B/Foo.php | 6 - .../classmap/BackslashLineEndingString.php | 16 - .../Fixtures/classmap/InvalidUnicode.php | 277 ---- .../Autoload/Fixtures/classmap/LargeClass.php | 1387 ---------------- .../Autoload/Fixtures/classmap/LargeGap.php | 1394 ----------------- .../Autoload/Fixtures/classmap/LongString.php | 14 - .../Fixtures/classmap/MissingSpace.php | 6 - .../Autoload/Fixtures/classmap/NonUnicode.php | 7 - .../Fixtures/classmap/ShortOpenTag.php | 3 - .../classmap/ShortOpenTagDocblock.php | 6 - .../Autoload/Fixtures/classmap/SomeClass.php | 8 - .../Fixtures/classmap/SomeInterface.php | 8 - .../Autoload/Fixtures/classmap/SomeParent.php | 8 - .../Autoload/Fixtures/classmap/StripNoise.php | 151 -- .../Autoload/Fixtures/classmap/Unicode.php | 6 - .../Autoload/Fixtures/classmap/multipleNs.php | 14 - .../Autoload/Fixtures/classmap/notAClass.php | 3 - .../Autoload/Fixtures/classmap/notPhpFile.md | 7 - .../classmap/sameNsMultipleClasses.php | 8 - .../Autoload/Fixtures/hhvm3.3/Generics.php | 4 - .../Autoload/Fixtures/hhvm3.3/HackEnum.php | 6 - .../Fixtures/hhvm3.3/NamespacedHackEnum.php | 7 - .../pcrebacktracelimit/StripNoise.php | 87 - .../pcrebacktracelimit/VeryLongHeredoc.php | 464 ------ .../pcrebacktracelimit/VeryLongNowdoc.php | 327 ---- .../VeryLongPHP73Heredoc.php | 307 ---- .../VeryLongPHP73Nowdoc.php | 1018 ------------ .../Test/Autoload/Fixtures/php5.4/traits.php | 30 - .../Autoload/Fixtures/php7.0/anonclass.php | 43 - .../Autoload/Fixtures/php8.1/enum_backed.php | 7 - .../Autoload/Fixtures/php8.1/enum_basic.php | 7 - .../Fixtures/php8.1/enum_class_semantics.php | 7 - .../Fixtures/php8.1/enum_namespaced.php | 9 - .../Autoload/Fixtures/template/notphp.inc | 11 - .../Autoload/Fixtures/template/template_1.php | 6 - .../Autoload/Fixtures/template/template_2.php | 8 - .../Autoload/Fixtures/template/template_3.php | 10 - 45 files changed, 6021 deletions(-) delete mode 100644 tests/Composer/Test/Autoload/ClassMapGeneratorTest.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/Namespaced/Bar.inc delete mode 100644 tests/Composer/Test/Autoload/Fixtures/Namespaced/Baz.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/Pearlike/Bar.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/Pearlike/Baz.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/beta/NamespaceCollision/A/B/Bar.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/beta/NamespaceCollision/A/B/Foo.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/beta/PrefixCollision/A/B/Bar.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/beta/PrefixCollision/A/B/Foo.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/BackslashLineEndingString.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/InvalidUnicode.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/LargeClass.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/LargeGap.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/LongString.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/MissingSpace.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/NonUnicode.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/ShortOpenTag.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/ShortOpenTagDocblock.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/SomeClass.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/SomeInterface.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/SomeParent.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/StripNoise.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/Unicode.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/multipleNs.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/notAClass.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/notPhpFile.md delete mode 100644 tests/Composer/Test/Autoload/Fixtures/classmap/sameNsMultipleClasses.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/hhvm3.3/Generics.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/hhvm3.3/HackEnum.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/hhvm3.3/NamespacedHackEnum.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/StripNoise.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongHeredoc.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongNowdoc.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongPHP73Heredoc.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongPHP73Nowdoc.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/php5.4/traits.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/php7.0/anonclass.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/php8.1/enum_backed.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/php8.1/enum_basic.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/php8.1/enum_class_semantics.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/php8.1/enum_namespaced.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/template/notphp.inc delete mode 100644 tests/Composer/Test/Autoload/Fixtures/template/template_1.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/template/template_2.php delete mode 100644 tests/Composer/Test/Autoload/Fixtures/template/template_3.php diff --git a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php b/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php deleted file mode 100644 index 89a0c9453a84..000000000000 --- a/tests/Composer/Test/Autoload/ClassMapGeneratorTest.php +++ /dev/null @@ -1,284 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -/* - * This file is copied from the Symfony package. - * - * (c) Fabien Potencier - */ - -namespace Composer\Test\Autoload; - -use Composer\Autoload\ClassMapGenerator; -use Composer\Test\TestCase; -use Symfony\Component\Finder\Finder; -use Composer\Util\Filesystem; - -class ClassMapGeneratorTest extends TestCase -{ - /** - * @dataProvider getTestCreateMapTests - * @param string $directory - * @param array $expected - */ - public function testCreateMap(string $directory, array $expected): void - { - $this->assertEqualsNormalized($expected, ClassMapGenerator::createMap($directory)); - } - - /** - * @return array>> - */ - public function getTestCreateMapTests(): array - { - $classmap = array( - 'Foo\\Bar\\A' => realpath(__DIR__) . '/Fixtures/classmap/sameNsMultipleClasses.php', - 'Foo\\Bar\\B' => realpath(__DIR__) . '/Fixtures/classmap/sameNsMultipleClasses.php', - 'Alpha\\A' => realpath(__DIR__) . '/Fixtures/classmap/multipleNs.php', - 'Alpha\\B' => realpath(__DIR__) . '/Fixtures/classmap/multipleNs.php', - 'A' => realpath(__DIR__) . '/Fixtures/classmap/multipleNs.php', - 'Be\\ta\\A' => realpath(__DIR__) . '/Fixtures/classmap/multipleNs.php', - 'Be\\ta\\B' => realpath(__DIR__) . '/Fixtures/classmap/multipleNs.php', - 'ClassMap\\SomeInterface' => realpath(__DIR__) . '/Fixtures/classmap/SomeInterface.php', - 'ClassMap\\SomeParent' => realpath(__DIR__) . '/Fixtures/classmap/SomeParent.php', - 'ClassMap\\SomeClass' => realpath(__DIR__) . '/Fixtures/classmap/SomeClass.php', - 'ClassMap\\LongString' => realpath(__DIR__) . '/Fixtures/classmap/LongString.php', - 'Foo\\LargeClass' => realpath(__DIR__) . '/Fixtures/classmap/LargeClass.php', - 'Foo\\LargeGap' => realpath(__DIR__) . '/Fixtures/classmap/LargeGap.php', - 'Foo\\MissingSpace' => realpath(__DIR__) . '/Fixtures/classmap/MissingSpace.php', - 'Foo\\StripNoise' => realpath(__DIR__) . '/Fixtures/classmap/StripNoise.php', - 'Foo\\First' => realpath(__DIR__) . '/Fixtures/classmap/StripNoise.php', - 'Foo\\Second' => realpath(__DIR__) . '/Fixtures/classmap/StripNoise.php', - 'Foo\\Third' => realpath(__DIR__) . '/Fixtures/classmap/StripNoise.php', - 'Foo\\SlashedA' => realpath(__DIR__) . '/Fixtures/classmap/BackslashLineEndingString.php', - 'Foo\\SlashedB' => realpath(__DIR__) . '/Fixtures/classmap/BackslashLineEndingString.php', - 'Unicode\\↑\\↑' => realpath(__DIR__) . '/Fixtures/classmap/Unicode.php', - 'ShortOpenTag' => realpath(__DIR__) . '/Fixtures/classmap/ShortOpenTag.php', - 'Smarty_Internal_Compile_Block' => realpath(__DIR__) . '/Fixtures/classmap/InvalidUnicode.php', - 'Smarty_Internal_Compile_Blockclose' => realpath(__DIR__) . '/Fixtures/classmap/InvalidUnicode.php', - 'ShortOpenTagDocblock' => realpath(__DIR__) . '/Fixtures/classmap/ShortOpenTagDocblock.php', - ); - - $data = array( - array(__DIR__ . '/Fixtures/Namespaced', array( - 'Namespaced\\Bar' => realpath(__DIR__) . '/Fixtures/Namespaced/Bar.inc', - 'Namespaced\\Foo' => realpath(__DIR__) . '/Fixtures/Namespaced/Foo.php', - 'Namespaced\\Baz' => realpath(__DIR__) . '/Fixtures/Namespaced/Baz.php', - )), - array(__DIR__ . '/Fixtures/beta/NamespaceCollision', array( - 'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__) . '/Fixtures/beta/NamespaceCollision/A/B/Bar.php', - 'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__) . '/Fixtures/beta/NamespaceCollision/A/B/Foo.php', - )), - array(__DIR__ . '/Fixtures/Pearlike', array( - 'Pearlike_Foo' => realpath(__DIR__) . '/Fixtures/Pearlike/Foo.php', - 'Pearlike_Bar' => realpath(__DIR__) . '/Fixtures/Pearlike/Bar.php', - 'Pearlike_Baz' => realpath(__DIR__) . '/Fixtures/Pearlike/Baz.php', - )), - array(__DIR__ . '/Fixtures/classmap', $classmap), - array(__DIR__ . '/Fixtures/template', array()), - ); - - $data[] = array(__DIR__ . '/Fixtures/php5.4', array( - 'TFoo' => __DIR__ . '/Fixtures/php5.4/traits.php', - 'CFoo' => __DIR__ . '/Fixtures/php5.4/traits.php', - 'Foo\\TBar' => __DIR__ . '/Fixtures/php5.4/traits.php', - 'Foo\\IBar' => __DIR__ . '/Fixtures/php5.4/traits.php', - 'Foo\\TFooBar' => __DIR__ . '/Fixtures/php5.4/traits.php', - 'Foo\\CBar' => __DIR__ . '/Fixtures/php5.4/traits.php', - )); - - $data[] = array(__DIR__ . '/Fixtures/php7.0', array( - 'Dummy\Test\AnonClassHolder' => __DIR__ . '/Fixtures/php7.0/anonclass.php', - )); - - if (PHP_VERSION_ID >= 80100) { - $data[] = array(__DIR__ . '/Fixtures/php8.1', array( - 'RolesBasicEnum' => __DIR__ . '/Fixtures/php8.1/enum_basic.php', - 'RolesBackedEnum' => __DIR__ . '/Fixtures/php8.1/enum_backed.php', - 'RolesClassLikeEnum' => __DIR__ . '/Fixtures/php8.1/enum_class_semantics.php', - 'Foo\Bar\RolesClassLikeNamespacedEnum' => __DIR__ . '/Fixtures/php8.1/enum_namespaced.php', - )); - } - - if (defined('HHVM_VERSION') && version_compare(HHVM_VERSION, '3.3', '>=')) { - $data[] = array(__DIR__ . '/Fixtures/hhvm3.3', array( - 'FooEnum' => __DIR__ . '/Fixtures/hhvm3.3/HackEnum.php', - 'Foo\BarEnum' => __DIR__ . '/Fixtures/hhvm3.3/NamespacedHackEnum.php', - 'GenericsClass' => __DIR__ . '/Fixtures/hhvm3.3/Generics.php', - )); - } - - return $data; - } - - public function testCreateMapFinderSupport(): void - { - $this->checkIfFinderIsAvailable(); - - $finder = new Finder(); - $finder->files()->in(__DIR__ . '/Fixtures/beta/NamespaceCollision'); - - $this->assertEqualsNormalized(array( - 'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__) . '/Fixtures/beta/NamespaceCollision/A/B/Bar.php', - 'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__) . '/Fixtures/beta/NamespaceCollision/A/B/Foo.php', - ), ClassMapGenerator::createMap($finder)); - } - - public function testAmbiguousReference(): void - { - $this->checkIfFinderIsAvailable(); - - $tempDir = self::getUniqueTmpDirectory(); - $this->ensureDirectoryExistsAndClear($tempDir . '/other'); - - $finder = new Finder(); - $finder->files()->in($tempDir); - - $io = $this->getMockBuilder('Composer\IO\ConsoleIO') - ->disableOriginalConstructor() - ->getMock(); - - file_put_contents($tempDir . '/A.php', "expects($this->once()) - ->method('writeError') - ->will($this->returnCallback(function ($text) use (&$msg): void { - $msg = $text; - })); - - $messages = array( - 'Warning: Ambiguous class resolution, "A" was found in both "' . $a . '" and "' . $b . '", the first will be used.', - 'Warning: Ambiguous class resolution, "A" was found in both "' . $b . '" and "' . $a . '", the first will be used.', - ); - - ClassMapGenerator::createMap($finder, null, $io); - - $this->assertContains($msg, $messages, $msg . ' not found in expected messages (' . var_export($messages, true) . ')'); - - $fs = new Filesystem(); - $fs->removeDirectory($tempDir); - } - - /** - * If one file has a class or interface defined more than once, - * an ambiguous reference warning should not be produced - */ - public function testUnambiguousReference(): void - { - $tempDir = self::getUniqueTmpDirectory(); - - file_put_contents($tempDir . '/A.php', "getMockBuilder('Composer\IO\ConsoleIO') - ->disableOriginalConstructor() - ->getMock(); - - $io->expects($this->never()) - ->method('write'); - - ClassMapGenerator::createMap($tempDir, null, $io); - - $fs = new Filesystem(); - $fs->removeDirectory($tempDir); - } - - public function testCreateMapThrowsWhenDirectoryDoesNotExist(): void - { - self::expectException('RuntimeException'); - self::expectExceptionMessage('Could not scan for classes inside'); - ClassMapGenerator::createMap(__DIR__ . '/no-file.no-foler'); - } - - public function testDump(): void - { - $tempDir = self::getUniqueTmpDirectory(); - - $resultFile = $tempDir . '/result.txt'; - $fileInDirectory = $tempDir . DIRECTORY_SEPARATOR . 'TestClass.php'; - - file_put_contents($fileInDirectory, ""); - - ClassMapGenerator::dump(array($tempDir), $resultFile); - - $fileInDirectory = str_replace('\\', '\\\\', $fileInDirectory); - $this->assertStringEqualsFile($resultFile, " '$fileInDirectory',\n);"); - - $fs = new Filesystem(); - $fs->removeDirectory($tempDir); - } - - public function testCreateMapDoesNotHitRegexBacktraceLimit(): void - { - $expected = array( - 'Foo\\StripNoise' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/StripNoise.php', - 'Foo\\VeryLongHeredoc' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/VeryLongHeredoc.php', - 'Foo\\ClassAfterLongHereDoc' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/VeryLongHeredoc.php', - 'Foo\\VeryLongPHP73Heredoc' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/VeryLongPHP73Heredoc.php', - 'Foo\\VeryLongPHP73Nowdoc' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/VeryLongPHP73Nowdoc.php', - 'Foo\\ClassAfterLongNowDoc' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/VeryLongPHP73Nowdoc.php', - 'Foo\\VeryLongNowdoc' => realpath(__DIR__) . '/Fixtures/pcrebacktracelimit/VeryLongNowdoc.php', - ); - - ini_set('pcre.backtrack_limit', '30000'); - $result = ClassMapGenerator::createMap(__DIR__ . '/Fixtures/pcrebacktracelimit'); - ini_restore('pcre.backtrack_limit'); - - $this->assertEqualsNormalized($expected, $result); - } - - /** - * @param array $expected - * @param array $actual - * @param string $message - * @return void - */ - protected function assertEqualsNormalized(array $expected, array $actual, string $message = ''): void - { - foreach ($expected as $ns => $path) { - $expected[$ns] = strtr($path, '\\', '/'); - } - foreach ($actual as $ns => $path) { - $actual[$ns] = strtr($path, '\\', '/'); - } - $this->assertEquals($expected, $actual, $message); - } - - /** @return void */ - private function checkIfFinderIsAvailable(): void - { - if (!class_exists('Symfony\\Component\\Finder\\Finder')) { - $this->markTestSkipped('Finder component is not available'); - } - } -} diff --git a/tests/Composer/Test/Autoload/Fixtures/Namespaced/Bar.inc b/tests/Composer/Test/Autoload/Fixtures/Namespaced/Bar.inc deleted file mode 100644 index f9c519a667e5..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/Namespaced/Bar.inc +++ /dev/null @@ -1,8 +0,0 @@ -getAttributes($compiler, $args); - $save = array($_attr, $compiler->parser->current_buffer, $compiler->nocache, $compiler->smarty->merge_compiled_includes, $compiler->merged_templates, $compiler->smarty->merged_templates_func, $compiler->template->properties, $compiler->template->has_nocache_code); - $this->openTag($compiler, 'block', $save); - if ($_attr['nocache'] == true) { - $compiler->nocache = true; - } - // set flag for {block} tag - $compiler->inheritance = true; - // must merge includes - $compiler->smarty->merge_compiled_includes = true; - - $compiler->parser->current_buffer = new _smarty_template_buffer($compiler->parser); - $compiler->has_code = false; - return true; - } - - /** - * Save or replace child block source by block name during parsing - * - * @param string $block_content block source content - * @param string $block_tag opening block tag - * @param object $template template object - * @param string $filepath filepath of template source - */ - public static function saveBlockData($block_content, $block_tag, $template, $filepath) { - $_rdl = preg_quote($template->smarty->right_delimiter); - $_ldl = preg_quote($template->smarty->left_delimiter); - if (!$template->smarty->auto_literal) { - $al = '\s*'; - } else { - $al = ''; - } - if (0 == preg_match("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")(\s*?)?((append|prepend|nocache)?(\s*)?(hide)?)?(\s*{$_rdl})!", $block_tag, $_match)) { - $error_text = 'Syntax Error in template "' . $template->source->filepath . '" "' . htmlspecialchars($block_tag) . '" illegal options'; - throw new SmartyCompilerException($error_text); - } else { - $_name = trim($_match[3], '\'"'); - if ($_match[8] != 'hide' || isset($template->block_data[$_name])) { // replace {$smarty.block.child} - // do we have {$smart.block.child} in nested {block} tags? - if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})([\s\S]*?{$_ldl}{$al}/block\s*{$_rdl})!", $block_content, $_match2)) { - foreach ($_match2[3] as $key => $name) { - // get it's replacement - $_name2 = trim($name, '\'"'); - if ($_match2[5][$key] != 'hide' || isset($template->block_data[$_name2])) { - if (isset($template->block_data[$_name2])) { - $replacement = $template->block_data[$_name2]['source']; - } else { - $replacement = ''; - } - // replace {$smarty.block.child} tag - $search = array("!({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}/block\s*{$_rdl})!", "/§§§child§§§/"); - $replace = array('\2§§§child§§§\4', $replacement); - $block_content = preg_replace($search, $replace, $block_content); - } else { - // remove hidden blocks - $block_content = preg_replace("!({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl})!", '', $block_content); - } - } - } - // do we have not nested {$smart.block.child} - if (0 != preg_match("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $block_content, $_match2)) { - // get child replacement for this block - if (isset($template->block_data[$_name])) { - $replacement = $template->block_data[$_name]['source']; - unset($template->block_data[$_name]); - } else { - $replacement = ''; - } - $block_content = preg_replace("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $replacement, $block_content); - } - if (isset($template->block_data[$_name])) { - if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { - $template->block_data[$_name]['source'] = - str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']); - } elseif ($template->block_data[$_name]['mode'] == 'prepend') { - $template->block_data[$_name]['source'] .= $block_content; - } elseif ($template->block_data[$_name]['mode'] == 'append') { - $template->block_data[$_name]['source'] = $block_content . $template->block_data[$_name]['source']; - } - } else { - $template->block_data[$_name]['source'] = $block_content; - $template->block_data[$_name]['file'] = $filepath; - } - if ($_match[6] == 'append') { - $template->block_data[$_name]['mode'] = 'append'; - } elseif ($_match[6] == 'prepend') { - $template->block_data[$_name]['mode'] = 'prepend'; - } else { - $template->block_data[$_name]['mode'] = 'replace'; - } - } - } - } - - /** - * Compile saved child block source - * - * @param object $compiler compiler object - * @param string $_name optional name of child block - * @return string compiled code of schild block - */ - public static function compileChildBlock($compiler, $_name = null) { - $_output = ''; - // if called by {$smarty.block.child} we must search the name of enclosing {block} - if ($_name == null) { - $stack_count = count($compiler->_tag_stack); - while (--$stack_count >= 0) { - if ($compiler->_tag_stack[$stack_count][0] == 'block') { - $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'], "'\""); - break; - } - } - // flag that child is already compile by {$smarty.block.child} inclusion - $compiler->template->block_data[$_name]['compiled'] = true; - } - if ($_name == null) { - $compiler->trigger_template_error('{$smarty.block.child} used out of context', $compiler->lex->taglineno); - } - // undefined child? - if (!isset($compiler->template->block_data[$_name]['source'])) { - return ''; - } - $_tpl = new Smarty_Internal_template('string:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id, - $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime); - $_tpl->variable_filters = $compiler->template->variable_filters; - $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; - $_tpl->source->filepath = $compiler->template->block_data[$_name]['file']; - $_tpl->allow_relative_path = true; - if ($compiler->nocache) { - $_tpl->compiler->forceNocache = 2; - } else { - $_tpl->compiler->forceNocache = 1; - } - $_tpl->compiler->suppressHeader = true; - $_tpl->compiler->suppressTemplatePropertyHeader = true; - $_tpl->compiler->suppressMergedTemplates = true; - if (strpos($compiler->template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) { - $_output = str_replace('%%%%SMARTY_PARENT%%%%', $compiler->parser->current_buffer->to_smarty_php(), $_tpl->compiler->compileTemplate($_tpl)); - } elseif ($compiler->template->block_data[$_name]['mode'] == 'prepend') { - $_output = $_tpl->compiler->compileTemplate($_tpl) . $compiler->parser->current_buffer->to_smarty_php(); - } elseif ($compiler->template->block_data[$_name]['mode'] == 'append') { - $_output = $compiler->parser->current_buffer->to_smarty_php() . $_tpl->compiler->compileTemplate($_tpl); - } elseif (!empty($compiler->template->block_data[$_name])) { - $_output = $_tpl->compiler->compileTemplate($_tpl); - } - $compiler->template->properties['file_dependency'] = array_merge($compiler->template->properties['file_dependency'], $_tpl->properties['file_dependency']); - $compiler->template->properties['function'] = array_merge($compiler->template->properties['function'], $_tpl->properties['function']); - $compiler->merged_templates = array_merge($compiler->merged_templates, $_tpl->compiler->merged_templates); - $compiler->template->variable_filters = $_tpl->variable_filters; - if ($_tpl->has_nocache_code) { - $compiler->template->has_nocache_code = true; - } - foreach ($_tpl->required_plugins as $key => $tmp1) { - if ($compiler->nocache && $compiler->template->caching) { - $code = 'nocache'; - } else { - $code = $key; - } - foreach ($tmp1 as $name => $tmp) { - foreach ($tmp as $type => $data) { - $compiler->template->required_plugins[$code][$name][$type] = $data; - } - } - } - unset($_tpl); - return $_output; - } - -} - -/** - * Smarty Internal Plugin Compile BlockClose Class - * - * @package Smarty - * @subpackage Compiler - */ -class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase { - - /** - * Compiles code for the {/block} tag - * - * @param array $args array with attributes from parser - * @param object $compiler compiler object - * @return string compiled code - */ - public function compile($args, $compiler) { - $compiler->has_code = true; - // check and get attributes - $_attr = $this->getAttributes($compiler, $args); - $saved_data = $this->closeTag($compiler, array('block')); - $_name = trim($saved_data[0]['name'], "\"'"); - if (isset($compiler->template->block_data[$_name]) && !isset($compiler->template->block_data[$_name]['compiled'])) { - // restore to status before {block} tag as new subtemplate code of parent {block} is not needed - // TODO: Below code was disabled in 3.1.8 because of problems with {include} in nested {block} tags in child templates - // combined with append/prepend or $smarty.block.parent - // For later versions it should be checked under which conditions it could run for optimisation - // - //$compiler->merged_templates = $saved_data[4]; - //$compiler->smarty->merged_templates_func = $saved_data[5]; - //$compiler->template->properties = $saved_data[6]; - //$compiler->template->has_nocache_code = $saved_data[7]; - $_output = Smarty_Internal_Compile_Block::compileChildBlock($compiler, $_name); - } else { - if (isset($saved_data[0]['hide']) && !isset($compiler->template->block_data[$_name]['source'])) { - $_output = ''; - } else { - $_output = $compiler->parser->current_buffer->to_smarty_php(); - } - unset($compiler->template->block_data[$_name]['compiled']); - } - // reset flags - $compiler->parser->current_buffer = $saved_data[1]; - $compiler->nocache = $saved_data[2]; - $compiler->smarty->merge_compiled_includes = $saved_data[3]; - // reset flag for {block} tag - $compiler->inheritance = false; - // $_output content has already nocache code processed - $compiler->suppressNocacheProcessing = true; - return $_output; - } - -} - -?> \ No newline at end of file diff --git a/tests/Composer/Test/Autoload/Fixtures/classmap/LargeClass.php b/tests/Composer/Test/Autoload/Fixtures/classmap/LargeClass.php deleted file mode 100644 index 25a5ba6d68f2..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/classmap/LargeClass.php +++ /dev/null @@ -1,1387 +0,0 @@ - - public function a1() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a2() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a3() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a4() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a5() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a6() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a7() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a8() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a9() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a10() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a11() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a12() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a13() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a14() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a15() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a16() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a17() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a18() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a19() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a20() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a21() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a22() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a23() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a24() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a25() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a26() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a27() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a28() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a29() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a30() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a31() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a32() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a33() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a34() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a35() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a36() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a37() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a38() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a39() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a40() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a41() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a42() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a43() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a44() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a45() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a46() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a47() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a48() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a49() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a50() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a51() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a52() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a53() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a54() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a55() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a56() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a57() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a58() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a59() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a60() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a61() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a62() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a63() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a64() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a65() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a66() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a67() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a68() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a69() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a70() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a71() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a72() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a73() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a74() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a75() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a76() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a77() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a78() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a79() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a80() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a81() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a82() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a83() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a84() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a85() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a86() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a87() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a88() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a89() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a90() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a91() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a92() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a93() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a94() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a95() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a96() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a97() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a98() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a99() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a100() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a101() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a102() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a103() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a104() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a105() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a106() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a107() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a108() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a109() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a110() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a111() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a112() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a113() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a114() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a115() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a116() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a117() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a118() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a119() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a120() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a121() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a122() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a123() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a124() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a125() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a126() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a127() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a128() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a129() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a130() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a131() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a132() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a133() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a134() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a135() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a136() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a137() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a138() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a139() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a140() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a141() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a142() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a143() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a144() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a145() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a146() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a147() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a148() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a149() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a150() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a151() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a152() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a153() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a154() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a155() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a156() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a157() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a158() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a159() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a160() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a161() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a162() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a163() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a164() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a165() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a166() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a167() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a168() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a169() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a170() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a171() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a172() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a173() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a174() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a175() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a176() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a177() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a178() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a179() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a180() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a181() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a182() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a183() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a184() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a185() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a186() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a187() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a188() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a189() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a190() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a191() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a192() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a193() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a194() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a195() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a196() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a197() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a198() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a199() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a200() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a201() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a202() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a203() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a204() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a205() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a206() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a207() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a208() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a209() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a210() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a211() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a212() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a213() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a214() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a215() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a216() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a217() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a218() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a219() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a220() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a221() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a222() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a223() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a224() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a225() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a226() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a227() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a228() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a229() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a230() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a231() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a232() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a233() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a234() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a235() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a236() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a237() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a238() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a239() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a240() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a241() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a242() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a243() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a244() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a245() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a246() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a247() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a248() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a249() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a250() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a251() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a252() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a253() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a254() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a255() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a256() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a257() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a258() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a259() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a260() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a261() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a262() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a263() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a264() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a265() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a266() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a267() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a268() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a269() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a270() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a271() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a272() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a273() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a274() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a275() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a276() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a277() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a278() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a279() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a280() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a281() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a282() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a283() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a284() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a285() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a286() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a287() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a288() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a289() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a290() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a291() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a292() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a293() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a294() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a295() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a296() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a297() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a298() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a299() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a300() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a301() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a302() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a303() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a304() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a305() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a306() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a307() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a308() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a309() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a310() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a311() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a312() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a313() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a314() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a315() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a316() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a317() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a318() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a319() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a320() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a321() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a322() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a323() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a324() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a325() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a326() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a327() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a328() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a329() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a330() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a331() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a332() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a333() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a334() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a335() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a336() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a337() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a338() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a339() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a340() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a341() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a342() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a343() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a344() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a345() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a346() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a347() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a348() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a349() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a350() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a351() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a352() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a353() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a354() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a355() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a356() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a357() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a358() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a359() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a360() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a361() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a362() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a363() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a364() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a365() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a366() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a367() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a368() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a369() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a370() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a371() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a372() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a373() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a374() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a375() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a376() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a377() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a378() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a379() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a380() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a381() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a382() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a383() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a384() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a385() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a386() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a387() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a388() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a389() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a390() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a391() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a392() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a393() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a394() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a395() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a396() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a397() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a398() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a399() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a400() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a401() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a402() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a403() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a404() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a405() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a406() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a407() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a408() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a409() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a410() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a411() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a412() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a413() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a414() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a415() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a416() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a417() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a418() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a419() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a420() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a421() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a422() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a423() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a424() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a425() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a426() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a427() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a428() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a429() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a430() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a431() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a432() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a433() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a434() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a435() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a436() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a437() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a438() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a439() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a440() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a441() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a442() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a443() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a444() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a445() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a446() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a447() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a448() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a449() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a450() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a451() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a452() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a453() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a454() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a455() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a456() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a457() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a458() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a459() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a460() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a461() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a462() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a463() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a464() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a465() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a466() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a467() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a468() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a469() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a470() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a471() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a472() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a473() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a474() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a475() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a476() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a477() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a478() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a479() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a480() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a481() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a482() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a483() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a484() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a485() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a486() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a487() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a488() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a489() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a490() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a491() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a492() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a493() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a494() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a495() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a496() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a497() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a498() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a499() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a500() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a501() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a502() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a503() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a504() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a505() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a506() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a507() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a508() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a509() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a510() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a511() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a512() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a513() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a514() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a515() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a516() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a517() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a518() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a519() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a520() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a521() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a522() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a523() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a524() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a525() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a526() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a527() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a528() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a529() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a530() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a531() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a532() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a533() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a534() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a535() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a536() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a537() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a538() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a539() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a540() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a541() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a542() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a543() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a544() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a545() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a546() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a547() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a548() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a549() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a550() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a551() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a552() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a553() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a554() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a555() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a556() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a557() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a558() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a559() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a560() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a561() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a562() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a563() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a564() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a565() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a566() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a567() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a568() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a569() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a570() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a571() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a572() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a573() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a574() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a575() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a576() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a577() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a578() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a579() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a580() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a581() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a582() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a583() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a584() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a585() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a586() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a587() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a588() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a589() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a590() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a591() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a592() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a593() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a594() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a595() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a596() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a597() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a598() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a599() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a600() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a601() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a602() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a603() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a604() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a605() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a606() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a607() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a608() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a609() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a610() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a611() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a612() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a613() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a614() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a615() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a616() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a617() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a618() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a619() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a620() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a621() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a622() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a623() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a624() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a625() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a626() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a627() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a628() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a629() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a630() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a631() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a632() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a633() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a634() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a635() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a636() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a637() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a638() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a639() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a640() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a641() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a642() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a643() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a644() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a645() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a646() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a647() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a648() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a649() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a650() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a651() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a652() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a653() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a654() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a655() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a656() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a657() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a658() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a659() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a660() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a661() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a662() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a663() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a664() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a665() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a666() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a667() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a668() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a669() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a670() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a671() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a672() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a673() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a674() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a675() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a676() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a677() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a678() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a679() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a680() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a681() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a682() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a683() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a684() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a685() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a686() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a687() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a688() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a689() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a690() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a691() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a692() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a693() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a694() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a695() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a696() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a697() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a698() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a699() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a700() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a701() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a702() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a703() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a704() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a705() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a706() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a707() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a708() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a709() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a710() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a711() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a712() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a713() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a714() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a715() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a716() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a717() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a718() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a719() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a720() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a721() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a722() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a723() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a724() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a725() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a726() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a727() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a728() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a729() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a730() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a731() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a732() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a733() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a734() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a735() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a736() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a737() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a738() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a739() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a740() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a741() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a742() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a743() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a744() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a745() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a746() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a747() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a748() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a749() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a750() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a751() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a752() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a753() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a754() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a755() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a756() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a757() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a758() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a759() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a760() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a761() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a762() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a763() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a764() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a765() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a766() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a767() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a768() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a769() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a770() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a771() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a772() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a773() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a774() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a775() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a776() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a777() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a778() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a779() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a780() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a781() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a782() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a783() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a784() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a785() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a786() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a787() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a788() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a789() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a790() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a791() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a792() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a793() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a794() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a795() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a796() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a797() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a798() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a799() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a800() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a801() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a802() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a803() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a804() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a805() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a806() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a807() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a808() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a809() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a810() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a811() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a812() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a813() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a814() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a815() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a816() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a817() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a818() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a819() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a820() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a821() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a822() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a823() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a824() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a825() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a826() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a827() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a828() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a829() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a830() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a831() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a832() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a833() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a834() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a835() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a836() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a837() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a838() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a839() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a840() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a841() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a842() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a843() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a844() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a845() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a846() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a847() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a848() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a849() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a850() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a851() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a852() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a853() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a854() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a855() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a856() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a857() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a858() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a859() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a860() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a861() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a862() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a863() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a864() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a865() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a866() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a867() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a868() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a869() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a870() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a871() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a872() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a873() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a874() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a875() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a876() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a877() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a878() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a879() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a880() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a881() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a882() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a883() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a884() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a885() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a886() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a887() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a888() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a889() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a890() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a891() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a892() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a893() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a894() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a895() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a896() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a897() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a898() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a899() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a900() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a901() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a902() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a903() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a904() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a905() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a906() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a907() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a908() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a909() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a910() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a911() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a912() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a913() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a914() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a915() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a916() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a917() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a918() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a919() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a920() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a921() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a922() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a923() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a924() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a925() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a926() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a927() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a928() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a929() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a930() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a931() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a932() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a933() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a934() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a935() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a936() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a937() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a938() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a939() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a940() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a941() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a942() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a943() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a944() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a945() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a946() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a947() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a948() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a949() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a950() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a951() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a952() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a953() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a954() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a955() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a956() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a957() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a958() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a959() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a960() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a961() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a962() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a963() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a964() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a965() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a966() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a967() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a968() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a969() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a970() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a971() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a972() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a973() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a974() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a975() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a976() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a977() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a978() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a979() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a980() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a981() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a982() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a983() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a984() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a985() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a986() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a987() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a988() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a989() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a990() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a991() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a992() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a993() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a994() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a995() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a996() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a997() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a998() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a999() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1000() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1001() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1002() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1003() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1004() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1005() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1006() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1007() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1008() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1009() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1010() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1011() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1012() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1013() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1014() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1015() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1016() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1017() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1018() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1019() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1020() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1021() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1022() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1023() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1024() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1025() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1026() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1027() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1028() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1029() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1030() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1031() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1032() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1033() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1034() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1035() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1036() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1037() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1038() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1039() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1040() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1041() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1042() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1043() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1044() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1045() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1046() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1047() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1048() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1049() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1050() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1051() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1052() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1053() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1054() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1055() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1056() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1057() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1058() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1059() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1060() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1061() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1062() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1063() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1064() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1065() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1066() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1067() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1068() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1069() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1070() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1071() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1072() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1073() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1074() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1075() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1076() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1077() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1078() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1079() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1080() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1081() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1082() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1083() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1084() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1085() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1086() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1087() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1088() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1089() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1090() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1091() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1092() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1093() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1094() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1095() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1096() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1097() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1098() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1099() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1100() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1101() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1102() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1103() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1104() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1105() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1106() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1107() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1108() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1109() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1110() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1111() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1112() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1113() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1114() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1115() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1116() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1117() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1118() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1119() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1120() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1121() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1122() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1123() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1124() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1125() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1126() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1127() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1128() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1129() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1130() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1131() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1132() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1133() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1134() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1135() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1136() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1137() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1138() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1139() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1140() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1141() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1142() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1143() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1144() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1145() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1146() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1147() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1148() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1149() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1150() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1151() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1152() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1153() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1154() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1155() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1156() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1157() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1158() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1159() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1160() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1161() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1162() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1163() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1164() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1165() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1166() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1167() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1168() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1169() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1170() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1171() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1172() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1173() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1174() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1175() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1176() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1177() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1178() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1179() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1180() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1181() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1182() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1183() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1184() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1185() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1186() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1187() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1188() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1189() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1190() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1191() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1192() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1193() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1194() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1195() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1196() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1197() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1198() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1199() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1200() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1201() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1202() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1203() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1204() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1205() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1206() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1207() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1208() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1209() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1210() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1211() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1212() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1213() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1214() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1215() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1216() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1217() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1218() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1219() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1220() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1221() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1222() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1223() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1224() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1225() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1226() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1227() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1228() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1229() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1230() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1231() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1232() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1233() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1234() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1235() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1236() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1237() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1238() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1239() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1240() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1241() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1242() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1243() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1244() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1245() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1246() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1247() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1248() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1249() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1250() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1251() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1252() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1253() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1254() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1255() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1256() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1257() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1258() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1259() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1260() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1261() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1262() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1263() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1264() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1265() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1266() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1267() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1268() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1269() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1270() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1271() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1272() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1273() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1274() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1275() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1276() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1277() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1278() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1279() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1280() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1281() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1282() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1283() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1284() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1285() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1286() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1287() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1288() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1289() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1290() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1291() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1292() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1293() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1294() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1295() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1296() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1297() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1298() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1299() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1300() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1301() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1302() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1303() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1304() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1305() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1306() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1307() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1308() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1309() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1310() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1311() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1312() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1313() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1314() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1315() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1316() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1317() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1318() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1319() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1320() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1321() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1322() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1323() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1324() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1325() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1326() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1327() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1328() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1329() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1330() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1331() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1332() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1333() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1334() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1335() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1336() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1337() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1338() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1339() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1340() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1341() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1342() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1343() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1344() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1345() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1346() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1347() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1348() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1349() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1350() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1351() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1352() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1353() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1354() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1355() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1356() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1357() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1358() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1359() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1360() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1361() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1362() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1363() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1364() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1365() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1366() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1367() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1368() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1369() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1370() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1371() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1372() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1373() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1374() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1375() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1376() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1377() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1378() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - public function a1379() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - - public function a1381() { var_dump(var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null), var_dump(null)); } - '[{"event":"inbound","ts":1387553749,"msg":{"raw_msg":"Received: from mout.gmx.net (mout.gmx.net [212.227.17.20])\\n\\tby ip-10-246-30-150 (Postfix) with ESMTP id 8FF124A85D1\\n\\tfor ; Fri, 20 Dec 2013 15:35:45 +0000 (UTC)\\nReceived: from [192.168.1.2] ([109.193.141.200]) by mail.gmx.com (mrgmx001)\\n with ESMTPSA (Nemesis) id 0Lu7a2-1VT7Xf1Llu-011VKV for ;\\n Fri, 20 Dec 2013 16:35:44 +0100\\nMessage-ID: <52B463C8.1050305@gmx.ch>\\nDate: Fri, 20 Dec 2013 16:35:36 +0100\\nFrom: =?ISO-8859-1?Q?S=E9bastien_Fauvel?= \\nUser-Agent: Mozilla\\/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko\\/20100101 Thunderbird\\/24.2.0\\nMIME-Version: 1.0\\nTo: info@i-pricing.com\\nSubject: =?ISO-8859-1?Q?T=E4st_html?=\\nContent-Type: multipart\\/mixed;\\n boundary=\\"------------030503000903030801000206\\"\\nX-Provags-ID: V03:K0:Zltmfhaftibnf1sBCmiQxKk3ZnXy0nx6ak5vzohG81fRwilXnUR\\n wvkN9f2AOHZ7gjmHvTvn1csqspqOKbNS+1klVbnZaJUbnrT9J+WFv4clIFAfRawYCvy8GGE\\n JhRt1h81gOGQ761rx4+rUbUcYfh+2XcD0w4Us6yrCsF\\/Gw6nv5z5puhgW9j1Ad5WWaKkd\\/f\\n m\\/nL5VYAUoqLjvBs+Jbgg==\\n\\nThis is a multi-part message in MIME format.\\n--------------030503000903030801000206\\nContent-Type: multipart\\/alternative;\\n boundary=\\"------------050101030504090308030704\\"\\n\\n\\n--------------050101030504090308030704\\nContent-Type: text\\/plain; charset=utf-8; format=flowed\\nContent-Transfer-Encoding: 8bit\\n\\nT\\u00e4st\\n\\n * abc\\n * *def*\\n * *\\/ghi\\/*\\n\\nschlu\\u00df*\\/\\n\\nDiscountify\\nend\\n\\/*\\n\\n--------------050101030504090308030704\\nContent-Type: multipart\\/related;\\n boundary=\\"------------020800050700000706000908\\"\\n\\n\\n--------------020800050700000706000908\\nContent-Type: text\\/html; charset=utf-8\\nContent-Transfer-Encoding: 7bit\\n\\n\\n \\n\\n \\n <\\/head>\\n \\n Täst
\\n
    \\n
  • abc<\\/li>\\n
  • def<\\/b><\\/li>\\n
  • ghi<\\/i><\\/b><\\/li>\\n <\\/ul>\\n schluß
    \\n
    \\n \\"Discountify\\"
    \\n end
    \\n <\\/i><\\/b>\\n <\\/body>\\n<\\/html>\\n\\n--------------020800050700000706000908\\nContent-Type: image\\/png; x-mac-type=\\"0\\"; x-mac-creator=\\"0\\";\\n name=\\"discountify-card.png\\"\\nContent-Transfer-Encoding: base64\\nContent-ID: \\nContent-Disposition: inline;\\n filename=\\"discountify-card.png\\"\\n\\niVBORw0KGgoAAAANSUhEUgAAATYAAABkCAYAAAAMjRzhAAAABmJLR0QA\\/wD\\/AP+gvaeTAAAA\\nCXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH3QwUDCIHSDOifwAAACZpVFh0Q29tbWVudAAA\\nAAAAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOV5F9bAAAgAElEQVR42uy9aZxdVZX\\/\\/d17\\nn3PufOvWnFRVKhMhA0kIMg9qVHCEdkZRVBS06W611W5pbe2\\/sy2KorZDN43d6qPtgIIiIIIT\\nKDIEkhAyz6lKpSqVGm\\/d6Ux7\\/1+cW\\/fWJcGgT0Cefmp9PvdFcm\\/tc85ee6\\/9W2v91jriwn9s\\nNszKrMzKrPwvEkuI2UmYlVmZlf9lho1ZyzYrszIrs4htVmZlVmblGY\\/YZidhVmZlVv63IbbZ\\nOZiVWZmVWVd0VmZlVmZl1hWdlVmZlVl5uhHbrGWblVmZlVnENiuzMiuz8kxHbM\\/MGzPGIAAD\\nCAQ6lOhAgjaEriFR6CBuKdxKmXRGIYRLPB6iwzKKEN8LyedDgs4YoTJoCcqeHg9m+XuzMiuz\\niO1psmY1S4YuGZzQxu+XxHoV9uhcYm6StpzGkXlaspAUAiuXAulTKBTJWJJk2iLhpJDSQVlx\\nAuMwOaUZNwFHSuP05ctMJDWqKboUTFu6WZmVWfnfg9ieIbvaYMAHa0DR4cfpyKZIVEokcoK2\\neBrVPUHCGSEmPRypsWSAtAShthAyhmhrwZIxhFAoFEJYGGFAGTqTEAiFkG0YJRmZ0hzxYjw6\\nNEG\\/GUE0G8SsdZuVWZlFbCfS5dSTFqlCnG7XYmFOkbVCYtLFabWwYxrHniRmeyRsQVxK4lYc\\nISL3EplAY2NkHCFsQEVGSoDRgtAYQgPaGHQI+NDraLqSHsvbc4y6rWw94rLp8CHK7W7koc66\\nqbMyK\\/8fR2x\\/wT2sJxXxwRxzrGZak+N0tk3RGvdIK0HSTiBSGismcKwEjspiCY0SPrYKkZYG\\npdBKgogRCgch4ijh4Ac+SkXGLfADjNEEoSYIA8LAEAYGY1ykF9Aqbc7vSHJu50p2DuZ5oDjI\\nmDOFsCVCzi6QWZmVWcT25HxOdMVCHoqxkGbaUiXmNhXIJSQZJ0nKiePYEifmoJSPNB5al9Ce\\nTygNRoJwbCyZRMoUloyjlY1SDkZIEAGW0ugwwLYsYrZNEARgBGhFYDRu6OK6ksBVaC3wgjKj\\nY0Msam1hUec8do9U+M3Bg\\/g9QXTPswBuVmZlFrE9gT1D+wbZn6az0k5TbIIF7RU64xUyMUHG\\naSbjuAgFrvQpBy7GVdhGEZopwEWJEG2liFtpUiSQMo42MaamPLLNTSgpQYCjDFJrgtBDodF4\\ngAcCLAJsBzKOg+toihWBloKB4RFWtDTjeIc4Kd3EvBWn8\\/uDfWyLDaASs9BtVv7\\/LeaJujaK\\nZ+a5Ly75RNtT22iyOro5rOk+0sbcuKY97dOaSpBOpsklK+gEiCCDHRwmH\\/jkRY6xcZvdA3nm\\nZPKct8JBVnwcqYjlLKRMIq0MoRMjFs\\/ga4XlxEFopNIIXUaERYQAowMqlRJKCiwl0SZKFNiW\\nwhhBxQ0JjM1k0cfzBGFg8D0XPwwJrCQHJhP8rnCAUrZSpYk8U1fejAVo\\/shCPNaiFDPCiuL4\\n1zEAup5VbhhjFt0+I9fFUbp9sno0YHS0now2DetKSBBSIJ6Bun9qKw+MQWtQ2zTzXejpKNCW\\nSDInmSKdyBGmBYUACmMVsokxXAQP9GW4eZONl1xAGChyepBkYpiVbXmmUj1MHT7I6nkOQjko\\n20GgAAslEriuR9+BA8ScCrbKk2tKk5+aJJWM4aRiSAVKGoLAJzAaKSTJlE2pUqEprah4Bi+Q\\nVMoh0tMQTNGmSlw6Zxn37t3LvrY8WJEyn3knqsFoCAPDvJZFaB0t2ieSklfkyOQQUoFQAqVE\\ndaHyxAkUYyLkHUDGyZFNNANQdPNMVkYR1ixH8JkEsbSmwWrNVOuT0aOpGrXAM7Sl5nLe8rUk\\n4xkwBi\\/wmCiOsXtoKwfH96IsnlGJN+upPCq0D3Kz5Fkqgd2hcHKGVEsX6\\/cI3HiG0d0HyJTH\\nec6pTcTMGIOmix9un09p\\/hpaQo944jArMxnmtQwzRjefv3mYUxbHWLE4iaMFRlj42uAoGx0G\\nEIa05ZrIZnNgbEId0NKcwxgfKQ2WpdGECCtECTBhicA3JGwHXwgcJXH9KPBYEhKpNI4KmBjb\\nwnM6srSXe7hvZD\\/OXOsZt3kNEPiG5624mPe\\/9r3HB2siTqAtJgoTbNr7CL\\/f\\/Cvu2\\/5LrJhE\\nWiAxx3xGHYJf1nzpnTfSkcsBMDAyzJVfej2OlAhr1qb8pVeC0ZFBCn1DZ1MPb77war5y26fx\\ndBmhnpwekdEYXkVz6flXcsWFr4fKPRCOARJkFmGtYty9jMs+exkiJVHPLMT21OwyoyG9w2Zx\\nvI3mhKbFSSCTHfz44QobBpqxHRtdnsvLlseIJ1xUxcIzNiLZTRgkkfl1XLFakxV7SLRPYVHg\\n\\/7w2Tbq9mVAngThSWBijCXWZUAdgPOIJn8CrIJWPwGDCEKUEge8iERgBU4Uy2XQMWyjcoEKg\\nwQ8k2oAwhpiVQNsWSAHCJ9ecYWx0jIUxh6S\\/lHvG9yFanzmvijAmQmdB2bAwNYTf\\/+InGYhw\\naLI6ee78M1i7\\/DVsH3oT1\\/7gXzhS7kc4AiEMMxG9MVGcNCVaaC5\\/AH9qPwDeeJKgAnYsggaz\\ngO0vuBZ0hMRCV\\/CG5\\/41lz7nZYjCN\\/nsVBmZADlt2P6IHq0YKBkhtRVzTueKC7oIB18OJjjq\\nekEpiV8x2InpA\\/N\\/qWEzpspN2zSPnImTyXhk0yGF7Bx+tE7SFy4ityRNZcojaU5i68A61iw7\\nwkkZRZc2nLuon98PZCipRfzwzrt563kp+vsnaW7P0N0qUYWAIF7CszQySGLFJPnCOGgXSYAl\\ndBRrExLbdgh8gRAhUlhgQowxxKWF9jQVHTJVMBwa8xkc0biBpiOr6JnjkE3HkH5IWUh84ZDK\\ntCCmDpOLH+RsZy73jx5EtcpnjCKnT9eV87J\\/wh95GL+f0O+HqVs4OXk2X\\/nbL\\/D+G\\/+Fvont\\n2DEBaob7YiJXd8W85RBuqA1z\\/7Y8OjS1hT1r2P5SayDiahrP4hvv\\/RGdzu8Jh99IoQLlYkAq\\nVvUx9fH0aDBa4FcMLzttFeHY554wrvHInjJUyx+fSRTQE\\/vOA2PQgWL8sR6y9HCoNEV3dytj\\npe0MDQ9wWms7b1s6QDo1ycFRg7Yy9DYFZEUZU7E4NFHm4MEypYkRMmaCdNxjw8gwBJrsoYDd\\nE2VyrYKOXDNtTZqYKkAlwJIBApAIhJEIYai4JXzXw2iQUhCPRbw07VfQQUjJ00wWAh7b61JJ\\nXcCr\\/uY6EAJbGtb\\/+PU0Z\\/K0pCRFJZgyEpFIYIsO3PIEKX+SpZWlbBvZj93u8xfvkGIMOjTI\\n0Ka3dRLCP28YXX6QuPdOPv3mj3Hll67BD6ewlIkCb9X4GsCczHjD6T0wEUdaJYRiluD8l3VC\\nCX3DkrZTaPc+QFjcDcD63UTxtqr1Oa4eBejQEFYEz5o3FJ2aVRnPazYfCJnbKpnfqdh12MeK\\nyUj38plzqp0wxBZlSwRT\\/V1MectAFlnUO4+frd\\/FWYsynHdyio54Hq2SGG1zSusEsdBn\\/8QY\\ngSPJCIsxP8umvYYpdZAXXHAaLzrnZaw+bQ2ZbAtCKCYnjrD90T+wddO9hLu3sqhT0dokSCch\\nYQmkUgR+iOMIbGlhtMQYQ+AF5F0fO2YhhKJUCRga1zy8vcKKtR\\/g5W94P1JGlI4ND9zO5NgA\\nqjNOTIaohI0ykokAgniawT3j6OYmAqlIF5bjtW4Bpf+i+jQmipks6V6GbfbX3YTQ4fJPjhHL\\nSCy7Gj02kYfdlhV05QRnLVGcvbweGDPhGJnKp7jsOW\\/iG7\\/+CkpJhDQgogNCWoLJwjZGpxRa\\ng5Sw8WABJ6GQKlrYM+fCHDM9++e5qydqrBN5T0+9bs2Tus\\/pbHjoGk5qT2H8LbXvtg8IlCWQ\\nCqQQGMkf1aOQgtAz9LYtJi031w7K8SnBJR8tYRISOy5w4oJEWuIkZZUQL55BiO0EiQ4FfQ8u\\npFDswU3FiXklDh0O8Zw2VvUaLDnBVGhBUCDXZCGEha8lbdlW+keGGCpZ7Ng\\/xnuueCVvveLt\\ntDQ3H3WNuV3zWLbiWXDZO9ny6EPc\\/M2Pkxrew+JuaMsJkk6ELELfoKTBUpErpUMIjKJUMAyP\\nltg7WGFML+Y17\\/oSp5x6Xm183\\/e4+6aPcN6iOBIJBNiWxnE8EknJVBlamhdy+7ZJek9ajC5J\\nOounczi9DtRf9qTWgWFpVxPo3bX\\/339YcqAiyGYklpTTwAsMHJwwPHzY8MN1Hmf1elz7tiRW\\n9RlMMMRLVhX47q+zhGEBaVcPYgnKFtyzX3PXZg\\/tg3IgnlE4cYGczqhianE\\/bUwjpUDUx6rT\\nTMQff7pjjFWjJlTHQXKcet8\\/5Z7EHx\\/j8RQK8UTXPvbv68\\/8xN8\\/\\/l553PNGVTGipn+qh5vv\\nGk7ubITsuwajAyn6G4MQx9ZjLC1xEtH9BL5h2fwOCB+pjfPzdT4qK0m1qyhMIUEpgbIA0UAa\\nOe78NejwKeBRnTDENrUtw+h4jmQ8hz6sCdpa2Z2fwpss8t+\\/zaO0ojK5n3e+cTktYoyYCSgq\\nQ6GYZ2isjGut4SNf+y865857Utc75dSzWHbdT\\/nFrd\\/mV7dcx5xMnt4Oh2zSQkkP2wYdFgFB\\npaIZzfv0D\\/t4zhLWvvw9POeiS1Gq0Rr98mffoDN+kM5cEkeGCAFhELm5tvTI2AE9J0sunrea\\nn\\/1mgoVz0wwd8rHoJVze9xc5rWondQCLO7yGXfLgzgKpZkWy2cKKN1CTok2jIZ7VrD8S8rHv\\nVvjEm+O1v415P+Ocpedy7+67okUs6otRWYJYMkK4liOw4gLLjjaOqWblQt8QeoY1C8+hu6UX\\nx4phMJS9EvsP72Ln4GNIJ0ISQhrksTKwuk5hCT3Dqvln0tu2iJgdR5uQqfIkG\\/c9xHhpGOUI\\npIqSHQ2IsRp7qt2TPz3OQhwrBkJQrOR5bP8jDOUPYjlRgD2ivYgG5BQF5g1hEM2dEKCsyEgg\\nzTF\\/H\\/gGHUR6kjL6vbQECA1G1MYzOrqmrCbcdQihZzh32fPpyM3FkhYVr8SDO+9lvDIczZuK\\nkLQJo2fzSppyXnPKvPiM+1A8uHWSRKdF6Msa3+zxepQ2WLbAhILA01TymoWtjetp16CDsPz6\\nYWIi3qcOozlQFqAMUv4RXc6YD6Gq81ddAycypHNCSqr8vMA+3It22imbBJ1dnZjKAIVyiGhZ\\nxY4wgVPYzsVnx5iXNaR8RTFU7MoPs7fPY+X5f89lb\\/3gUYbm8RKGYcNvlFK89JVv5QUvvYzf\\n3vUjNj98N3sf+B06mMSyDFob4skcvUvOpW3ByVz+jsuZv3DpsQ1zfoINv7qeFz0rRTalsKQg\\nCMFzK2itkb5HUsfxjGAeB0m0z2frVJnVrZ245TIDow663XvaDZuoJg5CT3PqgqaG7w5NxnES\\npZrhebyujYk2mRCCe\\/b4bNgVctqS6bTZFKvmlvj1FoNORe5r6BsuWPpirnntJ5k2c1\\/48Ue5\\nZ8dttbF1AH7Z8IqzL+cNz7uKlBpAeztBlyJXRTYhYlcwWUnyP7++kdvX\\/wArLhCWqfMDTbQR\\nwmp275IzLuN1z72CXGwc7W2pjiURag0i9j4e2rWJf7\\/jc4yUB7CcqkGqut1GR8YsIZq4dO2V\\nvPBZl5C2htHeNtCFyLVTKxDxv2Pv4VG+fvtn2T60ATsmImrEjNMgDAxLO07js1feUJvDb979\\nVW5e902s2OMMapX\\/9dI1r+fqi\\/+xupMFH\\/3Oe9nY\\/3ukOvZ47\\/y3N7Hr0FbedOHVvOqCN5Jk\\nB9rfC8ZDyCbe8ZJ3cMv9t\\/HNX30JOxFdM3Dhyue\\/j1ecf1mU4Dn8Fkx1KUpnHvf9z++QCHYd\\n2s57brwcIeA5y17MNZd+qqbH6276CL\\/c+DPe96qP8MLTL4nCG5M3oPObavf2iWt+CrINIeDr\\nP\\/kilz7vclqb2gDYfOBRPvCtq3ASxyhFqB6+ftnwdy\\/9EC858xW11fuZmz7IA3t+iZInFrT9\\nv0JsxkSnSuXhDHtKFYopmwW5kIoehlgT2aZOJvw4PiVOahvhxash6+WpeEkOlzWPbg+4+A2f\\n5SUvf\\/NxDdqP\\/+er3H7TV+jqXcq7P\\/gV5nbPr6OLWJwXXXI5L7rkcowxVCpltA6xLBvHiT2p\\nk+COH32eFQtC5rSnSSYFnu8ihcLgowMfSxlCH2SYIQa8YuUY39nSxe27DKd3hsSHcpTahp\\/2\\nwnlddUGSVpa5TUdgRkZ+\\/d4SKhW5iJGr9jijKEDYApMUJHKKe3fEOG1JfYDl3YrAMxHiEYKg\\nbJifGsPvO7fmSoX5BGEIypio7rakueZV\\/8pzT3IJRy\\/FD8eOed8pq5Orn\\/\\/XrFrwWT590\\/uJ\\npas8qKobFniGOakFfOztX6Qz\\/jB68ir84NAxRpKc3vZ8vnjV9VzzXx9ksLgHUTUyWkPgGnqb\\nlvHJt3yOrL4dPfa6J7yn3thpXPvm93Hj3Xdy6yPfxUlMoyswRhBUDIuakvh959cP9VGL0I+Q\\n6\\/ScTqNor2xYkj2Af6A+X+5EnNCP3MGgwlHj2eUuvv6uH7Ig8wj6yKvx9cTjlObw6jVXYYJ3\\n8617voyyBV5Zs7JlE37fV6ZXRX2P+vsJ+59NiKE8GMMvRSjvKD1OxKlMaVZk78Pv+8xMbF+P\\n2Q68vP7cRyTyyC\\/wJ\\/MAdJnVuAWNZasa6qwj5kif3ZmTuHDx\\/hnPaxgf8tChQDknlmEgawGG\\nP+cDFB\\/QNHkBZy\\/oYZnI85LsDtZ2bCVmduB4W1mTWcc5qYd45TJDuy5T0nH6vIB1+wZ51Vs+\\n\\/6SM2rUfvpzdv\\/8cLz5dcnLTHr5wzVpu\\/PKHmBg\\/eoEKIUgkkqRSGWKx+FFGbXRkhHK53BCU\\nHRzYR9\\/W77N0aRvJ1hZ0IolIZjBOhkpFIqRCSkPoBCBLqOAIXe4eXtXdh9+0iPUTpxNkVjN6\\nIF0PGjxdn6phWzpvKTKsJw7cIMZgIYxcRCWqKOboj6jGzey4YP+o0zBXudghdFB1wUKDVzas\\n7EpWl2tEa1+3PY8JI3pA4BpeuuZ1PHveQwSjn8I8gQGJ4niHCUY\\/zrldv+fV57wVv2Kq7ooh\\n8AztsV6ue+snouze6GcwxzRq0SbWxV+SzP8917zyatyiJgw0OjQErmF+03Kue+sHSE\\/9DeHk\\njX\\/8ntwNhENXctXa5ayZd37VqNeRn+9qFrf61WePPnsOaUxoZpQiiZor6ZU0y+bYtfkyCNbv\\nHI\\/mU3PUeIY4H3n7J+lVnyEcvx7zeKNWpeiE41\\/jktUeMZ0h9CMk3ZEcmnFfR+0iQLN+b5Ew\\nMARlzcruRj0+tHUS7Uta4v0zxjFHzfX0Z\\/sBn90D5dq\\/0\\/YoKkwQVmk\\/jevT4BY1b33Bq6D4\\n49rfbNgbsG6frocPTuC++LPfK2owuIcMiWFDc4tPWD5Mt\\/LpCYfJuRKjCpx6RguVMKStLUWz\\n8hFCMRoEbDlY4jkv\\/z+84KWXHfc637nh46ix37JmSZZcNo7vG1qSgu1bvsPHr1nP52+4AyEE\\nYRhSKZdJpdMNRnEqP85A3w42PvwLNm3awMiE4MZv\\/rTB4N36w0\\/xrDUtZNubIWGjjYOuuCgj\\nQOZx7ADP89BArFKgbMro0KEj2ceLWjdwy+Dz+cNwhrg7l1j2B2TavKepcWW0iMLAcFKnDaZS\\n+2Zbv8FyRBT4l38E5c8wbpOVGFCpbY64oyJeVLVWkECxsK1Y2zuuH2dwYpympIXW0eJ9zZkd\\n6MK\\/14afKGhu+UPAkSlDzILnrVKsXlTPWeniHbzm9L\\/hlvscQttDSAjLin958zUkp67BhEfq\\nKCGEP2wJ2Duk6W0XrF1tMx2ZMOERemPf58xFa9kwcA9SQZPVyb+++b2o8fdgdKE2TqliuH2d\\nT\\/+IQQm46DSLFfNVbfOGox\\/lb1\\/4Ya786h9QtkFVWfhBxXBKT6IhfvXwrjyxDificlfXlK5u\\n5qTK0J4arqHosak4Ja9ErprEefx40momXXp\\/7ZlH85rfbwmZKBguWKFY3F0Pw1il7zGveR67\\nxrYglWDPwS1kY4LO5gQx26397uCwxogobrh1MEAqQegpFraVHqfHEk5asu\\/QbhIWpOMWzZm6\\nkRzLQ6GsI8oUsKm\\/zKa9gjULq8tIH6G3bT6HvJ1gZqQ1TISa18w7lzO6H8WUgpq3928\\/97Fj\\nElVNTp3IHfPnx9hCqGwImZtyMLpEQm2hc24LoQqYyFucMS9NKhjhzvGlrAhGaO9OUXB9+o+M\\n09L9fF72yrce9xLrH\\/otm351Pc8+LUvC9rBEHCk1LSnBonab0UMj9Qzgvj28\\/dWnsvLkFjo6\\n2hDGpVQYIJPRNLdKjKWYmlB89BMPNRi1LY89QOg+QNf8dkzCwklnKBXHUIk0SsZoag+YGt1H\\nzLJxfE0llGgEgSwxpWKcPXc\\/G8cPsTE4mURQZvf2M1lzzn0I++mxa0aD9gxL5zZ+tWFvBSsu\\nozT\\/cQqURXVTHhX01SO1gnqjDYvmnIzNvtrXm\\/b7SDvKuBkNuVgHreKOOs3gQMjVXy8jMhZO\\nQqBD+NEjHufN9\\/nM2xI11yMV3MTJc1awc2wjxhhedvpr6bH+E+PWjdp9WwI+d6vHRChQdoQO\\nb7jL5\\/qr4nS1yiriepTlHefw0O7IF7zyNVcQn\\/pQg1H7xSM+X7jNJ3AkVkygQ8NNj7i88RzF\\n37wsVvtdh\\/w+Zyx6No8O3YtU0e+Sdpa21OGaoRotxHBNkaRdz6jWpi6AFb2nIMI67eKhnUUs\\nJ4rdGQ2ZWPOM8QQmGIjivWXD9T9xuXubxklItDZ89U6PT78hwYWnT1vyEm0p2DkqcBLwDz8K\\nGOvzufuza4lxb7RFjc3LPzpGsl2RzCmclEDZsCB3tB5VXBJLS971A5\\/8YMA\\/veZ8XnHmxtpv\\nPvNDwe\\/3VEhkJVYMZEox6TpANZhnKizsyHLwgKkFf42J5sEtat5x+UWY0rW18e58xKevCE1z\\nZDVj+wzJipb2BeRc0PGAioiTwafVAydpWN6Zx3ECTLyZ\\/r5WCuPDLO8uMVFQ7D2S4WMf\\/uxx\\n416e5\\/HFf30\\/LzillXRiEikUxSLYKg5hCEGAperxoKamJtYsljzv1BKdLcM0N4EdTyKTmjKa\\nDXsCzum+gnm9i2dkakJ+cednOe\\/cHMm5MdLxDnS5hIwJYnYzZS3RqRIJNZfC6CQVfxzfKqN8\\nRaxgKKbyGOPTmhjBFC+gEuwkUGczMbKJ1q7C02DXBEZrAt9wSk+y4buBCQc7Fp3QyOPgx6rh\\na0o3AXX3xwtiDUmBZYvaQNc3xGN9AXZcRhs\\/MMSlBF13GcfD56Jjd9PUpoilJRhI5iQPDYX8\\n5AHNK8+tGqRwhPZUE9sOGwgsLj2zBePWDcLvNgf88w88snMsWtKRsQ48w9hIyOduCbj+qroL\\nPb+liF8xLOo8mfMX7MAUx+tx1HU+194RkOmwSaejjKzRkGjSfP\\/hgN72gJedZVVjU7tZ0dnO\\nIwdMZAADWLngFES4uTbeup1F7HhkaKWckTyoJhpO6ohcx9rhO6Kw49FvA9+wvHfpDMMXGYTD\\n45p33uiSV5KW+Q6WE829sgR9k\\/OA+vx6lWGENFhxRTwD8xd0kYvvqfHOBkYU6U6LpjlWNP\\/C\\n4BYMy3paG\\/S4qc\\/HSQpiaYkdB79kOHN5ZsY6kzw6UCDXbZHIRrShypRm73BjiVVnphR1qTZV\\ntFZ1t1+45pXMT96BcaNnrHiG\\/\\/xtQDJnYSdklIU+wQ7On1154O+zSCqN57mk4laVAGgQUmGM\\nAyQQOkPoJxjKtzBemWRv\\/zgXveLjNOVajzv+9276MQ\\/tLoPMcXJrjK6cBSrDmAdToc\\/4kVHc\\nGeQx33OJp+J0NsdZ2G6RzvmYmCCMW0xNhhwczfCO93644Rp\\/+MNPaJ+7nzmLeonrDAmZJB9M\\nkm3qxvNDrLTG8tNIspTECAlhCHURIw1lCcoFVIG4CogbTSUZR5ssfTvPpbX7bp7yPi5GozU0\\nxVtpTQ7MSBwI1u0tolpVddGI47qzRsOCOc1APU5XqNRrC0PfsKi10hB3GZiwsWIBssoVPDI+\\nBKZONTh\\/VZJvfez7fP32z7FnZBMqJnDSkoyG9QMBr8TB9cENDIdGt6FDOHfJs8lxW+0qfghf\\nvMOjqcuKaCsRQwOrSkHZMqzxQ4Gtor+YnHiM0De84tznQvG7tXvZcTDkc3cEZOdaJJsUyqly\\nwQxISxH6hh\\/8wfCys0TtGXubpwg8QxhGhmpRmz7KUFnxKkdM1DMHxkTztaK7EbZvORiinMj1\\nj8YzDeMZAx\\/8jkvBUWRaJXYiMiKBC1ZccvL81gbDtneogIxVjaoUnLZ0GYTra9\\/fv71APKuI\\nZSNCbRiADjWL29wGPR6acLDjIZYjCIShKZNlbq6eiMqX43hWieZshOqi54Otg2UMKUT1h3Oa\\nIjqMmYFajWtzxdqlGPf22vW+e69PUUmy6aobKk98z6M\\/C7G5YxoxHscXU1gKpDRILLSRhFIQ\\nSLB0lClLxGz2lDo4MDJKSc3hhRe\\/4fjjuy6\\/ufUrNLV2sKm4lMdKEqs\\/AARlmWRSGRjt5yUr\\ns7VN67ol0k5AKl1GJiR2wiKMQwHYflCz8ox\\/IJutk34rlRIPPPglnvecDLGglZa5GRQlmhM9\\nQCuOmqIUDmEn46DixLIulWITwiox4Rbwk1lkoYylXZqKB1jb+iseGlrKEVIMybM4sHUdC06Z\\neEqNmzECHWhWzV8G4aN16kolTsEv0+xMJw6O79KGvmHpXNmw4Hf2D0ccraphW70w1wDzHto9\\nhdVpIy2B1FDWmtEpTWtmOn52F4viI1x\\/1T+zezjgtnU\\/5JebbsWKCzaOwEuudwmCKKNoJwVG\\nG85cGGtIFNz5SEBeKHLZKtpR0bWFMMRSEt1quO4XPlNTmrxrOFwCgeKCxSORta3Kjb8KSbQq\\nkk1VYzTD9VGOxklK+vtCDDEEUawyqSaiGGOVU7aipzG5svlgGHVDUfVWVrUsoGtY3lOPJYbG\\nYtvgFE3zImOn\\/aPHu3N9QF9J0NRVdRuViPC76fEAACAASURBVGKbIkqqrJzfNEP3FgfHpmjq\\nsRHCYEJY1FZhZlp8aCoR0X2qiDKsGqQn1KMS4BqW9S5DhjvrIaHdZZykqHZ+ie5JOQIfQ8WP\\nk7Aj7+SkudnImOlq8qSiufSCt5HT36+tqtG85gfrNKk5Vl0PTwEBVNarV5\\/kB0NhvUQYn0rg\\ng4yaNkoSGOngAb4xuNpD6yksNc5YJcYj28dZ+1dXY9vHDz7dddu36ZRbefN5E5w2f5h8toX+\\n9lUM5ZaTT51EKX0yhdRJzF14aj2z2b+LXFpilI8RAaEyeFIxMAF7D\\/fw\\/Ive0XiNu\\/+ThQtd\\nurrnsGP7BL\\/8+X483YxvuRhL4WMhrDRaJhGOg06HFFp9\\/FgaKWIor0TAFH26h13FDAuTe8kK\\ngxNL4qZayLuLq4vyKfpg0CaioCxo9cD4DQsxQhIzGgA+wUfriNxLYHH+io6GOdp2CGTVsDki\\nQVd2ZIbxTFDUkRsmZJXsmVJ8\\/w+NXD5TWY8\\/eDkL7a\\/y9y88j\\/\\/nvb9g7YqLkZYg3qLIzlWk\\nOyR2QmBCyRkLGxf5Lx7VxLMy4ropalHm6YRHPKt4eEywrSwZCBWuEizpXkpKrKu7xAXFI\\/2a\\neEainIgoO3MOhIhQlxOzQSYaNr2p1uEGnmF590xDZbN9qII1jThmUFXCwNCS6iRr99VR0ZiN\\ncCKdGGPw3cbxAH70QEAip7ATohZCMICpjpeLHagbrUkLrOh3ET1Gs3JeqjFGva8cIURVrU4J\\nDbaIH1OP0p5ufQWL21VDImrnkMCKCZSqJx6lig6k3Yfq666ruRIRkkND4EFGtvGaM+INB9W\\/\\n3+VjZaIyrOkSvKdif8g\\/KYsKeJMGNaLwq+1+4ok00giUjAM2rtYUAh83DChXxmhtVbgWTJSa\\nOW\\/tK46fkwhDfvuTG+hKSVpK21icmqRUKDMeOBR1HB2ksCoWpjjJBeeeVYflOx9jy0CC0eJc\\nkjKFljZjJc36bR4XPPcjOE49MDw+foQd279GU1MrX\\/7uQX6yIc4N\\/1PmN\\/f04xkXEcsTSxri\\niTZi8bmEpInF20iKTpLZHoa9ZkbLHawbWcZXfruCR721\\/HLXEkaEwRaamJ+gNL6SUt7iBGex\\nZ3xEDWmtfFx8bedhgR2XDbGfJ9InROTeFz7rYtLioYZxHj3gYTvRdZZ0L0Pp+sZav6eMU01O\\nKEugHEEiK7l1i+EXG49ub6Mr6whGPkxm6u2876XP5bNvu5Hu3HwsW0ZIQELaydLs7JgR43PY\\nejjESVZrHWc+i4yMhBMTxDOSZE4Sz0qUJTm5qwXC+ub95aMeTkpGc1INVB\\/NXDL0zulFzNjQ\\nk4WJmpvekuwgax+YYagspFOd4xkbHhMZojWLVoAeqv3+ge1TtXgkWtCa6mwYb3TKZt8ExFJR\\nXa+sIm1BlGFdOf9k0IN1N3NbKRrPqiZ3AslJc4IZGeQYByeDKDMuBQKBCWFJ17H1aFVfxKlr\\nyL0uu4dpQKZCRmjSigk2HagfZDF5mNZMB6Fv8Euay9e+Ebvynfq6HAj59W5Doik6qGrNTZ+C\\n\\/SH\\/JJAAVPYKrDDE91yUnSBEoYSNUjah1hRdn3wxYHzSw3cF2g3wqdDde0bUAPI4snHd7wkG\\nHyNlF9jm9\\/CDR6ASNCNCD08HlFEEfokkE5x3Zh2x3XX\\/Th48tJCRKYEVMxRdw8EjkoJ3Juec\\n02hQb7v906xY3c6+sUUsXPsFei76NBdc8UW+e+cYA33NhAaE4xOEARqDERB3sqRVE32VZv7j\\nnmZ+vqWXm7aeyUT6YipIdvmrKNlJpDTYJsSLL+DIgU6eKtA20+VZ2tW4EA+MKKxY9dT\\/Iwei\\nMQbtG\\/yy5PXn9WBmGIPBccPOUY1yoozg0rlpMMUZpzg1VAgRCrLiknSr4gu\\/1nzkhy79R\\/Qx\\n+GuHCI58kOWpb3Htmz9FWrWiq2U5TYkMQh+uX+OQwopLrOobwx6\\/FqcTH7JaoC9khEAToq\\/B\\npR4uZrATom7UHjfOdPZu9aIFDUjl0JiLkNHzr1q4FMLDjzNUjWNO+6KBB6t6ZEPnjMF8Aruq\\nEx0YVi5oHO\\/ezWVi6ShTK1TjvYU+9DaXGjtxTDrRb2VksHpaFpCQ9YTArkMGFasjasN0uOEJ\\n9KhEjUj7eErLpr7pbK6oH9SWwHIEk+4MDywcp7etC78UkXFfuOxItbojuv5X7vRJNqsqWnvK\\nwFqt08+T\\/rXRwJBNxStjtEYbTRiE2I4DaEq+S6Hkki94VCqCqZKFmy9BWOGkpaufVAXAXbf8\\nJ7mMYUB18qODKzhgPwdL5EhVprB0iUCXCMtDvOyCVaSSEVI5MjLK3Xtcwq5lBMLG1zEmyxYb\\nt4W85JJPNVx3\\/4FtDAzfwcO7FXL+G2k+5VTiXXOpdHTTffon+cQnHuFQn0RIgR+WEKKEFXep\\nGJ\\/RuMXmUcWIWsack3KkFzgU7SnsMECKcWR+EulPYBI+I3aSkalT0aF4yiybDqAj20Xa2tuw\\nEDccKFRrJ8UTuqKGaRKp4XUXvI1O51eNbtH9Pk4mQiQ6hKVzGgur9x2xUE49sRBUokJ85UjS\\nbYr1Y5IrvuHxL9932bDn6D5Kunw\\/6eIHeNWZr8EvVw1bMt6wefcOW6hY1aWe6e5Nl5G5hvZ4\\nL24xIg+HXhS8dlSjoS94iWiDq2O45jOY8WtPaW4wiCMFL0qMBLC0UzfErw7lE9jVmNPMGm4d\\nGLSnOH9p0+PQb+QWRrxDWNjaGA\\/rm0jUjK8U9QNpOr63al6mYbxNByqRsZHRNZf39EA4Wvv+\\nkb2VBsNLtU7zWHqcLh\\/ToaEp3kpL4mDd5Z2w0Zas1gKLGhFZVkMBe4dnjhcwNyMoTYa87aJX\\nQenmhsz29nFBIquwHFmNrT11oRoZsX6P\\/wHwRg3euCLvaoxSoCsoGSBjNlrDmOtSKGs8v0wl\\ndBnxLLpTZVIyINPadlyjlp+cYOO6n5NP9nDrY4s4OLmY0LLxrDIBMULfQntjeBOHuOLVL6lv\\nwtt\\/jY6fhBfvoe9wiOdqdh0ISeQu5uSTT5+x6Q0\\/ue16Dnm9nPXSa5m\\/8llY0sESFqFIUWxa\\niF56Bd\\/46j0Yk0E4GYwPXhDihzbJRJLVvW10ZiZ5dJvH6JE0niNRgY3te5yR28eZzgZivoUT\\nJBk1K5gcSdQqIk7kZ5qYe0rvYphBYh0txPBEvSj9qL+b3sxhVLu3pG0Nbzwvh\\/HrXUGmSoY7\\nt2jiaYWU1cB5d2Nh9cYDeZQV0SDeddHH+crbbua\\/\\/\\/ZObrj6VoSEZLOiZZ7NpinJNTcHXP6l\\nCvdtDR6H3oY4r3cQr6ijrq9+vsGwhGa6Y4iou99imiyrWXvyy\\/nK2\\/6Lm695gO+++ze8dPVl\\n1aLyyYbrKLul4YUjM+diuiywu2kRK7sb\\/+7+nW5ECQkNJ3U0svA37i9XUXGVw1Y1kL5reN7q\\nF5OzN8xwCx0OjAe1sqvQM0fFwzbuL0eGsjretI6NNuhAsLSrfv1AO+wbq48XBLCwtdyY6ZyM\\n1d1Hotrb4Bh6fLRvKorDVV3VlfOXQzhQ+82DO0pR0sZmhi4iI2fZgi0Hy5gZTYJyTolTq2Tc\\n6UMqCOGG3wSkmqfpLid+Pzz+86QRmxBQ2S3QOoxiO6FGSYVlxZDSphx4VHyPihdQqWgCbQhC\\nn8AbJ2UZuuZ2HNew\\/epXd7K3nOOW7T3sl8+CRHt0CobVcpvAJyyOs2JunHPPOLVmrH54+\\/2Y\\nRA7htLC5zzAwlmTLDsXFr\\/5IYzB1\\/T08uH4z51\\/4CRItq1C2QhuP0C\\/je4KynyVoO5nDphk\\/\\n7OF\\/fngvSgcEQQltxpHGoidZ4HXn97DX76YQdBMrTmJEiIdDEA6zqLWPiihiyRw2OcqlphOP\\nuTE1N3Jxu8fMzpIP76ovxOnY0fRnZucNt6hZ3LyaT13+N5D\\/asM8\\/ddvfEQ6WoTGzCCSzjCe\\nftX18yuaXvtXtLkfIjV5FbnS+8iqdoSEWEaSbrNomWczlbT4l1sCrr\\/FbbhWRq7Hr0TPM1H0\\nGhzNXLq5gWeHqLbnCQzlvOaSUzrx+i8iOPhsrJFX447eEnXFMI3NFDpzcfRRrYbqY7lFzdtf\\n\\/HqE+4e6qzcKgyVTRayGnpZ6kNzXcfonAqRdj9dN17c6YYYrX7CqIWC+b1ih4jJKxBjQgWBJ\\np98QD+ufDKpUkBlGl8i17m5ZQELOaEc1LCMka9cN5eMbIKzbU6y6taLWASTjHK1HT0SkXYQh\\n8A3zmysNiaiBSacay2tE\\/0JGiaVAaCp+fEYZnubdr34RpvTr2v\\/d8oDPqJHEsrKWzHgq0dqf\\nlDwwGsy4he9Gr6GTUmKkTSyexgsNU26ZslshCAzG2JRcjdYeujJGu3QjPH8cue03G9nuns9Y\\n9jQqsRYCFEJIdNTuAeNXCPMH+ad3vKbWGPKh9ZvZsL+EiCcphzH6prq5Z7ugd\\/Xb6Oist0AK\\nAp9rv\\/Yl1rzkH4jNW0Y5BgVPU5ywKBcFlYpLwfWY0Dl251dxxfse4ge\\/KLFpex9uIcQv+hRL\\nE1RKeVZ17uCNFw0hGSKuHYqyRCACKmGcYHKcuDlMaOXRAvZtXo32T2xgFCGi2ky\\/MR4SuRbV\\nALWJXMgwiDJdvhchNLegSZl2rlp7DZ99y3tQE9c0LORH94fcsd2QyCmUExm2FfOWIcJ6hm\\/d\\nrunAtST0YPjwIxhvR7SZg37OWnQ2fiV6zaEVE8QyklSrItNh8aOHQwp+vYGBMGW0jlpLj0yN\\nN1Qnnr3yFByRRAfV\\/mmm7j5fcvob6ErcV4OfoT\\/BPVsKCAVHJhvJ0S89+1Rk4BD69d5mppoN\\n9oqGS8+7ijO71je4wT992CNWdcUxikwsX6cKBW0gq2itWhcauIagqPjn132CnP5ew\\/Uf2V2s\\nUVW0hp7WhcRnxMN2Dxms6dIi1dheXQeGZd1d1ZeoVOd\\/dykitlpR9ZsJJD3N9e\\/LfoLxiq66\\nodOZ2ifQYyIyWiAIfRoQHcBjB71avLYh6VJtVmnFJLsH6\\/P2vLNOZWHTbTX0OFUyfOeBkGSz\\nqiZPZiLwp+7zpEuqtCdg0sb3CoRGY8vo7evCjlOs+FQ8Hzf0kaFBKokIISiUkLZHc1OA6xaP\\nmw39w+bdkOjBUnPxhY+UIeioUE\\/7IaY0ylmLmnj1y15Q+7trb\\/g+JtlFoDWe53Ak6OXODX18\\n74PvaRj\\/xz+9FdXzV3g9pzPolUkUiviFFoqTFhMTNuNjYxQm8lTGxwms1WweLiNiLfzkt3fx\\nmrVLsEnhmWFKQYAsVlibCbivdYQHJiyEaYFAcXgyzZEwzjxrHzvEXDxsLNlLGNpYwj+RBLao\\n44YnWdTuNtQ9J9Jncf7yOPH0dLBXELcTJGMZOprmcuqCs+huaYLC9wiHr4+O8qocntB88laf\\nVJtNLBmd9NqHBa1hA5H0wJiFHfdrG3vrwQKnzZ\\/2x3ze9vzV7BzaQ39he9TGRkYuFcBfv\\/Zv\\nyaQfxlSBW75YRKooq1pBMzwBndUcU4oHeNcr\\/5Ev3\\/HJaiNIgV\\/WXHLam7jigoWY8R\\/W7unX\\nmwPGPIglJQ\\/srRCEiaitOdBm38sHLv04X7jto3jGQ1ZRmFc0vHXte3n5mhjh2DfrsbW85vbN\\nhkSnFW16Y7BEvubpJRNpOnNdlCvDCKmj7sVtq\\/m7yz5It\\/wapjzQWAWSj2PHSkgJfmBY1tMF\\nYZ2O8sieSkTxsEU99jTj1XeLW4OG4vaByenxBEFg6Mx2YZv+OhIrtqD1eK0nHsIQuPrYeqxW\\np5jQoH3Bsh6r9pyBdtgzkqd5vlOnyEzzxKpZacsRPHbAZVVv9P\\/NzjqMW88G\\/\\/dvfHRSEUvJ\\nKv3o6XnD8pN+r2iQN0hpMGjiiQTSEtiJFBXfIITEC2U0OTogEJLAD8gkY5jAI2MdYWD\\/jj86\\nfsV1GT5SQLTYeFRIBwGBjOOJavTWm0JM7uffv3FdDa3de\\/\\/D3PHgHuyOswjDANcLGJ2C9139\\nYdLpOjQvFqf40a3fwTn9Q4xONaOHEjhOSFC2KEz4jI7mOTw0xOjAPoqDW8hPjDBZlGi\\/wN0D\\nJeZkDjE6XuGs1e1gNMZPoP1DnDa3k\\/uHXWKigDZZimEHw16RxNROmlrmkVfdBHYmyoyeQBLi\\ndMfc+R1LiIl9DbTEt7\\/yddTesQYYo0EXMXoUgiNo91OEh7Yd9cahkbzhn37g46ctUlVmfuhH\\njRKXz23kHm4dCLBiAsuJKgC2DARAnWzqlL\\/Ol6\\/+GtsHSzy48x4qfpm4leTCNZfQlXiEcGzz\\nDINUwklGVAwnbbhjg8tbn2dXgdgYF528iyW93+OXG36GZVlcuOZi5qW2Eox9po5QPPjmfSGJ\\nbIQK\\/Irkt1t8Llw9XR7Vx7k99\\/Lff\\/8TbnvoZopuno5cF2tXvZis\\/gnh2L81sP+vuz3ArtZW\\n6gCM0LieS6I6DZYZ5Jv\\/\\/A3u2ngfCM3pS85lXi4kGPs0prxluvVaPQSyv4RqmiY6w6JWt8FQ\\nDeYdrFil2l47WivTYYPAg5XzGuk8G\\/aXsHLVeJyB1nQCdD3O2tu1lO985HNICzxd4R+\\/dQWB\\nZ1h2LD1WkaTvQ3tmLilZL8k6cESiYnJG4kU0rEEpI\\/1HNaNuVWd1ozYworl9q6Gpx6qjvqep\\nG+uT7u7h9tu4gU8l8PC9kKZUM1YihUokqJRLhIGF0CAI8IxASIuSq8nFHDKVIQ5uewhjnrhL\\nZhAEKLeEdsfwU3GKKKSO6jKMV0SPH+Dav7+UU5YtqVYaeLzzo19FZLrQKkRXXLxynsXNDm+6\\nrLG64Y5bv4x0NCXXUBgcw5\\/oAinxvBEmRg9xZN8eDu\\/dytIOyamntXLaqrOYO2cOtrQoFd9C\\n\\/77H2Hrvg1z7X7\\/jtS9upT0bEs\\/EaW6WSMpIkyJUeQwORyo2PXHoMfvYq5upOFkCL1YrOzlB\\ngA0dwrKeNghnGjaNP\\/zeP3m87QdDPvGzkFJM1QK8QpgqU92wvMduIKbuGJ4i1+ugbImTNGw8\\nFPLo\\/pBTF0w3qcwTDL6JkxPnsfTs00FmQE+hSx8jHNs6o2TLcPMGTTxrYccFCa342WafV59j\\nyCaqhmDqx\\/TG9nDVcy4C46JLnyYY3dwwF5\\/5qUfBUqSzUS+wZE5x4+9CzjzJ0JQUtSqIVGUT\\nl535KpAdEAyj81cSBoMNc\\/H1u3w2jwsynVH760Aa7IRkc98kZy6uGko9iTN+FX91yl+BkOjK\\nJ\\/EHo3sKNUyW59OSirhiFT\\/OSHmSlnYbiCpFVs9vzHCu31\\/BaoleiDLdSXi686\\/Qit7WQs3Y\\nVPw4R8qTtHaoGq8vX+xvMJS69Gt6YlEDg8GJcbxiSFAxrHgCPSIixLayd1EDkly3u4idELXK\\nhaNoNirKjO47cuy3B33tbp9ES4TWatnep0metCsac2JMeOMoS2LZNsqxiadTaCkJjSAIDSoE\\nhEZXyaOWnQAChPLY9egDHDp0kO7uY7f+TqdStHc1s7dSRPsGGabQwsP4k+jJPt504XLefVXd\\nYH3yy\\/\\/N9iMC2ZQh0BVwK+iRPXz0ur9rqG44PHSQ7etvphCcQmHKQ+hBpDOK79tMju5g7MA6\\nLjljGVe\\/72rmdc859sOfdx6XvfGv6e\\/v57rPvJviWB8L5nZwzyaAHBWZiNjdwSgtXQHSa6Kt\\nWOYgASVLMra\\/k2zr3hOG1qY3dO\\/jMmF\\/qowXDN++1+eO7YZ0u0WqWrYUxWUExmhaMu1krAO1\\njXVoTKHiKiJ+WmDHBakWi8\\/dFfDJVwoWtMvaneryfVC+75jXLruGD\\/7Ao+QoUqmoIsARAr+i\\n+NBNHtdd5hCrBseNu5HQ3Xj0YRjCdbd5rB8RpDuiUikhIZZWFL1o\\/M+\\/wSEREzU0EY5\\/7dj3\\n48Hnb\\/O4f1CQ6VA4yQjJWEYQTwtuvDfkWQuj921Gxm2CMP\\/txqx+yfCuL5f4+j91ApFh29If\\nRC87qXYAEUh6chM1O1T240wEeXKOqruh9RJeFnWdhG3qa2d6PFmNxykbhscqTBYtmlIzEJUb\\ndb7dsi9CiS2ZtmPqUTlEJVkGepqnGhJRh4sJnET9JcszbYWg2tLdEmzuL2FINhze6\\/eEPDwk\\naO6JdCue5neCPOms6OSuMHqYUOMIC8tKEIg4vrHxAp8QH18KPG1jTAypBSbwCHyfWAjNiSLf\\nuuHzT3gjSin+9s2vIZwYxhobRZSGCKf2EhzZxIfespYbrvtwDe3dfc\\/9XPvNu5DpDoSykIFP\\nUBzh2afM4eKLntMw7s3f\\/ijt2QQTrsfoeD+HDo2zf98e9my4g5b8Nn7+xffzqX+88omN2gyZ\\nN28e1\\/\\/bj2le8ir+43cB9wzGIxVrgwwMbSkbJZIMjkGTOEAuNYQThnim6YRle4SITj5lQaG4\\n8UkrOgyjjbfjYMhN9wd85CaP1\\/2Hx28GJc3znAipJRqDxFIJ3HCEwKvzmh7aVyDRFGW3lJLV\\nsiaJm7K4+jsBX\\/q5x+C4fmLk78OdGwOu\\/rbPwVCRbFE1vpUdEySbFQcDxd9922fTgfAJEeu9\\nWwOu+obH\\/cOSTIdFLFmtglBRwXeyWTGI4upv+\\/x8Q4D\\/BIC57BpufjDgiv\\/0eHhMkp1jEU+r\\nalOHKJMZSyuGteSa73scmTz62UINP98QcMXXXfp8xdTkA3W+2aEKiaxCVrlbyjEUpurttjce\\nKBJvkjWyLTPeSSClYKq0AxPmjxrPcmQtNqnSiv\\/z0+CY875rJKKFuHr0mHq07Op9WVAqb2qY\\n401DxcgoW433VudSRgDm1JP\\/b3tnHqdJVd7771mq3rXX6e7Zh9mYYV9kX1wTEyPEqCjucYvm\\nJjHXG1Ev3iTe3Ot1SyRi1LgE0SSKS4wmIkpUQGQRkJ2BgWFgYPbp6X15l6o657l\\/nOq3e9im\\nBxGReR8+9elp+q16zzl16qln\\/f1ORZuefc793BUZlV7Tap1SSv3KM6H7PCdv+qcl83rlb\\/tK\\nJ83JEVxSp9hRpdzTT\\/fAIrKkTm1iL9THwDVQroEg2MhQMZ6uAhgsDafZNer5xJd\\/xuFHHf+4\\n3\\/PPX\\/93vnTJZYhWHHvEGv7sLedy+Pq1s27T\\/Vt4\\/hs\\/wLhdgip2BeieZBI\\/uJFffPvvOO7o\\nw2c3we0388+fehv3jvcxUYgpVU5iy1g\\/tbH7ee9rzuDdbz+3Fa87EPHec9br\\/pxrtyhMpUxq\\nOzA2obM8gZtyHD5Q4NTCDVzTPIxt9jAKE9dyyu\\/d\\/FQF2PBeSOuh5KE+7khqIeb2uJIXVIYH\\nAaJiePijnEYttF7NKYJltr6rOeWpjTuSaY\\/WUOw0FLs0cSublvMKJEJSExqTjvqEZ1WXsH6R\\nppSXODUz2DEm3LlLiCqGYqcO7UOFWXQMycsvsobQmPLUxhx91nPMMkUlr9kab8DND3vqWlPq\\nMhSruhUnmlub5rNQt9WcCmukm8JxS2GgU2F1QA3ZOiLclY+n1KmJZ8bzGNdKG0J93NEYc5yy\\nHBZ2hozx6DTcvFVIrCKuBEDqtBHujzJQ7AjjjIrBCm5OexpjjsZ0oGwsVDXlLkNcmVNSka9p\\nlkJz0lEf9yQ1jzbhJVLqmn0JiQtja0x4pkczjuiDRZ0K54U9NcXWusJWNOIC1FBSe\\/R9RIWs\\nbiPfTy4NWdpyt6bYMUfpztmDAVFYmBzMuPDNf8Uh5uMtM\\/OHt2Z85nqhe6kNSQPz9CQM9tny\\nf3jR\\/BTbyHUVBm8ZD8mAri5K3Qvo6F1A0qxRG98LzXG0byBpA200pWKRSCf0lDTGC6kukU2P\\nkhVW8KHP\\/4RlK1Yd8GA3bLyfs975N+zOFqBLfWAMuIRsfCtvet4qLv7kB\\/cpxj3rlecyOjXM\\ntmQ5v7VyE4et6uHCS2M+8YF38qZXvXS\\/33ff\\/Q\\/yj1\\/5OrXhnZx+8nG84Y1vJo5DkPzm2zbw\\n\\/Nf9b+K+VdQ6urAeVleHoNkEVWZtfB8P6BXs8UeRbb+Os9959VN207yfVSZZGur8kCe6jarV\\nXznDhKSNmu39ewyABRFmGaJyZqGZc03eyzjzTpjpBPAu1NZlSYDlDg3R4QMz8RgTh1YcG81S\\nwu3LQ5pX22cz1\\/FkibSAOrRR2AIBeTXO+w3N449\\/poE9a4bDZ4KX2cp5G8+OSZtHjwcCIq64\\nsN5pfh2XSg55lM8nb1+Sme4DN8tipaNZVBKfSou5ijksV621eIx1cPk6Kj33emH9Z+KtLvVk\\nCWRN36qsmhmXztHJveMx72Pr5ZQGUAXJeUbNDIuYmR3TTKmMz4TGhOP3jngjbznxbqR5R26R\\nC3\\/4+QS\\/IKLSa1ovzadb7HxVqS7FZF6hlUZU4AEID9jswogPm8ZgQBnEa5zXlI2Ayqh0xExO\\nbeV\\/vuVM\\/vxvvsKpz3vxvC2kL3\\/ze7z3b\\/+VRmkJttKLVxEKh0+niRuDfPj8j+9zznd\\/8BN+\\nvNkR9xxL0TQZH5lgsKPGhef\\/Da+bh1L71Bf\\/lfM+9iVkwSLKLuH2ay5j48a7+fjffhKlFCcc\\ndyTHr+\\/njpGMVDXocjV+79C9NNPt\\/Od9R3ND7VQaVYvLDIYST+UrS+vAeqy1whYPIMymHsnl\\nyOOOSylQJjBHmWiWe0\\/BHMIaNVvvqsPDIDYoHqmGrN4MifhMcWeruVs\\/9veHPkRB5W5WXNZh\\nb8lcLtFcCei5I3js8WuTI3cUg6U7gwjcar7WTzweyBuq7axSDS+SudawyrsFZtLC6tGcpTO\\/\\nx6pVqPvo+6Eedx1an3\\/EvQvKM5RY2RikombXXO+rqFscpo+6j8zupwKP+V0+V2YdUS\\/DU0Ok\\ndeGkQ17Em5+7Ahm7pHWZr1+XUS8Yujr0HKX29PNS2nmzKqkYrSOU5GCSBHPXZVngSlWhZkqh\\nSZ1DZRk2tqG4FqGgPOiIaldMeXKED533Bpae8VbO+7M\\/Zt3aVY+ZLW0mCd\\/7r6v4+Be+xd07\\nG+iuVdhCJ17ZUDiepsjUXs7\\/o5ezeOFsZ0Oz2eQvP\\/ZlVGkRmS2SOsXPH4542avexete\\/Yr9\\nTvXCL36VD37qq5yypsJkPMV9tRXE9NgHfgAAIABJREFUySHU9l7HTTddzymnnBGU29FruOWK\\nByjWC5y2aCNr4o1sHOmm6RYwHnegXBPiCK\\/0U8xelT\\/Ov\\/I34YEyN+SfN3MMyEfw6M4v3a\\/m\\nWC7yOIpLzXudjA7X0cyhTjqg8cyOSfKA+ZMbD09uPZ\\/MunOg83v8\\/RTauoSi7+Izb\\/omzQyc\\n91T1fWSD57U+t3fc8+93CNUleTGu5imH\\/J63Ypt3Tk1ZRGtwoZnNOY9zGZnLQlpaKbQJSB9e\\naUQ0ggo8oCpDi0O0piAZrncJe6f7+OnVW\\/jyj9\\/Niu4iv3368XR3ltFakTrHtl2jXHHDBmoU\\nUdV+ogWLwRRRxoL3uCxFmpMsLjf4i3fuW97xjxf\\/Gw\\/tFeJewac1atPTvOT0F\\/PWP3z7fqd5\\n7Y238p4Lv05H5yKKbOTdrzqNf74JttxWxOpJrrv2ck45JdCHrVm5BGo3sTJOeMlqoZqOMjm9\\nmCztpMNOs6g4xM6Gpq5\\/mdzlb6jMPFDqUSHCJ3cdnsLrqGfAeH7V6\\/4UjmumXayoyvidLyXS\\nFSIM2Rw0GBH4u8sy4m5DXDF58bb6ta2L3beJ7vElzQJvZMHY4GML+5w6U33jnEdZRU9XN2lj\\nPCfxsogG4zMio7h7uMg96gii3kXYrMFgJlxy9S6cNBDTCGax6oaudZjIgC4g2qCUyd0JQfkU\\nmd7DX7\\/\\/tVQrsw3FI6NjfOjz36DZsxgVa3Td0m8n+ccPz49n4U\\/++tOo\\/nVkUScb6yUu+tLl\\n\\/PFf\\/D6Xl\\/q44xf3MLB6tnJ7zSHL6GSQF67bQ5Vd2CyiUirQUdxG\\/8A4K+Id6G2aXdEU813n\\ntrTlmSYhpgalOA6F3W70UZ\\/5+nUZGyc0nYtMi3UqBAp\\/XYptnmKMI9KWmIQIAQfOW7yy+MxR\\n1AoxFi+GSpQik1NUKhatDU40ymc0bBc37e3lnuRopLQSrz1KW1QceCkNgujQyaCwSG5fKx16\\nRlEKEYf3HprjHLO0yFte87J9xvmhC7\\/EpO4hMt0hU1jbzgfPO4e+Bb37neNFl\\/wH949oqgu6\\nAMtk1MODcizf+tpVvOuNz+U7chTXXHE98pfBQo2U5\\/cOHeKozgY6HWXSOboY5LcG7ufuoWm2\\nR4tZ3f0Ayzu2tJ+OtvwGa7bwY3x6x6NsQBH4xvUZX7tD6BwIbGS\\/LvdzX1d0nho1TVN0iJyi\\nUWSZw2UOfN4QryJq0kMz8ZTjvfgoQSKLRoOZZMz3c+f2XrZyKFPlZWjjsKSgYtyMf5+nt1Te\\nmKaYrcJGQPAgDp01SCd28P8+9BfB1c3l\\/ge28NlvXYnuXY8yFtWYYM1AxNtev3\\/k3nqjyd9d\\n\\/D1U1yHoqIgXBZRp+gU8NLiZ+x\\/azZknL2NBtdqy\\/B54cDNpY4LUFqljqJuUnVKl0bR09a5k\\n+1BGsb6LdWv72SFD7QekLb+xms1EsHe6weevFhYUITYwPAU\\/2+wZFU3ngKVQnUUTFvkNUWy6\\nUsfEPUgzAa3wPsNnWXAL0TgxuLiPhCYwiljBa43OFInuYNNYN1vMEYzFizBWUyRDSwmvJMBZ\\ntTCaNErrfZBnnShQgheP8o50eojfPWkVv\\/PCM+a8OYT3f+RzqOoSdFxCeY9vjPG+\\/\\/EqCnG8\\n3\\/n9y79dyu56jK1UERPjReO9peY6mIwP4V8vvYtzXnoEfQtXtM5pZJ56WqBnog6qwV7Vz+SI\\n55jFo\\/zn5lEq3etomm6Sxsiv\\/Ua3pS1PPm4XSkPiDs2VO4W04UNJiFFEVUtHSYWCYZvH1Z4B\\ne93O1wfuWJoyWaggyXSO6+5wWYrzKcZDpA3WNCkVG1jt0K6I9jF4YefUQgZZyGRcQHSTYiZY\\nUyZTZZRqYMiYQetTmpxV2wTMLEBLKPlQEso79PROPnb+hfvEzH567U384Mb7MX2HokyEZNMU\\n\\/QSvPnv\\/JSXOOf7pG5djq31oGyHa4MXgrSWRXib9cmR6nJuuv4vXvePc1nkb7tnMtqlOdqcp\\nVWVJVJWGK9GcGqNUOpQ9aZXanjqV5vBBmD1oy7NJsyktOY+GUOzIs2F5ic9sWYl6xuzzeSs2\\ntCedKfnQDklT0rSJcw7vFZEyxH6IzjJoByaJUSZmAsu2RieTuoTPEkq6QNHFSASN0jSRBIst\\nYNaHldLahARC7oo6CQkDcQlS28tbX3YGh69bs49i+ssLLsJ2LkJHAZ\\/MZQ1efOqRdHRU9zu1\\na2+8lXu2T2IHlgIKUeBRKKvJsgJTqpemLOS2Tffxdyec2frOmzdsZXOyhr\\/fXKRcWM4i30W5\\nqBis72WcpQzpw1nXP46Kxmjh9LSlLb+Zqg20YLR6dAnP3DKaZ4jMu9zDi9BwjrKOcqJeR5ok\\nCJBmDh110FXfTRwX8SrGmAwRxfZmN9LZR2Mkw3gLOiZTFqUyrGQYXcBg0DY0AWtj0cogSIv1\\nJ2DHOLK0RtWN8r\\/P25dK76vfvpTbHxzDLliN6JxTLqvzvJNPm9fcLvrG91GVBYixKCRA\\/Sgf\\nyliMwesy06qXQ098BQMDoad02\\/adbNjZQPWvZUitR2eGUWnQm0ywo9HB3uoA1j5Mb2eBysoe\\nxhluPx1t+c33Sef8mI3APfPEyjzLEKKiUBqoIztCdtJiaGQZaEPqhIYU6GxGKF3GlTQ+G0Eo\\nMOg6mRhrkqURoi2JychMRkEZ4qwcFJrV2FypiYQeO6NsUC54dAqeFD81yHvf\\/gr652Q4p6dr\\nfOjTl6A7B1A2zuN9GZI1OGrd\\/tu2xscn+P7Pbkd1r0fmRD01HpHwM81SXGOS157z+pb7+93v\\n\\/Qcd8RhVO4iugZS6qUnGbl2k0y9jiRpjLJvk1jv3Eq\\/cTLld7tGWtjyNrui8RdA2oUEZT0rJ\\nZkwnioYyKBwuqTFpO4l8jYITHAW8L7Nk8XK2bB5HvMeaGk2vUKaEQqNVhtEao0N1uDEejEGb\\noDyVBIIJwZPWxllayfjTt75mn1F96otfZee0wXZ1oIgQb1A+QL92du7fDf3BFddQkyKRKQCG\\nTNkctVehAS8O15hkScXxB7\\/7IgCyzPHz667k9adELO7YhksSrtm7nHpSpqB2s6ZTIf2d\\/Oge\\nzdHre6l2FvA02rvt2S4SWgp9FrhagbwPVbfX5mm32GS+90zRf9gIW7d1kXooaIUShziHVeDq\\n4+hqmSxtEMcRCoh9ChO7MNJNKgbvwOq8uNbYkBHVEcw0Z2uD1jPUXAI+xLsyl5BODvLB\\/\\/Um\\nSsVZTPZdewb55Fe+h+lYFRIGM61GIoh39HR17nde37\\/y51DsDDE1D\\/jZYmPEo9ImamoP7\\/nT\\nsykUQnb1qmt+zqW3DFLu7SWKoFIpkzY93R0ToBQbkgi3tcRqm7G0a4Ra2sSY9mZ7tktSE6K6\\nY7H1rOiGVYs039wI3j59yLFtaSm2+btIptREbA2XKJQ2WOXQLkWTYfBMjQ1Trmqmm46uoqUo\\ndRaYCXqK\\/eyZ1iAG45qgwWPwWphB3FN5o1roJw59fV4Jmc\\/IamMctbyDV73sJfuM5\\/9c8AUa\\ntgcdlxCl0Urw4kJ8DsXo+PgTzifLMq6\\/9V6wi3OlKAgZWnToUXQpUh9mVbfjHW98Za7ghb+\\/\\n6Nu4jsOZtP14ZRhNNGXVpDZWxxQMWaHCYtnDiw+7l2217ejYt8s9DgaDzQlvO0lx+IBloFvT\\nTIWLbkjp7JwFCG3L0yN6Djvbfo+o6Cn113DaoLSlaDWxAu19nh0VpmsZKQUa3qDxRM1h1i4p\\noHUTj8e6BOM9IhF4i\\/YeLRlz8BBCK31es+aTBo3R7Xz0\\/D\\/ZBzvtrrvv418vvQ5d6gUd5Q28\\nEmpDlCDGkmX+CSc\\/Nj7B9j0joAJpolIBNFK8C1ZlcwI\\/9jCfOP\\/tFAsFAG64+Q5+cvND2Kgb\\ni6aiIfYJTVcgKfQxFfVTSgzHL9hFMnYXDV2bRVVoH8\\/qQ8eKT1zl+fY1gbjnnq0Ob+ZiO7WP\\np+uwB\\/IiEYGOQyYY2TZA5j1FrWmQ4cQj2oDzaK2pJY7YKrzyRDQoNB8ijsrUJEYjZM7hU4hw\\nWOPQAuIMylpajqAXxGUkU0P87inrOeXE4+aMQ3j\\/R\\/4B27UEHRfx2uSwOIISlRcUFvjp9Tdz\\n2knHPb65ag2i5oD7iQ+WmjgkrePGd\\/CmFx\\/LWS9+PhBKPN77kc9DxxLSqISyGocDBZFOSWnS\\nYWKe23sPa5I7GLVd6BXJ7MZuy7NajA3QP2ccGULXv9jiKVZt+97\\/Oiy2A1GESkH3sgYUHF7A\\niqegQ82IxlPUQuQa6LSBUYDLsKR0+VG6S5osy\\/IGd9CqiUqGMOkEZA20min4lfzwJPVpsrGd\\n\\/N\\/3\\/bd9YhQ\\/\\/MnPuPauHehSN1g7y1MoAsqHgsG4zNU33cUTudpGG0pWkCznPXUZyqWoZBqZ\\n2MkxCxWf+fD7Wp\\/\\/x4u\\/wW2bBokLEdYmaJWhlKAwiHd0S8y6aCuHlW8hnd7NmGQQS\\/uFfbAc\\nHqTuOGx5sNLu2iHYgmqvy6\\/hsOIPOJJAz5FD+FtKiHIUjMFrhZOUss4ouDqIQaUe7+toHVNg\\nKhTMmQJZ2gDTwGUJ1XiMxX2r2TmeBhgiG0HmQvO7a1Ib28Mbf\\/9MVq5Y1vr2NE356wsuwnYu\\nREfFwBKk1BwFFlADVVTk6tvv58677+XYow5\\/zJl0dFR5\\/VnP4+If3h6KDG0MWRM\\/tYcTV3fx\\n\\/X\\/5e0qlUPB718b7Of9T3ybrWomKSwiC8R6NRokFrVncs4UXHnIXjd17SCqLqC\\/2ATfOH3xv\\nTJ8JadOT1kMLjo11wNgvaLwLMNvNaU+hogMnwByMM\\/EzcNeOpB4AK6OSotSpicohueRnEG0b\\nnqQeGNuLHYHGDwlIt2lDWoQzCkWaCGnNk9Y9tqApVDVZ09OY8kQFTalbP2EG0yWe+oSnORVu\\naFQKFHg2VsRVjc+EI\\/qhECmm68IDo9BZFmpjjqQWvrPcpbHFfb9jPvN1mSfL55Q1w3yjgmrB\\nn6MCDHmxM\\/A1HPTJgwM\\/RdG1usnIwwXsaIHINxET0DmsT\\/GmgBKDadZBO4yfpKgdncWl2PES\\nmeqmLKN0pns5tLqHhelORuUo9rhKYKaUOpqMZi0hzkZ5\\/7vets+3X3zJd9m8t4ntXoTKG+hD\\nDEshSuVoqxqtS+jKIt7\\/4c9x+SWfetys1IUfPp84+gSf\\/9plYGJWLV3A+973Wt72hnNaDfbD\\no2Oc+2cfwpcWI4VunLbEzhKpMcROk2Qd9KkJjunZhR7bhLaekZKGBenj4nc9q5WaFzq948TF\\nsLIbjlxhmWzAe76X0bU4Iq17Xr0ezjkx4rLbHV+9x1HusUCA8Z7a6zhlkfAHv2NY0R8s\\/NEp\\n+O4tGVft8JR7DeXUc3yvsKgCx640eOADP\\/GBV7QprLIZZ52oGWnAP28Q+opw4oCwskdx9CGW\\n3ePCed9MeOfzDGcfH7F1WPjADxzVhY+dwUybHjOW8e7TNCetjWgkwr3bPUkG944IP9srJHXh\\nyBXh3FsfdDiB6lTGu07VHLsyYtuQ8LErMpyNckU+z\\/n2GHrEc9JSWFKFNYs0SQYf+k7Cn\\/5W\\nxAmrLUrBz+7xXHxzSqHfYqKDu8REPxk7TxmhctwUdV3AK0NRCyUFBoVojdVC5FNSX2CUhWyb\\nWs3OHRWsT4EhllXGee6qYQ6tDhJno3g8SebI0pQ0aZDUJqkPb+e9b3slPd2zxMfjE5N87Ivf\\nRFcHwBTyTGYek5MAiRwMN4VTBordXL1hFxd+8WuPuwClYpFPf+yvmNz8U0buuoxN132Hd\\/zh\\nuS2lNjo6zu++4TwenIiQchdFVaMkU2TRGDVjIe2hN9vNmSvuZX11iIJP8X4BY8X0oA8aT9YF\\nLcKiHs2hizWrS4JrBoukrwyxVZyxVtOYDLHNpC40d2f81YsUf\\/XymI3bPa\\/+h4TXfLIBHt79\\nkphT+gJpTMmCzTxnn2hZu1hzx4MBaUZ8sJDOPkxz5uGWAoHNPjJQmxJOXKNZ1KO57e6UP3+u\\n5jWnRVSKisOWaKr4x5yHiFAfdbz\\/tw0vONLy\\/y5p8KpPNqk34IVHWwaHQlN4c9Jx2tqwb264\\nJ2NVWfjsGyP6y1CKFUcs15y2TJGlcmDzrQdo9OFhz6nrDGsWG8bGPF94R5HpunDFbRnVouas\\nEyx\\/dHJYz4M+kSMSFvlADgQKCxz1HiHVBWLtKauQOBCtMKpBQXsaqovN9SX8fMdiprICBkGb\\naVZ07mR5+jAdjWFQMVPTTbzLEJeSJgmN6XGW98Db3vDKfZTQ3376YkaaBZQtIaIAj8r9PKUD\\nU71ugbWbgLjbuYzz\\/+E7fPzTX37CeFuxUHhUX+kdd9\\/Hc8\\/972zYA6rSj7Mx2htiAYVHlGcg\\n2sk5x45wRv8mzMhmXGYZkiLRct96KA62QykYU5rrRzUf+ZFjx1C4R6evUTRrHltQfPYaz9V3\\nZSRZuF0uEbKhlI+9wnDKOst3b8j4lzuFBYfGFJfG\\/PjOwFByzomG5pRnr9N86xbfInnZsNNj\\nSxqXCYWG45R1wRm59WFPVFIMe82lGz3TeZ10VxFOWm\\/5o0\\/V2bTTc8XdGZMqf88\\/ak5Aw3Pk\\nco0I7JqGBasjLvhJRjMVdk4EQoYo9axaFD7z0FbHBW8ucMGlCW+6sMFITtvXbIbn50DnO6o0\\nP7jX00zCHj5yteW9X0v4wi3wuRuE6+4Onz9xtaY+4Q\\/KfTf30E9WKSJCccU4dbEoZSiovHtA\\nC7H24DIavsC2qRKTlQoUUpRukhGTTWcUGw4jXdSlQiIR4j0uSUibDRrjg\\/z1f3\\/zPnBDD2\\/d\\nzue+cTm61IPSGtWqgRO0eMR7vPcILig7rcAadLGC6T2ED\\/7TD3npm\\/4HDz60bb9m7EPbdvDO\\n932Yk855D5sniqiOPpSN0crg6MFRppxGrIt384Yz93Jo4XpkeBdCTF0vY2ig1gIPPVgPbRVR\\nOfB0fv+W8NC94AhLfdwFcumi4oFBz61bHLaomBzKePfzDeuWGLYPeb74c0dHvw3sTQYSFx7o\\nrrIibYR\\/H71MUSoGsu7bd4R4WnPK89vrNdaEluHbtvlAhqKgGsHi3gCr85LTC3z4eylDHRHv\\n\\/6HjszdDqds8ppGNCIkT0lwJv+0FEfUJT9RtuO5Bz6gofCYctzSwZo2Me95zboEvXJHy872a\\nww+19PcEhXf3rqAEn8x8l3VDX3dwMT\\/\\/44S9saFzoaXSa9g67FufV07ayQOedGBb0bOqycT4\\nFI0Hq8RuDJ2jyirv8R6UVfQv6GJosol4i8fg6GTPkCVZosiMZlKK1J3CZQ7xiswlnHb0al72\\n0t\\/a59s+8NHPkBUXYOMiwelVufJwofYtx2wL6ByCarEaabwtYruW8dN7Rzn8Je\\/kpWccxanH\\nHc6ZJx9LZ0cV7z279gxxzU23c\\/OGzVx1y2Z0ZQDTvx5lS6AtCoURaBbq2CxjSfIwJ5fuZdnk\\nMNn4OJO+xChFdpYNdqm0yGQPdolKmusfzHinwEC3ZlEBagkkk56zT4z4P99NUcZwVJfneXmZ\\nxD9dkVDpjwI1nAfXhP6OvKskN8jThufwxeEhf3C3J4t0cAdHHOe+MgJg+5BnUjS9WpE0PCeu\\nCOUYSsFVd2dsTzXVfrNvT7d\\/7L0ed1iu3OA46wTL846yXHNfk5tGFZ+7BXTF0px2HLkiKK8F\\n3Zrr7\\/dctV0RlxXH9wa+0aFxz7Yp6Ch7juqSA5yvcPKycJ2JaeHKB4SelWH+WSIc0h\\/+PTol\\noefZH9z7zv5SFdEClcOmGd\\/TR7euUEjGQ4+WDu1NOqvRVxym7PpJtUaoIhSxHRFNWwY9yVSW\\nkRGBB+8dzjlOOuE4brjlzkCsCGzZvodLr92I6V4ewoKSxxCY6ecMhblaZt+wM21RgoQWLRuj\\nq334YgeXbxjj8luvwH\\/xMpTPseBMjLJFiMtE\\/evBFnKFpnOcKUFJipgMskmWVbZxwqIaZjJj\\n2vcx4ZskPb3UFo3ktTFtrZa\\/V9jdgKEJT3+X5ugliqt2Zjx3pWL3mPDQtEIZzytOzWOak54b\\nd0DPISrcPQ\\/1CccZhwVltWlHcC2bU54TTw0P8w2bHHFZUx\\/3vPwoRU9H+P8\\/35RRqGoEIZn2\\nHLM6JzTO4Ks3OEr9EfPtCShWNRdfn3DmYYauiuI9Z8f80cVNUq3RUSAjPm19hFKwZ9Tz+Wsy\\nqstiaqOO448L47n+XkehqmlMCq94wYHP9znHhOtceVdGodOgdEjUNCcd65cG7+bOhzxxRR30\\nnQ72l52\\/jiE6cpKpmw1lrdGZR1QRBxR1QinZQUEqpGoBYlKM8WTe08yEMhHNRCHKtiCKxMR8\\n6utX8Q9f\\/j6ZS0K3QVxGdywEE+eKK0AKzeQ\\/5uZCZjoYFFkosxAfFJMG8TrgtdkSqtiNFj\\/L\\n7YgGTCg01jqozBav4mzrV5R2U\\/GDVNUkxmumXMKQeHzUwQ41jVhP65S25Gznhps2Oc46SbOm\\nD753c8bbzy3ytz9IKXUbJnZnHLEiPMg\\/ui0j7jCt\\/ZAlwqFdwuIF4T5fdqcjKhmmdrvWOXft\\nCIvdnWWce3qMzwl\\/79omRMUApNCY8JyeK4sr70yZspqq3b9VnTUFlwV+Uum0fPw\\/m3zk9UVK\\nBcU7zrRccH3I6PZoYUk+xi9dmVJYYNE6JBROWBu6Vm7b6olKhvFdGUesKMx7vnHJMLEn47jV\\nQXnd9rAnroTC37Thec5iRV9XsBYvu8u1\\/nZwF+jmBLJP9gCoLG4yvUTR9GVEKxpKEymP18IW\\ntwTRHkuGokBEzN6kl22+nyldZdx1oX2CRkhMsKx8sQs6FhL1rMB0rcCU+9FRNbh3TsD5vKxD\\ntZIZwUAKDL3Ke7ybjbt5L4HkFo1SGq0MSkdoU0DZIhIVIY4hti0IJaMFrTwqvybiibzBi6dT\\ntnLCkoRmNs6QGJx085Cr0Byogfrl1vPZeERFxd07w4th3WLNWYcpHhrybBwLZMAlA+VCeL0M\\nTedFrTlz+fSw41Un5pX8mzLuGA7u5GF9UCoomqlw5zZPbSTjf50dcdVNCVoHVrWbNjt83VGf\\ncCwpCQs6g7L40QZHsSOPp+1n7PVxx18+T9EYzYhKittHNFfcHmKGZxxhyKY9WdNz3PLg4tab\\nwtUPCFE5JDLW9kC1FOKAN25yqKYnSv0BzVcZxapO6KpoMifcul3QkcJlwuSg4w2nh7n8dEPG\\n\\/VM5I\\/1Bvuf0UxKpA\\/qPmWakq8yI7iY2nqIkRFooRBHG1yiZKSLdRCSjFg1wz\\/AS7hxaw9B0\\nOdhcMwF\\/QJQJ7qyJwUSgo1B0+wha7Zkspyev88ip+WZIX0Q8CkFJKJRVIigvQVkp30pAhL\\/n\\nVpkIAQVuThY4n2hiEgoyRq80qPqMrCE0GjFDNGms3xNqk9pl3486TKy4c3vILi7r17zj7AJf\\n+GlGuVujUNQyaOTZvomp1nuExpTniA7P84+2DI57PvHjjEqPJkukFV+7Z4tjfMTzFy+y7Bry\\n7BkLe2PjQ45OLXzhXIvUHM9ZEdzQkUnPhr3MsrE\\/wSEeGpOOwxdp1lZCQXCpS\\/PvN6YtG79o\\noDntOTbvNrjh3oyoQ6PzuNjRS3VrPL4hfOYcizihkcMazWu+TeGYpWHfb9oe4ol4oTbqOftQ\\nOHqVZetez2d+mlHuMbMew8Fd7vHLa0cEtIXq88aY6ilTV2VAYyQhSofoiA2Rb2L8BFo3qYll\\nLF7JpmQdDdWNMVGwuJygRYXUQK7AHB435z9PhlMO8W5WmflHpHtzK00ky38KgssTDfKIQr7c\\nmc2VXrimBx9S5j63+tAaJYaBZCfrK9vwYtnuFrPZwe5FdTDMywI4GA+lFbunhOmG0FHRXH57\\nxl6vMXmVf7HDcO3GEE89fV1w1cZ3Z3TVMj746gI7hj3nXZKQVi0m1rhUODxXGAULH35txNEr\\nNB\\/9z5Sj8jKPvcOeT\\/9xic\\/+OGNqGk5eGz5\\/1V2zrt9+x+6hakInwbknW0a2pUwNOxZ3hr15\\n705Pw4T418nrwga48UFPXNEtkuGjc4W3e6\\/nk28v8O83ZWSFA5tvMu05cU24\\/q2bMpK6Z2xn\\nxondjnedVeDBXY73fSuBbouxbWtN5ECY4Ofj1xqhevw4gzcMYL0mNlP4ShM\\/pjFY4kAmgDKa\\nmk8wBYsREOdQ2qCVx7cC\\/wrRkveoqlZ91Ey2USGt5ILWBFDKGc0SoiOIaJTyzPBdiQDah\\/Yp\\nIc+shvSpVjNZ1hzASELSQZglfbWqyaFsZ1nvAm6ejBnrG6Jj5TTRMw\\/y\\/ZklIqAUo1PC+LTw\\nlRs9HUtta80KVcUXr8\\/orsDzj7VcUA2JhecfFfHjOxwXXZ8R9ViiUrjHxsKO8bDaR6y2yFbH\\n+7+VYnotjTwb+MKTYj77o4Rf7IFiRXHMyqAYfrFNiMt6XvfKe2FFv0ZrOO0IywUF2LTT88rT\\nYjY87PjY5RmlDk1vh6enqnFeuHWnYHrDOLWBel5n99unxPzLz1Iu2wSdi2w+X7X\\/+Xohm3Yc\\nszLEB19+ZkxcSjl0ieHIFYZvXZfylZscpT5LVFDtPTgT2335Rwae4rUQJraXGN9aoGRTasow\\nsqsT5ys0007Q3ThlccbjdYaSGPGh1xJtgjKayWlqTQDrUK03rMoj0kqpnKJvLjoHrSyXaynI\\nkJpTeQ5VFEj+u0hOIjPzhKkZb1ZaD6NS4e+iLSob4vlLdjC0M2aH7OaYFz+ItcKjQODbsm8A\\nPvGYoZQv\\/0mR9361yW5jict6nz2TJaFjYGlRWNylSZywcbfgi5pip877H8M6e+eZGnY8ZyGM\\nTwubJ1RwwRRkE45jFyo27fFMW0OxU5E1hNqYx2dCqdtQ7NDzAn4UL8RNR7cSHt7tOHaloVqA\\n7WPC5vHwnTYOFltt3KEUlLsNhUrgxXWZx004juqDzYPCpNGUOjXaqHnPN0s9y9OMC99aJE2F\\nt\\/x9jXVrLLUU7t4pqKqmWNVo20bpfYRi63\\/KlbwIPHz7AnZt7aRSmCCuNHFYRnYdglILwJQC\\nn4FKyYjwOchkUEC6ZWGhzSxn6Q3wAAAGSklEQVQqbstqU7PptjktVfuqVj+L7qZmz0c0XpG7\\nlbmVqWYUW0iPZjJrsQVrUIPSGDwqnaDppugpbeb4F2xpkcO25ZGWTgBdRAV3bnIw46Mvj7j9\\nYcd37oVKj0Hpx1IkQZl4P9M8onhEWHXf7\\/Az9yggMM+4jzP7JFDC\\/XL7OGTWZy248DIMnJpK\\nz+\\/8xxvPfObbmPCcfYjwjt+JuW+b413fTOlcaPPH4\\/HX52AX+6tCdl1x7DBRqcGW29fiBmt4\\nDKnSmEKCQmG1zbOUKgTz\\/cwu0jlGms4rLGYZ4WctMGao4+couVk3VBBE5xZavqlEgNwtFe\\/3\\n2XwzG1fya0mu0Lz3eQLCkziPFs\\/aVbdxyGF7UTOJjrbt\\/ygrpzbqOWUJbBv03Lvdc\\/4fRNQT\\n4Vt3eDoGbCtz\\/OjXbHi4Hwmj\\/lifnVEEj\\/yM0nPo4J6C+zNXeRmj9juuxzr\\/ccezv\\/kKNKYc\\npx4a3PabH3AUqxoTHfg42ortKZRFa6coVu7ngRuXMzGhcGR4lWCUDtwGgFIeLQqvVLDcZtxJ\\nyQJ3AZpZIy1XUCIoFdzKAFu0L3O8Fk9QYXl8TdRsfG6mj3RuLE\\/NxNaESFIyFZN5gxBhJUOl\\nU0TpKOuOvZWFKyZAz8Tz2hvoUZaUg2MGhA++ooAI7B7xjNaE9\\/1bSmWBRWnVfhDn+YJoTnpK\\ndcfhKwLPx8M7PUkNovKjlVtb9hWz\\/oXlv\\/mV+bkKitWUvhWjNIarJHWF8x4RhVYBN82omURA\\nrrA0aHFo5VuWWDDO8iC\\/BpX7kUpJrqjmJDDyujZR+9h4LZc2dBAE6wvxocJEcksOyd1iDd5j\\npYFtjlKxW1l7zO0MLJ9um\\/3zcN8mxzwvOizEvH5yp+Pj\\/xUKVm3cXrz5KzY4bRl89LUFrFF4\\ngees1axfpLjuIcHY9ho9oe75\\/f\\/b97S8P72DXRv7eOjuARqpJsNSKFWwNkJpm8fT8kGJIOLw\\nRAh2TqBXtUJrGo0oHWo1lJ5VXF7lfQJ+HxegpfgQlPK5faZCp4EE286jybRBZ3VKvkYxG6N\\/\\n5f0sP3Ivus0yNW9J657auMdnoRWpUNXo9oN4wIqtMempjztcmscSjaJQDcmF9ktif67o06VB\\nDSw5YohyT42H71jI9FQnjfo4PiqibREbF3BKo7UNNWetpnY\\/k6BsYa2plhcoKAeiHVrpcI6E\\noIiZyQ4o8jhZ7oZKiJt5CS5s6EjI6+GUw2Y1itToKDzEmtO2UO5Ood3PfmCbqqTpLD0CJba9\\nLAcmGopdmmLXY2co2uu5nz34tK6Qgq7FNY7s28Lww10Mbl7I6ERoPWm4FFsok80UZuhQXa1w\\neYYy9IGKz9t7xeXKyhOIgHILTmzoCxWZVYIz2dQZy0+HmJz3LudKCKxU1idU4kEGVj7E4nUT\\ns\\/Zeexe1pS1txbYf3YaJYGDNOAtWjDP4QB97Huil0azQbGZ4HWOiUgB3y0NvWmlmmtCF0Ceq\\n8t81Hp85lFJoHeGV5BwDs6UhJldOLYw0FfCztBJ01iSWhFJhhN5lgyxeO4SxtJVaW9ryG+2K\\n\\/hofXGOFxev3smjdECMPd7B7ywDT011keTuK1sVgk+vZerRgnIWSDYXgfZNKoUA9aeKcxyvJ\\na3tUQHlQak7fJygcWgSfJEQGSoVBVh65ne7FjVluU9XO3LWlLW3F9kvZb+FH78pJeg+ZoDYa\\n0ax1MvxQN\\/V6L\\/WmBbF4UXgJSQa0DoUcCpQUSbTBKY+SUBPnRBDxASbcB45BI4Jknoga3cVp\\noi5PYWCYvjUj2BZFXrs3qi1teZa4os+sp7jUnVLqHqZ7yTBpfRu77+9jalc3mbOk3iA+dAI4\\nLEpbtAJpegoCIllog5EoYOH7BpFOiOMmpaKjWE7pXaipLhoji8dRVlo4WG1pS1ueVYrtmTWg\\nuUnsqJSw\\/JiduMP2kDUU0zt7AEVjuEhjvIIoE5IM4gMvad5LWijXKJSbdC+LMEbjy4NEVY+o\\nDGVmwMRpA0K2pS3PWlf0N2CQJnaYGAqde5\\/c+Y+hNNs6rS1teTYrtnaUvC1taUvbFW1LW9rS\\nlrZia0tb2tKWp1ex+bZia0tb2tK22NrSlra0pa3Y2tKWtrTl6VVsbb3Wlra05dmn2NrlHm1p\\nS1varmhb2tKWtjyz5f8Do0rRt3XbCQgAAAAASUVORK5CYII=\\n--------------020800050700000706000908--\\n\\n--------------050101030504090308030704--\\n\\n--------------030503000903030801000206\\nContent-Type: image\\/jpeg;\\n name=\\"john-deere-logo.jpg\\"\\nContent-Transfer-Encoding: base64\\nContent-Disposition: attachment;\\n filename=\\"john-deere-logo.jpg\\"\\n\\n\\/9j\\/4AAQSkZJRgABAQEAYABgAAD\\/4RUhRXhpZgAASUkqAAgAAAADABoBBQABAAAAMgAAABsB\\nBQABAAAAOgAAACgBAwABAAAAAgAAAEIAAAAAACwBAAABAAAALAEAAAEAAwADAQMAAQAAAAYA\\nAAABAgQAAQAAAGwAAAACAgQAAQAAAK0UAAAAAAAA\\/9j\\/4AAQSkZJRgABAgEASABIAAD\\/7gAO\\nQWRvYmUAZIAAAAAB\\/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEM\\nDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwM\\nDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz\\/wAARCABwAGMDASIAAhEB\\nAxEB\\/90ABAAH\\/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAA\\nAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYU\\nkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14\\/NG\\nJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcH\\nBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1\\nwtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dn\\nd4eXp7fH\\/9oADAMBAAIRAxEAPwD1VDyMjHxaXX5NrKKWCX2WODGgfynvhrUPqGdT0\\/AyM6+f\\nSxa3WvA5IYN+1s\\/nu\\/MXkjaqsjHr619Yr8nKyMl9leNRVs9W01EPyLG5OS70sPp9Fz7MfZRU\\nz3\\/zCjyZRBjyZOGgBZonU8EYxj+lKT23Uv8AGT0TGPp4TLM60\\/QIHpVkzG31Lv0r\\/wCvRj3s\\nWbb9Y\\/r31Bj7MPCGBjghzbHMFZDT9H9Y6o+mm7+vVirnW9dzqWur6aynpFLhDm4TAbnN8Mjq\\nWU2zJyHN\\/wBJ6dKourZbb61w9a483Wk22H43Xmyz\\/pKtLNM9THy\\/l\\/3bTyc2NuOUvDEPbj\\/4\\nZPin\\/wAx3cjI6mbi\\/P8ArTTW789mNk3Wvae7DjdOroq3N\\/kqtazpdpl\\/XsrInn9TyD\\/0snIV\\nNtF32d17Wn0K3Bj3j6LS76At2\\/ze\\/wDwb7P0dn\\/GKbMR9uPbdWd7seXX1R7m1CP1pv8ApKq3\\nu2ZX5+N7Lv0lPqejFKRO569P\\/Q+Ni94y0GIysGVZJ5JcQH6UaljSjF6IPodTyqyPzvsR\\/wDR\\neQ1yOx2Oxm3F+tF9T\\/3bKszGb\\/25XdbX\\/wBFZhaokEcJA0bBLHHmYjbFGP8Acllif+m9HiZX\\n11qaxvTOrUdUZMFleRReZ\\/ds+3txsr\\/wZXWf4w+r9OeK+v8ASnVjdDrWNfQQP5FWVvou\\/rNz\\nti4qxjHfSaHfESrGF1TqnTYHT8u3FY36NbHTUJ1\\/o1vqY\\/8A4GpI5Zjr+yP\\/AKkZ4c2O84fU\\nZh\\/z+D\\/pvqHR\\/rh0DrG1mPkirIfxi3xXaSZ\\/m2uOy\\/6P\\/aZ9zFtLxqzN6JnNI6tgjGsOrs7p\\nwDB\\/Wyel278W36XqX20frL\\/8Guk+pOVk9E+sWR9Vsq\\/1cdzN2H9LZuDW5TXYtbt\\/o15eJa+6\\nyn1PSqvxbtn56nx5+IgHQtzHm4q1EgdOKP739aEvlfQUkklOzP8A\\/9Do\\/wDGf1H7P0WnDaRu\\ny7d72kTNeOPtDv8A2ZGIuO68BX1IYDCDV0rGowWEcF4Y3Ly7oHt323X1er\\/wlK6D66E5\\/wBc\\n+mdOMWVMbQHV9v0tzrMkH+tj4tS5B15yrbcsgA5V1uQQOP01tl3\\/AFL1RzSJykdIj\\/pf+iTa\\nHNzqM\\/60o4\\/8GH6yX\\/SgyaruBRddcRVinNge6rc5gA\\/f+0MdWzG49t1\\/6D\\/SV2qm1WMbEtzr\\n68WmoX3PJNNbto9waXPc115bUx3pt+luUR8Whj+eOhlr8o\\/S8P0nTo\\/YWBmeq7rNb9ri30Ka\\nH5hfQ4N9XFzn4Rsxtz278e9tbLsf\\/tQz\\/uPTqdCwOjMtt6riZ7cnptdd7LaSxzX0sOvoXG6x\\n1zvRxmvZ+tVU3W\\/zqji\\/VDIAac\\/L9MA6047S7SOPtF\\/p1t\\/sY1ysdT\\/Z3ROltxRivza8630r\\na7LtrrBsdbY++72foqqMfb6FdbKv8F\\/h7VRzc1jMhjxZuLLOUfRj4Zx0PqlGXphCXD\\/rv\\/QN\\njl8Uojjy4I4cWPiyAymeKEjH1f4Dx9U+lW15HqbGlzZ14G7RJwWj1Dqt2YXMZVXhYZduZh0N\\nY2T+bbmPpDWZF\\/7lbP1ej\\/u1b+nWe7lXYmwDRjfQ7j\\/F4ouNkjCMqhP3AN5AcMeL+r\\/V\\/rIn\\nBCciuQ3J4QEZj4q\\/k51uPV0HrQJe\\/AacZzGiB\\/k671q2b\\/8Auz0\\/N2f9beqDloU\\/p\\/qr1Gom\\nG4GdiZnxGSH9Ksb\\/ANLenR+Yfy8f+lwtvlifUP6vEP72P1h9i+0Uf6Rn0PU+kPof6T\\/i\\/wCW\\nkvJ\\/2i\\/7B9sjT\\/mz+zok\\/T+2fsnf\\/wB\\/SV3j\\/wCjxOnxj\\/m8X0f\\/0bmTbs\\/xl5OVMtxd1p+F\\nWE2R\\/nuXI4ojHpHhWz\\/qQuizCf8AnV9YT+d9mz9vx+zMhc9WRsZ\\/Vb+QKhLWUpdzw\\/4vq\\/8A\\nUjmc38o8Z5Jf9z\\/3KdqnDXNLXgPa4Q5rhII\\/lAoQOkpxfUPz2kjsDKZXZpU9d9TsN1WPbk77\\nG0uPo0UGyx1QDYdbbXRZY+ln6T9Ez02ez07EH64PBzcJg5roud\\/24+ln\\/R+zLc6PW2npGFW0\\nQPQY8\\/1rB61n\\/TsS6l0zE6nUxmTuaaiTVbWQHs3R6kb22VuZbsZ6lb2LncfNYx8RlmynhgDO\\nIlV8Pp9qPFGP7z0c+WnPkRhieKcoxNyN8Rvjl6pPCEhQcfFdUPqdh98y8\\/Cuof8AkkOz6l0u\\nP6PqFjP69DH\\/APUXUrXHP8oTXvR\\/5w\\/7lyP9F80P0L\\/wouB+zrrenv6hjn1aqNMysfTp\\/wCG\\nc3\\/C4j2+\\/wBdv8x7\\/X\\/R1eus9y7XpHScjoGVk5tmSy3EFBJfUyz1Q5jm2Ne\\/Ea25ztrPV\\/mb\\nb1x2W\\/Efk2vwWPqxHvL8euwBrmMd7m1ljXP2trnZT7v5j0\\/z1Nh5iGWUxCpRhw1kieKE+OPF\\nV\\/vw\\/SirmeV9rHjmRwTlcZ476x\\/Tj\\/VmgcrvSh6mH16g\\/Rd0m2\\/+1jWVW1\\/9KxUHLQ6If0fX\\nZ\\/8AKTO\\/Ljqc\\/LLwjI\\/81XKD9dAd\\/wCCP7T\\/AJJ9Lt6O35ftL7TtSVCX\\/ZfL0\\/8A3Y\\/8kkn8\\nR\\/YzcZ\\/8ap\\/\\/0rOVUH\\/4ysvDGjcrfUZ\\/4bBZ\\/wB\\/XIYzt2PS7xrZ\\/wBS1dn9cz+z\\/r703O\\/m\\n67RjPfYeJZc\\/HyP8zHtpXHuodi2WYj9H41llDvjVY+g\\/+e1RyaTkOmh+3ic\\/mo+k+GSX\\/PjG\\nQen+qbuiXzh34lNnU3bnVPyGixtrB7wyht3q1U3Uf4VldHq+j+sfpv03p36Prwxjvs2bh5WE\\n+p5qtbSa8iuss9jxtxX13+xw\\/wAHjLiw6PvB5ggjVrmub7mPa76D2e+talmXjdWLft1rMPOY\\nxrB1B8+hfHsrZ1LZ7sTJb+Zns\\/V7P+2MVUM\\/K8cyZyySxT6RnP8Ao8v3oQ+X28n6X6v9X\\/su\\nP25eX5uQxjHjEI5Y6Dijpmj24vT+s\\/6b2+F1Pp\\/UGh+FlVZE8ta4bwf3bKX7b67P5Fle9Wdl\\nn7rvuK806jg34uQcTqFLfUa1rgH7bGuYZ9O2p\\/ubZU7a7b\\/3yxV9lYbsAIrAgMD7A0fCsWen\\n\\/wBFUpfA4nWGY8J2uHH6f78Zw4v8Vn\\/0vwkxyYTGQ0IB6\\/4XC+pulgl8MB\\/eIb\\/1SiHtcDtc\\n10c7XB0f5pcvLG4+K36FFTfMMbP3xuRsW+zEyGZOMRTfWZZY0DSdHNc3T1arPo20\\/n\\/8b6Vt\\nYPwLQ1nuXS8fCP8A0pNUfjMTIA4iI3qeK6\\/weF9O3HkGD2IXn31kxGYfWsmupuym3ZkVsGgA\\ntG6xrP8Ag\\/tLb9n7i6Ppn1q6flsZXmPbg5Z0LLCRU4+OPlvHpe\\/82m91WR\\/Is\\/nFH6zdDyOq\\nV0ZWHsN9LXshzg1ttbj6rK68ifQbbTd6nper6dVn2i39PVsTPhvHyvMyxZ\\/1QyChx+mEskfl\\nIn8n7\\/qZ+dhHmeXEsREzE8Q4d\\/F4hxV3pNnpYnXrz9BvSLqT\\/WyLKaqx\\/wCBqjkMuoufRfW+\\nm+uPUqtaWPbOrd9b4d7vzXK5Q40\\/VXqVpEs6hnYeE3y+zB\\/Urnf5li3yNCD19B\\/6p6P+6crl\\ngY5LOnADL\\/FY+gf2V6vb0p+X7R+zJK59iv8A2Z9jkbv+bX7Uny\\/aH7W2\\/wDbftSVj2vPa9v+\\na2va8P8AJ8P1f\\/\\/T2\\/8AGz0439Ixc9rS44trqbCOBXkt9Pc7\\/wBCq8Ri4zrzm2dSGczb6fVK\\nKc5obpDnsGNlsd\\/wjcrFfZZ\\/x69g6z0yrq3Ssvptp2sy6nV743bXEfo7Wt\\/eps22sXjOJm4N\\nuEzo\\/WfXw8rEssfRc1m80ets+2Y2V09\\/pZFlPrVer+h\\/S+p\\/4JV5kESjMAkaiVerQ\\/pcP+BF\\ngzQEhIaDjAonQccPH+tFAHKQcRwju6J1L0\\/WxG19SxwAfWwHi8Dd2fjjbm1v\\/f8A1f2fvqj6\\nzGv9N52WDQsd7XA\\/1H7XKGMozvhIlW\\/Drw\\/3v3WhPDOPzRIbXrP9BmPuPo1Fzqq\\/zWGyPV9I\\nf4Jtu1rrGM\\/R7\\/0n0025B3J96VLCCTZN9NUkpiUPemL0aQIpC7nz0ITUZV+HYbMO2zFsMFzq\\nHmvdH+kaz9Hb\\/wBdZYgPsDRLiGjxJgKeJi5ue4NwMe3LJIE0sc5oJ\\/euj0a\\/+uWJEDhPFXB+\\nlxfJ\\/hMmMTBuF8X9V6Jl9n1q6S7Es9\\/W+mh12KZawXVuLfVrZWxoY11rGspfWxtf69Xg3+yr\\nJvWNl4tt+J0Po1YNeRnh+TucRtLuo3DDwnbW\\/wCjwMf1X\\/8AGItGHjdJyGZPVOojFyaHeo3B\\nwduTl6Ese261pd0\\/D31u\\/wAO7Irux7Peui+otd\\/1i+uOV9Z7a3NxsYEUu3Fw9RzBiU0+qdzM\\nh9OH9otyfTs9l2VUmcvG5iMNcMbnGQvhjfp9qH6E8XqlOHB6Mf8AN\\/uOjRkAcgrMQIz\\/AK0R\\n6uOf9b9B9E\\/ZfT\\/9A3+Y+yf9Y\\/0H9RJWklo0OzK\\/\\/9T1VU+pdI6X1aj7P1LFqyqxO0WNBLSR\\ntL6n\\/Tps\\/wCEqd6iuJJKfP8Aqn+KXFfYb+kZrqHglzKslvqgGZrbVk1mnLp2f6Sx+VasnL6N\\n\\/jHwKnUXVu6piNO5zXGrOrd\\/1vNFXUXL1ZJQ5OXxZK44iVfLxDi4f7vEt4APlJj\\/AHTp\\/i\\/K\\n+IXZdOPY49V+rjKnkTtr+2dPie\\/o7bqlVHUPqy536THzcefzasvHsA\\/9i6mWf5y95SUf3KHS\\nUx\\/1TKR\\/iyn7f\\/MW+3Z14Zf3oR\\/7jgfCHZv1RA9p6kT4G\\/CH4hpTU9T+rwdtZ0m7LB+ibs9w\\nP\\/bfTqV7wkl9yjVGeT\\/HyQ\\/HFPGr2x0jCPlD\\/vuJ8Xwm\\/WLI2N6L9XqcYuM0ZTcJ9jx2\\/wCU\\nerurpWwz6hfXXrvv69niil53OpusN5a5ulZGBhnG6a3\\/ALfsXqCSdDlMMZCXCDMfpy9WT\\/wy\\nXrXcJ2MiR2+WP2Q4XlOjf4tfqz01rDfT+0bm67smDWCRtdswmBmJt\\/OZ6lVt3\\/DLqgABA0AT\\npKcADZIAGwpSSSSKX\\/\\/V9F6\\/1U9H6Nl9UFX2g4lZs9Lds3R+b6m2zb\\/mIXUfrN0PpNdR6pmV\\nYtlrWvbSXbrCHT7m01h1zq\\/a79J6a5361\\/Wzo3Vfq\\/n9L6Yb8zPyajVXjV494fucQ33B9Ldu\\nxSxc7D+rv1p61kdbqfR9vfW\\/E6n6T31upDGM+yetWx\\/pei5v0f8A329SMz10Irv0C0yHQjz6\\nB6M\\/WPoI6cOqfb6DgFzWfaGvBYHujbW4t+jZ7voO+grOf1LA6dUy7OvZj12WNqY55gF79GM\\/\\ntLzfq7W5GH9Zur4uFbR0\\/qN+AzFc6o1m6yq3dkZTaSG3NY\\/f\\/Oen+m9f\\/uR9orr0vrR0v6yY\\nuHiWdR6yeqUHNxmjHbh10w42Dbb6uOXv9iByGpabUgzOuj2uH1Tp2fZkVYeQy+zDsNOSxhl1\\nbwS0ssb9JvuY9Cs6xinAzszDc3KPT\\/WZaxrtsW0AmzHe7a703bh+4uIwei9Ttt6t17ozzV1j\\np3Vs5jKnCGZWMXstswbZ27tz932d\\/wBD1P8AR\\/ocrE0vq7a\\/I+qv1gyHVPqdk5PULhS9rg9v\\nqN9T0ixwa7fW53p\\/R+miZmvHX8FcR7Vv+DYx\\/rZ9Z7sOrqDfqy9+FbW29tlOXVY81uaLGvqx\\ntjLrHbHfzW31Fo1fXH6uu6didSuzGYlGc17qRkfo3TU4VZFbp9u+i13pv93\\/ABe9ZXQfrd0b\\nB+r3T8Sz7TZl42HSx+PViZDnGxlbQ6qt\\/o+g52727\\/V9L\\/hFzmTjdRwruk9Sufb0fJ6hldU6\\ng94oOU7EGR9nbVW\\/FY1zrn2U7K376q31PyPfUz0UuIgWDe30UZULB4nvKvrd9WbqrrqepY9l\\neMGG57Xghosd6NRdH71rtiWJ9bfqzm5NeJidTx7si47a6mPBc4wXQP8ANXJdW6k7O+pnVMOz\\nqNvW8ttmPZudhWYRFb78euuhrDWxtn6Su79J9P8A7bWl9XetWu6m2jL+sF3VBkMdVTiu6ZZi\\nD1f50W\\/afSa32U1Xex7tiPHrVj+X+EkS1rwGrrN+u\\/1RcWj9r4oL4jdYG\\/S43bo2\\/wBpHzfr\\nT9Xen3\\/Z83qOPRbta\\/Y94B2v+g7+1C8\\/xGfWin6hY12JeX9IvZbTl4teOH5FNLrLa8jIbve1\\n+U1\\/6V2z9X9Guz6fp78qm\\/fkHp\\/UWV9N6xd0zCb0zp9eNkDAdmG+lgyfR3BlP6DY12\\/6Ffqe\\nt\\/wKb7h06bfy+ZAnpqK0B+16r\\/nx9UP\\/AC3xf+3Akuf\\/AOcF3obP+c+R6v2f0vV\\/Y9v8\\/wCt\\n63230\\/Q2\\/wBE\\/Uvs381\\/2p\\/nEk7i8R\\/L\\/CTxDu\\/\\/2f\\/bAEMAAQEBAQEBAQEBAQEBAQEBAQEB\\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf\\/bAEMBAQEB\\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB\\nAQEBAQEBAf\\/AABEIA7YDRgMBIgACEQEDEQH\\/xAAfAAABAwQDAQAAAAAAAAAAAAAAAwQKAQII\\nCQUHCwb\\/xACBEAABAgQCBQcHBQcMCwkLABsBAgMABAUGBxEIEhMhMQlBUWFx0fAUIoGRobHB\\nChUjMuEWGkJSWJfxFyQzOWJ2d5Kit9biGDc4Q1dyeJS1ttclU2iClqjT1OcZJjQ2VoeVuMLS\\n1TVEVWSYJ0hUY3ODhIWIsrPExyhFR4akp7TDxv\\/EAB0BAAEEAwEBAAAAAAAAAAAAAAACAwYH\\nBAUIAQn\\/xABlEQABAgQDBQMIBAYIEgcIAgMBAgMABAURBhIhBzFBUfATYXEIFCKBkaGx0RUy\\nweEWFyNCUvEkMzVUVmKV1DQ2Q1NVcnN0dZKTo6WztLXT1TdEY4KUotIJGCUmZHakwoOyRYTD\\n\\/9oADAMBAAIRAxEAPwCfRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDOYmWJNl+amn2ZeWl2XX5iYfcS\\n0wyw0lbjrzzrig22y22kuOuOENtNg5qSBuxbv\\/Tj0P8AC\\/XbvXSPwjpk4ylZepcheVKuSusb\\nMgHbUG13a1W2lKUv6MOyKQ9s3Q0HNi6U4c5UJGnt9tPzspItE27WcmWJZu\\/LO84hN+4HhDL0\\nxLy6cz77LCbXzPOoaTYaE3WpItcj2xlhBGmu\\/eXL0IrS8obtZ\\/FLFB5KXEyzlp2KujyDziVE\\nNl2YxAqdmzzDLu5wOJpcy8hvjLl0FkYS378oTqSy5L4XaNckwAhexq9\\/X+\\/OlSiohra2\\/b9v\\nU\\/UASnaOFF0ObVbmyAaDW1egNS2v7N6WD5xiymvqAFk03t6rmJNrJXTWZpo95KwBxIuL6WYx\\nRQpe4VUGnFDcmXS5MXtyU0hTY37ysA62N4k3QRDJvflxNOa6lv8A3O1HC\\/DNpe2TLi0cPpaq\\nPS6VILbRL2IFRvVt6YayDu0MsiXXMD\\/wUMZSoxBvTlBtNm\\/\\/AClNxaTeLrbM2HBMSttXTN2P\\nIPNPM7B6Xdp9k\\/c7IqlnmvMclPJ\\/J3AXM2fpXSYDUfKVwPK5kyNPr9TWM2VSZWVlJdRG4FyY\\nnA+AeYlVEDUi+kah\\/HdLb0Zlpx88ylppBGhBBLql+otiJ8NQqVOpEq5P1WoSNLkWMg9OVCal\\n5OVa1jqpLsxMOtNN6xIA1nAM+YbzGO13aZWiZYSHk3bpJ4JUp+XSVOU39Uq0p6slIS6slNFp\\n1Vm6w6M2nUZsyS9dwpZyLzrbaoAVw3ZdN3Tvzhddy1+56gVOK8tuGs1GtThW8UbZflNSmJp\\/\\nWe2Te1O088tt55kAxwEQef8AKjf9JNMwgw3uDbs\\/V3HrghObNLy8jL5ddLJmSLAKv6RSNU7j\\n+YV\\/Q9NaRbcXX1u+BIQ2yB3jMd1rxODuvle+T8tQutpxyNyzjRd\\/Wdp2HiJVy7qiZGs1UlWv\\nKUBxJeY2SMqtm55RLzGr5I6ZoY6XNy9Wh9SddqgWVjtdj6V5NPS9rWhSKa4EuJSpS5ir30xU\\nUazYLrI+aXAvINvbEkkRB4Ih075SuPZjMmWlMPSCSRkUzITbzqQCDqqbqD7SzoRfsE9wG+Ne\\n5jWtuXyiSYG6zbClEd\\/5V1259gvwtoZOVw\\/KF7dZS4m1dFyt1FagUsu1\\/FaRoyG1KZUNq7LU\\n6xa8Xg1MapLCJyXLzBJ8pZcybjouv\\/KB8eJlbn3L4D4TUZB2mx+fqreVyLbJaAaLi6dUrWS5\\ns3AtboQ21tGvohsVJU85oBioSo8Ek9gJiLzW3fahNFX\\/AMyGXQoW7OVplIZA0sSF+YKeubby\\n6bH6towHMT19wAKqS06\\/1NiWb320uhlJOvMm943K17l0tN6sLUuQlcF7WSXW3Q1QrCqz6W0t\\ntBtbCfumu+4Xdk84PKHStan0v5Bh5lj6COoKzywvKFVZpbDeOctRmXGHGXk0bDPClh1wObtq\\nmbmbKnJ2WeSDk27JTMuUdO0GcazNk4fwfaB7zFdivq9cR2Y2o7QpoFLuMcQgK39hVJmVO8Gw\\nMqtkgG1ikaEaEW0jCXWqu4bqq09re4RNPNgg2uMra0pHs0F+F4zeq\\/KT6d1bLxndJzEpnbNh\\npz5pnabQNVII85kUKnU0S73S+wGnl7\\/pSOPXtT02dMirrU5O6VekPk4z5O4zKYx4gU2Uca84\\nKSuTp1flZRwLStaXFqYLjiCUukjdGMmwX0p9Z7oNgvpT6z3Rp38Y4rmRlmcS4hmEk3KX61UX\\nhccbOTChfU62vqeZjFVPTizdc\\/NKPEqmHlEg20OZw8dTfvvuMdsVDSAx8qzSZeq434u1KXQ6\\nH0y8\\/iVec4yh8JcbS8GpisutB0NuOo2gyWEOOdMfKT+ImIdVcbeqd+XnUnkI2Tbs\\/c9cnHG2\\ngSdRtb866pKNYrOonzdYk5CPktgvpT6z3RTYr6vXGtXWaq59eoz69315yYVe39s4fffhyjHU\\ntS\\/rvLV\\/bKUTpa28ndfq2juoVesVctLqtUqNTMuFJYNQnpmdLIcILgaMy67swvUSV6mQVqjP\\nmMcfF+zX+KfZFpSocQR2giMNyYcdWXHVrcWq2Zbi1LWbAAXUokmwAAuTYAcBaE5Qfzr630tx\\nt46nd7NOdIIIIR2g4g\\/H5QdmeB698EO5Cp1SkuOTFKqU\\/TX3Ww049Tpt+SedbKgdmtxh1tS2\\n9YJWUKVqkpByG\\/NpBDrbym1pcacU2tJulaVFCkndopJBG+xsdYTlUOF\\/DX5\\/D2iPrZLELECm\\nv+UU6+LxkHyhTZfkrmrco\\/siQVN7ZmeQ4UKIRrJ19QhAA6I+qp+P2O9IQ63SsbMXaWh5QW83\\nTMSbzkUvKAKQt0S9aZS4oDdrrBI3gnfHVEEZ6KvVEWKKlPoOtiicmE77cnLagd19L3j1LjiP\\nqOLTb9FSh8DGSdM009MajGWNN0qtIltuSZDErKvYzYgzcixLoaDTbDdOnbgmZENMtjZsIMvk\\nxqDZamQMdgUnlKNO+hGXMnpPYoP+S7XZfPFTk7hCtuHdczAr8jUhOEB5zYGb2+w+i2OxLTWy\\nwsgjZS+L8VSoCZbEuIJdINwlis1FkZrJGazcwkX9Ea79B+iIyUVCdQbpm5lJG4pmHUkbuIXf\\nS2nfrGySj8sJyhtGbaaVj0iry7LTjaGK1hphPPKCluKc2rk81Y8vVH3kZlLZfn3UbJersyAy\\nGu26Fy6OnRR1oXPu4QXSlC2FFquYfTUulxLR+kaWbauO3XNWa3eUFpxpxP8A8rOS3GNPSmUn\\n6pKeriPbv9sIKQpPEbukcI3cttMx9LAJaxliIgG4D9Umpo8BYGZceOXQAJvYW0EZrdcqySMt\\nTnxbQBU08tNuACVrUn1Wjfpb\\/wAoP0hpXY\\/dRgbgzWQksmY+YJq+La2oDhMwGvnGv3WGC6zk\\n2xtBMeTrzddE0M2Y72tr5RDSXEtt3hor1KUKQnbTttYtytSS8rVdLq26ZVMP6VsACmXS22ur\\nTO02jylPJLTTbsZEgHiPTzwmpBHDePHj4CJFKbb9p0oUWxKp9CAE9nNU2kvpWAmwzrVIB8kG\\nxzB4KJHpKUCQc1vE9db+rUHDzDjUu7\\/rGlW9Vj3iJelrcv7okVRKG7ow5x4tWbURtHGaBZVw\\nUltJQylQE5KXzKVIqDy5g6oohQWGEvbUPP8AkrWSFqcslye9zhtD+NFRtObdP\\/gV1YdYiSih\\nmlajtZ+l2xV6G0E5ZEPVVvaKISztMyYg8QRJ5Pyjsey+QTMvQKgkEFZmJCZacUkEXAVJz0uh\\nJ00UWlAE3KVDSM9vGtabN1eaPf3Rgp15\\/kXGteOmndaPQjtDTh0Ob82SbX0nMDpyafKQxTZv\\nEq1qLWHVKGqEt0et1KnVRe9RSSmU8xee\\/hnkjR67RbjkWapb9Xpdcpr4GxqFIqErU5B1Km0O\\nILM5JPOsOBTLqHEFLhKm3G3ctVQjzSVJB6j44w+o1er1tTqajb1Zq9BqAQW0z1FqU5S5sJOR\\nKBNST7D4Sct6dpluAy3RL6f5Ts0MqalhKXd9L03JGquyxAsLZWX5Oazm4OhfQCNNANdi1jyY\\nH7fTmXNBq0+trxNltvcOF9+8x6YkEeezZunvpqWAWxbGlBjU0yx+wyFavut3ZSmc3Q9qs0q7\\nJmuUxpK3Rrrbbk0tu67pdz2roXl9ZHLi6fNprZ+fLow5xJS0kJU1e+HFIkkvBKgpBeXh67Yc\\nwVJA2RUh5vWRlrnagPCb0\\/yj8GTISmeptdp7hAKlBiUm2EkkCwcam0Pq0N7+agaEb8ubas45\\npq7B+VnGSbapDTqBcakntG12HCzaiRrYHSJtEERZ7D+US3ZLLaZxP0Z7dqra1na1Kwb+qFvu\\nMI8zNTdFuCgXKmbUSHPMVX5MHWB2mbeTubeHnL26Fl0iUZvOj4vYYTi9VM5MVu0afcdDlnCV\\nAmXnrNrtcrM5LoSEKW45bcq6VHzJZWQWZ3Ttr2zmplIYxRIsKJIy1FEzTAmwB1cn2Jdm2uhD\\nhSdQFFQIjbMYnocxYCeQ2o70vodZtc21W4gNn1LNhqdxjd7BGGGHXKFaEmKqmGLO0m8J3Zyc\\nTrSlNuW427Dq81rZkNS1Fvxq2aq\\/MpAU4ZVqRVMBvN0shkawy+p9Rp9YkZepUmfkqlTZtsPS\\nk\\/ITLM7JzbQzSHJaalnXWHmyoZBxpxSdxAJJzieSVRp9Sb7anT8lPtf12SmmJpu9gfrsLcTu\\nIO\\/cQeIjcszMtMDNLzDL6bXzMutui3O6FKFu+ORgggjNh6CCCCCCCCCCCCCCCCCCCCCCCCCC\\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOErtfo\\nVsUqbrdy1mlW9RZBG0nqvW6jKUqlyDRyb2k3Pz77EpLtlSsto86hGahmSRGuvGLlcNBLB0zc\\nm9jFL4k1uVzzoeEFNmb8MwQMlCXueVVKWEpQP4Dt4NOa2WQyzMamq12i0Nnt6zVqdS2iCQuf\\nnJeVC7WBDfbuILirkAJQFKUdAknSMaZnZSTTmmpliXBFx2zqUFXchJIUs79EgnQxsvgiL\\/i7\\n8oWrj\\/lEjgLo\\/UynjJfkty4t3HM1Va0qOqjbWZZ5pKZdbSUlZUm+psOrcKAygMkv6u8WeVQ0\\n6sX1TLNUx4uGzqTMawTRcLWZHDqVl21gh1luq24zJ3VMtLGYPznX55aUFTeezMVJW\\/KCwBS8\\n6JF6oV55NwBTpRTLAWOC5moKkxkvoVsImN90pUL2jU3jOkMXSx284oXsWm+zbuOBW8W1W5FD\\nawbaaEEzf79xTwxwqporGJmIlj4e0tSVrRP3tdVDtaVcS3nrbB+tT8miYV9YKbZLi1OZJAzy\\nEa68T+Wa0DsNzMS9OxFuLFSpyxUh6mYX2dVKn5wIIUxXbnVaVpTjbn1UuSdxzCTkM9UbzCgr\\nFardyVGZrNxViq12rTqi5N1Ws1CbqdSnFndrzE7OuvzLy+OanXVEjgY4+KirPlM158rRQcP0\\n2mtm4D1RfmKm+BawUhDP0ey2rcQlYfSk3Bz3uI9M46nnNJWUlpcfpOlcw5w1BHYo4WIU2oWO\\nmupkrYm\\/KFZ5ZmZTBvRzlJdIUryWu4m3k9OFxIKQ2p+1LWp8kWVHLNwovOYGeQGRQC7r0xK5\\nY\\/T2xGVMtSWJ1Hw0pkyNVdLwzs6iUgMpzJHk1crrNyXdK6uf1mbiQSMwonPdq6QyTvVuHRzn\\nuhyAAMgMhFVVja\\/tErOZMziioS7av6lS1NUlCRocoXTm5d5Y9EX7R1ZIJBJClCI3NYjrMzcO\\nVCYsd6WVCXRa1rES4bChbeDe\\/Ekx2NiBjPjFizMuTeKWKuImIkw4vXJvS9LhuZtGqsutIZar\\nFRm2pdhk7pdhhtphhH0bLTTeQjrqCCK6mpuanXVPzky\\/NPq+s9MvOPuq1J1cdUpZFyTqTqST\\nqY0i1rcUVrUpalG5UolRPDUkknQDeYIIIIxCsDdr1z\\/XAEE93j18bQQRclClcAe3m9fCFksf\\njH0Dv7oQVqPG3h1eFWSnfqfb7tw9cN4vDazwSfTu9+UOwhKeAA6+f1nf7YvAJ4AwmAr5DTv+\\n7dDUMHnUPQM\\/acvdCgaQOYntPdkIcBB58h7T49MXBA58z7PHrhJWkcb+HVoQVKPE\\/D4QiEpH\\nAAdgAisLaqRzD07\\/AHxdCe0HAde+PIQyPQfUYrqK6PaO+FgDzAn1mLtVR5vh748znkIIb6iu\\nj2jvg1FdHtHfDjUV0e0d8c\\/S7Pu2tol10W2bhrCZwlEoql0WpT6JtTbi21pl1Sks9tlJdbdb\\nUGyvJbSt3GHmW35hRQw0t5YF8rTa3FWJCQcqAVWzKAvawJA3kQcbcTuHEx8xqK6PaO+DUV0e\\n0d8dwU\\/AHHarNuOUrBbFmpttKS085TsOrvnUNLUCQlwy1HdCFEAkA5Hhuj6+W0QNLWdl2puS\\n0XtIiclX0hbEzK4KYkzDDyPxmnWbbU06kngUKyz54zk0isL1RS6gsa6pkZo7iBwbPEnu01Nj\\neH0Ssy59SXfXpf0GXFac9EnSMb8j0H1GKRlu1oI6ZzzbbqNF7HIJdQhxIdw5uVlwB0ZpDjT0\\ng28y4Ac1tONocaI+lA5+WkOT402akHTL6MeLjYaUkK8vteYpRIXraobTVFSanh5vn7HaamX0\\nhAzMZ6cK4pVbLhuvLuLjLR6ibjTUWlzcWudO6HBITxNhJTZJ3ASzxP8A\\/SMMSlJ4gHtAMJlp\\nB5iOw9+YjOL\\/ALnHpwn\\/AOpmxL\\/9GSY909Fp5OHTi5tGjE0f\\/g2TP\\/6d8YV+CWK\\/4MYh\\/kSp\\n93\\/0vf1YwsU6pDdITv8A4V\\/\\/AIcYNlg8yh6Rl7Rn7oTLaxxSfRv92cZrz\\/J4ablPZS+\\/oy4s\\nONqdDITIW45U3tcha98vTnJx5DWTZyeW0lpC9k3tdo81nxX9gTpp\\/kv43\\/m+r\\/8A1KBWE8UJ\\nNjhyvA8QaNUgR6jLX74PMqgnRUlNj+2lngbetHv1jDqCMmXtDjS5YQ4\\/MaK+keyy02px157A\\n\\/E5ptpttKlOuOuqthIabbSkrcUtQQlAUenL4uo6PWPNKZTM1LBLFymy63Qyh+o4bXnJMl1SX\\nHAyl2ZorTZdLbbi9mPOKG3NxjDNHq6BdVNqSOPpSM0BwudWhpwHO0IXLzKR+UlX0C17racSN\\n43EoHMXNxyPf01BH1VVsm8qEXxW7UuakGTQHZsVShVWniUQ4hDjapjyuVZLIW2424C4U6yXE\\nDnzj5WMV5t6XUEPsutKIvZ1tTSiBpcJWASLgi+guCN4IjHyXvplI4G\\/s3C1vWefeQQQQgEHc\\nYSQRvEIrZBzKdx6Ob7IbKSUnIjL49kP4oQCMiAR0QtKiO8fDwj1KiO8fDwjjikHqPV7zCRBS\\nd\\/2GHq2SN6d46Ocd8Iw6CDuPq6\\/VDoIO6G8UIB3GFFIy3jePbFkex7CKkkb+b2+nx6oSWgLH\\nQRwPjmh3Cakc6R2ju7vAdSu+h9vzgjjVJKDkfXzHshFSM949Xjx8eSUkKGR9fOOyGi0FB6Qe\\nB8c8OAkG4ghpH3dj4pYm4YzfzhhviNfeH1Q2wfE7Y93XBaU2HwEpD3lNBqEg9tgEIAc19fze\\nIyEfEqRnmRx9\\/wBvjrhKMuXmXpdwPSzzsu8nQOMuLacT3BaClQB7j6oUlSkKCkqKVDUKSSkg\\njUEEa6GNmmG3LB8oDhrsGEY2O35TGC0TS8S7at27duGuIfrz0hK3asOgajurcIWv6+53J2Ni\\nmGHyii95Yy8tjRo5WpXELUgTVXwwu2rWqqWG\\/ausW5dcteInSU\\/sbC7qp5QeM0oHViNvFik5\\n7xx5x0+PHXOqRtX2gUcpTK4nqTqEkfkqi4iqtqF7lBFRbmVISd35NTagNEqTZNtxK1+rSxAa\\nn5iwsEpdX26Lcgh8OJT\\/AN0DusYm1YVcuLoH4iGTlrlua+cHalMpSgy2ItlzzkgmZ8wLaRWr\\nFfvKmtSyla5Ynaq9S21NJzmW5R5ewjZThnj7gfjNLiZwlxdw1xHb2KX3G7LvO3rinJVvJK\\/1\\n\\/IUufmZ+nutg5OsTssw9LrzS802dx82YgEZGL5ScnaZNsT0hNzMjPSjqX5Wckn3ZWal3kHND\\nzEwwpDzTiTmUONrStPTmItSjeUfiFjIitUSmVNCSkKdk3H6bMLFkgqVn8+YUs2UohDLKSSEj\\nIBeJDLY1n27CZlpeZSN5QVsOHxUC437Gh4X1Hp7QR59WEHKaadOCJl5ez9Im+atR5dLbSLfx\\nBmJbEujiWayIkZZm+pauzVJlgMglFDm6Y4lGQaeQDkdp2DvyiXE2kiWksd8BbSvNlCENP1\\/D\\nKu1OyqmjUV\\/4W9QLgTd1NqUytsHasS1Vt6WU6dszsmR5NFsUXb5gipZET\\/0jQ3lZQozsqZmW\\nC1FIARMSBmVlPpX7R6XYSkJJXlGsSCVxjS3rCYS\\/KKO8rR2rY8FM5lnvu0PXraWPBGpXBjlq\\ntAnF9UvI1PEStYO1uY1Aik4v269QZTXUBtSu66E\\/ctlyrKFHJC6lcVOU6jJexTk5s9ntnX1Z\\nOIlEYuTD68bWvi3JrJMrX7QuGlXLRJkhII8lq1Fm52RfyBBOzeVnmOA42vSsQUOut9rR6tT6\\nkjKFHzObZfWgH+utIWXWlDil1CFA6EAxI5aekpwXlZph\\/S5S24hSx\\/bIBzo\\/7yQd2msfWwQQ\\nRt4yoIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\\nIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+DvvEnD7C2gTF0Yl3\\nxadhW3LBXlFdvGvUy3aWhaEaxbRO1eZlZdT68gWpZpTsw6rJpppS8gNP2PvLuaJWGJn6XhJT\\nrux9uNkFDMxQpRdnWJ5QlKwtqYum5pVNYeKHtmEvUa0axIvo27rNQIDO3j9cxVhzDTXa12sy\\nFNBGZDcw+nzl1INiWZRGeafsb3DLLhFiTuNsGcqUhIC85NssG1whS7uqG+6Wk5nVf91B3jmI\\n3ex1jiVjBhVg5RjceK+I9k4b0QhZbqF63NSbeZmlNlILMiKpNy7lQmlKW2luUk25iZdW4hpp\\nhTridaHDjpy2emvi95ZT7Pr1u4EW1MnZtyGGtKC7kclt+qmcvW5F1asMzYUrWVOWyi2PNQ2j\\nYgbUPaqrpvC779rk1cl8XTcd5XFOnOeuC7K3Urirc4c1rHlNVrE1Oz0worcdX9NMKJWtZO85\\nxRmIvKQoUn2jOG6RN1d0Zkpm55Ypslm0CXENZXpx9Gtyh1uRXawzJvcRKdxzKozJkJVx9Q3O\\nvqDLd+YQnO4sdxLR48NZhON\\/LsaIeHLlQpuF1OvjHivy+aZeaoFOVZtkuvoADrL9z3YxL1sI\\nSrJtuapFmVqTfKFOsPuMFp53UFjVy6mmJiL5ZIYZy9kYF0OYCmmHLco7N33ehh0FLzb9x3gz\\nP0svqQQhudpFqUSblv2aVdZmgy6NLYSAAkDd0dPfnCyU5bzx5h0ePHVReIdt20CudohNWTRZ\\nVy4ErRGvMiARYWnVKdqNwN5E2lN9QgEJtE5zFFanLgzRlmz\\/AFOUHYAa7u0BL5HCxdItw1N+\\nyMScZsXcZaoKzi1ibfWI9SbWtcu\\/el01m4vItoAlSaczU5yYl6cyAA2liQZYYQjJtLIGUddQ\\nQAZ5ADqAEVNNTczOvLmZyYemZhwlTj8w84864o71LcdUpajzJUT7I0ClKWorWpS1KN1KUSpR\\nPMkkknxMEKpRlx49HN6esb+mKpTq9vT0dkKoQVnoA4nxzxjX47h+r2crb\\/Awg6a7otSkqOQG\\nZ8bz1Q6Q0E7zvV08w7O+L0pCBkPXznti6GlKJ3aD4+PyhpSid2g+Pj8oIIIIQVAb\\/ZHgST4c\\nTBBH1tpWNet+1EUexrQui9KuSkCl2pb9WuKoku57PKSpErNzWa9k7qfRgnUPCM4sOOSw068S\\nUNTEhgJXrWkHNUuT2I1Qodg+TpVnqqco9zVKQuVY5lCXob7jeY2wGbcbOQoFcrBSKXSalUAo\\n6GUkZh9A9LKSpxttTaQkghSlrSlJBzFIuRly0nNzRtKykxNG9vyDLrxBFtbNtqsBpcnURrzS\\nhSuA3dJ4QullIyJ84+z1c8b77A5AvHSrFDmJWNeGNjsuAEtWlSblxBqDSTxS8xUGbAkdsnM+\\nYxVJhrofzIjNqw+QZ0aKJs3r\\/wATMW78mkbPNimzNt2ZRXclazhdlGaNXqwNrkhLWwuFotJL\\nwIdd2LjU5puxrH9QyqVSmac2vLZ2oz0s1a97lTLDkxNIy6FQVLhViMqVWVbfMYQxFM2PmPm6\\nD+dMPMtW5XRnU9x\\/rdudraRPAOYD0CL2Zd591tlpC1uuuIbZZaSp1151xQS2022nMrdcUdVC\\nEaxWv2TjrH5LvQSsEMLpej3a9bmWVEqm72qlyX35U7s9kXZiQuus1akDWAH0DFMYlUOZuolw\\n9vjKu3rFwWwjYCLUs7C7DOWYYSkJt+3rUsphEu0yptKSKbK01tDTbDqgE56qGVqSMm3FAS5r\\nYHOyrCpmv4so1JYaAU88207MMtDeorfnHaW2hITrnVoCDoQCY3sns2qcwtKHJ2XStR0RKMvz\\njhFtLJKZfMq+hANuSjEEGzNFfSTxC2ZsjAHGK52HQkpn6XhzdkxSkh0FTanasKSmmS6HAg7N\\nx6bbDm7LMxlTaPJK6et3IafGCRtmTcIAm7vvWxKIps5MqO1pa7jfr7eTbwWs\\/NGX0bzOt5Q1\\nsTMUqWNuFtKSozF5Ut4p3AU0TdXKlcyQaXLzScjkrNZIR+MvLh8JUtKHDeTzTJs3DVjmQDK0\\n2XYa3HVClLqE9JuhKwkLSNkpe9KVoRksiMVFPk04VzfhRtww0p9n0nJOTxTh1cyEmyQldNp\\/\\n0pUtVBR9AJJtYEZVETmnbCq1OZSKbiSZCtzjdOMiyo8w7NMuN5bb\\/wApfv1ERwLU5B\\/SoqoQ\\n7dWIuClpMLHnMsVi8LiqjJ1c\\/pJaWs+SpZHSW624cwdwyG1yQtn5P3KJ2b156Tz73np2kjbW\\nFjUtqthQzKKtVb5nM1OJ3JHzKkNrzUC7+xxt3qGlvKpyTSrKmHuP0s\\/Wm5cp81AP0EtTpnXz\\nGsD+uUfVSveFlKfi5\\/Ssvd46tOoVtSSSBvfaqU88B5p8wpn5NobgpKtZlZ1V+aUKTrxB57yh\\nvImw9dKK9U8TzDBAKJCkYzfzqJScodmpakUp5IBvdDqm7AHMVjSdSHk31ZzKXaDkSQLLn6yy\\nki3FTclNFwEnelTQ\\/tQLRh9bfIPaK1ObbXc2I2ONyTYQEuCVrdlUGmLXsUJcWmUbsioVBB26\\nXHmkGrKS22tLL222Jee74t\\/kddAqhlKp7C64bqWNYoFfxKv1pIUXGnULKLcr1vtu7NLZaDTj\\nbjLjTz22aeJa2POTukZirOAhutSdOCjkryKjUzMApKSkKnpedcQDra2slSVhWRStO4R8rN4w\\n4nz2sl69q6gKSoEyc2KccjqA6iqe3LKR9XJJQUaua9X66hESnfLm8l+lBbdF2VYpq60C6HZ3\\nD2GGpd1dvRAen8QT02hNwMxVJgjXKgnUzCS8myZTlLzWGGBpcLM3PLSNL3S7Jdmo77flTfie\\nEd8UTk4tB2390lo04bTGqHED55lKlcgCHXAtWZuKo1XWKVZ7NxYLjLY2TKm280jtymaL2i7a\\n+q7SNHnAa31B5pxL1Pwnw+pbgfZCi06HpegMKXMIQlSku621GRGZjXDcmL5pGsbvxQNMzAUo\\n3JeqpIqEyohKj851JoKDymiBvAcWhWrzg9GV3So0bqUp5+u6Q+DEq+hK3HETeKllLn3UMgoW\\nESprbk9MrSRqFtlp10r8wI1+GsT\\/AO0GpbhSvB\\/k4VGoqzANupq0vKEJKbApTS8H1QrJsEht\\nLiAUqJz6BJ3A2G0GnXTP4ow7TMgupApsm1YJtv7eflcth+cUHLy1jeZTafhPaSmDR5HDu2jL\\nqeMqqmytt0Yy6nApEzsDKoldkVh51MwUZa21O0z1zDl3E\\/DhnLWvu0la5Vqhq4KXMZZZbzsZ\\npwp+tuC9UqGeqDkqI7VW0\\/8AQ2opd8r0grFf2WyC\\/mp2qV4KS7kUhs0KmVDbZZ5L2JXsd+1D\\neqoR8FUeVD0Hqcl8DGk1F9jVylqdh9ifMqeKtTNLE0uy2acvVCioq8tQkBCkhRdGoXHPLm27\\nzwQKB5M1TbbNgC9KYvqaCCWrHPK0CmNhIBOZSvRAWgm2U51JwLsykwUze1CgN5QSUN1OgSxG\\nUG9m1VB5RIAACQMxKSka6CSe7jHheyCV3tRFJQQDsXXX1ZghOSEsNuKcBUrMqSkp1c1bkErj\\nj5jHrCWWCCu8pZWsTkZemVqb+rvOsJSmPlvcSQV5E8BnkCIxc9yt+hpJupbl7kvipoLeuZiQ\\nsOrttIUpS0lkipGnvlxIAWopZU1quJKHlLC0J+Te5ZLRLaDpbo2MkyWy4UbC0LeBfKArVLXl\\nF6S6U7YgFG2LISCnaBog6rC\\/K98ryaQTT9gFElllKMhqFAxesJJWCStCsQ0xSroGUJzoKVnO\\nolJDcNGibFGlWf2kIcFzfzepU1W4J3KbkZhPEHiFagagmJSD2kRhGjIoud97ziSGaDcA1Muc\\nh6lsgZ8ABrcBnl50Jf2R2E3\\/AM35v\\/0JV\\/8AqcRXf+7U6LP\\/AJA4\\/wD\\/ACWw6\\/2qx849y2GA\\ngdcDOFGLrjIWrZOOostp1bYUdmpbSLneS24pGRUhL7qW1eaHVgBYxh5T3lwPrJRsbwS0AE+g\\ncP1xpA+qn0TM4\\/zKJtqApVieAygJXKbBmQM+PJteY2uiabdN9PrBihqy7wASBfW2oNpYLmkh\\nhQhGsmtVF0jfqNUWqBZGY35vS7Schxz1geOQ3xRrSRwpcCiqsVBkpJOTtEqZ1ubP6Bl8EZ79\\nZRSrpyzOcT7\\/ALtngR\\/glxb9dnf0jg\\/7tngR\\/glxb9dnf0jj3\\/3lPLmzhX4pME5AP2r6Fnuz\\nJtvucelwHW9gsDu0MICNgVrfhxPE\\/pdo7m4afuFl48U8+RiWN\\/ZHYTf\\/ADfm\\/wD0JV\\/+pxe1\\npE4RulQXcr0vqjMKeoVfIJ6BsaY6rMZfhJAyIzzO4RNv+7Z4Ef4JcW\\/XZ39I4+k\\/7tTos\\/8A\\nkDj\\/AP8AJbDr\\/arAfKd8uGXUhS9jmCXQb+gmgVt1JsB9fzbH+dAubi6k5tQL5VWWiU2DPBQR\\njycRbLquabaOu63b0NIVuN8oOW+ttIlaMY94STSlJbvFlGonWImKXXpRJB3eYqbpbKVHPilO\\nsvn6DHJN4z4XPN5pvWjjeU5POPMLOR\\/FeYQvLMjI5FJ3b9wiKZL8stonOtNuLoGNMqtYKlS7\\n9oWsXWid2o4qWvp9gkcRsn1p4DWzEfWSfK56G80620\\/Xr9pyFpUpUxPWJUXGWiBrBK005+oT\\nGus+aNmw4nWy1ylPnh9vyuvK\\/lUD6Q2BUGaUkLKjT6Bi5AJSRlKUIxJU16DTRau0P7XYXTCh\\nRdijygGNo6WwSkDt6jTgPS5qXIS48TYZPzolONYo4cvZhN92klQTrZOV6msJGWWZCnplpBUd\\n2SQrW35gEZGG1Rawru3XVV2sP7lExLIacNSTblZ20mCVNtrM0mZDkuFK1kIVmySsZZkxGgp3\\nKkaDtRS0XsZJilvOvlkS1Sw7xOQtJKghDjsxKWfOSDLSiQdo5OANDznktJSTH3tK5QbQyrBS\\nJTSBspkre2AFURW6ElLgSlesV1ykU9LbIC06sw4US5XrILuslwIyGvLk29yOf6e8mapONgnW\\nXksYU1sAHU9pM0OqNLSR9VQFtFG5B0dOB9mE6kJldqNBXmsQhyqUF862sC2mfZUFam6VJSQN\\nCN4O+mqaNGjFdSnF1vR\\/wGuQuOtPPOVLCnD2sla229iw44qboMyS4hlOo0pRKkt5to8wx1FX\\nuTk0G7jK\\/nDRkwul9oCCKDRn7WAzdDqtn9zU5SNkrPMJ2Yb1WwWctkA0NX9F0sNGSsBl+j6R\\nOCzzxCnmWkYo2ZK1BrYOlBfXJzFZYn5fVdGshxxlrWCkuJKkLQs9425jJJVhSG7PxVlao4pS\\nkNotu+Wp9eulszSkoRS6s6oqDQ8pWkb0oBePm+dCFf8AtBpNvMrF\\/k31CQKLhx5VYamtEkZs\\n6Kpg6nFvLf0kl9YuLkpzEQk7D8PVDKJDFeHakXCChBp0i7mzgEFJZqMyV57gpIQM1xa++O47\\ni5HPQBrwdVJYRVm15h1Trq3rbxKxGB2j7qXlFqUrtyV2nMBAC22mJeTal22nFJaYJ2BZ6JuX\\nkGdEeqhblv31jpbEwSottt3JZtZpjaS64vJUvUbF+cnFBJQ03\\/uugBpvN3auFbo7lk8XcTZE\\nAMXvcK8iQPLKg7UTvVrDNU+JlRGv+MfqgtjzPMj6mR0icWZPIOXAxPoSBkieo1IXqkax+vLS\\ncrMK18wcluqUnVGrqc+xkfLs8meplDdb2TYppS3LF12RoOFZllpZAJJfla9Tp1SL5gFNyqlr\\nUQVNAXUnUznk2PqzKZRhh4bgAJuSWobtEsyakBXMlwc8xMa67m+T30d1LjtmaUFSk3BkWZO5\\ncK5WpJeOTSVJdqVLvilKlylflDgWmkzGaVMtBobJyZXjTdfIGaT1PDj1pYp4I3MhveGalUL1\\ntqoTHnNpyZZTZ9bkNbWU6VmYqkujZtg66nHAzG9eQ0qr7YVq1Gj2xPtBIzLcrUJKYUfMOZcR\\nUX2UDVCvNEp5ritYeYgoP2tO0tmyoJq1kqCQkaz1PriXFZgoGqJaZpyMs8lkEznEIQAfOWJf\\nIeUf5FeICA9WarheYeISBP0bGLAQQE2zLkGKzTWQbWKlrS3bVRBIVEQn\\/JvqzVyzQkuAAkqk\\nK00b8bhE7NJUSOCUt\\/8AdOsRVLu5HvT9tRLrzGDcjdsmxntJq0L\\/ALDqCyCGlJLNLn7gpNdm\\nCS4pGqxSnXAph7bajQbcdxQvXQ80qsPis3ho540UOXSSTUH8OLsmKP5rhZ1UVmRpkzSHFa4H\\nmNzq16rjLu9p5ouzkadpS4ezQCZ+RuWlrAGanpKUmWSSkjzVyk868dQjLz5ZsDXQPOOvs\\/ua\\nbjjhXVCAxeEhLqyyKKnLz1LyVlwW5UJaWaUd4GaFrRxGeaFZTqmzvky4qKfwa23YaZfeylqT\\nn8UUGWmNLZkop1WRS6iomxVY5lAXVqgpEQio7C63KBRNLxGwBe6zIefMpO8XclGUoy621c13\\nZjrHnVTUpMSb7srOSz8nNMLLbsvMsuMPsuDeUutPAONqAIOSk+iG8ejXW7ewexYlkSty0PDX\\nEuUKNRuUrlNte8ZYNpUpWqlioMVFrUClqWEhsgKcOfXixffJiaB2IPlBrWjbYdKefDhD1jfP\\neHIZWolQcZYsOrW3IpLTm9tpUq5LEEMuMrZGyiWnYa7Py6ZvDuLqPV5Z1JWy8WlIYWFBKm8s\\nzIv1JtaSFC60gC3pJQQbCDzmzipSy1NonGc6TYom2H5NY4G6QJggg6WO\\/jaIG6k57xx5x0\\/b\\n7+3ikpIIKSN3R0d2US+b\\/wCQT0TrjExMWJfGMGHU64o7GVFYoN22\\/LawBSnyCsUFmvu6pGYL\\nl1HME8d2zwdxE+T34t09U07hXpAYe3agKLkrK31bVxWHMbLerYOTNBcxAZcmGwUNNvFiUYmF\\n5OralE5NJjU7sex3IZslOl6ihNznkJ2XX6IF7pamVSswq+4JSyVXFraiNBMYPxBL3Ikg+kfn\\nS7zLl9+5BWl089G\\/HXSI7i0FB6uY+OeEVJz3jj7\\/ALY2cYjckVp8YdCafdwSfvelsa5FTw7u\\nW2rsL5QMz5NQpeqS12rIBBTnbqAr6jesd0YE3zhXibhjOmnYkYeXzYM8l5TCpO9bTrtrTXlA\\n1iprYVyRkXS8A24rUSPqoKohk\\/h+u0gk1OkVOQCb+nNSMwy0rLlzZXVoS0tIzJupKynXQ6Xj\\nRTEjOyhtNSkzL7gO2YcbBvusVpAN+BBIPCOuIIUUniR2nv8AHv4pxqSM4uN46t8oxYSWnLeO\\nHOOj7ISUnMZcCPGUOu2EVJyO7gfGUeoV36jd39fD1w6hV9Dv+I+fXOGpHEHsMIEEH3Hph4pO\\ne8cff9sIqSDu9RjKSbjv4wuGa05HMDcePV9kfXWLiRiLhdWW7kwzvu8MPbgZLZTWrKuas2vV\\nMmV7VptU\\/RJySmVtoVmQ0txTe8+aczHyxHEHsIhBQyOXq7Iy5aYeYcQ6w64y82czbrS1tuIP\\nNK0KSpJ3i4INjHqVFJCkkhSSCCCQQRqCCLEEcwQY3B4IcuVpy4TmSp933BaWOdvypbaVJ4l2\\n+21X0Soe2rolbvtJ63qq\\/PrSVttz9yC5w2hWqZZ1LTKG9xeBPyg3RjvcyFMxxsO\\/MD6w+tlm\\nZrEghGJlhSw8xDk1MT9FlKbecukrJe8klrGqYZZ3mdfcT9LDqUnI7uB9kJLGYz5x7osyhbYM\\neUIoSmsKqksi37FrKPpBKrZQAZlakz4ACbAInEpFzpcC28k8R1aUKUom1vNjKA3M\\/l02FgBm\\nWe0SOFkOJsN24R6VGD2klgFpAyCqlgri9h\\/iSy2x5TNSlr3JTp6s01slsj54t5LzdeorgS62\\nNjWKfJvDaNHZ5LGfeceXjSaxV6BUpSs0CrVGiVmnPJmadVqRPTdNqcjMAFKX5OekXWJuVeAK\\ngHWXW16p4xs\\/wC5ZrTuwMMlT57EtjGe1pTZNqt7GiRdu2bUy2kNuhq9Zabpd\\/eULZ1Usrnrm\\nqMoy8ht3yB0F9qYuvD\\/lD0uYyM4jo0zT3CQlU3TVpnZa5AJW5LulmZZRe4ytqnFaDfc2lcnj\\nRpYSmelFNnS7ssoOJuQLktOFKkgdy3FW3A6CJ58ER7tHz5Qho4XwmQo+kDYF44IV15xhh+46\\nLniNh8nWcLT09Mv0yVkLzpjSvon0yMvalwhhvatOVJ0y7Tk3uwwkx5wXx6oQubBnFGx8S6Ol\\nLRmJi0Lip1XmKYt0BSZetU2XeVUqFOFJTryFXk5KcbzycYSMgbsoeLsNYkQldErMlPKKQsy6\\nHeznEJIBu7JPhubbGu9bKRcEX0MSmUqkhPAeazTTiiL9nmyOjndpeVyw55bciRHcMEEESOM+\\nCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\\nCCCCCCCCCCCCCCCOo8W8cMIcBrZXd+MeI9o4dW8kuoYnrqrUpTl1F9gNqdlKNILc+ca5UQlb\\nbnzdR5WfnlBSS3L6uRLTz7Ms04\\/MOtMMNJK3XnnENNNoG9bjjhShCRvKlKAEJWtDaVOOLS22\\nkXWtaglKRxKlKISB3kgR25DV55Euhbzy0NNNIU4444pLaEIbSSpa1EpSlKQkkknJPZmYjoaS\\nnygrDW21z1A0WsNZ7EqqNqdZYxBxJRP2pZSXG1q2U3TrSlXGL0uGRfaAzbqs7YM42Vb23SFZ\\n6BdIvT50sdKZyZlsXMXrhnbXmF5ow\\/ttwWlYTTaSvZNv2tQhJSVZdYDjrbE\\/cZrNVQhxxry8\\ntnKKZxRt2wZQStimuO4knUnKEU0hEglV7WcqTiSytBG5cm3OJJtu1Ii8\\/i+mSuZEtnnnRcfk\\nvQYBFrAvrBvfm024m19b6RL40jOVv0KtHhdQpLuI7eLF6SKXWxZ2D6Ja73G5tLeXk9Rutucl\\nrJpamX8mKhLO3A5WJIl5Jo7rrDzB0R6Q\\/L1aTGI3zhRcC7YtjAa3Xy+01WVBq\\/cRHpdaXWNp\\n88VqRl7YpJmGVIeDVPtJ6o02ZCfJbgeLIfc0SJGQ6zx7oujnTEu3XHGIFOMSUy3h6RWCkM0n\\nMiaKDb9sqTmabC+GaUVJpVpdHOET+LKrOFSEOiUaNwESpLaiOGZ7V4kcci20nflGlvvsRMUs\\nSsXLhfurFO\\/rwxDuR8ulVZvK4arcU8226sOmWlXqpMzCpOSTkAxJSmwk5ZpDTUuy0yy02PhE\\nJ5z6PHjvolOseocYWAzyAHUAIp+ZmX5l1x+YedmJh1WZ195xbrziiAMy3FlS1qIGqlKJ08Ij\\nSlKWoqUSpSjcqJJUSeJJ1JMXJSVnIenqHTDxKQgZD09Z6YohAQOknifHNC6E8FH0D493jPEJ\\nsL9GExVKct548w6O3x9l8EAGeQA6gBDJN9T+qCADPIAdQAhZKQB1858c0chSaPVa5UJWkUWm\\nVCsVaec2MjTKVJTNQqE46QpWxlJOUadmX3CErXs2W1ryRnvAMbEMGuSi04cZhKzkthDNYdUG\\nZU0Pn7FydasNloO7Ipdct2dbmb5eYDTm0MxI2pMtaiShLhfIYVsqZRKxWXC1SaZP1FQOVXmk\\nq8+lBsCe0cQgttgZk3UtSUgEEkXAjIlpObnF9nKSr8yvS4ZaW4U33FWRKsotc5jZIsbkC5Gu\\nVtsr3ncnp6ez4w7AAGQ3ARJqwi5AG2ZQy0\\/jvjzWawv6NU1beFlClKFLNrABLaLuupNcfnGH\\nHCEeZZ1LeDafonmnX9oztJwk5NbQnwZ8lftrAW0a7WZZA\\/74MQ2n8Raqt8K1xONovF2q0qmT\\nSdXJt2i0ulpbyJabQpbxXZlJ2IYvqBQuouSFFZOpS+8JyaCSQLpZku1ZJt6VnJpojQGxKgmS\\nymBa5NWVMCXkUGxs+52jtjbc2wHNeYcW2RY3tEKLDXAfGrGOZErhXhRiHiEvabJ1607Rrlbk\\nJUhWqVz1SkpJ2nU9pKskrmJ6aYYbX5q3QeOyLCrkTtNS\\/wDyeau6mWJg9THQl1a73uxiqVgy\\n68svJ6NYzN1lM0EHXMpWJ2jrQAUvOMvJ2US46jf+G9lSzdPmbht+ksU9ltiXo9NUy65Jy8un\\nUalWKPSm3nWGkJSG2WkyrTaUIISMkb+o67pT2lJ7RFCotYrbqc0pdmSxSJNauYocWZycI5iF\\nyKDuAGe8jArp8nfZtmO0LaxSFzsv+30mUqUu5PAotnCqFRE1avAkoWgFISTcoALgBFm0HYbV\\nap2am5Cs1AKtZ1EumnSS78POJr8mRqD6Myk\\/nHQ2jU5hfyA+EVGMrNYv4233ez6Al2Ypdj0W\\ni2JTVO5pPk7k5VVXpUpqUSSptbzJpMw+PpkeR\\/VGxDDHky9BzCgy71C0frQuGos7NSqpiKaj\\niRMvPt\\/VmvIrznazRJOYBCHAKXSZBlp1O1ZZQ6d7CtaT1\\/VHWRSJai2+yoHUcalV1GdSVpy1\\ng9UFuSi9TdqDyFPOVlYyEdJXZixcjslNVO8b8nJKlMJUubfqdbTSKLLoJyKn0F+TpjCd4AWU\\nI3ZJz3ZGo6x5bPk5YSX5vgLZ3XMYzyFJTLzbtNlaZKPE5EI7Ko112frqVr0NvoZKiVAm6iQL\\njo3k6vS6Q9ON0OlNoTnWt8uVSbZAAUpZLgLKQkXJUmcFtRdKbRswbqmGOGtNaoknM2VZNMlA\\noMUOmJpNElmSrVK\\/JqNTksBOZA1y1KZ7hmMgMvgqxpKYY0vaIlJuq11balI1aVTHUNrXnqq1\\nZiqLpza0BQzLiC4hSDrtB0FBVoiv7lAtDnDZTzNdx5supTjOsDI2U5P4gvl5OsDLKdsqRrkp\\nLPhaNRaJ2blUy6\\/NmlskExhHfnLZYGUcPs4e4W4kXvMtFYbdrszQrHo8ysK81TM63NXbVwws\\nb9eYoDL43pMsBviMzXldeVNjYFvZzsTkMNyLwAl56syFVn1pQpFkKl6rV38MUNzKSTnXT3W0\\n2QChKfr7x3D2x\\/DQy4gx5LzTrAsuVp0zLqKSgpuhUjS2qnPNngEdogkXte1xJoq2lm7rKRQ7\\nPQhIGYfqtV11HozlJOVBQEneT5asqyO5OrrR1hU9JDFGohQlp+l0VKs9b5rpUstWod2oldVV\\nU3EjnCg4Hc+CwMhERe9+Wp0hqyXWLHw\\/wwseUd19nMT0rXburUv\\/AL3s52Yq1Io6igZ65ftx\\n4LUUlIbIUlWIl3coFpqYjuhicx0vuTUrXDUrYTNPsVxCFk+YlyxabQ554ozAQ\\/MPzD6f9919\\n4jU7TPLdx0FLxNtfZwdKLCs8rRaizQ5lhC8l20HBNKlkuJQEJSVPVgrylZ7RedZVqHtqWw+h\\nC1JwrUK66nKUvTEmlyWWUnVS1VucLrdwcwCJEjd6KSNJp9zYrXUqUfqF03\\/VJWly7ec0\\/Ubg\\nXTKSwjNWbj6VTMrItZEj6VYB1dUZZZRiJemmboq2Kp5V0aQOF7c0hbvlMpS7sp901VpxIKnP\\nKaZbLtaqjTpO8Jelgt05pQlSt0Q7qlScYL\\/m0T9yLvG4p0ghM9d1XnZiZCSolShMXDO7YJJK\\nlDzjtAdZGtrb+SkcELrmNVU3N0mQSrihUw\\/MPpOY\\/AYl1MHdnmfKd54dKYk95K8pVH0zu0Tb\\nRX8TTRUVuhAL00gmwWEztWqddeUVkek4qVRewui6bxoZzyo\\/M0Kaw7g2iUtsCyfOJ1cwnS1i\\nqWp0rTCkW\\/MDyrcFm2WJLl28rnoa22txuk3Bfd+FkE69pWLUZZDyw3tNm0u9X7OCiHB5OVK1\\nGFr89twy5DxxoujlwLElVOJsrAK7a4jNQaeua9aNaiuLZStxilUa8wTvdJQH92ohIc+lUtrT\\nXJYCSacjUbimnuOaJKRalchkQAHH35zPI+drbJOsPNyTxj6yTwYseV1dtLVCoav\\/ANeVB5Gt\\nu4qEgJFPXkAB6CREip\\/k6bAKSEiZk8S4lKQLmfq82znKRvP0WigpuTqQnKm9tBreBVLym9oU\\n2VGWqFMpnpFQTTqMw4E3N8qTVjUCbXsCok6m6tNM3bl5bPHmdLqbSwpwooDTiSltVcN23NNS\\n4IWNoh2Tr1ryy3Uazamy5JLZ1kHXZcQrUT0DX+Vd02K+4tNNxAt+1UvkpTLW5h7aD2qlRcGy\\nZcuSk3FNo81YShSH9ukNoUl3XClq+Lk7Ds6Ty8mtqkKKd4XMSbc4pKgUkKSucD60qBAIUFAj\\ndqnzjH00tISsojUlZaWlU5ZBEuw2ykDccghpKBlmBmCeiJnJYF2L0i30fsqw9MZbBKqtLM1J\\nRy2sVGqJqhUdLkkkk21vrEFnttO0SoX7TFmIUg6nzSoKpY1sd1NEum2twANNQALmOsappdac\\nN5KWt3GvG\\/J05lVt1mt2wyM1Nr81VrIpDLKc2kAahQkJK2xkl11CutqpM6R94qLtw3TiTX1n\\n8O5r5qs2s5LW+nW+eq4pw6rj7iwMs9ot0pG0LmeUQQOff7PHriuqkcw9O\\/3xK5SpUamW+hsI\\nYYpQTbJ5pS5VjKBbd5ozKgbuAFhpuiHzmLsQVC\\/ntTqE4DYkTtRnZu50uT2rxBJtqeO7vjDu\\nXwWvZ7LaN0uUzz\\/8In9YjJRG\\/wAlZmebzt2fmj8bdHNsYD3ArIzFYo7XDMS6J2ZGetwG0l5Y\\nqyTv\\/BzO7L8KMq4rkeg+oxmrxhWV\\/VVLNf2jAP8ArFORpzUJo\\/noGvBHeLfWKuXtMY1tYAKz\\nBmLn3b80MUYgkcxDjlTPA8QWz+LrDLOOUZwEo6cvKK3VHd28ssyrGas96slomDkd\\/m5nI\\/hx\\nkBkeg+oxXUV0e0d8Yi8UVtehnyP7RmWRy4pZB48+PhCDPTR3vHlolA5DgkH179fCOkGsDLTb\\nyK5u4Hjq5EKmpFCdbdmoBumpUCMjkNdQAPnayglUPW8F7JbCddipu6pGZcqC07QBWeqrZNsj\\nIgZHUCDlvSrW86O4cj0H1GDI9B9RjHVXqwvfUprn6LpR\\/wD0y84bMzM\\/vh0aj863Efo28Lbu\\n6OqkYRWElQKqQ84Mj5i6nUwnPmJLc22vpy87Lm6iunCiwEKChb6SRvGtUqwtJPWhdRUgjqUC\\nOEdmxbqpPN8PdDRq9VO+pz\\/LSbmAPYHAIQXpn98veHauC\\/jZWunHodefqYWH\\/wCTssP\\/AL5n\\n\\/jNGLThfYvNb8t6Zie9\\/lXwjsQoHMcvbFuoR1+\\/t5hCRVamP\\/wDIz3rm3+7\\/ALTuH2Qnt5of\\n1Z0\\/\\/wAizy779GOujhjYw427Lf5xPf8AW4p+plYv\\/k9Lf5xPf9ajsMgjiMvHN0xQpB4j088K\\nFWqXGfnvVNv93\\/ad3uEAmn\\/znXfU4v4FUdbKwpsJWavmEZqO8Cp1kDMnMgJTUQAOgZAA8BDd\\nWEdiKUSKS8gE7kpqVSKU7huzXNLUeH4SjvPr7OKOg+v7IsII4iHU1ep8KlPcrGbfPuLh9ohY\\nmXjufd8O0Xfh334bxHUy8GbLWCEoqbRzz1kTxJGXEAOsuJyPWknryjj3sELWVrKZnq60TuSk\\nTMi42nLnKV04uKB5xtBvO7zY7ogh9Ncq6d1QmT\\/bOFf\\/APa\\/XiYcE3Mj+ruetRI0tz0+evfH\\nQjuBtJVrbGu1FvMZJ2svLPZEHfmEeT5g5bgNXLpMcU\\/gU4MzL3Kle\\/6r1JKCE7\\/w0VFesc\\/\\/\\nALGN3QMs8jlJB6j09\\/TCRSR2cxjIRiWtI\\/66pQ5LZl1e9TRPvhYnppO50+tKDutzTfhHR9Jt\\nnGG11IXaeKFaoamtUNqpV0XRQVNDYlgpbNNdzQEy6iwMuLBU2cknI9pUnHjTotZSF0vSExOq\\nAby1U1LESrXG0AFtOAFi7JidZLYLKM0Kb1EoUtoJ2TryV82Ug9R8cYSIIORjEm5qSql\\/pWhY\\ndq1xZQqVEkJu4Nrj8o1qD0Oe1ksU4gp39A1Wek9b2lZuZlhcAAH8g83qANDvjsGjcohyhtsh\\ntE5ektczDAASxWbHw9qKlJ1NyHJqg0iQqUwfO19o7OOPhYCVLKUqbHclD5Y3SloYbReeDuHF\\nZZa3rmJah3vbM6+2FKUVLmHLgq8gFgJUErYpzbYQkeYspUpWKTjWe9O49HMe4+yG5BB38efP\\nj6Yic\\/gHZZVf3Q2YYOBJJUql04URaid6s9LMsvMd5VmuSb3vrEyp+2PaTIW7DGFdWAAAiaqM\\nxPJSE2sEpqC5xISLWsE2tpbhGym2eXAtl4ts3to+V+kKR5kxM2xfchXVLUlKApxun1a3LbLG\\na9sBLLqDykBKAZhaiooyVtXlgtD64VtorM1iTYm0KA47dFkmeaZ1nS2pSvuJqt3vrbQkbc6j\\nKlqY+qgzP62GjeYkpObGU3KS00Mssphhp4apz3ZOoVu847uG89MfPzVkWlOZ7agU1JPEy7Ak\\nyc8sznJlg5nLjnnmSfwlZwuoeTxsQqYPZYexBQSoG6qNiOZmSlRIOZCa4mpITY6gFOXcLWAi\\nb07ymdpckU+dTkhVAnKcs\\/S5IXAIuCqnJpi1A21ObPxzjWJQtoacmiLfBbFC0hMNGlupCm2L\\nkrqbKmHCpZbS03KXm3QZhb6lJ82XQyZhQ1F6mqpK15hWji3V5uVaqlk4jzVTpoWQiboF0mqU\\npw6mqQfI5yZkH8k79VYWAUo83dEJOawltGYz2LdQkM9bLyWeUsDMkj\\/w1E2SADlkVcBznzo4\\nuTw1q9uTianaN7Vy355ojYzci7MyM4g+cBlPUydkn0eapQBSlXPuTrebFE+TDR6XMKnMDbV8\\nX4SnAptbTsxJqcfztEqaC56hT1GcQUKOZDiWV5CSoN3JMTqS8qt6ZSlrEeDaPUW1ApWmWmH5\\nRHpaEpanGKuki1roU6M1gM6dxnu0rSLxSphCXqxJ1hCdyW6tTJNW7d9Z6nop8yeBOup9ShrZ\\nAjzcuzaTpZVBAbTXbPk5jMJDz9Jqb0lqk\\/WLcpOS89rAk+YhU4nIH65yyiCZaukvpzYcFtVr\\naQ94VZmXRsmZW6K0m92UsgAJaEniFT6\\/JNoShIQyhK8mE+a0pCRuyXtHlaNMO0NgxfmHdg4h\\nSjeqZqbTQqhRK2+EpyURULWqztCYCx5y1C2nEjikIG6JXT5LyxsF5FYR25y2K5dq3ZSdcq6a\\nvOuISb9kqXxxTJ9htKgMgLdSS4gEJStoJQqJFLbXthteIRV8JzlFdXcqdlpVlDCSQPSz0idl\\n5lSgSbgyJBIBOa5ETa6RpN4a1AAVH57oLmWSlztOVNspUAclNrpTs++tIz4qlmlHIkNkkKjs\\ndq7sM76knqOqt2lcUnPthmaotRep80idaK0qDczSKkdaYa1w2Sh2VcbCxrblZZw9rK5bXCya\\nW3L4m4K4g2bMeahxdrVaiXnLoVwLzjVXFizjLRWCpSWmpx1tO5HlChGadgcpBoY4hGXakca6\\nDbVQfCNpIX\\/J1Wxkyql79SYq9xSEjbZUnLJbktWphhJz+lyyiaSXlYeVnghARtA2NUzFUkyA\\nX52j02oMTK2wLuLeqeHp3EFEaQoZcixSm20kKzBd0pTu2aNsZxJ+4OO2pB526W5aozTLCVFV\\nglKJSrsU6bdUbkFAfWpQ3WFydy+J\\/JvaDuLiZg3To34cSM5MoOtVLEpz2G1UDytYonVzlgTN\\ntKnJlC1JcK6imdaf1AzNsvsZsxrixS+T8aPdwh+awlxhxMw1nn1qWmSuaRoeI9vy\\/HVak5VA\\nsquIa3fXnbjqThzzBB+iPeti4uTU7T2axhziMmqUXIJZnbWuZqsUV3NKVpQlVOnJumvAoWha\\nUK1gAUlPNn33Q9JfEellpFSNJuFpJyWahIJlZpaMyQBMU1Uk2lxO5JW5KvqWAVr11+eZNR\\/L\\nl2BYmcErtE2Z17CNQWQiZmZeRkazLMKJCVpeqFOVR69dKnHFhKKQtXoEgJdUhs6qr+TyuaR2\\n8gugVdpxOZDjYXTZl4EXSpDjPaMKBAAzKnRYmwJTcxHmxY5CDTHsnyibw7qOGuMlORrqlZWh\\n3GbPuZ1Kc\\/8Awil3uxR6Cwte7ZtS12z3nZgndmvWPivotaRuB23Vi5gliXYckw4W1VquWnVm\\nrbcWFBChK3SxLP25O6qlJBMnVH962d+ToidhRNKy35nUauC3KrSlE5KmKbMMVWWHOXFtvJps\\nw2jh5raJlxPDz8847kouLGG10tpl5G6KQpybBaVIVVwU197XSpKpcytTRLl85FSS3L7ZDgB2\\nalo43FQKx5Nu0jsxgXavR5Wfft2FLn6imRnFKUUhCGaJiVulVp9QUtCDkWsC4BNyFGoK9sOr\\nFLzLcplZkUpuS6llNUkkAHQl6WK0pFgfrzN8uukebWRkcoRWnLeOB98egpi7yemhbjn5TM35\\no+4euVGdZXr3HadOcsK4HXHgpaJ16t2NMUCcqUw2pQW2qpPVBleQQ+y80CydVGMfyezCispm\\npzArG+8rHnChx5mgYi0imXzRHX\\/P1ZRis0UWnWKTJk7PKYmpS5ppsod3Oh9Ox31T2K4okruU\\n2Yp9ZatdKWnfM5lQ3g9lNESwukgjLOLNzlF95rObwRWJcFTHm86kcGnOydsN90PhCb7yEpcW\\nTaw1IBieLGe8cR7vshFQ1hlzjh3enxnG2DGfkZdO3CFM5PU\\/DqlYw0GUJJq+EVeauGbcaVql\\nrUtKsS9AveaeIOTrdOtuossLafBe2Iaed1i3VZ922LWpm3L1ta4rPuCS\\/wDDKFdVEqVArUnm\\nSMpil1eVk55je2tOTrKc9QjKK6qVBrVFXlqtMnqeb2SuYlnUMuHT9qfy9i6NQLtrWm+hIMRm\\nZkpySVlm5V+XN7DtmlthW\\/6qlABQNjYpJBAJBj5EjMEEdRhAjLcYeLHP6\\/Hj2wgtOYz5x7o1\\n4NxfoRjd3s8fv+wQ0UnI9R4QitP4XoPw8d0OyMwR0wgRxB7DCgbEH2+EOpNx3jrr2w1UMx1j\\nf9kfQWpeF22JXZK6LHui47MualuF2mXHalcqdu12nu5EbSRrFHmZSflHMhkVS8y1u4GOCUMi\\nR6uyEFjI7uB8EePRGU06tpaHWlLbcQQtC0KKFoUDcKSpNlJUDqFJIIOt4UCQQQSCCCCDYgjU\\nEEbiDxEbqtHPl3dMvBpUjSsTn7e0irRllNtrlr5YRQL4Zk0L1ltU\\/EC3pRDz8y79IFT93UG8\\nZlIcAB2LLTY36aN3LfaFOOnzfR7xuSpaPl6TIaaco+KjbLFqPTbiloUmmYi0zbW2iTZBb15u\\n6hZz7m1yZlHEtOEQX4ItfDu2LGlCDbbk+K1Jpygy1YzTLiUjeG51KkToVbRPavvNJFrNHjvp\\nLElVksqe385aTp2czd3TQWS5cOpsNEgLyj9EgWj1FqRWqPcdJka5b9WptcotVlWpyl1mjz8p\\nVKVUpN0a7M3JVCTcflZyVeR5zUzLuracSBqqjmo81vALS+0l9F2pIqeBWMN4WI15V5ZN27Kz\\nyapZlVfzyWusWRW2qjatUdWjzBMzlIdmmk57F9l36QSANGP5RaP9zrd0t8IzvWhh7EzBw7g2\\nUIaRMVnDyv1DNSg8nyioz9Duo\\/QuO\\/Ntrl1lqWmL8w3tywrWOzYq6X8PTa7C80fOacpVhoie\\nZQlTYNySqal5dpKQPypMS+RxbITACJpC5JzQFRu6wSbAWcSM6bnU52wlN9VkC4lSQRjdgBpZ\\n6OWlLRfnvAfF20cQENy7c1UKLT53yG7qG04U6puCyqw3Trroba3NdpDlTo0ozMrQ4JV54JJj\\nJGLjlpqWnWW5mTmGJqWdTmamJZ1t9lxPNDrSlIWO9KiIlDbrTyEuMuIdbVqlba0rQocwpJKT\\n6jBBBBD8LgggggggggggggggggggggggggggggggggggggggggggggggggggggggggjXHpYc\\nqRojaJLVUpN1X41f2JUgt+XThXhm5JXNdLFQaStJlbmm25tm37P2LxaTNtXFVZOrol3dtTqJ\\nU3GS0NfU6tTKLKLnqtPytOlG75pibeQy3msSEIK1AuOKAORpsKcWRZCSbAsTE1LyjZdmXm2G\\nx+c4oJueSRvUo8EpBUToAY2ORhnpMae+ivolykwMYMU6PK3U2wp6Vw5tlabnxEn1Flt9hr7l\\nqWtcxR0TjbqFylRuZ+g0V5JIFUSRuioaVvLc6WGP4qlt4YzjWjnhzPIclfm6xqg7NYgz8moq\\n\\/wDktiS7LSNVk3lA5n7jZG0yG\\/1tMPT7Rdcd08Tc5O1Kcm6pU5ybqFRn5h6cnp6dmHpudnJq\\nYcLz81Nzcwp1+YmH3lKdefecU646vXcVnHPmK\\/KEp8qXJXCNPNSeF0pqdSS5LySVa+kzJpKJ\\nuYTYaKeXJWP5jibXhVRxq2nM3TGC4dR5xMApb8UMghahxBcU2QRq2REgfSg5frGu\\/jU7a0ZL\\nNkMFrZeccYl73uVMhd2Jc5K5OI8pl6e+y\\/ZtpuTDTqQ9KIlrunJN5pLshcLK8wnRhf8AiTiF\\nivc07eWJ17XTf111FRM5cF3VyoV2qOIU444JdE1Un33GJNkuqTKyLBalJJv6KWYZZGzHwqBz\\n+rx454XQMzmeA9\\/j4c0c1YkxriXFbpdrtWmptsKK25QKDMiyb+j2MkyG5dBSPRDnZl5SQntH\\nVkXMJnalPVBeecmXHrElKCcrSL\\/oNJytpNtCQnMRa5MXpGQ6zv8AsMLITzn0d8WAZkD19kL8\\nIhq1H1n3DrT7Y1y1WFhvPugioGZyHPFIVQMhnzn3QkegnvPDrlx7\\/GGouAyGXgw7aRqjWPE8\\nOofbzxfIyc1UJtiTkpV+dm5p5tiVlJVl2YmpqYcUltlhhhkOPPPOLUlLbTaFLWrpGUbM9H7k\\nkdNHHkSNScw+RhHaM4thX3T4vvTVpurlXNVS35G0Uyk7es6pcsoPyLjtvydMnS4yfnZpl3at\\nbCm0WrVl\\/wA3pVPm6g7pm83YWtDd7HM87bsmU6j03loTcgE3IvkyslNzznZSks\\/Muaeiy2py\\n1zYFZSCEJ\\/jKISOJA1jWilOZ38B7+jx8Y+ltWz7svqtylt2Pa9x3lcU6QmToNrUOpXDWpsgp\\nSBKUykS03PTHnOtoAaYWddaRvJAiWFgJyEOjfYgp9Wxvu27cb66yUuTFFlnHMP7BU4pOapdd\\nOoc6\\/d0+Jd4+ZMm8JFidS0DN0dhp92UG22x8M8DNHi3l0vD+y8OsJrfATt0UCkUS2BUFtgJS\\n7PzUuzLzdYnlDVzmJ5+cnHVrzUtxYBNn0\\/Y5UG5dyo4rrNNw7TmGu2mVLeafXLtJCVLVMzC3\\nGafKoSN7pmn0JsbpKRE2pez2rTzjaZhaJcuEBMuykzk2tRt6CW2j2VzewKXVqBBJbNrGI9gf\\nyLumbiwmVqF3UG3cD7efzc8sxHq2tcTrGQ86Us+3G6xV5eaLhyErcq7ZWUIdc2mRYD24PBDk\\nJtGOxRKVDGG671xtrLWSpmniYOHlkukAEtikW9OTV0q1VgoUtV77B9BH6zZ3xs1uXSUsukbZ\\nmhSs\\/c0ygrTrtD5tpqlJOqQZuaaXMqTmCULZkHmXE70OnIR0HcmkRiBWi41TXpS2pQq3IpjC\\nXJtSBuKXahN+UOa2tn58oxJ5HIZEa+0rvEe3fyU9lxdaTVXdo9bllEGVobQxE0V2G+eWqQwi\\npGdNldnNvzDdzdtQAEXlhnyfqnNdm67SSwhVj51X3eyG9JNqe2gu2N7pDsoQR6Jc+sYycw9w\\nZwD0eKKZbDjD3DjCmlpZ2E1OUajUWgTU8hGStarV1TbdTrD4AJ29VnpuaXqjN4gGGtwaROHd\\nF125GbnbimkZgN0qVUJULyGWtOzplpdbYG5Tkr5YQTqoQrflqmxi0kcJ8LAuq41Yv2xbM2tl\\nc00xdl0MOXDUGcwSqm0NcxMXBVwScy1TJCaUQScst41dYs8tJo92mJuSwos69MWai0t1EvUZ\\nppNg2nMgD6N9uerEtO3QrNWStlM2fJrUgAF1ClZJquc8sLbnj9HmGxLY9L0SlquzL1urMv1V\\nDaQSkOMzTiaFhiQdBsoMTKqm2kIVqsnMLJdwbs0wUgJxfjCUQ6yATSpBTUs4kEA5fMJQTlTc\\nRvAW01L3O8J3GRbcGlFdc6HG7fpFLobR1gl+aK6vPJT+CtKlCUkmyRnrIclHtXcCvPOMfb1x\\narjtOnqtfl+LkaFLtqVUZmsVmWolvSzaiElc2hTkhRpdBJCFLcaQklWzzI3REjxV5X3Szv4z\\nEpZ85aOEVIcC2kN2hQm6pXVMOKOQmq9dhrakzQSdQTlGkKGsDz0Ntr86MALpvXGLGmqCp3pd\\nd\\/YlVNK1qROXLWq1cglNYBBQy9UpmYYp7IQAhDTRlmEJ1WkJQkJREJqOyzykNqAU9tc20TVM\\npj\\/pTNEps4+7KZCU5mn6LSDQcMtqIBSl1C50JCipSV3UhWim9t2zbDIUjB2DFz8w3oioVAMy\\nKL29FxE1Mio1NxKTYqQ4iVKiCApOixLQxO5SnQ1wuE1LzeLdNvSsSpIFGw1k5u9lzK8s1pYr\\nlMR9yKVIJ1VJm7jllA6yfrpVq69MSuXEpzZmJXB3AucmCSoSdexKuGXktRIJCfKLTtZuoFxS\\ngdYlq9Gg3qlJDuuFt6SaVgzdM5qrqLsjSGjkVJde8smgkniGZXXYO4kkKm2iNyTzlPZdKwSt\\nyVCV1OcqFVWMs0BSZCWX\\/wDcmNeYTmecTm4fxoz6J5N+w\\/DQQ5VV1fGE2iylCdn3W5RTgy6t\\nS9HTTmS3cXDM1NzYNyFqcG6sq\\/5SmOaiVokZunUNlVwEUqRRMPlGosuaqJnBnIOrkumWOgKA\\njW\\/dWJHKm6ZuIiphpjEWQw7pkwV50rDe3abQgyFBQSJau1IVu72EtpUpKA3cg+sFr13UNqRh\\n\\/XKljFivPiq3XWb+v2fWpTgq121mtVtYU5mpZFSr82+lO0J1iA\\/5wV0Zxk9S7TtujanzZRKd\\nLOIy1XhLIdmgBwzm3w5NK5zmp4nPM9UfTJRlvPH3fb464talOYRwsgN4QwXQqJlTkD8tT5OU\\nmFiwF3nJVlMw8ojRS3Ztxaha6jFNVrHWIa+sqq1WqtVJVmAqVQmZltBvcBthbimmkgk5UtBC\\nU\\/mgRifTMEbqmwlVQfptKQQCpDjy5yZSegNyiVy6st+f68Tv1ctbztX7+nYE0NgpVU6vUqgp\\nORKJZuXp7KjwyUFJnXtUfuH0Kz87PmV3pBD8ximtTFwJkS6T+bLtoR7FqC3R6nO\\/fEYXPzS7\\n2cyC+5CQPYTdX\\/mtePh6dhtZFM1Szb8m+4nLNyf2lRKiPwiidcfZBPQhtCeqPspaUlZRGyk5\\nZiVaHBqWZbYQOOWSG0pSBluO45Z88OQgnju98KAAbhGimJ2ZmDd+ZemFXvd11xwX\\/wC+o+oD\\ndGEt5a\\/rOLcVzUpSuX6RO\\/kDpFgR0+r7YUi4IJ47u3j6v0QqEgcOPTz+uMQknfCMqlaqNu7r\\nd69YSCCert7oUCAOvt7oUCSerti8IA47+3u\\/TCCoDf7OMKCQOFz9\\/s+3lCQB5h6hF+orqHjq\\nzhWCEFw8APXr8o9JA3kd0WbMc5Pu74u1UjmHv98VghJUo8T8PhCStPefV87QQQQR5Hnad3v9\\nsEEVyPQfUYMj0H1GCPO0PIddHoa0giuR6D6jFII97Q8uur9bzIHiM4pqpPMPd7orBBcjcSIO\\n0HEH4\\/KLNmOYn390WlBHDI+Ovd7YVghQWod\\/jCgoHcfV17NIbkHnHrEWlAPV2d0OosKBzbvb\\nCwscdPh11ePSAd4B8YaFBHX2d0W5A8RnDopI6+yLCkHjx6ef1wsG+oMJKOINuue\\/4w0Ujo9X\\n2xYQRxEOSgjhv9\\/q\\/TFhAO4wsLI36j39eMeZlJ0UPn6juMIQRepBHDePbFkOAgi4hYIIBG7l\\n1yhIoy+rw6O6EyAdxHeIcxapIO\\/gfHGPY9hmpJT2dPf0QitsL38Fcx74eEZbj+n7ISUnLeOH\\nu8eOt1K76Hfw7\\/vgBtqI40ggkKGR58\\/G\\/wBEUh6tAWOvmPjmhmpJSSDDgJB+I5w7cLFjoetf\\nDu\\/XFICM9xggh4EEXENkEGxhm43qHMfVPDq6vthFSc+0eMo5EgEZHeDDNaCg9IPA+OeHkKvo\\nd\\/DvhxCr6Hfw7446ZlZWbRs5qXYmWx\\/e5hlt5Ge7PzHUqA6zlvPs+VnrBtOe1tpR5eXWreFy\\nSnZMpJ50ty7iGDx3BTSkjmGUfaLTzj0+PHenGSzMzLBBZfeZI\\/rbi0XOh\\/NKQRz0sfdDqVrR\\n9Vak\\/wBqoj4GOuKbZVTtSoprFiXrdVnVVrezUqPUpqRnmSMzqtTtImKZONp5wdsojrjKKx9N\\nzTvwu2SKbjEvESlMlBXSsQZWm3Y7Nho+aJis12VbudvMFSFiVutgvJOTi1KQ0pHUZGYy6e\\/j\\n6OMIkEbj+nrhiqSlKxE12OI6HQsRNhOUJrdIkKipA0sWnX2C+yob0rbdQpB1QpKtY39IxZiS\\ngudpRq3U6au+YmRnZmUzHjn83da7QEeipK8yVJJBBBjZhYfLSXnSA1K43aPLD6AU+U3BhzWp\\n6lsMjg4Ze3rkZrbEyVZ5oBvOWS3kEq2oc2iM8sMeVL0NMSthLv4hTuG1UmnEIbpWJtCmLeCC\\nvIa79fp663Zsq2gq1FrmLma1SFrI2Sdcx0nUap1hwJ9R9EfO1C26HUgpU5SpJ1Zz1nQyGX1c\\n5JmGNm8SOP7J64qKu+Txsir2dTFGquFplZKu3w7VnXGC4dxNOrKalLoauNWpZcqCLhKkE5ou\\nGg+UntFpJQiemJGusJsMlTkmw5k4gTEiZGYUvW6XH3XyDa4UkZYmxYeYwCoU1iuYX4kylZoK\\n1rSzUbPueTrtBecOTqk69LnZ2lTGYcDgQ4HQkrDhAKgDkfQNJy+KaEt1yTpdxsAJCnFtGlz6\\nsswf1xIpVIoz4qHzao555jMZHz\\/KFQqzZdVauDDi97ww\\/rzCkql6tbNbqFLnGC2SUFmcpkzT\\n6gnI55frw7ubcSczcOeUV04sLFyzM7eNu4zUKWAbFKv+kS0xUSwElCya\\/Sl27cj81kdo27UK\\n5VztW0azLyStp3TUrZntw2bFLmx\\/bhPtSbAC2qBWJidpsnZKUpQ0mlTpruFpt1KUpQlcyzJt\\n5RYBCQlJtCS2\\/wCzrE1m8aYLMo+5ZK5+RDE6QTbM4t+1OqEu3qSUsOzaxYfXJ9GdPb+ktYNW\\n2bVXRVLbmFEJKpyW8tkApRVlqTVPDr+QI891+Sl2k6wIVqBa0fX3VZOCOPtC+ab2tLDTF638\\nlE065qFbt5SUqt3IFbctVJWfMhNp3lC0NsTTS0BaFNusjOJLhpy0eGc4uVp+OOEV74bT7hQy\\nqtWy4xelu62f0k3MMTSLerklL6u8MU+SuJ5J8wLXnrDZtg5pZYAYyTEq9g\\/jNaVfrLiS9LUq\\nRrDtAvFtsjNTqbWrKKPdcslBJ13HKa0lJ81Z1gM7KkPK88ojZ2gS+2LZPJYrorYyTNdpLK6W\\nVtEpC3X6pS0VzC7voXWmXTJU0OJCkLW16S0SdjDGyrGqbYRxjLMzD4GSlzy0OrUokZW0U+o+\\nZVJQvopYVMpGihmBTn7Vxz5CnQ2xMROz+GpvPAa4ZgOusLtSrP3TaPlLyf2WetS8H6hNmWQf\\nPbkqFc9tS7WWzaDbWqgaZ8eeQe0vsMfLKphTP2bj\\/bsuHHGWrenW7Mvcy7JOu9M2pdc23SlO\\nKZycZk6JeFfn317VlqWce2HlEiW3MfcR7fKG3qm1cEokozlq8z5W4EgnW1aiyuXqBcUncC\\/M\\nPoSsBws\\/XC+\\/ba0obXnw0xc1Jn6A8QAqblcqtTxkM9dZbSzUG8xvDbclNFOWRJzCjbGGfKR8\\nlbaYptmoTc1s2rUxZOSuS30LKhy6UrUKrIrn8MJReyw9UVybi0nMptKu0SiA4k8n+py\\/aOs0\\ntqbQNfOKC8A6BvSDTnUIUVH85LMq7Y6BZuDHnu4j4VYmYRV9y18U8P7yw7uBsu\\/7j3pbVXtu\\noOJaKEuOyzFWk5RU1KnWbWzNyoelZhp5p5p11l5pSuvVjn6ePwj0sa3SMHsd7Xmrduei2Jij\\nas4P17btzUikXPTVHVKAubotZlZoSswhDig2p6Vbeb1wUKTmBGqLSB5CbQ7xWE3U8LXLr0fL\\nmmC84lVqzjl1WS7NOKBcenLNuiddmWW0ZZy8nbVz2xJM63\\/g+9OpbEzsmXUZNqrYNxDS8SUy\\nZQHZV1qYYUh9uwF5aflHJinzYJtZztZZFtCbp9Kjans\\/qsg642wrtHGiQuVmm1SU2g\\/oFDv5\\nPMBa5Wpm51yxCkWMxnzj3QioZgj1ePZG47SF5EbTSwWRO1izKDR8frUlQt4T2GMw8u6m5VAc\\nIM1YNYRJVyanDswBI2qu61kvNaql5PbLUdcVt3DaNaqFu3VQqzbNwUp4y1ToVw0ydotZpswk\\nDWl5+mVFmWnZJ9I+s1MsNuAZgjprip0Gs0NzsatTZuRVmKUKfaIZcI1IamEFbD3E3adWLa3i\\nHzUnNySw3Nyz0uo3y9qgpSu1j6C7ZHBr9ZClDQ6x83BF6xkc+nx9vpiyNcg2NuB3eMY0EMnE\\n6qyOY7x2H7c4ewk8nWRmOKd\\/Xlz\\/AAJ7IdhSTY+OkObfuW5LNrlOue0bgrdq3HSJhE7Sbgtu\\nq1ChVqlzbZGpNU6q0uYlp+RmknLVflX2nATmDnvjdnot8vjpX4L\\/ADbb+N8pTNJGxpZbDLk1\\ncDzVtYnSMmkto1pS9aZIvyldW0navuKu2hVmq1F9SGl3HJNALRo1cTrJI5+I7Rw9fCGUSSgY\\npr+G3u3otUmpFRUlTrTbmaVfI3ecSjgXLP6XA7VpZSCcpSbGMuWnZuQcC5WYcZJ35Feiq36b\\nZuhduAWlQ3er0LtFLlVdDXS4NMo1l4kNWRiNUVssIwsxR8ls+75iefSNnJ0B5+dmbcu59xxL\\ngalrXrlWqQbb205TpLaNJjZFHlU+che4lKkncQSCCOBBBz6++NpeiXyw+mZop\\/NtARegxlwz\\nkGmZJGHuLb9QuBun06X81DFrXYJpF1275MwSxT5MVGo25JN7EKtx9tptpPQ2F9vDTvZy2Kqf\\n2KjYfSdMSpbWthmmJFxSnUD85a5Z125NkSqEiJlIYu+qioM34ecS49hWyTrzUptY\\/itcI9Au\\nCNPGiRy12h1pPOUm2bmuB3R+xSqCWmfuPxRnJKWtuoVB0EeTWviSlMpbdUStamWJOXrzdpVy\\npzToZkaDMEb9wiFodQlaFJWhaUrCkKCklKhmCCNxSRwPBQ6QYvqk1qlVyWE5SJ+Wn5c2BXLu\\npWW1EBWR5vRxhwA6tPIbcTxSImMtNy0432sq828jS5QdUk7gtBsttRt9VaUq7ovgggjaRkQQ\\nQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRH65ejS9uTBvCfD3AXDS7qta97YvT9Qr\\n921K3KtUKPW5HDO3m1U9VMXOU56UmWJW9a\\/PCUdDcwpE5TLartNm2SxN74d6c1KUpSipRJJK\\njmVKO8lRJJJ5+PPGdXKU6SX9lPpi4uYj0+d8ts6kVb9T7DpTa1LlfuHsdx+k06ekipx0ol7k\\nqSatd+zzCUTFxTGTTIOxGDCRkO3fHz72pYoXirGNUmm3lOU6SeVTqYgLKmhLylmVvti9gJx9\\nDk1mABKXEJJOQRTFdqBqNSmXQsqZQstS4vdIabskKTroHCFOnvXuG4XpGscubn9HEfAw4AzI\\nHTFiBkO33c3fC6BxPT49\\/uitVG57hu+2NNF4HADsELpGQHw6emLEDfmewe72cP0Qu2hS1pSl\\nJUSQAAMySdwAAG8k7ukwyrU21038dSQLeP3iDr2xcgZDPp3+jm8dcXxsw0aeSc0v9I75trH3\\nEqwisGeLLwvXFZqdtwzEi4naomaHaRl13bWkTDGTlOnE0mSoVQLjI+fWGFF5qQTo38inom4M\\neRVnEqWqOkLeUuEuLfviXRTrDlpkKaUHJDD+nzD8pNtFCVMuMXXVrplng8t0S7JDGxmdC2dY\\nkrikPCWFOlFgKE1UQqXCkEA5mmMqphy6TmQrskNK0PapBjfU3ClaqpS43LebS67Hzibuyggg\\nWKEEF50EHRSGy2SLFabxFNwI0VNITSXqvzXgrhTdl7oQ+GZ2uykiKfaNJd3Et1m76u5T7YpT\\nobO1blp2qtTbzYIlZZ48N7ejxyAUw4uRrmk\\/i0hhv6F53D\\/CJJcmXFEhwS9Sv24qfsWClSUy\\n8\\/KUi1ZlTgW75BcDP0T5kQTtzYd4Y0mUoqHaFbdOpcsiWpds0OSlpVMpKIzLLEhQqWyhMnLa\\nxOz2cuzKIJJJTvjoa6dJSbd2kvaVGRKNb0pqVY1XpnLNWS2qew4JdlWQARt5iaSrWyUz5sO4\\nnxLsG2PBf4dYtlq1XWQFDD8iTP1EujVKF0WmuOrlO01CV1uaYk12N1psYujCexKdqnZupkZm\\noIOX9lTd5Clp1FygqIcmMqj6SWnHyob2QLg\\/QYH6IWjBouU1tzCfCmzLNm5SW2c3es\\/LJq15\\nTCA0EvuT173A7PV4MTCto47KM1OXpja3XfJ5JlrNmPs7mx+sS3ypmQmXrlnEZhKKQhJk0Hzz\\n59RfLcsts5Z60p5afOb8wDaamvzFDGSm0SlP3Xi5iPSbet+SWC9VryuGn2\\/QJRxQOybaVUJm\\nQpUu88fqNS6UOOuZpQlahGoPHDlmtHHD7yyl4S0W4sbK+yVttT0q29ZtjodSChwOV2tyTldm\\n1tPAkGmWtN0+cbStTVaQhTTq6OqPlcbT8bldD2AbLRS6e2ssorlWlW5xTAWQUK7BlUphmjPC\\n4Jbnp6rNK9OyTYGLq\\/AbAWBpZtzGmJJGTASFopMhlli4ABfs5ZlDtTnEaWK5aVYIunMoEi+\\/\\nm5tIe+K2XGaQZS2ZNas8pJPlVQUklQKXJ+aaKQQSCHJOVlHARkFERhPjTpNYNYPNrrON2L9s\\n2zOusmZTLXFXFVC6qiyXFEvU63JZVRuirNhwr1jTqbMpQVEq1d0RVcbuVQ0t8YzOU+RvJjCe\\n2pkLb+Y8LZd+hTpYW2WgJi7X5ieu0vKbUrbmRrFNk3XFqWiQa1W0N4HS1Gu6856YqWwqtZnJ\\n99b07Wak+68ZmYcObz83VJ9zOYmFHNTinHnH3CSUoUrKIPN7Ddqe0h5uq7c9qtQm2AsPfQ0n\\nNmbYllL1UlhLqZTD1HdFyFCnUmbYVcAKsBEZqW3zCuHG3JXAOEmUkAt\\/SlVCZRtdrBKlMtLc\\nn5xtVgQZmflHQBYoBOki3GrltcL6B5VS8CMNq7iDPNh1lu6L0e+5C2EOBeTU3J0ZhE9cdYlF\\npGsZefFpTKVKGeWpqq1S4xcprpgYxeVSkxiSvDmgzSiTb2FMs5ZrLSVILbjRr7U1O3pMMOIO\\nq9LTVzvyiwVZS5354+0XBRxQQ7X6qGhuK5OmIK1kHfkqcmEhCVgbiESrqcydVe7zu16PY1rU\\nPUVI0iWU+jIiam0+WTOsngtLsztNirPefJ0spO7zd0WDh7ZjsbwP2aqThaWrdRZsRUqygVWY\\nLqLWdSufSZSWcFhlcp0kwBqRYqJNGYn2143xEXW5vEE2zLOXHmFHP0XJhB3trVLFD8y2SSSJ\\np+aJ0BNkpAxflLZvO7JpyoeRVSovzrhffq1TW4BNOKy13nqhPuJM0sDipLjzquCQTkI7IpGC\\ncyoocrlZbZTkCuWpjRdXv36vlUylttCk8DlKvJz+qVJA1shYqAScufhl19ETebxXUHE9nKpZ\\nkkABKQ0gOLSkWATmcBQAALDI0ggbjuirF1GYdJIs2k3JI9JRJNySpXvIA193xNHw4tGlFBZp\\nTU5MJyPlFTJnlkgkheydzlUKTxCmpZsg\\/ugmOwGWUMoS22lKEpSEpShISlIAyCUpACUpAyyA\\nAEVbQED90ePcOqF0pz3nh7\\/HjqjUxNzEyrPMvvPq4F1xThHcnMSAO4WAHdGvcdW4SVLUrXeo\\nknhz4ch8hYSnPeeHv+yFQCeG8+N5gAzOXOfGZyhZKQn4mMIkk\\/AcobgSnLt5zF0EVAJ4CPI8\\nvxuLdW1igGe4QqlGW87z7IuAAGQhRKc+O4e+GlLJ0Gg+MNlRVonQfZ38h1rFoBPDx2wqEgdZ\\n8cIuA5gPQIVCBxPq6O3phskDfCwkDvPPrl7YTCSrs6+BhUJA6z093RF0ENFZO7T4+39UBUBv\\n9kEEABO4DM9AhZLKjvUdXq4nuHt7ITDZWTu0+Pt\\/VCMXJQpXAHt5vXwh2ltCeAzPSd\\/2eqL8\\nieAzghMNgwedQHYCfflCgZQOOZ7T3ZQ41FdQ8dWcV2Y5yfd3wkqSOPsghEISOCR6ouhbVSOb\\n4++K5AcAB6I87QcAevbBCEEOII87Tu9\\/3QQ3ghxFMgeIB9EHad3v+6CG2oj8VPqEWFlB4Zjs\\nPfnDvVSeb4e6LS2OYn07+6PQscbiCGRYPMoHtBHuzhIoUnik+8esd8cjqK6j468osyI4jKFA\\ng7iII4+CHqm0K4jI9I3fZ64QUyofVIV1cD7d3tj2PQSNx9XCEYtKQeo9Pf0xcQRuIyPQYIAS\\nN0LCxx05Hq8IFJT2dXARYUg9R8cYdRYUDiPV09nRDoWDv0Pu+6F6EcxDMgjjCakZ7xuPsh2R\\nzEegwkpOXDePd2w4CQbiEFJTqnXu639eMNCMtxghcpB4+uESCOIh1KgfHl8o9CgrkFde7u\\/X\\nFpAI9x6IRIIORheKEAjIwqFwzUnLeOHu+yEVoCx18x8c0PCCDkYQUnLfze77OvwXEqvod\\/A8\\n\\/v8Aj47wG2ojjiCCQRvG7Lx08YpDxxGuN2WsOB+HphmcxmDzHeOsQ6k2Pdxh3RYtuI69h93s\\ngi1SQsZH0HnBi6CHweI9UNag8iIYKSUkgwitORzHDmHR1RyDqNYZj6w9o6O6GZGYI6YeSbjv\\nGh67\\/drDyTcd43\\/OEO2LVDMdY8ZReQQcvBHgRSFA2N+UKhsoBQKTz7vHZxhkpJSSD+kZ8fTl\\nnHIrGRz5j7\\/Hxhs8jMaw4jj1j7PdnD4NwDzg6EceoZHqPjKLYXUMwfG+EOEOg5k2O8dA\\/P74\\nISeabdbUhxCHEKGSkLSlSFJzzIUlQKVDnyI4x8jPWVb86oOpk\\/IJgELbmKasyi21pOaVoQgG\\nXCkkAhWwKgQd\\/MPs4RUMj1HhD0vMvsE9i840R+gtSb20soAgKHMKBvuIh9pxafqqUkjUFJI+\\nHLrdHcGGOlppg4IJl5Sw8b6zXrfldk23aOJLTN50hMpLg7KnyT1eaqVQpEoOBaoE7QxkQkLS\\nnPLY\\/hby0KZVUvT9InA+pUM5lMzd+FU2isUgKWkBCl2rcE63MyMuhY133W7yqsyWFK2Ugtxo\\nNvaeljfmOw+728P0wgsZjPj09nX46YhmI9mezzF4ccruEqSubdzFdUpbX0JVC6oAF1yapoZR\\nNuAaA1CXnEHTMhVhFl4b2uY\\/wsWm6diGcdlGsoTI1FYqEmG0\\/wBSbanA6JZB4mVLC9bhYOsS\\n48EtMHR2xyckXMIcYbaqlfdG0lrdVUHrZvhl0Ml14NWzXEUu4XRLIDiX5yRkpmSzSvUm1oyW\\nc9rYx9xBt0Nszc81cck2AnYVptb0yG0gZ6lSYU1OqdUnJIXNvTiUnJwNqiABP2xRZ1aXzJol\\n5ptaHUzUkoycwhxB1kuhcvq6ziDkpLi0qKCBnwEZUYQ6bWl5gSZaXtPFmZvy2JTZ6tlYuNv3\\nhTNizqhuVlaw\\/MNXPTJdCNZtmUo9epEolKxmyCltTdXymxjHGAJxysbFNqdbw5MFfaqpNTmn\\npJqaKALNzU1TUOUqqBSQlKWKnRGJYFCSt0aZL0pXlFYdrzTcltCwjLui2Q1CmoS+lvNoVIlZ\\nxwTMsEm6luy9SW6QTkZuAFz4bX0kLLrGzYrrE7bE24UhS5hPl9LK1HIAT0o2H0JzO9UxIS7T\\neuCtzUDi4Xxb0e9HLSltxqn4uYbYf4tUYMOS8hVKjJSk3VaW24lZWLfuumOsXFb7q9utSnaF\\nWKfMay1ZqCvOiLHg7yy+F9XXI0jSCw5uXCWpL2LD92W8Hr4sXaFbbbk3MtSbDVzUxlRcDiZO\\nTp1zutISUqmluKGtt1wdx6sjECmIvHA\\/FCiXNTwGfKKhZtxMTS5Va0qW1KVqQl5jyqnzISta\\n1U2tSbEwhClpeYSYtGkeV1tm2eBqlbdtm0viairUmXdxJSWWJF19BUAXFuyqZzCdWdKcpTJy\\n4oirK\\/KqFgmJe1hHZxj1ha8E4llVOuozqo08fOLDT0VSc52VTZbB+s8tE42SLoun0oxZ0k\\/k\\n8th11M7XNFjFao2PVCXHmbBxU21x2m64VEoladeVKlhc9ClGEbk\\/OtHvOZeX9ecZGRiP3pHa\\nA+lhorPTbuMOD9x022ZdzVRiBQG03Xh9MNrcLcu6u7KCZ6nUtc5lrMU64F0isAZbamsndE3a\\n1dJW4qfs5e6qZLV6XTqpM9JBFOqacgNdTjaEKkZok6uTYZkSVFai8c9nGSFsYnWFfbIk5Opy\\npmZtlbD1BrLbcpOOodRqLlzKvky08lxLmotEq9NtqRrDP68X7hHH\\/k77Zg01hHFDeF8STJTl\\nw9Vkoo0+p9eXKyzTJ53zCpKF83Z4eqLyBvURZYFRYr2KVKldo8qnvSzSbnz2m3nqeQBbO60L\\nOyydwHaiVG+yVXBjzM4IneaTXI3aFukcKjWabZJwPv2cTMPC7cIWpKgU+ZnnPpEP1uxVyztn\\nVFtcxtHqg\\/TqbRK3Ui68X6626Wnmo6uk\\/wAiBpgYD\\/OVfw6p0jpGWFKbR5FQw6ln5a\\/JaTSN\\nzlVw1nXX6s\\/MlQATLWZUb0UlvJ95xgB5DO2r2zLE9FzutS6atKJufOKcFOOoSNQXpQgTCDYF\\nRLSXmkgek6DpFM1DC9WkMy+x86YGvbSoU5Yc1tWDyLD6xyFCbH0yBeNL606qiOvd2c3shi6n\\nVUeg7x8Y5+r0uoUiem6ZVqfO0yqU6ZdkqhTajKvyU9IzbCi29KzknMtsvyr7DiVNvMvNIdbW\\nClSeaOHeTmnPnTv9HP8ACK\\/AKFWIIVcpUkghSSCAQQdQQdDfkeOg0BOZJ0N02++\\/shgsc\\/o7\\nfHXDdY4H0ePbDsjMEdI\\/RDcjMEdPj2RlINxbl8OrwtBuPDT5dd0NVjdnzjj2fp98S9Pk6mln\\nUrzsnFHRQvavz9WrGHZlMSsLzVqnMz8y3YVSXJW7dltyCJt1S5WjWpcH3P1CRlJfXYS7ek9q\\nNMNyzYdiHHeCOmMvtAPSUf0S9LjBfGt2afYtuhXSxRb\\/AGWddflWHd1trt28wqWRmJ16nUWo\\nzFcpko4NVVapdOeCmnmWnWp3s7xEcM4qpk+twtybryZKpDNZBkps9k444OIlVKRNgb8zAAPp\\nERtaRPGQn5d8khsL7N\\/kWXCErJ55L9oN3pJTrHpRQQzl5hibYamZZ1p+XfaQ8w+ytLzTzTyU\\nutOtOtKLbzbzZS4242opWkp87LIl5HeG\\/dFuwQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\\nQRrq5U3SNVoy6FWLt302dEneN5yCMJ7AWFFL4ue\\/mJ2nvz8q4EqQiety1mbluqR2qFNOTNBa\\nZdGTqhGxWIf\\/AMoR0iDeGOuHWjdRp7aUnB22xdt3y7ZyBv3EKWlZunyM0hSM1qotjy9FqUi6\\nheoW7ynWdn9FvgG07Ef4L4LrFQbcLc4+z9G08pVlWJyfBZQ42bj8pLNF6bHIS6rXNknS4gnv\\nMKVMug2cdSJZmxse0euCQf0kNhbg5lGul4j0JGZy9cOEjMgevshNAyGfT7ocIG7Pp4ePHCPn\\nqo2BPs698Uz3da2hQDMgdJjl6VSqpXalTqJRKbP1es1aclabSaTSpR+oVKpVGdfQxJ0+nyEo\\n29Nzk7OTDjcvLSsuy48+84hpltTiwI4tA4n0Dx4543QciDo7\\/qs6Vz2KtakXJm09H+gruhDq\\n2i5Jv3\\/cYmqJZUi+rIJSuTlxcd0yjiHAtqftqngtFlxWWXR6a5V6nJ05olJmnkoWsDMW2Rdb\\n7uUkBXZMpW5lJAUUgXF7xnU2RcqU\\/KSLWi5l5Dea18iN7jhA1IabC3CBqQk2jmNF7kQdJLF9\\nMhcWNU3KaPtlPLQ4ZCtygreJtRlclkmWtGWmmJSgJcW2Zdxd11el1SUU4iZRb8+zudkV6MnJ\\ny6J+igiQqth4eydwX1TktvfqoYhmWuq9m5tlBznqXNzMqzSLUdKStKlWhSaEpxtWzmlzGWsc\\nmcR8RWrBkpNSZT5wqNRU8mTllP7BptLAb2szMEJWtTSFOthLSdVTq9ZCXE6q1ow5vbFO4q7K\\nTk5ctwNUyhyjLs3ONB9FIoklKsI13X5xS3W0GXl0BxxT9QmnQykaynA0Dk5j3bPsr2IzrtDl\\naTPYpxxLoYcVIt9mDKuzLLcxK+fVZ9ky0gX2XG3EopknOTSUONl9hAcbWrqjA+xlE0w1UW22\\nGJS5P0tUSmYfV2Ssrq5SWGVtsNrCwFnzbQKHbuZTGYF0Y2Wbbe1lmJo1+ooJSZWkKS4w26CA\\nQ\\/UCoSiCnJWuJdUy6hSdVTKYxtunHC9Lj2kvJTCLdkHPNTLUla0zikFJGq9UlATKl+cokyok\\nkniUZAxpM0iuVz0Y8GDUKJYU3M47XpLLcl\\/IbJmmZay5aabXqkVC\\/wCZZmabMskZrRMWnJXW\\n0tYSy6qV1lON6ItITlO9KzH8T1IXeZwvsmdC2lWfhgqdt1MzKON7FUvWLl8qeuqsNTLOumoS\\nblVl6JOqdcBozbS0st0lUcQ+U7twuhc0jZbg6ZOjEmZulTMxKqAB7RwXxFUVLaJBStymUmbB\\nJCUj0RLqhirZPs\\/uhlSsY11rTJLlmbl2nkgfXfJFLl0pWkp\\/IicnmCAFpMSb9IHTu0ZNHNyd\\nlsSMTKfP3ext1O2Jaaxdt8OTLYSpUtP02nvql6DMPa+bTl2VChSz+qvZzBUhWppDx65bDFu6\\n\\/LKNgDZVHwspCw40zddzJlryvZxJzDc3KU+YYFo0JakqIdk5qRu0hQCmqkkFSBplo9q3DcTh\\nckZJ5xtxWu5PzJLUsVlRDi1TLuQfWVZhaWA87nuKAY7ioWEVPYCHq7NuT7oyJlJUrl5Qb8il\\nb3mzTyTvyUgyqgPrDONhhvyf9luDSiaxAlWMqyghbi6olK5PtrhSiijsqVLFLm9SKo\\/P3VdQ\\nWLgRT2LfKAxhWe0l6fNN4akFAoTLUhSlT5RpYO1JYD6Fo1CXJNNPBTYKQTqfgr5xIxWxsuM1\\nzEG8rzxIuN3aBmZuGq1OuvyzK3C4uVpzEw6+zS6ehxRKJKnsysjLDc0w2gRyVFwkrc6EPVZ9\\nikMK3loas3OkcQNm0sMNaw51zBcQfrs5+acgafS6dSmfJ6dJS0kzzolmktBZGeSnCkazq95z\\nW4VKJOZVHIoGZ38B4A8emLUcxCWGG5OjyUtTJRhAaYbaaaSlptP1UssNoRLMoGtkJbWBwMUT\\nN1eamnXHluOOPOqK3Zh9an33VnetbjhUVKJ3lRUTprHxdEw6tajJQ4JBNQmk5Hympas0rMZ7\\n0y5SmUbIJzSpLAcTkPPUpOcdgMtgBOQySgAISkZAZZAJAyAAHMBuTCSUlRAHP7OuHwAAAHAR\\nHJqZfmV55h5x5Zvq4tSsoPBIOiQbbk2A1FrGNS86tZ9NSlE8VEmw5DgAbbhp3axWCCCMNRsO\\n\\/hDKRc29vhBDlpvLzjxPDqB+PwhNpGscz9Ue09HfDwAk5CGSd5PiYWs29Eev5fP9cVSnWPVz\\n93phbsigAG4fp6zCyE5bzx9w7\\/HTDKlZj3DdDcVSnLt5zF0EVAzIHTCd0G6AAk5CFgABkIAA\\nBkIVSnnPoHRDKlZvAQ0SVmw0A66HjrAlHOfV3936IVAJ4RVKSo9XOfHPCoAAyENqVbTefh4\\/\\nKHALCwigSB285i6CLkpKjkB78h29HphoknUwhS+CfWet8Wwshoq3q3Do5z3QqhoJ3nerp6Ow\\nd8LAE8PHbHkNxYlCU8B6ef1woEk83pMXhAHHf2936Yvhsr5a+MEWBAHHf7ovyA4DKCCEEk7z\\nCCscBf3QQRdqqPN8PfFwb6T6oSVAbzCbrV3D2e\\/f7ITjLTBHQxxl0jMMr2xGwdRa94zlgVtq\\nlV3DWSrzTOJrki\\/TmqixcVMt2aYZlZ6izKlTUhJatURUqlUadU5Ol06ddlHEjFHUT2+nuyjI\\nfRf0jb20WMYLaxZsh0vKp7okLnt159xmn3daU64z88W3Ug2SnVmG2kTVNnFtvClViUkKq2y6\\n\\/IoZjdYdcoQqsunEbc6ujO5mZx2nuBuclA8koROsBTbqXlyqyHVS621h5CVISCopjMkPNBNN\\nJqPbGUcVkdUwsJdZCrJD6MyVhZZJCy3lPaJSUgpNlDoWrUmqUGpz1GrlMqFGq9MmXpOp0mrS\\nkzTqnTpyXUW35OfkJppqak5plwbN2XmWmnm1bnE80cZExDE\\/AHRV5TDDGi31KNs23iBVrblK\\nlbGIlFl5Rq76ew5Kp8mkq8w2tqVu6iyL36ynqTUnTPUd1mYkpSboU46\\/rRi9J7RTxb0Tb8cs\\nrE+jASc4Zh+07xpQcfti8qUy6E+XUedW2gtzTO0aTU6ROtsVWlOrZE3KiWmpGamt7XMItS9I\\nlsWYWrEnjDBM+4tqVxDSrkSr7a+ycp9akyS\\/SalLPBUtNSs0ltyXmkqlZlEvOBcqiQ4owdVc\\nNOgzDZeklpbcYnG0\\/k1tPpS4wtQSpaAh9tSXGHm3HZeYQpK2Xl3sMY4IcRTIdA9QiC9oOR66\\nPR0ifZ9\\/uhCCFtRPZ6e\\/OLS30H1woLSe7xgyrG439fzhODIHiM4u1VDm+Pui2FA8j7IM6hvH\\n2deyLCgHhu90JlJHH1wvBCgsjv8AH5woKB3ew74aqQlXEenn9cN1tFO9O8dHOO+H5QDw3eOj\\n9EJkEcR6eaHAoHuPL5c4VHHQQ7W0FbxuV09PaO6GyklJyI9+R7\\/RCo9CiPDlCZSD28xhIgjj\\nC8UIBGRhSVEb9R8PD5Q8CDu6664w0UjnHq7vHs4JEAjIw7UnLs5j3wipPOPSOmHgeI9UIUni\\nnfyH2d\\/W\\/e0IIORikLkAjIwiRkSOiHkqzeMKSrNw1HXQi0gEe49EIEZbj+n7IcRapOY3cR4y\\nhUKhmpOqerm7vRDZ5GfnjiPrdY6fR7uyHxGYyP6D7IRIIORh5KrjvHv7+vtj0Gxv0Y46CFXU\\napzH1T7D0d0JQ6hVjbgfjC1AKGYb+tPVBDV5GR1hwPHqP28fXDqKKAUCk8+7x2cYeBsbwhJs\\nb+3wjjlJzGY4j2+Pj6kYcqBSSk8x8H0jKEFDVO7n3jqPR6IeHPgd3XXyf3xYQCCDwhAjLcez\\nfz9+cOITWOf1+PHshxBsbcD8evsgjj3U6qj0HeO70Q3WOf1+PHtjkHUayetO8fEen4QyIzBH\\nTuh5JsQfb4R6efVxa\\/zhCLVDMdY4d0XcIIWrQhQ7uvWIAbEHlDYjMEdO6ECOIPWDDpQyJ9Yh\\nBYyOfT7\\/AB8YfbVw4EXHj+qHxqAecNCMiR0HKEFDIkersh2scD6D48c0ILG7Po4+PHGH0Gx8\\ndPl13wQycSDrIKQpKhvSoZgg5g5jgR1ccuvdDWjGpWjXJW6rGuC4bCuiTJVJ3FZdZn7cq0qo\\nqSpexmqY\\/LONpcKEFxKFJLuR2h4Q\\/WMxn0e7x8YQUMwfWIyAo5HGyAtt1JQ60sBbTqFCykOt\\nquhxCgSFIWlSFDQgw8w+9LuIdYdcZcQtK0ONLKFoWkghaVJsQUkApIN0kAg777HsFuVf0mcM\\nDKUvFSl2\\/j9azIQy5PTGxsvEViXTqtpU3WaXKPUGqiXa85SanQX6pU3UJ8orTDji5g7gsBuU\\nh0VceHJSjyl6nDe9pghCrHxUTL2lVlvkpRsqZVnpqYtisLecKhJS0hW3aq+0kuOU2VJKExWC\\nMwR0xx83Iyc8gtTssy+jeAHEBRRnkCW1ZayFZfhIUlX7rpqLFGwzZ5intH2qUnDdSXmPnuH0\\nNy0upatQp+jrSacpF7laZJFOeWfrTGgtduFNvWO8N9kxOTqcRU9FgZarlTsylAtm7GopInAq\\nwCUecLmmWxuZ1N\\/QBtTGS+bSLTTNTNWpzeqFU2tlc8gNHiiXmitM5LFIz2aWpnYJUCpTKv2M\\nZOWjpB2dXtlL1oPWxUFFKSZxQmaU45kTkipNpRsASjXV5bLyrSCttCXnSN\\/n7YGaYOkxo4uS\\ncrhviXPVe0pNxH\\/0tsRFTF2WUqXQUHyGnImX01q2ZZeoMzbVVpTi1FSlrUFqC9zuAvLA4K3o\\nZCg4829VcD7ndLMt8\\/lUxdeGs\\/ML2TTbjdep8p8828Zp5S3TKVujrpdMlgDPXK+ErcOPQMR+\\nU1sRLacO15vafg6WtlolUTNVR5iVRlSG2ZJ538IKcW2grsmaHUp2nMnKt9pywbi5qdjrZHtD\\nyt1NpWDa67Ydo6tqVl3HlWuRUG2xT5gZiMzlQl5R5eqW1DUmRPpH6D+itpgUd1WL+GFu3FWJ\\nmTLFNxFoOrQr+pyUsttS0xI3lRtlPzrUklhgytNq66pQTskszFLmWNqyqN5pXfJ9MYbEFRun\\nRVvOWxmtltUzMCwLucptq4l06XSlx1qWp1YU7K2febiGWxtpharLn3H3m5eRoc4Qt0bscNsW\\n3006RufDS96fW7aqaTMyU9b9WkbgtertFZbW\\/Luyj85SZxBKC2mal1LW3qkJfQeGd2EeKLmI\\nUtUZapSctIVikplnHkyrjipebYeDqRNS7Luu6wG3UajzRffSEqaUlw7TVT0ns12+7LNvVUlM\\nK1\\/Dk9g\\/aDOJmEy8uoh5mdfk5dyZmWpKtsS7BdeZYlpl3zSt0+WsEKallTLxBMdxvseTJSrt\\nWSqWqNOs2v6UkSmXnG0PrQhp15kFxt5C1ONhLqFzKbKC1BtGseahdlqXNYly12zLzoNXte67\\nYqk5RLht2vSExS6xRatIPqYnafUZCcbZmJWZl3EKQ4062CCDmNXdHyqhkT1743s\\/KH9H13Bn\\nSrs3SLo1PCbI0kLZEpc3k6EhMpifhvK0uh1aa2batnLmtWfM2fNpCmmvnOo064ZwrfmA+4nR\\nProdbQ62oLQtKVoUOCkLSFJUM8jvBBEZWI6G9h2sTdOcKltNPKEu8q13WFBLjC1hOgcU0tsr\\nSAEhRIBNjbmKoSLlNnn5Rwk9k4pCVkWzp0U2si5sVoUlVrkeloSDo2WMlHr3+PTCCxkeo7\\/T\\nzw6WN2fRx8eOMN18Ow\\/Z8Y0sY6TYjv09segFyMekx\\/ZIaCmGgqtQE7fODKncFLy2jifKXPuO\\nlZNdm1NaFOLmX0VKwqhbSJiovJAnq5KVtttS1yrxjbDEJf5PRpJHDHStubAas1ES1s6Q1qKb\\npLL77bcu3iRh6zUK9b6kKmFBtlVUteZvOlltkofqNSXQ5bJ5bcu2mbRHdezSv\\/hDg+lzLi88\\n3JoNMniSSozEklDaHFkkkrflTLzCzuzOkAC1halAnPPKYwom7jA82dJJJKmgkJJJtcqbKFE\\/\\npFQubXggggiexuoIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+cuq5aLZls3JeNyzzdMt61KFV7l\\nr9Re\\/YqfRaFTpiqVSedIBJalJGVmH3AneUNk9UebTj\\/i7W8fsbsU8Z7g2qKniXfVw3WZV1wO\\nmmSFTqDzlHobS958loFHEjRpLerVlJBoFagnOJlPLhY\\/pwa0JLismmz4lbqx9rtNwzprTLy2\\n51u2ErNw31OpQkAOyLtDpiLVqIUrzU3dLZghZyg9IG\\/Po+Occk+UTiHzip0fDLK7tyEuqqTq\\nQbgzU5mZlULTwcYlW3HEki+SdFiLm9bY1ne0mpaRQfRlm+2dA\\/rr1ggKFt6W0hQ5h7W8KgcA\\nOwQ4A4AdkJIG\\/Po8d8LoGZz5h4Ec0LOoHL7YhEKgZADoibXyPOj+nA\\/Qzs+u1KQ8ku\\/G2bcx\\nWry3mNnOCjVhhqTsaRU4tIeXJJtKTkK3LMLAZYm7gqK2R+uHHnoiOi5gpUNIrSDwkwYkEzOr\\nfd40ynVl+UQpyYp1qyal1a8Ku0lAOa6Ra1Pq9STrlDetKEuust\\/TCf8AVmZp1iWW980ysrTq\\nfb1Hl6bQ6fJpRLycmiXZbp1HkZWXSAhqWlimXZbYbRqtMNqSEEIBic4PclKPKVvFNRUGpKky\\nMwtx42\\/Isy7JnJ14X\\/OaYbRbmlxYJANjaey+iOVCovTiUZ1pU1TpMEGypqbUkLykblIbyIO\\/\\n0Zg6E2jF3F2vi4L0nw24XJOj5UeUCVEozlFrM2tIAAzXOreGukfSNNtEr1EoiEJykGlve2PO\\nkHiXa9HvivqwVs243LTtO0ZOrzLVq1BdrbKmVO5n6ZKvNyNXma1cEnUqpTKlUGHpmWpMzJSz\\nC20tFJlDaceOo0dtGDFzE9moKlbnat6Yt6yXA+hM4u+bsX8xW9NyyXVpdm3qROzxuOcaQsOq\\nplHnXkeaypaYMUq09PzcvKMAuTE4+2w0CfrOvLDaAo5ncVqGZP1R52\\/cBzXsMpjuMMWY52tY\\nglmnZmfqb7NNU+gPJlHphaZ6bMuXUnszT5P6OkZR5uy0S6nmsw9IG79vFd+iKVh3AlNmFttN\\nSgn6oltZbLrLSVSsmh4oIzofdE7MvsruhS0sOlJshQ+wt2xq5cTaJpoNSlPWVAT0yf2QJWpC\\n\\/J2UfSulCk6u8IaKgobbMHLuqgYc2\\/SlNuzDRq02kBSn55KVMJIzzLUmM2UpJyKQ\\/wCUuI+s\\nhxOWcfV0yRZplPk5BgANScu1LpOWRVs0BJWofjLUCtZzJKlKVrK4xzDKdVOfOrf6OaLkqFdn\\nJtbiG3CxL5lBCGR2alovZJcWDnJUmxUkFKNSMto5AenHXSoBWRFzYJ0JF9LneTbU6gb9NwhR\\nCEjVQlIQkAAJAASEgDIJAGQAAIATuEORuAHRCaBxPoHjxwhSI8s3Ph8ePXdGJBC6RkMvSe2E\\n0DM59HvhwhOsoDm4nshsm1zyjwmwJ5QuynIax4nh2faYWgghkm5ueMMk3NzxgiqQVEAcSfB9\\nEUh0yjIax4nh1D7YYUbnu4dd8OfUT3nr3db4USkJAA\\/Sen05Zw4SMh1nxlFiBmc+Ye+FgMyP\\nGQ54ZWrh7fs6++GouQnM58w98KwAcw9EENwdddcIAM9whcAAZCLUJy3nifdCqU5nM8B7fHx9\\nTS1XNhuHvho+kQkbhy+Pq4ffFyE859Hf3fohZKSo9XOfHPFAMzlCwAAyENKVbdvPuhwAAWEV\\nAy3CCDsi9CCs9AHE\\/AdcMw2pV9Bu4nn93x8N4hBWegDifHPDtKQkZD1857YuAyyAHUAIVSjL\\neeMeEgD4DnCItSjPjw6OnuhYtuoS0VIWhLzZdZKkKSHWg84yXWzkQ4hLzTre0HmBxt1sb0GK\\nRtW0NNOLDq37YoWjNpf4d2lido6tvzcrbNZqVqyFQuDCiZrc+9OztQllSsqKjPUVU\\/PTtQnp\\nullu8qY9NzM5TJ+oNMtUc7nDtOpdYqHmNVrbdAQ80RKT8xKqmJBM2FJLbdQcRMMuSUq4nOlU\\n6luYQysoLzaWip1vLkWJeamAxMTiZILSQ2+40pxkPFSQ2l9SFBbLShmzPJQ6EEJzoCCpxGqm\\nCJAOlNyQ1Due2JXFnQJqsletLqEs7VXcMKtfdOmWKzITZknqWMML0rnk9OS4JR1575txEulh\\nibbU1Mi8pXV8ie0G12Rqtp3hW8Pb0oFfsbEO2lJFw2DetFqFrXhR2l63k87NUCssStQdpE9q\\nFylV6TTM0CsS+rNUiqT0otEydhiDAuIcOMszs1LNT1GmkNuyWIKO+ip0KdYdALT8vUJbM2G3\\nb\\/kxMJYcWPSSgpIJyqxh2r0R1SKhKuISlWUPISpcuo2BAS4EjKSCPRcShYNrosbw0CDzn0Dx\\n3xeABwEXhJPUOk\\/DphQIA47z45ohBUTv9kakADcPXxhIAngIuCDz7vb49cLAE5avoI4buvhF\\n2zPOcuzf748gKgN5hEIHPmfZ3xXVSOb4++HAQnnBPpy8eqK6qegeqCE5xyPu+cbeuS+x9naT\\nVKngxPVByVeYXMXnh5Mh1aXJebYKFXLQ2VAk7N9sorctLIDbQ2VxLeU+Zltsby7eqWDPKG6N\\nVJomItFlp+kX5QmamyGnWmqrbl0SaH5Oan7eqKmlfNt1WpV0VKSceaaVLzrbMzLvS83Q6hOy\\nDkPHDe+Knhpfdp39RVKFRtWuSFWbaCg2mbYl3QJ2nOqy3S9SkVzMhMgbzLzLwGW6NzXJS4wT\\nKPu4wemZ51LkiWsRbPcS4ElhKnZOkXKww4VBSU7dVBnpaXZzSFv1WZ1UqU8pWhwXiCrbG8c4\\nqxNTk\\/SOC8aooz2KsITCu0plSmmhUJGuzTcsvOzL1CZlHaY+idS2FOzAfRNB6WUto9dbJ5mT\\n2hYAm8LVYNu1PCaksST7qQ44uh1ELVLMLB9J5mVmG5hhbZuhmW82Q3kXkMay9LnRTvvRHxXq\\nGHt3ocqVDnNtVbDvNqXEvTrytovFlmotMpdmhI1WTcKZSuUh1516nzm5KpiQmqbPzuLOqk83\\nw90TQNLrA6l6ZejJeNos0KRquLdq06euLDNbk9K0eYavqRknnKVJt1eabXLyNIu9DZoFXanN\\nSnJD6ZiZMs9TadUZSGQpKkqeZfl5mUmpaZmZGekZyXekp+n1GQmHJSo0ypSb6G5mRqdMnmJi\\nSqMjNNtzUlPS8xJzDbbzS0Jt\\/G+HaTJopGKcJzC57BOLZU1GgzKgSuTXmyzdFmyVKUibp7gU\\n0W3VF4ZFsuKcfYfXHO2NsKzGEqu9KKbWJVxaywVEq7MixUwV29PKFJW0sk9owttdyrPZqUDm\\nzHt7otKDzZH2Hx6YdlCeYEenPx6os2Z5jn27vdFfRDwtJ7vGGpBHEZRaQDxEOiCM9b0k8N\\/X\\nwiwoB4bj45oASN0K0PeIalB4j1H7ePp9sJw6KSOsdI+PRFhAPEQ4F8\\/b93XhCCjiDY9buUIQ\\nRepBHDePbFkOA31BjwKKdFXt1x4wkpGXDh0dHfCSkhQyPr5x2Q6ixSM944w4lfA+35\\/P9cLB\\nB3Rxq0FB6QeB8c8WQ\\/IBBBGY5wYZrQUHpB4H4HrhyFAkG4iwjPcYRUkjsPA+OeFooQCMjCkq\\nt4cRDyTcd\\/GGi08SPT3+PdwSUMxl6odEZHKEFJy3jgfZDwO4jxEIUPzh4n52+P64akZbjBCq\\n057xxHuhKH0m47+MKBuLjfpfr22\\/XCa0849PfCKhmOseModdsIqGR6ubx1R6DY35QqGakhQI\\nP6D0+jPOGSgUkg8QfB9McksZHPmPvhs8jMawG8cenL7IfBuAecKQbG3A\\/HnDWCCCH0m47xp9\\n8CxY9xhF5OY1hxHHs+ww0UMwR6vHsjkTvBHTDJxOoojm4jsMPIPD1\\/D7dYUg8PXDSA7wR0xe\\nsZHPp9\\/j4xZDkOQ3IyJHRuhm6nVUeg7x3eiOQWOB9B8eOMNnk6yc+dO\\/0c8PpNwD7fGDn11x\\n9scesb8+Y8e0fZ8YshcjMEerthCHR6SSOI3fZ8oItWMxnzjwYbqGYPrEOoQIyJEetq9oNx4Q\\n6g3FuXw6+yGpGYI6YbkZgjph2oZE+sQ3WMjnzHwYywdxHjC4akcQeww3IyJHR4z9MO1jfn0+\\nO6G6xvz6fhlD4NwDzEHQ93XqhsoZEwgsZHPp8fb6YcrHA+jx7YQWN2fR47oWk2I79IfSbge\\/\\nxhqsb8+n4eBCS0haSlSQpKgQoKGskg55hSTmCDwIOQI64cKGYPVv9X2QjGQk2UPG3Xxj2Mw+\\nT\\/xgnMD9JnDV8XRXaDh7dlyJti+LclKxMyloVRF0SU3b1JrFdo6300om3azUKbWk1MsoflGZ\\nB4JdLDkw25NAwluNNq31SJx1epJz7ho9QKjkkSlRUhtLq1DPVblppEpNr1QTqy5SRnHn9JUp\\nCkrQpSXEqCkLSSlaVpPmqSrcUqSRmCPq9eYMTK9D7GFOPOjphhiJMzZma9N0Fqh3apTiVPi7\\nrZcVRK8++nNxbBqs5JqrUsw6pTvzfU5Va1KCgo8+bYW5\\/CmLcDbVKKhAqNDqkkh1zRAdmabM\\nGpU9MwtKSp1E00mek5lTmbNLJblzmbIQOrvJ6rrdVpeJ8BVJ5a2n5ddRkUrUVlDEwhEhUUNB\\nRsjsXDIzDLaNO1cfdACsxOSXLR6Mp0nNAHF2m0yQM7e2ETDGOljBKUl75xw9lJ9+55JlvWbU\\n+9VsPZ+8KZJyiXCZiqzNOdSzMTEuywrz+bQnvLaSJdas3ZFWwOZOZZIK5dR5gAnWaSOhnhwz\\n9SXD+vN3jZFIqE1qTDr0iqQq7TqUupcnJZKpOdD7awUKTNpTty0rWbUzMDJJGZPm4aauj47o\\nf6buOmAyZZ6Utmi3pOzVjbZaHS9h7djbF24eOqmGipqZmpe2qvTaVPuII1KrLz7DzEvMMPS7\\nP0Ax55jijDeHcbUchyRrVMkZ5h0WuWJuVTPyRWE3s4ZZ59txJ1SttDZJIAFQ7QKM7JTai6jK\\n\\/LPOyMyLEgPyrigDfQnOkOgE\\/WS2ki43dFkZgjphA7wR0w6UMlH1+uGyhkSPGR3j2RTAO4+B\\nitwdxHiI+7wjxMuPBjFPDvFu0nlMXNhveluXrRl7UtIcn7cqsrVGpWYOosGUnTLKk5xtbbrb\\n0q+8062604puPTlwxxAt\\/FrDiwcUbTfMxbOI9nW1fNAeUQpa6PdNIk61Tw8ElSUvolZ1tt9v\\n+9vhbKiFJyjy2FjJR69\\/j0xOE+T76Q4xY0M5\\/CGqVDyq6NHO8py2ky6ytcymwL4dnrtsqcff\\nUTrN\\/Oyr2t6RZBHktOtuVaGTWyEdAbBq8ZesVLD7qsrVSlhOyqSRbzySv2iECwOZ6UWtxR1G\\nWUTEvwlNdjNuyilejNNZ0A\\/11n0rAHippSyojUhsXuBpvigggjqiLBgggggggggggggggggg\\ngggggggggj5e8Lrodh2jdF83PNinW1Z1u1u7LhnlDXRI0S3abN1aqzakgjNMtISjzygPrBBA\\nUN0JWtKEqWtQShCVLUpRslKUi6lKJ0AABJJ3AE8I8JCQVKICUgkkmwAAuSTwAGpMQ3OXzx7\\/\\nAFS9LmjYP0yc29vaP9lSdImmETPlEsL7vxuTuq532S2SyhxqgGy6RNtEreYqFGnGXnQ6nyeX\\n0cIGQHXv8eiOw8ZMS61jRi3iXi1cRUa1iTfV03vUGyorTKvXJWpyqiRZyzQmWp7UyiRk2W9V\\ntiVl2mWghptIjr4DgB1AR83sY1xeJMT1utqJKJ+feXL3vdMm0QxJINyRduTaYQbW1SbgXija\\njNqnp6amlX\\/LvLWkHelvQNJ\\/7rSUJ56awqgZDt3+Pf6YcIG7Pp8d8JcIcDcAOiImTck84wok\\nIcghgUmt4iYs6Q9WlFLlLGosrhzaDzzSiwu4rs1anc07LPA6onKLbtPp9OdQTqmUvFZLYyaW\\niQpjdWQGKVb7ThydWuqTiUKGezRry8mhSRxS4tc2tQVl57DSupGO\\/JnYFpwC0N8JLbmpUyty\\nXjSRileKXEFqZNfvxiWqrErNtEZszdFtxNv27Mo\\/36jKzy4R9hfNXTVrkrNScfCZRhxxhl1x\\nSUstykgksh0KUUoQ0tDa5kqO4B1W9KQAI\\/tqrysP7M26BL+hO4kfakXCldnPNQpM7Uj+bdOV\\nLMg4LklqaIGl1Ds7YvhxMmxTlvICTKyqqnM3H\\/XZ0AspXycZaWADuBlRYnjGG5dvHFMxWcIt\\nHSkToUzSpaZxXvSXaWlxtVQn\\/LLbsiXeKEazMzISDd3Tj8sp3NctWqZMqaSkSy3NGeFdI8vu\\nBdQWnWZpLBdBO8eVTGszL578gUt+UOAnPJTaVDpHYemFjY9pEaS2MGLQmVTFKuO7p2WtbMLQ\\nGrLoCWrds9AaWSGXXLdpdOmp4JAS5UH5uZKNd5alPMM6R822yw+tJExVXFT68wM9irJqVSDx\\nKSwhLyRvyL6+aJLhmiJwRs4o1FDYZnXZRKp1IFlef1AmbqAUbBSuxLrkqhRsQ200myQkJjnf\\naTiU4jxPXqslwrYmpxUrI3Nx5hKAS0qUi5CO0l2Q8sJuO2eWq5UoqPYiE6ygnpPs4n2Q+A4A\\ndghuwnir\\/i+4n4Q7QN+fR7+HujUE2BPKKx6660hQDIAdEVgi5IzI9ZhiCFEjIZek9sPGU5JK\\nj+Fw7B3n3CGyQVEJHOfB9Azh+BluENrOgHPf14\\/CELOlue\\/rrdBBBBDCzYW59fd64QgXPhr8\\nuu6L0J1lAc3E9kPeMJMpyTmRvVv9HNDlA5\\/V8fHbDJNheBRue4aDrrhF4GQA6IXQMh1mE0jM\\n9nHu9MLQxCTp1z3QRegZnPmHvi0DM5DnhYDIZDmhC1WFhvPuhCjYWG88uvUPui4DMgeAOmFw\\nOAA7ItSMh1nxlC6BuzPo6uv0wyTYXj1IsO874uAAHvPTFYIuSkqIA\\/QM+Pozzhgm+phK1cB6\\n\\/lFUIKz0AcT454egZZADqAEWpSEDIenrPTC6E5bzx8eP0x4SAPgOcNwJTlvPH3ePHXfBAASc\\nhDJJJuYQpXAb+tB39b9wASchCqUgcd593Z3xUJA7\\/HNCiUk9nT3Qypd9B7YEptqdTv8AD5mN\\nl+ghpw3bgLMzWHNWuKak7TqcvUVWlVph0zEvaVyuMTDslIzrEzryz1q1ieyS9KTLTsrTKrMi\\npBEvLzVXeVuXq9p6LnKg4Yow\\/wBJ2yKbT8U7SbmPuYxCtGa+5XEKyJudb8mZurDC+Uibq9uh\\n59TPzlQKiurWpU6jKyUtc9FrUkuRk3on4HMBGyvRHx4rVMmqY4mcU5dFnFpSUPuqyuC2lES7\\nktOKHnP6jRRIzrigt7NcnPBTk6HHkaaSxxi7Y5PzeJsJvmewtVZlCsY4FqSnJrDs6qYWUTFX\\nk5FRKaVUJsrSmozkh2RmX0y8zOtTSfOw70vshr9LxdLfi6xWG1zgl1\\/gnV3QjzgJYbKl0GZc\\nXfzmXS2lbtNbfzBlCX5VlaLSbacPNNvRC0heTZuOWdxrK8WdGiv1Rul2PpT2pRVyiKLMzkwl\\nimWtj1acgJhFkXM7rtsyVy0xx+0rozaVTFs1IVyl0XpaTflJ2Wlp6SmWJ6Tm2WpiUnJR5uYl\\nJmWeSHWX5d9lamn2XW1JcadbcU24hQcQohSVRNksLEbDvHDC963bzp1FxBwixIt+pW5WqRcc\\njL1ilzNKmxM0av2zcNOnEvS89Iy8w1O0ipSb6HTKvMPNoUtpptAiNcpfyed38lLeDOL+DMrc\\nuJHJ9YhVlpqcoyn52v3Low3LV5prYUyZq74mnqrh9W5iaUm0KvUpoPPzOpbFenU3GaVXL5v1\\nFEwftaw5MY12WAyNQkcoxJgiYWhM3TJlxN\\/2Mj0Uhh7KtUk83lk5tCFNoRJzbMxLJh+0LZbO\\nYdmHXZJo9iSpQbQD2TiQQFdkVek2tJNltK+pdA1QUuudExcEKPV2wzpFWpddpkjWqLPStTpN\\nUlWZ2n1CSeQ\\/Kzcq+gLaeZdQSlaFpPTmlWaVAKCgOTCSeAimVpU2pSFpKFoUULQsFKkKScqk\\nqSQClSSCCkgEEWNjFKEEEggggkEEWII0IIOoIOhB3Qlsxzk+7vi7UT0e0wrszzke\\/ui7UT1n\\nx1ZQ2Vp7z6vnaPIRyHQPUIy00NsQF4e6Q2ElfL+zlJi55W06uVE+T\\/Nl1pctqYW+kEBbUi3V\\nGKj+HqPSjbmqVIAOKWono9p7456hzkzITDM7KOKYmZCclp6VdRlrMzTatq06k5EBTa5dCgMg\\nRllq7yI01dZTNU19sixtYHl2gLRPHcV3Gm8A7xF4+T1VVSO0aUkCohivUyqUt4X9E5JZVTaU\\nRuz9pTw2g2uO1UkaLVeaZadxOW5W5WfBUWCdhPNJ84vSbqgX8gDkpTQSl9sH++NAAZRHV5Y3\\nR3lcDNKW3sYLakPJsMtLFipz8y7KhpNLoeP9rSKJy6ZFpLLTTUojFSykS99SEulTrk\\/dVqYo\\n1yYe8oqzSI32UGqNV2hUausoCWa1SKdVGkZqzS1UZNmbbQddCF+al8fWQk5cRxy6I5SfBGZ0\\noeThxtt2iS7MxiZgrTE444UvubUzEvfODKHbzpUpIBkLJmbrtiXuXDnUWENvSdyzLMw4wy84\\n8ia+TfW04qpeLtjtVeCkVGSfxPg9x3U0\\/EFMQnz1hi4Kgmelcr620ZUhmUnR9aaWo3ltjwq1\\nWKEubQ2kTMv6Cl2F0rQFKl3Cf4qgthWt1h5CScqYigFscxPp390WlCh19kcJZ9ySF6Wrbt20\\no50+46NTqzKpUdZbLc\\/LNzBl3Tqp+mllrVLvjVSUutOJKUkZR9EUkcRGodQtl1xh5JbeZcW0\\n62sWW242ooWhQ4KSoFJHMHlHDqkqQpSVApUklKgd4UDYg94IsYbRaUA8Nx8c0OSAeIiwo6D6\\n\\/HfCY8BI3Q1KSOzqhJSAd43Hxxh4QRuMJqQDw3H2QQ4lfA+35wzII4wmpAO8bj74dkcxEIqS\\nR2dPfHoJG7rxhZAI11ENSCDkYIWKQe\\/xzQiQQcjDqVBX2w2boOmo69\\/f94ixSc944+\\/x46kS\\nAQQRu4EcIcxYtOe8cfHj9EOpVbQ7uB5fd8PDc4CCLiONWgoPSDwPjniyHykhYyPo6j0wzUkp\\nJB\\/SM+Ppyzh2FA2N+jCahmOvmhEjiD2GHEWLG7Menr6\\/RC0K4H1fLrj4w8CCLjj16ujDMjI5\\neDCK05HPmPvh2oZjrHjKECMxkeeHkmxv7fCGz6CrjcfhxHy\\/XCEWqGY6+aLyMjkeaKQ\\/DsNi\\nMwQf0GECOIPYYdrGRz5j7\\/HxhBY5\\/X8PHZC0GxtwPxgjjlp1VEc3EdkWQ7eTmnMDenf6OeGk\\nPpNiPYYd+snvHxHz74IReTmNYcRx7PsMLQHeCOmHwbEHlDYNiDyjjVDMEekdsIw5UCklJ5j4\\nPpGUIKGR7d8PDhx039fKH98WEZgjphAjiD2GHEJLG\\/Pp8d0OIOtvX6+vhBHHKGqojoPs5vZD\\ndYyUevf49MPn08Ff8X3kfGGixuz6D7PGUPoNj46QQlCaxwPo8eOaFItUMwfX6oV9Ve7Q\\/ba\\/\\nvhSTYjv09sNljdn0cfHjjDdY3Z9Hjuh0RmCOrd47YQO8EdMZKDpbkfd1eHoaLGY7N\\/j3+iEF\\njMHq3+PRDrjDcjiD1gxkIOhHL4dfGDrrdDYjMEdMIHeCOmHJGRI6IbqGRPbC4cQd49fXuhtw\\nhAjIkdEOVjJR69\\/j0wgv63aPs+EPjUA8wIciyN6HIxYxBmq4o4DVSbyZqUvL4mWkw4pKGxOy\\nXktAvFhsqQS5MTkm5asyzLpcBSxSqi+lCsn1o0Xx3\\/oqYvOYE6QmFuJqnlsUyhXPKS9y6pXq\\nuWnXUOUK6EqbRufW1Q6lPTUshQUkTrMrMHJaULRGsc0BOJsJ1il9mHX3JQzEkLDN59KETMql\\nJsSntXWhLrUAT2bq02IUQZps8xGcK4yoVZU4W5ZqdRLz5uQn6PnQZWcKhuV2TDqn0JOnatNq\\nBCkgifVo6XBsn61azzvmPpbrUi2sjc62UStQSngkqW15E4lB84iXeWSsHzI3nym3RwMlV9H3\\nS3t+mrQZ9mfwRxCqDDKG2kz9PM9eeGc1M7JIW7OTkq7f0i9PTAKhKUiiSIe2bMswjezYVdFv\\nXVQK62+DKtTjPlDqFDUVTpxJlptYKVFK0+SPOOs5HJS0NuZ6uZP0PKc6On9lPoL6QmFMjIKq\\nN0LsmZvawGmGg9OOX3h66zeVtyEgRmWpi4Jmim1nHWs8pGuTjZzS4oC0PJbr5xjsWqeDppXa\\n1LBc69LSiFHO79Gzyl1WkqUokq1mhVKc2ACES0shAukWjofbNQgZ1+aaRdNUlEzbZA0M7JBK\\nHkIsN7jaWSo29JUwsnfePOwk5tE\\/JSs6gACYZQtSQTklZGS0f8RwKQcyd6YvWOB9HV43x8fZ\\nM8HpGZkFKzVKuh5oZ5\\/Qv\\/XCR0IdSpSuO91MfZL+qer9HxjDmGSw+61bRCzkvr6BspGp3+iQ\\nD3xyctORakfok28Dqn\\/ykfrhqscD6PHtjdPyC+kGnBvToo1hVWeRK2tpC2rV8M5sPqcEqzdk\\nl\\/312LOlLRzM9NVSjTdpSGsl1tLl3O66G8\\/KZfS0oZpPVv8AHoj6ewL4r2GV+WRiTa0yqSuf\\nD67rbve3ZtKlJMrXLVrElXaU+FJIUNnPSDCiU7wBn2bnC9XXQa9SqugkeYT0u84E3BXLheSa\\naBGv5WWW60ba2XGTKTKpSZlplN7sPJXYfnJSpJWk3IuFIzJtcaHeN8ep3BHXGEuI1v4w4X4d\\nYtWqta7axKsi2L6oeu42683TLpospW5JiZLRUhM3LMTaZabb3FmaaeZWApspHY8fQZtxDraH\\nW1JW24hLja0m6VoWkKSoEaEKSQQRcEEGLjSpK0pWkhSVpCkqG4pULgjuIIIgggghcKgggggg\\ngggggggggggggjUPy2eOq8G9BS+KDTp7yG48bq1RcIqVsyTMGk1YzNbvRWzGR8jmbQoVXoM0\\n8v6NCq7LMqJdfaCtvEQ\\/PlDWNxurSAwnwJp02XKbhNYc1ddcYQFICLuxKnGVplpoa+o+5IWp\\nbdvTsksozl27hm0tO5vugV1tWrn0DgSuzCFFMzOS30VKkaK7WpKEs4pBBBC2ZVcxMJN9C1eN\\nFiSb80pE0oGy30iVb5kvnKu3G4Z7VQtrdItbfEe1G89nv6\\/QYXQM1dm\\/4e8iEkDcT0\\/D9MLo\\nG4nry9X6Y+fSvqnrfpFOQsgZq7N8ZI6JGDDmkJpJ4O4RBh16nXZelOTcmxVquM2fRi7XbxmW\\n3PqodYtal1Z1hSiEmZDTefnjLHBA4n0ePZG\\/HkJMGxW8UcWcc6lKEyliWxI2JbTrycml3Bec\\nwZ+sTUqrPW8rpNBoTci\\/r+Z5PdIyCnSFMpaIStKlAFKSFKCvqkJIISrUaLNka\\/paAmwje4Yp\\nf01XqXTikqbfmkGYAB\\/oVkF+Z8CWG3AknTMReJONyT6aHbs\\/MsajBZlPJpNDYShLbroEtLJb\\nSjJKUsqXtAlBy1EqAO\\/dpi5SzGoYDaGuL1xyc75Lcd10f9TG0SHSxMKrd+h2jTExJOJUFJnq\\nLba69cUsobwujZ9R2sYlTyizT6UhZ89a595IJz1UAsS+snnQpSpjq12knjwiccvljOJu68FN\\nH2nzes1QaRU8VrpYae2jZn66\\/N2vaDD7aFhDE7TqfSbqmVNPgzHklfkn0JZYeSuZrCsMHHO1\\nbDlHcZK6dQi2\\/Noz52vyQTU53Nu9CYDUjIrskELsCrTTtCtVH8FdnVeqSF5JypNKkpQgZV9p\\nNnzFlSP40uhczOJJOoQTY6Ax8KRIO1eqSFNbz1pyaYlypIHmIW4A64cwdzTWu4rIHzUHzVRm\\ngwy1Lssy7KEtssNNstNpGSUNtoShCE9SUgAZ8w6Yx1wipQm67M1NaM26VKkNkjhNToU02QTx\\nyl0TQOrvGukf42SKBrKSOv2DefjFyYqmu0nGpUH0ZZvMof8AaPWUfGzYbtyzG28xw1UHMzqW\\n76Ni5\\/tl2J\\/8oT7YdoTqoA4HLM9RPd8IcoGQ7d\\/dCI3kDphxwiJLOgHP7I18EKoG7Pp+Hgwl\\nC4GQA6PGfphvr2QQ4YTmSro3D08YcxY2nVQBz5ZntO+L4YUbkmGFG5Jgi5CdZQHXv7OeLYcM\\nJ4q\\/4vuJ+EMKNzbgNPnDg9FF+O\\/22+z3w4A4AdghcDIAQmgb8+jx3wukZkeswws625anx6+M\\nNQokZDrO8+PG\\/OLoIqBmQOmEbo8OmvAA3i9Cef1fHx9kLoGZz5h74s4QuBkAOB5+3nhgm5vC\\nE+kq53Dd48B9v64vSMz1Dj46+2FotSMh1nj3Rd48euGFG57hu+2FFVhfnugh40jVTvHnHeer\\noHjnjsXCC+KNhtiLbV73Fh5aeKtEoj84ajYN8NTL1s3BLztNnaatqcEm828l+RM385Ux9Qmm\\nJWqykjNTMnPMtOyr26fCN\\/kgtK9MpQblwyq2i3idPhqVblGL4uaUt6emVkarVt3E7OVKy317\\nZ0MMtV617cqs264JeVk51tpsiUUPDshWpZ9buLMN0GaZcVaWxFMzFMl3ZdKGz5wmpqlnaegl\\na1N9g8+26OzK1AIUknYUulGrLEuxOybM4tzIzKTSn2lzBITlDDqWHGFOLUShLS3W1qUAEBV7\\nRoaQnPfzc3f6PHPCsbp8WuRHxpl5eerujHjhg\\/jNJy2u59xt8t1jDKtsJShKm6dK3jbr2KVC\\nqlWmm0rVLJrFv2VJF9LUtMzkqw4ufY0v45W5izop1qXoGldghilo9uz05820q57wocvXcLbi\\nnkspmjK21i1Y05dFgVZ9MspEw\\/LKrkpPSaVBE\\/JSrgQhWbUdmmM5KUaqSKQqp0x9pL0tUaJM\\nSlZkn2FgFLzLtOfmCtpQOZLmQJUn0gbDTIqOF6\\/SytM5TZhotqyLKUh0IVpdKg2VFKgD9VQB\\n0OmhhAAk5CFkjIe\\/x0QwpVTplakZep0ioyFWp80jXlZ+mzcvPST6M8tdialXHWHU7stZtxQ3\\nZZ7o5NKdbs8bor10KQpTa0qQpCilaVApUlSTYpUk2IKToQRcEWIFoj6UlJOYEKvYg6EHiCDu\\nN73vr4aiKpTnvPD3+PHUsAVEADuA+AEABUQAO4D4AQsAAMhDUClZfEwAAD3npj6my7lnLQuW\\nkXHJFRXTptK32QvVTNybn0U7KEnzcpmWU43mcwhwpdA1msx82lHAn1d\\/d+iFAOYeiGphhmZY\\nelphCXGJhpxl5tWqVtOoUhxB7lIUQeI4EQ5JTs1Tp2VqEk8uXnJKZYm5WYbNlszEs6h5l1B3\\nZm3EJULgjTURu45NzHhDl5X\\/AIM1GdLlKuOo1m\\/rBU+pQUmcS+FV+ly7as3CahShK1xiWGyY\\nl\\/mmsPHN+bOtu7ap1j4pWTdOBeMNu0i98MsQ6HULWrluXGx5TSajTKu0Zabo84gqS43LzWvr\\nyczLuMTdOn0sTkpMy8y2w\\/LQ9sEMQJnDHEvD+\\/5d9xBtK6KXPToZWsPTVHTMIZrEkAkhZaqN\\nGfnaatAz12XVpAGtqxLTZfZfQ2\\/LuodZdQh1p1tYW242tOu260tJKVoWkhTS0qIIJ7RWlLxd\\nW9kGO6ZibD7pHZ\\/kZ2SdWpMrWJBCm256nTqU+g4zNy\\/YuBRQpbEyW5tpIeYaUn6OS79P2g4R\\npFYcaR2VeprUw4lCc4k6i2ksTiGr3v5tNpeZNyA6lC0rBC1AwhtKnRou3kl9MSf0bbrn6hWt\\nF7GKYnbw0a8RKw404uRo87PNszVvVucb1Zdur2vVZpu3LwbKJZDrjtvX0mSo9Jul2XT2JkTw\\nGfjn6IlH8qfoYU\\/lJdAu\\/sPJClsT+PeEstMYkYJVEMsiquX1b1Nm1otlE4pvbinYnUJM\\/aM7\\nKKfakvnx6iXBPIW7QJBTUMPRBxem8ScO3LcuRbwvjDx5q3683NpU1PTcigPNUeozTLw8pRN6\\nks7Tantc3jUKe\\/NOhszSG09f7T6NRsSUGi7WcHWXQ8SyzEzOtpCc0u88oMKXMJQVIbm5SdQ5\\nS6khKzacbaJzOLfdVxLtGwo7QanMLDRRldyTCRfLqQEPpzC5SoFPpG5WhxhxXpOLMZYahPV7\\n+3nEV2Y5yfd3wpBFBFaudvCKzi3UT0e098chIJCUvAZfWZzOWRGSXsgVc+7PduyBB35bmMcp\\nT2nHCW2WluLfeabaQ2krW47kpKWkpRmtalKdSUpSCV6+4EgRhz6rSb9ydyND\\/dEcTyGvfaLV\\n2Isuv7UsJobzDJMVB5ZTpZtikz7q8x4JUlJQb2BKgm91CJbGC7oODuEqlqWpasM7EWoq89ZU\\nu16UVKUo71KUFZE8BnzZ7sosIp5tFbqNLcCVMVOmrOo4Apt52WcBCFoOaFpVLzMykhRy3b0g\\nZx0FatITblr23b+aT8w0Cj0UKbSA0fmyny0kNmlKUpQ2NjuyASkbshmM+08P5sS140JQUr6S\\naXLK5ioTUu7Laqhl9XJ05nPzcknf9eK22MYjXQNr2z+qNOBCPwspcm8pJsUyVYmU0edtrreS\\nn3wQd6SoAi4t3BiKWE3R6s0QTmlZh1AI3rYHbt7\\/AOOhPO2+IKNuWQMFcWtKTRlQViV0ctJT\\nFnD22NdJQt2wDddTqFkTxCjrNiepjrr7bJKkMM7ENrUk6rfYRBHEZeObpjtzlIqI3YPLV6Xt\\nGl2jJ0\\/FrC7BTFKXlwSlh6dpOH9l2rPPoSpCFKemqomvz69TygF12dUHkfsCOq46i2vUtNF2\\nhYhl20ZWJiaTPtAC1\\/PG0Ovq5G80ZjvIAJtuj5zYllUydbqDKRZHbKWmwIBzfXIB5uBZ52sT\\nqYalIPNkeoeAfRCZSR1jpHx6IdlAPDd7vs8boTII4+g8x7IrlLnI37j18xGjhqQDxhJSSN\\/E\\neOMO1Iz3jcfZCRHEH0w6FBXjyghsQCPceiESCkkEdxHxBh2pHEj1d3d+iEiARkYVCkqtpvHw\\n65QzUnLeOHu8eOtJQzHu8dEOyCkkEdxHxBhBScj1Hh3QA2N+UO6EcwYakcQfTBCqk57+ce2E\\nofBuLw3qhXcer+I63wktOW\\/m5+qG7qNYZj6w4dfVD3jCBGRy8GHkKuLcR8IdjjoIWdRqnWHA\\n8eo\\/b784RhcLQbG3P4wioap6uI8dUN1jI59O\\/wBPP464eKGY6xw7oQIzBHE83bzQ8k3HuMOK\\nFxb2Q0Wnn9fw8fbCcOOMIEZEjoh9BuLcR8ISg3FuI+EWqGYI9XbDcjMEGHMIrGRz5j4ML3Qu\\nGpHEHsMMVp1VEdB3dnNHIrG\\/Pp8d0NH08FDsPw8ZQ+DcA8xCkGx8dPXDeCCCH0m4Hdp7IFCx\\nPtENn05EK6dx7Rw9nuhqsbs+j4+BHIOJ1kEc43jtEMSMwR0+M\\/RD6DceHwhaDceHwhCLVjMd\\nm\\/vi6A7wR0w4DYg8jC4aLTrII4nLMdZHf8YYkZgjp8Z+iORO4kdEMVjVUodfsO8fCHwdxHiI\\nIawRcoZKPXv8emLYcXqAfb67QQgRkSOiEFfWPjjvhysb8+ke0fZCCxwPo8e2HmzqDzHv60h8\\nG4B5iGqxkrt3w3WMldu\\/4e8GHSxwPo8e2G6xuB68vX+iMhBsfHSPYbL3Ht9\\/V6BCC9xB8bv0\\nw5WNwPR8f0Q3WPN7Dn8PjD0KSbKHfp18YbLHA+jx7YQXwB6\\/HuhyoZpPr9UIK4Hs92+HUbvA\\n\\/f8AbD0IePHqgggjIRu9fX2wRMS5PzFsY06KGFtfmpszFetuk\\/qeXQVOl+YFXsrZ0liYnHFE\\nlU5V6Cii12YKt5VVufm3j4Y1wV6yqLNLXtJqXlxTJ3M5q8op5EvtF7\\/2SYl0szK8uZ7gMwIh\\n+cijiz5NceLmBs\\/MoSzWKdI4m220tezSJ6jvStuXS00FnVmJmdkqhbMyhlv6VEvRZx\\/JbaFq\\nYlS6P9X2UxXLfccGT6G6tKJz1fpGlIlZ0AEkKWtDkmrdkcmVK89P1IvsGnjgPbtU6BYs0nGU\\nvNSraSshgPrT9M0pQTf6zTyJylM3T9aaUM2oJ7Nl5\\/8ADDZRQ6upXaz9Hbal5skXcLkkr6Om\\nlLNrXfaDE+uxtlINgfRHnxcoRgP\\/AGKfKA6QWE8tT26Va36oFQuKypWXBEkxYOJLbN7WfJSj\\nikoDjNDkK5J0GYISUsz1InJdSithaox4IzBHSMokd\\/KesAVyFz6OGlJSJVexrNLrWB94zjUs\\nltiWqFDfnL6w\\/U9NIIL89VZOq4gNAPpQ4iUtyXSy482NSXjcU2cE\\/ISk4CM5hltawMtzoBS6\\nncAPMdStO4ZbovLH1L+ja7NJQkBpbqlIt9UNu2mGQLb8qXFNk77tWJ3W5Ur0n5nUJhoCyQ4o\\notuDawHGhcaGyFhOgGqToDoFeMNiMwQecEQ6UMie32c0N1DJR7c\\/XviEX3dxv17I1KDqR6+u\\nuETm+QAx8OK2g5LYcVSeVNXJo+3vXLEW2\\/rKmfuQrzpvO0JpThUsLlWTV69btPRk0tiWtpLG\\ny2TTLr28yIR3ydvHQ4faYd34MT8+4xRsfMOZ9qmyIdKWJu+8NVTF3UVxxouJaUpmznMRGkKC\\nVzAdfbQ1k0p6JuMdzbLax9M4KpDi1Zn5BtVKmLkqIVI5W2MxOpUqSMqtROpUo3vvNoYdmfOa\\nVL3N1sZpZd+HZWLf+ZU38bWtBBBBFhRvIIIIIIIIIIIIIIIIIIII84TTTxpVpC6VuPeMTc2u\\nepl4Yj11dtzK3g8pdl0N1FtWO2XddxCgxZ9FobADayyA0Nhk0GonRcoljIMBtCrSLxFl5nyS\\nrS2HdUte3H0LCXmbpv8AdlrEt2blkKIU49TqrccrVVNpCvoJF51YDTLxT54A3kDpjlryjq1f\\n8HcPIVu85rM0i4vfWSkVEbxYfSI10NwUk2Nq9xvN3XJSQP1UrmnBfeVHsmSbcgl8c\\/S4D6y6\\neA7PfvhdIySB1QjxhwBwA7BHLDnD19e+IDCyRkkev1xM35KLCJGE+hfhxMTMoqVruKT1SxYr\\nWuhKXHWrpUwxa7qVfWMu9Y9LtiabJ80uTDy0ZbTfEEwvsOq4o4j2DhtRc\\/nW\\/Lxtuz5FYSFp\\nYmLgq0rS0TLusUoDEmJrymYddW20zLtOOvutNIUsT5KXTKTZ9rUyg0NhuTo1sUKQo1GkkHWR\\nK06kSLNPpsqkk5lDMuxLsJz5kjn3RGa\\/U0yLbLVkrU7ncWnOApLTQ32sojMo+icpB7NQ4ERd\\n2xWimcqVUqqkm0ow1Iy5KbpMxOrK3Ck6DM20wlKtdEzGoINx8Pc75nq1OupUChpYlmugIlwU\\nKI47lO660nPcFbsyI8\\/\\/AE8sZTj1pdY64isTonqNNXxP25aj7S9aXdtGykNWhbUzKpPmtN1K\\nlUaWqzqUgFUzPTLjgLri1Lmi6b+MLmAWihjtiqxNqlavQ7EqlOtuZQ6WH2rwuxTNp2nMNOBS\\nHFKk7irlOnXEtkPGXl3dRSFfSIgDyEm7PzspIsjN2cmmJVvcSNd91DSSR0ArBPVBsZpZcncS\\n4qmkFC3l+YsrWbhIcWJ6eANzZKAJIJA1CLgm1on+3erpaYw7hplYyMtrqkynUaIQZGSUeF9K\\nhmzX3hQte5yfwupXzda0vMKSA7VHnJ9RIGYaVkzLJz50lllLyRwG2PPrR2awN6j0AD1n7I4+\\nTlmpKUlpRgarMrLsy7KTlmGmW0ttg5ADMISkbhlu3RyjIyRn0kn4fCN3OTBmpqYmTf8ALOrW\\nAd6UknIn\\/uoyp9UcmurLji1n85RI7hfQeoWHqhwgb8+j9EKxYgbien4fpi+MBZ9I92nXrhEX\\nIGauzfDhA1lJHSd\\/YN59kIoHE+jx7IdsDeo9Ay9f6PbCFGwJ65ffHijYEw5gggjHJsCeUMjU\\ngcyIIfITqpA6Bv7TvPtho2M1pHXn6t\\/wh8BmQOkwxC18B+ru+2FUDIDr3+PRC6Buz5zw7B9v\\nwhLjC4GQA6IxybknnDcVhRA4n0d\\/whOFwMgB0QhZ0tzhCzpbn+uL0DM58w8CHCBmc+jxlCaB\\nkM+c+BDhAyGfOfAhhRsCePCPQLADnYm\\/qv8AL2eMXQAZnIcTuEELMpzUVH8Hh2nuEMwhZubc\\nuvu9UOEJ1UgdA39vPC6Rqjfz7z1Do9EJpGZy9cLw2s8Pb9kI3Rmno66ZOIeD1Yp8vVbhuGbo\\nTQYlZWrSNSm27mt2WaSllpElOpfQ9UaO2y2hp2izji20SrTLUgplpkyM3vgwI05bMxtk63gx\\npHUezsUbIvdTtOo9RuC36BVrXvKhzbjRlrbuy26nTl27U1LW0kyYn5FtM++BJz6E1ViWM9FN\\nAzOQ547owkv922KqzSJ6ZcTRajMNpbcKj\\/uZUVrTsZttW8NsvOajU1kQlB2U0dXZOB3RytQx\\nZs+m5nEmzatTtDmVZn6ph5lXnGHK0kKSp1+ZoL3aU9U+UJKFTLTDc06hbnZvNzKw6q\\/tmG0u\\nVmHpTBu0AJqNEmi3JUquTSgahQHlnJLsrn1WecpK1lLamn3Fok7oVcSjam0bI9OD5P8A0aZl\\nK7j7yVF2pwqvZKnarcWjLV6y\\/M4S3261LocelLPfuOYmTYtxTTjTyWKJcT0zarrs6iWolSw\\/\\nkJJpL8fLDbHadqF5VzBjGO0anhFjtZ9WnrbuSxLikpukvqrtJW4zU5BiTqaWp+nVWUdZdL9C\\nniuaQ3k9IzU+1tVNTGdAjSorGJVpT9OqVTJxEw5nG6PXlPKB+6e3XXH00KszLPmB915Eu7Ta\\nupGu6J+UFRU6yuqy6G+jeWe5LW2OUUwRm9IvAqitUHTRwVoKqlRV0RjyapYtUKhN\\/OT2GtYm\\nZNLc7N3Ew00\\/O4UV87WYlq0DbEw5K06tzM\\/QegMFY2wZ5QbM7h+t0yUwhtXpko5MFuQv5nW2\\nGG0rM9SC4Q9MsobKHpijTa3ZmXlVF2TmVoS++1JtpmyFunh2dk0FbAUQl9CEpdZURdCHkoyp\\nUkgWTYJQvVLaJd0pS5HwAAHvPTCqE85HZ3936I730AdAnT30qsMqZWLywQuPCR6mzLNHevDH\\nGm1bDKTuqUMtLzEhdFMoVVpS7uqknNyj\\/wCvanRbYnaS9PMPuSUzlNMSTe7bDvkOLWprTFQx\\nsx7n5hkFHlNIw9odPt9lsJGaw3dV2O1kvhQKfrWpJqbBJOtwbjzGx7H78xNt\\/Q3m8pJuuIdq\\nk\\/NS1PppbbKgJlp+cdZW9LrCbpcZacKQU9olGtuepbB+Ipx8tMU51QzlAeWUMsrsbZ2lOqQX\\nUG+nZJWrhlCgUiOuASchCqUhPWemJc9o8nzyeOGzTO0w\\/ZvqqMDI1G7rium7HJkpGattTpOd\\nlbSPHLNujNBagOYDV7\\/oFv6L1iBtFj4BYd0JTCm1NzNGw1sajOLcZEvs5lc5LySZ1+ZT5M0p\\nc5Mhcy48w06t5xQDka2cwzgGikt4o217Oqa6gkPStHn14mm2VWuEOy0gWnkq3ZkqSmxIAz3S\\nTOafsTxjOpSpbAZCgCLS8yoWNr3W+3KtEi9jkcWn+NyhYU1t4omFhtamkpaLrgSSlClFaG0q\\nVlkku6yigHLWS3mnPfErjR3rqrkwFwerLq9pMTmHFnJnHNcObSelaHJSU+vW1lHNc1LPEpUr\\natb0nzkqEZkVfE63qpRZq2ZqwaRU7bnpNchOUOqqkZmizck4FJfkZujrpT8jMybiFBLjDmsy\\noLIWzkIx3tW07csehSdq2jTzR7YpLk6mh0gzLs4mk06aqE5Oy9KZmnht35anCZMpKOzGvMKl\\n5dgTD8w+XXlc3baXtnWSlrwPtBl8azPnDqKiynDVdoJk0hoBLzT1TaMrONOFCUK7KYDiFZVJ\\nbcbUS31jswoVWwthVjDVVacUJGbmZmUmyqWCFNTrqnnJfsGpiYcZLbyluBa1FLnaLJDakhKu\\n5cNK4aRdUk2pzKWqoNNmAVZpJmFASqhrKy82b2IGZHmKd\\/GyVB85RTRPxA0P+WKxHXhlhpet\\nVwb0jJum4jUn7kbPqtWotOlcYpyYNw08fMNKdpVIYt\\/GGkXGafT2ksvU+1W6ekIS1MBbs0Nt\\n1TLjTrK1IcaWlxtxJGshbatZKk5jIaqwlQ3ZcB2dzDGyuebnSKTzA5qmxn079urLPfnlnmOI\\ni0fJ\\/wBt+BcPbPMUbPNpdTnpGnzFRXN0F+Vps3VChiqyimqpLtplkOCXErNS7E+znCQuanHH\\nG8ykrMajaRgCaxYppUihsFcutiaWpTaSMos2oJW43mUsOEAhV0mXbvYWCoWlTwixVoZdFcwz\\nxAoxYLQf+dbOuOnFkvJbLKXRN05nZl5LiC1r5BwON6gj4Us5KIVmlSDkRlkQecEHrz5sjzcS\\nInHtY3zyctrQJVzgfMqDzauIz89cu6nLn3JOrnnvO8\\/OXRUMEsUZZUniphHat2MPJSHBc9r2\\n3d7SVISAhxDlVkTMNqZASGH5dvyhnVQpvZFOcShiZ2AVhxLNI22NyEyq6UN4jwhXKdKrWbJb\\n7SpOty8pKovo4txS8oOcpASRFAzvk+YmYQpbL5dCRdKOxlnPVdifcdJtppLrueOtjCTDKOs9\\np7soyJ0W7DViFj3hNahYU\\/Kv3ZT63VmMxqKo9u61x1dBWSUoRMUmkvMJzO9TwQMnlBKpCOJ\\/\\nJU6H2MbE1O4U1OsYQXO6lbjaLbqExWaAZheSi7P2XdMw7OiWbGaUS9ArNvyyVfsZWFZHCfQI\\n0ZrjwsxQxpr9\\/wAjLsVrDyvVXCGlLYD7klNVKQnWpm5qxSHZluWcepzko1Q26RPGXSuakqnO\\ntuJlXEPMrh21jDU\\/gjDDVcRVKHiGhVdT8rSMQ4cqbNUpU3NhsBtgPslJQ+EO+cFpSbLQy6Wn\\nXOyWoTrYVgGoYexbW6pW0NNTFMo\\/m1PazLDi36i+lD0yhp1DT6BLMS5ZcK20A+fDJmIJTtdz\\nT+L\\/ACjHPWu\\/srjt53P9jrlKUdQHelM+wSAMwfPSSk5kpPPmBu+fjmrZTtbjt9AIzXW6SgFR\\n3DXnmEgngdwJPNlx5o5awjNOpxVhotJT2oxBRi1c\\/wBUFRlii2oG8i9yB3239LT6QZKbvu82\\nfvck6dkq\\/PhfXdzHERWuXQlZS3eWpwTeln5kv37oWW7Nz7cwQ42ibk70x8kkMSmyZbUzLeRW\\nVJzavK1zJVNKmyh5LTsuwxjFGSHL1VKRnuWz0Y5SUmEvPUbQ5pFMqjYSvOUnXbg0paw3LqKm\\n0JUpVMq1PmzslOI1ZpCQsuJWhGPikJVxG\\/pHGPox5RgQ3tAaKR+20OUWo77rE\\/U2yTx+q2ka\\n33G2mg+cuO0hOIHSkD0pdsm27N20wFfDdvB0NtAGUBGe4wottSN\\/EdI5u3v4QnFEA31BiGwi\\npOW8cPdCakhXUemHUJKTlvHDnHR9nu7ODqF7gTrwPXR+JDUgg5GElp5wO3v7\\/wBMOlJ1h1jh\\nCJHEH0xkpVcd43\\/OCGxAI9x6IQI4gw6UnLhw8boSWN2Y9PX1+iFQtCrGx3Hd49db4ZkEHIwi\\ntOW8cD74dqTmOse3q8fGECMxkeeFJNj3Hf8AOFqFx38IQixYzG7iPBHj0QoRkcjzRSHgbWIj\\nxB3jl18fjDVadZJHSN3bzQxIyJB4jcY5FQyOXqho8nJQUPwuPaO8RkDUA84XCMIrGRz6fGUL\\nRasZjPnHgwpBsfHT1w8k3AO87jz4X+cM1jInr3wiscD6O74w6WMxnzjwYQIzBHTD6TYg+3wh\\nB9Fd+B8fX8\\/ZCEWrGY7N\\/fF0HGH4dhqsZg9W\\/wAeiG606ySOkbu0bx7YdkZEjohuRkSOgw4g\\n7x64N0cdBF7gyWodefr3\\/GLIfQdSO68OL1SD1r0IIYrGqpQ6Du7DvHsh9DZ8b0npGXq\\/T7Iy\\nEHXxHX2x4g6+I6+2GSxkrt3xbCixwPo8e2E4dh2Eljfn0\\/ohm+N6T0gj1H7YfLG4Ho+P6Iav\\nDNGfQQfh8YeSbgd2ns+6CGCxwPo8e2E4WUM0n1+qEYeGqCOW74wRYsbuw+PhCC\\/qnq\\/R8Yck\\nZgjqhA7wR0wps6DuPyMOo3eBhqoZpPr9UN1DNJ7M\\/Vvh1xhuRxB7DGUDYg8jeF9dbobK4Hs9\\n2+G5GYI6RDnhDc7iR0RkQbvGG\\/GG\\/CHJGRI6DCCvrHxx3wtB1I7rxkb9eENjuJHQTFIuUPOP\\njiM4tjIRvPh18YIyd0LsWf1FNJ\\/Bu\\/X5tEhR5e75Og3NMPKylmbWu5Dtr3BNTKd6XGadTas\\/\\nU0JVmUzMlLuI1VpQtE4uwKqqgXdRKgpxIY8sTKzSiDl5LPBUo+pW4FSWkuh4c5U0nhkY89eJ\\nueiBikrG3RnwaxIdmfKalWrLpsjcL7ju1ddui2y7bFzvLJUpaDM16j1CbQHSp0MPp11rzCzW\\neOkTNIrmF8YU5CvPaRPyy0LSSn8vT5pFRkQog6pUtEyHAbgo0sQSI6X2BVVualMUYRml\\/kZl\\nkVJhs3PoPNinVEgHccpp+XKL3uTujtrlk8AxpC8nZpC0GTkkTly4eW6xjTaaljNyVqOFr5uS\\nuJlEbi9PVKxWLuoUqynN156sJQyhTykIPnp2NOh2RmJFSs1Sj20b37wzMAnIdOTqHCVHhtBr\\nZ7o9UChvSN5WZKpq0tLVORrlEdp1akptpEzKVBDzDlPq0pMsrGo\\/LzJEyy60tBS60soUDnHm\\nE46YRzmjVpVY14ETynlow5xMvSxJKafCg5UaJS61Ni2KyUK87VrVEbpdSYKwHAzUU6+rkUjs\\n\\/aE3L1ukUXEcie0lqjTmZhlwfnNOson5RWnolTku++NDrlAGYC8VvjunLlpkFaQl1tT0o+AA\\nMr0o4R4kkKcQDa+VsA20EcOv63aPs+EN18fR3w5c5vT8O+G6+APjxuikeuuUV0g2V46R3Toz\\nYyTuj1pF4KY3yKnycMsSLSuuflpcqS7UaDTavLm5aRmnztlW7eXUqS\\/q5qLE66E8BHp1SM5J\\n1KSk6jITTM5IT8rLTkhNy7iXmJqTmmkvy0yw4gqQ6y8wtDrLiDk404FA5KGXlQvjck8+\\/wBR\\nyP6I9E\\/kmsbBjzyf2jpdMxPJna9a1nfqWXOkqSZqXq+F829ZcqZ\\/UzSZyq29SqDcBXrKW8xW\\nGX3yiZdeaR0hsCrFn65Q1q0daYqssgmwCmViUmyOalpck9ALkNEm4GkzwhMZX5uTJuFtofRf\\n9JshCwOZUHEG2uiNNxMbIIIII6YidwQQQQQQQQQQQQQQQQQRHM+UTYxmg4JYIYHyE1qTeJF\\/\\n1a+602y6dsbfw4pCadKSM6yM0eR1GvXrJT7Jc1VOTdsnZKOweziOJ+sPHDfG5bl28Xf1RtOu\\nsWdKTYfpWClgWdYKEMuFct881SWmL\\/rj4PnAzaHLukqRO6mQQ5RW5dYDzDwjTUjiezx7o4D2\\nv1g1jH9dWledmnutUlgXuEJp7aWZhI9JQsZ7ztdha2exGbNFN4jmfOqxOLBulpzzdHcJdKW1\\nWNhoXAtQ3i6iQbGFkjNQ7c\\/VvhwkZqHbn6t8Io4ns+Ihwj63YPs+MVcs625Ro42mckLhi1fm\\nl9SLoqDTTlJwntG472dMygLlnKxOMt2jQpfNfmpnWpm43q3I55ZOUNbqPPZMSxK05nJhpCh9\\nO4N4VmC2jJZGQzy8\\/U4AcD2HRnyLmHkvRMIsUcT5xLbU\\/fN6yNsyKnikPKoVkUszG3l9c5oY\\nm6vdVTlH0tapddpCduF+TS5RupCRkDrA63nE7+J6hn45t+\\/mWvYs+ntpVUw\\/LMtPytFaEs7M\\ntzF3GVyrLa5lDjKUqAKajNLlzdbZFgpRJsg9sbHcP\\/ReCKXOuAoeqr8xVVoUnQh1wMShCuKV\\nSktLvJAFrrIFiSTHz5f3F77nsGcHcEpGaQidxFveo3rWmmHvpRbuH9PRJSUrOMpUNWUqdeuy\\nTnZZS28n5q2VhpYMo6DGSwspnl91MzCk6zVLln51WeeqXSkSzCSfxg4\\/tkDMZlk8QClWyTlr\\nMXf1S9OK6bbk5tE3R8G7StbDiSLJ\\/W\\/zl5K5d9yKyIH67lq1dEzRJ1Z87a0ZDWam2UKjB7Bu\\nmhmk1GprSAufnUS7ajx8nkUZhSeYBT0w8lQH1tknWy1Rl1bh+UTQMAyqAnI9PMGYX+kpdSXn\\nF72IUiTKEnj+TvHPm1Ws\\/SmKa9MJUFNy76aVLWsQESQEs4UKG9K3kTDyTc37S4JFjHc3CHyB\\nklI6hDNIzUkdY98PuMRmKi4e37PnCyRkkdmfr3xdBAN5A6Yx98ELJGSR6\\/XD1kZIz6ST8PhD\\nThD5IySkdAHry3\\/GG1nQDnv9X6+fCELOgHP7P1xdBBBDCzpbnCUb\\/AQuwN6j1AevefcIeIG\\/\\nPoHt8Zw3ZGSB1kn4e4Q6QN2fSfZ4zhhf1T1xhKjcmFUjMjq393tyhaE0c\\/o8e2FIZjyLkjMi\\nFwMyB0wkgcT6PHshdG89nv6\\/QYaWdbcv1w2rVYHK3zPu+EKgZkDpOUOOEJIG\\/PoHt8ZwrGOs\\n6gct\\/rtCybXPKCHradVIHPxPafVDVCdZYHEZ5nrA7\\/jD0DMgdPjP0QiGIVQMhn0+6L4BuAHR\\nHMUKg1u56xTretukVOv16rzTUhSaJRpCaqVVqU48rVZlJCnyTL01NTLvBpllpxxQG4ZiG0IW\\n84lDaFOOOLShttCVLWta1BKEISkFSlKUQlKQCpRIABJtHhBVZKbkkgAAXJJIAAA1vcjdrwji\\n0DifQPHjnjtLCfBjFTHG52bOwlsS4b7uBZaU7KUKQLzFPadWW2put1R4sUqg08upLXznWp2n\\nU9teaHJoEDLczopcjJXKxKSF\\/wClpXVWLbqUszyMMaDUJZNyzcsQl5CLvuVC3qdbbTgUEv0u\\njmo1hSFlp6oUGfQpobrbXmsIsCrZRY+BNg21alBlhkRS6a3TZF6YbBQZ2eeBFVuCoqG9ypVe\\nbcnHwSt2bmxvM5m8L4ewRTUYg2u4plcD015rt5OiaTeL6u2i9xJUdsPPSzZV6CpqaYW3LOW8\\n7aZbIcizcI7KcRYncbUZZ6UlbgqUpIS9ZWVXp57NS1xeweUXrC6JdwWvpi0ddBnS10UcTrMx\\nLu+37fqtm16UVauILVnXRL1qp2\\/I3GhpEk\\/WZB1mRXNM0y5WaFNVSaoJrcrKSrT00qYRT2n5\\ntvb7aV1zto1JU\\/KtomEOsOMTMmtZbbfQQS0SsJXqrYcAWhSUkhOu1uS6op+dr18TtbeL9Xq7\\n88oKUttlJzlmAcykMMNhMqjI5oKxks55OLXzdOX7jbhthfT\\/AJ4xFvqysPaR9IE1e\\/bvoNpU\\n1WzTruZTVbn5KUOzRmVkTB1Up1lDPhw3jbbHg1raTTsS7HlYgoM1SnGPojtpqWrtcmJ+XeeW\\nmYTT6XIzDMul1hzzd2mTDlUadY7Rt99cu6qWR3fIUeeTh+Xp2IXJecbl5JmSemXc0ulyXYaa\\naSubmZhxsOzKlJzrmm0SxU4oKQ2hQSo5T1bFa7qiFJYmmaUycwG6cwEOFJAGSph\\/bvJJyBza\\nUz5wHm5Zx8DNTs9POF2dm5qcd5nZt9yYcHPmHHluL49fDo59QOKXLV8nvhkJtia0iqHeFUl8\\nwil4X25c9\\/eVFJUMpSv0ekzVobiAQXrkYStKklKlJJUdfWIvylTR3pi3mcNMEMa76W2ghL92\\nVK0MPKe+8FkDYGnVW\\/J1UrstRYcmKbKP7RSm1yaUpS65tJ5nymtrzqZibwTtcxSh1wOS7uJ0\\nP4eopzFCguSTiOaptMZYUQFDzWXaYSr6uosNQazgDDwKBW8PSqkiy009QqExcG2V009qZeU4\\nNbhalLFtd8SeFuIbTrLWlKQM9ZSsk5dJUdwHWY4h24aCxufrtHaPnDVcqUmlXm8dxfSrMcMs\\nszv480KzED5Rzjjcjzv3IaPmHVtya1EtSdyXjdN3pSgkea+5SZSxTNKy3aziEp1h5qE\\/VjGC\\nv8u1pwVlevTZXBS0k67a9lb9gVaZQA2yttbQN1XdcrmzdcUJhwlZcS6hAadaaK21Sal+Sl5Q\\nlRQhU1hfC9AWoXLdUxfJzZbvlulxVFlqinPuvkU4gG4Di9DGrf2q4EYJyz1UncpsPNKWtvMO\\nafPXpXTT88JVusN9p8q7ztVA1zXaaebJMwlaun6reur0gHo54YP4jWNKnUmbroku4RmEzE42\\nwoj8bUdKVaoG\\/PIjrjz45rlouUFmlzBRitbkq2+t1SWZTDDD1KJdtxeaWWHXbffmghsHUQt2\\nYdmNVObr6nNZavm1crtp1rcLjuKFBeWpWspTmHNhKKzmPrrNACzmOKgQroVxiSseRptuJzTN\\nS2bITlFktVjEK13ISdVqw6lItfWyVAnQEaE4X448EbvNMUb9\\/mVLsRccPpW+6+\\/l32j0TZW9\\nLPniEyd2W5MrWQA3L1ymvuHNOtlqImVLSrVB80pz83pzj6ZC0OIStC0rQpOslaVBSVJ6QreC\\nOkx551vctPpgUd1JqtOwhutrXVtUVmzavIubJSmiUtPW7dNEQ062htaWHHWZhKVPOLmGphKU\\nJRkxhly6VyyFRlHb9w+ue3l7YeUV3C69XkJbYW4nXSxadVbpjSwhAKnUPXQtM5vQ8EfXXqql\\n5KO2qmJW4KLR6u22FFRo1blXXSALnJLz4p77lrAFLaFukkZW1\\/m7KT2oYEnFJQqpz1OUrQfS\\nFNdCMxIACnJJU2hAN9VLIQmxKlgWMTnII0FaNfLG2DiW1KytLvOmYhzhRrTNo1uUVaOIskyh\\nKg5sW3GJeSqjcslBfmZuUl62hQKUuVJCleZuWwmxqsHGiirq9m1MuTErs01ahTyEylcorrxy\\nQifk0rczYdCDsZ+VemqfMqSpDUzt2H2Jejq5hrEWGpl2Tr9GqFJmWFBDrE\\/KTEq6gk2SpTT7\\nbbiW3LHsnSns3RYtrVcXnEu9LTssicp83K1CTc+pNST7cwzfS6VLQTkWm4C0LCVoPoqAIIjt\\nxJKShxClNuIUFJWM0rSpJJSpKgAUKTkFIWCdTPMAnIhMNpD0y\\/qZvzb7k3NvEZuzU28Uh6am\\nHckremXNVO0dWpa3EpB1jmSV4I0om3wwqVDzolnHUPOS4dWGHHmkONtPLZv2anWm3XUNuKSV\\nIQ66lJCXFAqypzZsozZSnNYZspIJTfflJAJF7EgHeBBHHz1xPWhLKuaXYamHqItiel2Jjew5\\nMMzLQbQ5kFlKQspSCnJQyKkKSsBwchHUGNVwN29ZC3nG1Oio1Sn04NpWlClFReqCsipJGYRI\\nFRHma2\\/NXMWFT87Tx59TnXJeoSf7KkJhlWR5idlyHZV5pdxlcamEtrQq\\/oqAPA3daZRMOIYc\\nSFtPKDbiCLhbazlcSRxCkFQPcYiKcpVivN438tzM12YbbkfuHwvtW3E05C0zKZJg4PVKtmVS\\n6lKVDazF7qqBMyCsmaWEhLS2EN\\/ZRhR90oxY5UfSuvtLq5iUo1WveiS0wt3aoW3alWtrDams\\nocCwHGPm2jO+TLRry3k8ujZHVU05GbZRn9Xj0d0fQnGU9WJ9jAzuJZx2oYiOzrCLuIJ6YS2h\\n6Zrc7JLqdTeWhhtppouTc86sNtNttNpKUNoQgJQn5t7TXZdWM6yJJAalG5ubblmgSoNywnpt\\nUugEklWVlaBdRKjrck3hOG7jX4SB2pHvA+HqhxBEIsUG41HW\\/wCfztEESrNpuPxjj4IcOt8V\\nj0j4ju9UN4cBuL9CF9dc4RUnLeOB9kJLTnvHEe6HZHEH0wgRkcvBh9Cj6x7x1v8A1wQ1IzHu\\n6j0wiRkcjzQ5UMj1Hf8AZCKxwPo8eOeMkG4B5wQ1UMj1cRDdQyPUd47vRDxYzHZv74brGY6x\\n493uj2Hkm48NDDVY4H0Hx45oThcjMEdMIHcSOiHkG48NPl13QlXoqCufR9sWLGYz6Pd4+MN3\\nE6ySOfiO0euHZ3gjphuRkSOjxn6YfQdLcvh+uHI4+DjF606qyOAzzHUD3fCLIXDiDqRw3\\/CG\\n5G8jjxEIEZEjoh0sb8+ke3xlDde49vv6vQIfGoB5gR6saX4jr5cBDZQyJi2FFjgfR49sJxkJ\\nNwPf4wpJuB7\\/ABhJe49vv6vQIbrG\\/PpHt8ZQ6WN2fQfZ4yhusbs+g+zxlC0mxHfpHsMXxvSe\\noj1bx7zCEO3hmg9RB+HuMNIfTvHjDgupBHqHqsfughJ4Zoz6CD8PjCsWqGaVDpB9eW74RkDQ\\njxEIGhHiI49QzSfX6oRhxxhudxI6Ifh+LVDNJ7M\\/VvhusZpUOow6hvwhxB0I9fXXGAaERx\\/G\\nG8OljJSh1n3w2UMlHtz9e+MhB1I9fXXCCKQgdxI6CYXhFf1j6PdAjQkdaH74WjeR3dfGGyvr\\nHt9++G6hko9ufr3w5WPO7Rn8PhCC\\/rdo+z4Rlp3DwHwh2Gqhko9ufr3wgr6x8cd8OV8R2fEw\\n3XxHZ498ZCdw8B8IPl4cvb0YbL+sev8AR8IQWN+fSPb4yhyviD48b4br4A+PG6FoNlDv0h5J\\n9EeFvshu4N4PSPd+mE4VXwB6\\/HuhKMhB9Id+nXrhUESUuRHxRVXcKMVcH5yYQqZsK7qfdtHb\\neeVtjRL4kXZSalZZkq3ytOrNtTM2+poZNzFwp2xHlEvEa2Nm\\/JHYo\\/qe6Ydt2\\/NTOwpWK9tX\\nJYE2XSQwmoCVTdVBWoZ5+UTNXttijyakBSi7WC2Slh51SNJimRE\\/Q55vLmWygTTdt4VLnOu3\\neWe1QLa+lpFgbLqwaLjmhPqVlZnJg0uYBNkqRUUmWazngluaXLvEkgDstSBeJt+C1TLtFqVJ\\ncUC5Tp5My0Dw8nnkHzE5gDJExLPOKCfqqfOt9ZIXCw+Ud4KuYY6dtu4x02XWimY94YW1cU1N\\nlrZNrvfDhQsOtSrKkp1HUy9rUrD+dW7rF3b1N5t1oBtpx+YjhNUfILsbllLGyqkpMSZz3I2z\\naROMK3lI1spdbSBmBm9q8FGNOvylXBBd9aG2H2M8hKl6p4D4sSCKlMJRrNydlYpSSLYrDilJ\\nCtVT15yOHEuknZtOFzeC7sc772Y1AYk2NSss4Q5NYaemKe5mOobkXEzMvpvCUUicaZBub9mo\\n20IFs7VqWEzM+4hNw6GKm2AL6n8jMm1rXuJhw+Ott8Q8W3UzEuzMNnNt9pp5BBBBQ62HEHMb\\nt6VDtixYzHYc\\/h8Y+fs6c8roDCSrNcmtyVX2IIcaB6gw6hI3ZeaM8\\/Oj6FX1T44b4rp9osvO\\ntG90LUgd4BIB8FCxHMGOcSnI4Ungq3v0PrGsNHvqdhHxES2Pk0uNJnbM0j9Hmemxnb1xWzjB\\nbEovJTjjFz09VoXkpoqObctIv2xZZLSVBG3q7royW67rRKXd6FdnuIMbduQvxjGEvKH4ZUub\\nnPI6LjJb13YRVck5tOPVqmpuW12FIO5Ts3etp23INH6zap3P6uvrz3ZdVfojGtDeUrK1NTX0\\na9c2CkVFBlUBX8VEw4w6SbWLYJ0uRtaNMea1aTcvZK3Usr5ZXwWddRokqC7nQZb2NrGfrBBB\\nHc0WxBBBBBBBBBBBBBDOZmWJJiYm5uYZlpSWZcmJmZmHEMsS7DKFuvPvvOqDTbDTaVOOuuKS\\n202kklITDyMJOUYxTODWg\\/pM32y+iVnW8La5a1HmCUpLFcxCVL4f0SYa1lJ135OrXPKzTTYK\\n83GQrYugbNWHUJ1qnSE9UHzZmQk5mcd1A\\/JSrK33N5A+qg6k2HMQzMPCXl331fVZZcdV3htB\\nWR\\/5YgQ6QmJ7+NePGMeLkw444cR8TL1vGW2iVoMvTq7cE9P0mSS259I21I012UkWGnPpGmJd\\nppeernHUiOf0ePbCCB5vac\\/h8IcI4Ht+Aj5lzcy7OzUzOPnM\\/NvvTLytTmefcU66r0iT6S1K\\nOpJ11JOsUQtSlrWpRzKUSpSjpcqNybd6ib+JMLt8\\/o+MOEc\\/o8eyEEcD2\\/AR2rgnYi8TsXMM\\n8PUocU3ed9Wvb82pvMqYptSq8nL1WcOR1w3I01U1Nu6o1w0wvVOuI09QnJenSc7UJpfZyshK\\nvzky4fzGJZlTzy94+q2hSvVDkrLOzk1LScunO\\/NPsyzKN2Z59xLTafWtYTEsHQ3w\\/Rhjox4K\\n2nsgxN\\/cRS7gqrWz2bia1d4cuqrNP+aFrelZ6suyWa\\/wJdsbkpSkZkVKp061bcqNcrT7UhR7\\ndo87V6tOuFOxlKdSpJyeqM24QctmzLsPzCiPwQehIHzNJlW1TclKstNtttqbQhlpCW20MS+\\/\\nZoQjVS2hDTeolKSEgEZDLdGIvKlYqfqP6COkJXGphuXqd02iMMKM2op2s1M4mTsrZtSTKKI8\\n2Ykrbq1cq6HM0uMt0xx9hYmUNCOBvJipc1i7EWN8ZziXFTuJsRNU9DouopfqE45VqqkrKDmG\\neep6juSlKLqTYpt9I645LYUwzLSrZQJXD1CuhJ0zN02RS0wAnMDdYlylKc2ZSlZQoqNzBzxd\\nxDqWLeKuJWKdYBRVMRr7uy+J5pSgoS8xdNdnq0uUbAybSxKeWmWl2mwllphpDbKENoQiMi7P\\npvzVbtGkSnVcakW3Hk8NWYmQZmYB3A+a++5vPHLtjEm26cKvX6RTinWRNT8uh5JGY8mSsOTR\\ny59WXQ6rLgct2rGbCOJPjxuj6V4ucQyxISDQyIbR2mQXslCEoYYA1NwAHU91rR86azMLdcSX\\nFFbjrjkw6tRupa1quVE8SpSlkkjfDhoZuJ6sz7D8coep+sO33b4aMDziehPvIh4ged2DP4fG\\nIITYE93v4Ro4WiqRmodufq3xSLkDzuwZ\\/D4wx17YIXAzIHSQPWYfwza3uJ9PsBMPIaWdQO6\\/\\nt\\/VDSzqB3X9v6oIIIuSM1JHWPfDDnD19e6PUWsT1aHoGQA6AB6hC6Rkkdmfr3wjxhxGO5w9f\\nXvhuFkDJI698XRQbgB0ARWG4OuuvshZH1e39HwhdA3Z9J936YRAyAHQIcJ4Ds9++GCbknmYb\\nTqonx+ItCyBuz6fHfF8UTwHZ798VjHUbknrlHqzpbn+uF2BvUeoD17z7hDxG89nv6\\/QYbsjJ\\nA6yT8PhGSuFVf0F8F7aaxx04MZFsW4xVZ2Qs3Ryw2pteuHFbE+qUlEo\\/MGtvUqWYpdjWgsTL\\nTcvN1av0SYuMy9WYkatSDTmjP7Wi0ScxBPt02RyB5xKnFuOZyhlhuxddUhpDsw8UJPoy8oxM\\nTb6iGpaXeeUhCn5CRfqU01KS5aDjpPpvuoYaQkaqW444QlKUjU2upX1UJUohJ7I0SNBXG7S8\\nroNm0sW3h7T5zya5MUrklX2rXpSkFtczI0sJDb1z19tlaV\\/MdKcOwL0r87T1IlJlqbiSPghg\\nfovaCltzSMPKZKXhiC1TZhd24s3K7ImpltlhTlSS7XFgSVs2+yhlx1yjUBLcsmXlga5Pzc80\\nag5E50m\\/lN+JFaoCcL9C\\/AG0cCcMKRIv0W25i7ky9VqkjSEpCJByQsi1naZalEnJVJdW5KVK\\nrXvRHnnAtVPUUOKmNE+JmkXps6a1WdZxCxJxZxfZcnXJg281NzMnYFKmXil1brNqUNqk2Dbv\\nmpZG2TS6eClEu0XQNkiLOThDaFT5VbWAjh\\/Z3dvs5\\/arjuVlq9ihlpQsXcG4FbfNDocutOqK\\nhiqtmsKbdW1OUGScQEM3phyn4DwchM9UkP4pqzYCylpX0bSZdd\\/TQZ59JmfR1BVKyo7QgqRP\\nlpeQTpNJ7lstCzCmYnJe9dIag3xX5RtTkvY2C7T2I8ylwk68kKjbypmzKVPoIIcbuK66VOJB\\n+kX5wB0Z45fKVaxNKnJHR10d5WWBU+JK7MbLjfqLq2iFoYL9hWTMSLUq8nJt5ZTiJPt62bGq\\npIMwvSpYmgTftYLU1fdxUiz5QlKnKfTx90VaAAzU0ssOy9HYK8yhLzVRqAQc1qZWkBLmYNka\\nGWB9ppZen6JOXnUGgCZu6p1czLlzWK1EUiRTI0lTeY1EtzUpOKS0Ehbq1LWtdNubEtgMjVH6\\n9tGxFjfbxi2YdExOz2I65OTFPcmhuWzK092lU8yqbZUSszO1dptFkISW0NoTtKxt6qzTXmlG\\nVIUSUQChEtQZForCDrZc7N9r6ZP1nZZTJJG70jm6LxM5V7lJNImdVSpbG+\\/KBLuqc8mtjAmk\\npsF1kTJ1VMt1GyJNi9Z5tZAaQip3DUNUApaIW66V46yujBpO4p1V+4LpplXNQqCkKm7ixIuU\\nqqkypRKtec8vm6ncTqk6xWtT0kvziQc1ZoG56jUOi0CVTIUGj0uiSLfnJkqRT5SmyiTlqjVl\\n5JpllJCQAMkDIDVyyjmkjMgevx7In9Nx\\/QsHy6pLZzs7wfgyUCSj9gUuUYccTcHO4mmy9NQt\\n1SrrUp9UyVOErWpaiSagq+0KuVdztJqYmZxYJIdqc7Mz7gJAF0do4A36ICQkZgEgAaAAauba\\n5OurOBl28cSKdJqySZiStqizNSBJy1kM1OqzFKKAN+Ti6Ss5fWb5o72oGgNglTEINXmLxuV7\\nMlwT1aYkJY7wAG2aNIU99tGQ4LnHlkqUdoE5BGbAGZA69\\/jshcbgB0RoqjtQxzPk56\\/My6VG\\n4bkG5eRCRyC5Zpt8jvU6pWls0Rl6u1V4m82tAO5LIQ0B4FCQr1lRPfGPtH0VtH2ipSJTC+gP\\n6oIBrDtTryj+yZlRrk\\/UNb9lVq57gA0EhOxZ1OxqZhFhVTdVNOw0sGQS24l4GTs+3pdW2QEh\\nDuuzT0qLydRJDxUXPNSc898fecYeoTqpA5+J7YiM3iCuzd1Tdaq0ypW8zFRnHid2\\/tHlX3fC\\nMBc3NuH8pMzDl+K3nF7ueZR9UfN\\/cTZn\\/kjbH\\/oClf8AVIRmMPrCnEBqbsi0JptKg4luZtqi\\nvthwJKQsIcklDXCVqSFAZgKUOClR9bCiBl53Pzd\\/j4xgpnp1AChOTQVoRaYdBFrbiF31Fr24\\ncNIxVPu30cWLcQtXz69cdH1nRlwCr7S2qhhNZjKXUKSo0Slotp0JUgJJbetxVKeaUEgEONrS\\npKtZaVaxKjjvevJ44V1pp12ya7cdlz5SvYtTDyLlooWQCgLlp5UvVvrbioVpZSlWexKgCc\\/k\\np1j1DjCwGeQA6gBG8p2OMXUlaVyOIqq2Em4aem3JqW05ys2X5Y8jdo6aRlMVWpS5BanZgW3J\\nU4pxvTm24VoPrTEf7FfRfxlwKeFxvyq6pQqdMImZW97PmJpxmmOMONqlpqeDaJeqUB9t1bQb\\nmZhpEqmYKWpWoOup3bT+Tt5RXEqUuijWzW6y27iVbjflltXLOFed7UGQbbcq9tXIy060KjPe\\nRMOTMxMfXqdNamZ19TFVpiahNZcKlWnW1tTDaHm3kKbdZcQlbTjawUrbcQsFLiFoJStCgUrS\\nVJKVCNaeK+jB+pvjhhJi1hKwmk0Cp4q2RSLnoku2ryO25m4bkp1I+cZNlvVW1b1XE65Tp+RQ\\n4jyGanW25Etys621TbEdxJRtsNHewbjSlyH4QuS74wzWm20NNuVQt3Ykng4omX8\\/WlLDzaV+\\naTefIGpd9Eqo2\\/sz2nTtAr0kX3SyxMPssT7aFKErPyqlZXEPM3UEzLaFLclXUg2eAQEhK1NO\\nz3sKMRaPi5h3amItAzRT7ppLU6Zda0rdp0+2tcnVqS+sJ1Vv0mqS05T3HkICHXJQrSChSY7I\\njofAfRlvXRPtKpYW3ddFFvKSVcc9cdp12jNz0kFUaqSVNYmpCfpc7rqpk5L1eRqE1s5eenZV\\n5meQ\\/wCUF4vNt945npPrMfNbGuG6hgvFddwvVZR2RnqNPLlnpV5bbjjIWlD7KVLaW404TLut\\nKDjbi0OApWlRSoGO85eZlpxluak3kvyryc7LqQoBaCSL2UEqBBBSoKSFBQIIBFoXjAPTkxfp\\nGGVvSszVmnX6fblt3XiBW0MuttLZp9Dp7jrK83vo8nWZSseespQjZDcrJWrnrmek+sxF35bP\\nSMlaZYONtFknXUzlXfo2CVDfTMI1Vlx5Tl4y6kDJeqJKVvKX1ElSST56wFKTGXs+ws7jfF9B\\nw02y44iqVSnycwUKKS0xMzjDDzxUCFBLDbi31kXIbaWrcCIbqFRTR6XVauogfRlNnJxFwCFP\\nNMr7BsAggqcdKUJBFiogGwN40t8nrKT1w1DGvE2sqW\\/UrjrtMlXZoJIbdqE2\\/WbgrygpanFK\\nW4\\/UqY4Ua\\/0ScgsrWsFGy1ScuzmPfGKeg9ZyrX0eLYmXWg1N3dUa1d00gDIqTOzSabTnFE5a\\nxeo9IprySN2ottOeSdYZZEZZgjqIMdzbRqg3UsbYhdZyhiWnRTWEIt2aGqUy1TUhsAABsmVK\\nk5bghVwTe8fLeuzBmavPOlRV+XLeYm9+xSlom\\/HMUFV+JJOpN4aqTrdvN48b4R7YdKTqnqPC\\nEVjPzufn7\\/HwiGIV+adx3evh4GNTCcNHUapzH1Tw6ukfGHcDUs7NONSzDLjzzzjbLDLLZdde\\necUG2WmWmwXHXnXDqNtI85RPNzrQhRXlSCSqwSkAkqJNgABxvpu494h0KuB36eu45kb7+rjH\\nHxYsZjPo93j4x2s3gjjI5QaldRwpxFZtKi0+Yq1auyasy4ZK1aLSpdpT0xVK1cs3T2KJSqZL\\ntfSPVGoz8tKMtnWceSCBHVSVBSQpO9JAI60kbjvyO\\/rjNmJKckuyVNSszLB0EtGYYdYDoTYK\\nLfaoTnAJAJTe1xe1xd5TTyEIccZdbQ5mDa1oUlLmUJK8ilABeXOnNlJy5k3tcQ3UMx2b4RO8\\nEdMOSMiR0Q3UMiR6vHsj1s304b\\/hCIbEcQewwgoZEiHSxkc+nx9vphusbwend6vHshyFoOvi\\nOvthqRkSOiEFDJR69\\/j0w5WN4PT8IQWNwPo8eOeFoOviOvthSxp4QnCS9x7ff1egQr48e2LF\\njdn0fHwIfQbKHfp1649Sbgd2ns+6GL43hXTmD6OEIQ7eGaM+gg\\/D4w0h6Fp3jxixY3Z9Hjuh\\nusbs+g+\\/Puh0rgez3b4bq4Hs92+HUbvAw8RcEc+fXXLm2X9U9X6PjCMLkZgjpEIRkI3Hx6+E\\nJRuI77\\/D5RRQzB7PbzQ2UM0nsz9W+HUNzuJHRCwbEHkbwuGyhmCOkEesQwjkOEMFDJSh0Ej1\\nGMjwhxB3j19e6KQQQQ+DcA8xeG90MCMiR0Ej1GG6hko9ufr3w7d3OK9HtAMNVjzu0Z\\/D4RkD\\nWx7vjb5Q+NQPARbCCvrHt9++F4RWPO7Rn8PhDiN58PtEewxdGTiuvI+wfHOGy\\/rdo+z4Q7f+\\nsP8AFHvMNXOIPTn49sZCPreI+\\/7IIThJfEHq8e+FYTc5vT8I9GiyOfyvCkH0vEW+37Ibr4g+\\nPG+G7nN6fHthyvgD1+PdDdfAdvj3RlIPoju069UPQ2c5vT8Ibuc3p+EOV8B2\\/Aw3XwHb8DD6\\nD6Pgbfb9sEN18Aeg+PdDdfAdvwMOFjzew5\\/D4wgvcD454cTvHiPjDqDp6\\/dpf2Xhuv6p6v0f\\nGEYWV9U+OeEYyE7x4j4wuCPscNb5qWGOIth4j0gk1Sw7ytm8ZBKciHZi3KzJ1ZDC0uDZuMzJ\\nlQy807rNPNOLbeStpawfjosc+orsMPKSlaVIWApC0lKkncpKhZQ9YuDDjLjjLzTzS1NutOIc\\nbWk2UhxCgpC0ngpKgCDwIj0IbRuKUmxbV20aYTOUucRSK\\/TZtlQLU7TZxqXnpZ5vMjWRNSjq\\nFJO7XQ5mQY+008MF06RehhpKYPS0oupVK9MILsFrSrKNoqYvSiSCrnsQpQUqLupd9HojmqhO\\n1WEZNKCiFRrw5N7EZWKGhdgbWXpoTNSty2nMPaqNxdl37AqM3atObml6y9Z+YoNMpFQLmsVu\\ntTzLzp26lIRuYsmfVUbWo0xrBTiJRMq7mQV7SSUuVzXvGRcDAWd3nbTW4ExKPJ7nPNKji\\/Ck\\nwVKbfZROspV6P9COrkJxQ0GYvNzcmTbUpbSrUC8dh4uLNew\\/Qq0kJ7KpSDaXMtjZFQk25hCD\\nqbdmQ8kg7lEpUbi0eVRh9OFL9RkFHc6wiabSeGsyrZOAEZZlQdbJBzOSM05AKjss7wR0gx99\\npk4U\\/wBjtp06Q+ErUt5DSrSxpvSQt6W1Q2G7NuCrTFassqTvCQq1q1RXyAopzP4u8\\/BQ7X5R\\nUpUnG1aKJKV8LONLLKxbgRkB46mOS5xpTMwtChZSVFKu5aFFCh6imGyhmlQ\\/cn3GPs8JsQqt\\nhHilhtipQStNcw1vy0r7pWovUUqoWlXpCvSjeZ4Bb8gltesNVSVqQrzePxhGYI6RDCNbKvLl\\n3G3mlFLrLqHW1DehbakrQobxcKSDu4cIZUopKSDYggggkEEEG9x3gEWsbjfz9Vm3K9S7rt6h\\n3TQ5lE5Rblo1Mr1InEhOpN0qsSbFQp0yjzlDVflZht4DPgrLzc9\\/PxrZ5JDFxeMvJ46MtwzM\\n23MVW2LHVhbV0gFT0tMYU1SesGnCaISCubnLcoNEqi3dZa301Bt91xTzr2WyaPofS55FTptP\\nqLduzn5KVnEWNwEzLDbwHqz29WusXJLPCYlmHxueZad8O0QlRFuBBNiN4IsYIIIIz4fggggg\\nggjQD8oXxPFsaKeG+GUq8Gp7FHF2VnZpvaAGYtqwaFUKnUGw1xWlFxVi0Xg4DqNBreCXG8t\\/\\n0Q7\\/AJRJif8AdHpMYPYVy82ZiTwzwmer83LpeJbkbixHuOb+cJcsnc1MuUCzrTm3XAM3mJmV\\nB3MjKstsFU+i9n1eWlWV6ebYpbIvbP59MtNTCdx\\/6n5ySLXIFhYm8aDE8wJejTWtlPFphP8A\\n33ElY3je0lzdfwMR9UfVHp95hwj6o9PvMIJ4DsHuhdH1R6feY4Einibknmbw4R9Uen3mNlXJ\\nVWKbs0rKTX1sh2Vw6s+6ruUXG9dnyydlWbNkUb0LRt0uXSudlUkBTapJcy0deXEa1UfVHp95\\njfhyNlkCXtfGjEp6XzXVK9btj0ybIUFNCgyEzXq3Ltq3AomTcVuuPoBUSZSX+pkSuk\\/KDrxw\\n9shxvMpWUvT9OTQmUg2U4a5Ms0t9Kd3pIkpmaeNtcjSynUCLM2P0n6Z2j4XYUm7UpPfSrpIu\\nlIpLLk+0VC25czLsNi+hU4kHQxvgthguTjz2rrIZYyPU46ckdPFCXfZz5CNBfyh3FFVLwr0f\\n8Gpd8By8L6uPESqy6Mi6iUsSiN2\\/S9sriJacmr8qDjTZBS8\\/SwvcqWTnILtJlYkZiYUk5vTG\\nqlQB85tlCdXgk7g4t4E7+Bz4ZxDb5dvE5d6accxZbTn6zwewxsizywkkt\\/OtfYm8RJ6aPnH9\\ncOyN4UiTdy1EhunMI2aVhxbmj8kPC4kMIYUdcQQ7NNVPEsyMtkqM4+tmRXqkE2kzTlAnin0V\\nFOUR0\\/tsqvm2Hak2lWVc7MSVLbsdQAoTL6RqdFNSz6Df81Z3EiNXeEFP8qud6dUnNumU59xC\\nsvqzE0pMq2M+lTDk30\\/VHCMn0c\\/o8e2Ol8F5DZ0WqVJSdVU9UESyCfwmZFgKCknnSXpp5HUp\\ntWfNl3Sjge34COksSvl+qTIvcMBpgG9\\/qJSpY05OLWD4X4xwzUF55pzkgJQPULn2KKodsfh\\/\\n8X\\/2odo4k9Xj3Q1Y4K7R7odt8\\/o+MRtf1T6viIwiLewH2i8KRejiez4iLIUb5\\/R8YZghyyPP\\n7Ek+4fGHcNmOKuwe+HMMr+sfV8BDK\\/rH1fAQQo1+yJ9PsBhOFWfrjsMY6\\/rHuj0GyFeNvbYQ\\n8T9Ydvu3wuN5A6YRR9Yen3GF08R2j3wwvePDr4QiF4qN5A6SIpFU\\/WHb7t8I3QboXhxCCeI7\\nR74cJ4jtHvjHhCNx8evjC8EEVG8gdJEY8eL4ev7IeoGSUjqEIz9Mp1WkXadVpCRqlPmUaszI\\n1GVl52TfQd+o9KzLbrLqCfwXEKHGHEOOEJKlIUhSFKSpKgpKkkpUlSSCFJUNUkHUEag6w2CQ\\nQQSCDcEaEEbiDwIjHprRVwHZuBVxCwpFbyhrCluzdRct9D2tmX00Nc0qn7wNn5MpldPCTrCT\\nS6SuO\\/6dTqfSZNiQpcjJ02Rl0hMvJU+VZk5RhHMhmWl0NstJAy81CEiFoXAyAHQMofqNXqtT\\nSyio1Kfn0spCGUzk2\\/MJaSkWCW0urWE6crE8bwtczMTBHbvvOhAskOurcCdw9EKJtoOHthZH\\nDtP2fCHKB5oPST7PAhukZJHZn698OU8B2RqoZWdAOZ+HQhZHA9vj3wugbyfR48c8JJ4Ds9++\\nF0fV7f0fCELOluf64ahVA3k9Ay9f6IVixHDtP2fCL4xFfWMEKNJzWDzDefh7YeQgwNyj0kD1\\nD7YXhk6rA4C3zMJJIBPs7tw++KpGZAhcDgB2CE0DifR49kLoG\\/Po+Pgx4s625QzCgAAAHp6z\\n0w7aRqjWPE8OofbCLSdZQ6BvPw9sPIYWeHt664QQRlRoSYN07HbSjwhsKvUWWr1rpuiXu266\\ndPywmabMUGyEOXVMM1FCgU+TT0zSZKnNlZAVNTkq02pK1hUYrxIq5IPAMYfYd3vpPXlICUmb\\nyknrcsZb7RE01ZVFmzMV+qMJUhKks3JcMnJyUnkUuvItsPNhbE\\/LOOWFsroSK5jSluTTiJek\\nUFf4S12dfKUS0lSaIpM9MOzTqiEtMurablVLUbJ7fObBClJkeEqS9WsQ02TabU4kTDcw8Egq\\nPZMOIUU2Gt3l5JdFgbuOoHONiWM9RE5d6ZVCwpNMpkrLKCRmEvOqdnFnW46xamJcKST5oTuH\\nnZnqOH1WqczWapP1SaIL89NvTTqQrWCFOuKUGwQEgpaTk2jMbglBIBzI4\\/z\\/ANz7Y4D2qY1T\\ntA2j40xk2l0S2IMRVKfkEu5u0bpipgs0xpwKNw41T2pZC02ASUEBKQAkfTakSBptKp8gogrl\\nZVpp0i2UvZUl5QtwU4pSteHPefhcTr7kcM8PLzv2paipW1LfqdYSy4pSUzs5Ly6k02nJUgkh\\n2p1EytOa+qA7NJ1lITmoQGOUixQq+M2K+GmENHLk3WFz66zV0KUt5ybvC\\/qkxI0xqYKUArdl\\n5Rtc7m2yBsq6tSyVea3PYxGwWoGPMtRLIv65Zq2sLWKuxcV9NUpx1NeutqkEuUOzqeWG5hcl\\nJT1WcarNYqwlnHZNmhMS0qWJupNz8h93Y2j1oEYN3XL33hjooYVSmIUpNys\\/KYkzGHlt1PEC\\nWnqe2hiRm5XEK52qxe8vNyrDTKGZhqptutJZYCVKLSNj075LUts+wag7ScfY9wjhlxXn7VCp\\nk9Ukz+ICtLa6Y3UF4cp\\/b1FEilT1RDapluXcmnEMuS6VMjtxD9oaKvWKK9hqhyc27MTr0sqf\\nmywoSbUqwrzhDAfUpttcwqYRLuKbS4UBkKS4tK1gRF4wk0VMcK5blt2zhlgvifctFoVIpVvU\\n+fplk11yktS1KkGJGWM5WhIN0iUVsZdBWuYm2WiSekRmpZfJOaZl47Byp2ba+H8u+6EImb3v\\nOjJyZJzMy9I2mbtqrDSCcih6QbmiQS3KLbLK1yNZ\\/HetvApp1GpsmSDqrmnX59SUjhkWxIoB\\nzAOsptSCR9UjIR8ZPYp3zPkg1pcq2eCJKXlZcJ\\/GIdSyZhRIOSc3lAb9wOYiaVDaz5LtDddc\\nVXNpe0KbcWpwuUWiSlCp7ziyFKW99PLp8+i6itRWjMbrT+SUAVCgKb5Nk86Qup1ApVfMsKmG\\nWc6idSUS7M+TcncmYTvPp8I1XWbyH10vJafxGx7t2kJQAuakbMs+pV8LSMiUM1evVa2Ey6Ql\\nWsp96ivgapTsN+0RkhbXJG6GtoBp69b8v28ZxBZ28nU7xoNCp7pbBLqGafbtFk6y23Mf3wLr\\nUypDeyDbrbhK3MkZysVaof8AyQqlRnQd367nZqaz4KH7M6s5BQzy58uaOO8\\/9z7YiM35WWz2\\nmehhDYLSlrQbonsY4mnq6FrICCXaUJVLASUEKyongjMSoIQoZjYFO8nnC0plVNOJfVpmBadd\\nKrZdSqZmXGr87SyRa9wd0I25opcn1YAaTRcD7Mrzstkda46XXb92y9ptFLd+7ycq0s+FKBVq\\n5LYSj6BtKWPogYp6UWDGjdb6mMOMKrYpl2VKXLdCt+k0W3rVlksGYXtahVWrelNqzSmFF1SW\\n0bNyoTqVysspnOdnpToDGfHyhYaSk1Tqc9KVS7EMqWuVccBp9Ca1dp5bW30rQG1JZ+lbkEuo\\nfW0W5iYVKSrjTz0SfTB078QNKXECqaP2jHctRnBVJlacV8dJWaeQymioWyxPyNpz8u4y7KUG\\nW2hkJmpSSpVytKDNDtlLdIfXOVGS4A8oHb1tJqj0jg+m4C2eUOTY7asVuh4SlpWQodKAypmp\\nqbqjlXstCUrEjLstpmJ15JblWglLjjEnqWDdmWzmkGv12VCWUJUqRpyVsSs1VX20pUW2USbM\\nspqVSSjzmZWChtCkputxxpLuUml3yguKenjipP4VSN5vVbBbDqrpnMTpyhrdp1l1y5pN3Wpe\\nG1oybEy5L1Giy0ywZm8q1PKqkzW5WVRQ\\/nN2kTrjlX6qj4rDjDe3MKbLo9l2vL7Kn0ts7eZW\\nlPldVqLwCp6qz60\\/sk3OPJ1lknVYaSzKMBMtLsNo+1jbVuopn5tRbnalU22ipJqtZmHJqr1d\\n85RMVWpPOKURMzakJ7OXQQzISTcnTpcBiTbJ4lxvi6cxnW3am+0xKSrSfNaZTZRsMydOkUKU\\npuXlmRogFSlOOrN3XnVqdeW46pa1JL4g9Xj3wgscD6PHthyvh2H7PjCC\\/qnq\\/R8Y1zR3dxt1\\n6jEQhssbgeg+PhCCx5pPQR498OFDNJ7M\\/VvhBXA9hjJj1O8eI+MNV8Ow\\/Z8YQV9U+OG+HKuB\\n7DDcjMEdIyj1O8eI+MPnUEc4Qi1QzSezP1b4ug4xkDQg8iIQjcR39fCGqxmlQ6jDGOQhgdxI\\n6CYfhcUhvDiEFcT2n3w4g7x6+vdGRv8ACG0IHcSOgmHCuJ7T74bq+se3374fRvPh18YaRvPh\\n18YpCCvrHt9++F4RX9Y+j3CHYdhsr6x7ffvhk7ucV6PaAYfL+sfR7hDJ7657BD6dw8B8IWje\\nfD7RCUEEEZCdw8B8I8V9Yw0e+v2gfEQ1XxHZ8TDx\\/insPvho5zen4Q+k3SPC3s0hxJukeFvZ\\npCcJL4g9Xj3wrCbnN6fhDiPrDvvCoZv\\/AIP\\/ABvh3wzc5vT49kPX+Ce0+6GbnD098Pp+sPH4\\n6QQlFi+A7fgYvi1f1T1fo+MKP1\\/WPeBHqd48YbL4Dt+BhBf1T1fo+MOF\\/VPo94huv6p9HvEZ\\nSNx8fsEPw3X9U9X6PjDdf1T6PeIcL+qfR7xDdf1T6PeIyEbj4\\/YIALkDmbQ3X9U+j3iEFcD2\\nH3Q4VwPYfdDdXA9h90OJ3jxHxh1G4+P2CG6uB7D7oQhdXA9h90IRkJ3jxHxhcEWqGaVDpSR7\\nIuiiuB7D7ofgiSTyFOIxqOHGN+E8w+kuWteNBv2msuOZvKlryoy6FUwwlWZ8mk5qy6c46lHm\\nNP1QK1daaWpUmLCWdK6XUqepR1pSdRMtpO47Kba1NUJzyKEuSy1b8slLA3FaTEKrkY8RFWfp\\niy9qOupEninh7d1p7FxZQ1850duUvmQmUjMBcy3LWrUZFgKz8yov6iddaAZlGGM4qWr70soK\\nSmeknkI6C8wpt5JI6mkTI9PSTknBs19C7TqRMXIZqZ8zdAsAoT8uqWbSNB\\/15DDljckjv06q\\nwNNCs7LkMKVneo78xKkm9wJaYTOIFt9kyU0lpNvzUi2txEMf5SFhL9wWnnQcTpJCkymNuDtn\\n3DOzmzSgKuyx5upYf1CXQUZl7yW2bfsmYU+7qrCpwsamzYaWvUFJzCZuUlJpGWrMy7L6RzDa\\ntpcy38MtbIhW8ZZGJXfynjCZVf0e9HbGyXYDkxhtivcFgz620fTIpOKdsirCZecBGcrL1XDO\\nQlUawWWpmrJ2Ool97XiR2ZNeU0CWSVZrlXHpVXSAlZdQk84yZeaHZu6YtXHsqETy3wDZTqXB\\ncWNphtKlqOm7tm1gDcL87gUJiuV83qs0ANFOh4HmJhCXVHedzhWD3gkACPojuJHQTHHncT2m\\nOQVxPaffHHq4ntPviAN8fV9sRte5Ph8omNfJqcVzXMA9ITBeZc2j2HOKVBvynhxaddFKxPtp\\nVLVKsIORVLy1Tw3nZpwjPZTNW84jbtAyXYg9\\/J0cT\\/uP03btw9mXSmRxawYuinSjAXq7S5LN\\nrFDu6nPcVJWlm3ZG72y1qhecwl1LqUtuIenCR25smqBqGBqSFKzOSKpmnuG5Oku+tTA1J+rK\\nOy4tewtpYWAs\\/Db\\/AG1JYBN1MKcZUTv0V2iBuG5txA77XOpggggiyI30EEEEEEEefXyrOIxx\\nO5QTSbrYeDktQL8GHMo2lWbUunDGjUuwJthr8UqqtvVGZfQCR5U\\/MEcd0\\/uv1um23Q61cdXm\\nEytKoFJqVbqk1uPk9OpUo9PTjpyIJDUsw44QCM9TLPnjzIL2uqfvq87tvaqjVqd43PX7rqQC\\ntqBP3DVJqrzgDhSguATE459JqI1uOXMOcfKMqRao2HaSlVjOVOZn1pBUCUU6XSwM1hly5qle\\nyt6kApBKFFMHxs\\/ZiRlhr2jrr5Fx\\/UUpbSd4IJ7dWXvB4iPnk8B2D3Quj6o9PvMIJ4DsHuhw\\nngOwe6ORYreF0fVHp95iVdybNl\\/cXoiYbuOMlioXg\\/cV61BJH7L88VyclqQ\\/xzIdtynURY5t\\n5yiKqw248ptllC3nXVJbZZbQtbrji1aiG0NozW4tayEpSlOspXtms4TWebIw7w2w+ZS2k2pZ\\n9pWikoIKFO0WjSFJWo7PWCy47LKWpQ\\/ZFKK8zr5xxn5ZVUdThXCGGJYqL9exI7OhpH7Y+ikS\\nZlwzl3qSqZrUsqygAXENkXOkdLeTPSw9iPENZWm6KZRmpQKI0bdqc2lxKweCuxpz6Bb8xa77\\nxGVNBlthR6e2UqBVLtvKzSQQqYKnyCCNxG0A35EZHo1Y867TJxJTi9pXaRGI7U35ZIXRi9fc\\n1RH9dK9a2ZS4Jyl2ugLT5q0s29I0tkKA1SGgrLjHoB6R+IwwZ0d8bcUWnUy7+HWE9+XXTStW\\nyDlUoNr1Gco0s2ojc9OVRmSlGMwAp15BAz4ebZKy7tQnZaVSoqenZpiXSSNZRcmHUtJJH4R1\\n1jnzMdlbHsPtUGiNSaCAxR6TSaKyoJIHZSEohpduBGRlg31IFr7zGZttqfbOUiTvYrcn6i8k\\n6\\/WLbTCue8zIOljw3GMxrBkBTrPoTBGSnZITq8xkSufWud87LfrJS+lGqd6QlKVHcY+0RwPb\\n8BDZlpuXZaYaTqtstNstj8VDaQhA3ZcEpA8bnSPqj0+8xiTTxfdffVvfecdN+BcWV9\\/O0csO\\nKzuLX+mtSvaSYeMfUP8AjH3CHTfP6PjDVj6h\\/wAY+4Q7RwPb8BGEv6p9XxEIi+FG+f0fGE4U\\nb5\\/R8YZgh4x+H\\/xf\\/ahxDdj8P\\/i\\/+1DiGV\\/WPq+Ahlf1j6vgIIWY+uf8U+8QjCzH1z\\/in3iM\\ndf1j6vgIV\\/U+ucPUfW7B9nxhdH1h6fcYQRxPZ8RC6PrD0+4xjr+se6G4Wi5H1h6fcYti5H1h\\n6fcYQrcfA\\/CEncr1\\/AQun6w7fdv9whyj6w9PuMN0fWHp9xhwj6w9PuMMR4jcfH7BC0XI+un\\/\\nABk+8RbFyPrp\\/wAZPvEY8JWdQO6\\/t\\/VD6HEIJ4jtHvheG3OHr+yEQQ4hBPEdo98LxjucPX9k\\nNoGhPfb2frhxwhxDeHENwOcPX9kLgZADoGUOE8B2D3QhC6eA7B7obc4ev7IbhdP1R4474uii\\neA7B7o+itu1rnvGqsUG0bbr11VyaB8mo1t0ifrdVmQNUEtU2ly01NvD6RAOzaI3gccjDDTTs\\nw4lpltbrrigENtIU44tR\\/NQhAUtR5AAwAKUQlIzKUQEpFySomwAABJJ4Aak8I4poZNp68z7T\\n8MoUjY7hNyUumJiamVnKnZVKwroz+yc+ccS60zSpsNFX0oTbFIZrd0y8y22PMZqdGpjbrn0Z\\nmG83HWtkWHPIuYOWi1LVTHTGevXS42Q69R7bl6bYVBWsKOtJzFQqTtfrNRYz1EockXqFNLcI\\n1Ajcg2HS9kWOqgwuoTFJFBpbaC5MVTE0wzQpOWZBF3nhPLbmgyB6XaIlVpKBcE3TeR07B2Ja\\nuUIlqXMIDhGVUwnzcKB3FKHLPOA8OyacJGu43iOMj6vb+j4RkLhhotaROMIZcw4wdvy5JGY2\\nZZrSKHMUy3DtgC1\\/3zVoU6329cZqSXKmPM+kG7fEo+xcGNCvAksrw3wbtKZrEmGxL12Yoi7q\\nr7LqE73GrpvN6o1OW2hJLyqZNhondsihlsN9oVXHitvgt0elSFPRmQHZtbtQmNQZaigEqlWG\\n1c6klt5HHPhmY5V6rsAwSVpxltkkq9PtqKV0PZtIO4idUtBsttFdCHaO04hd0FE15uRYj610\\notiheT1iio5Fz5VKtqsVAN+bix1BDk72b5Ft2WQc334a6McMuRi0h7jSxM4j3lYOGMk+EF6T\\nYfmr4uSUIILm0kKSafbrpRrbthdrgcczyOzIcOclmckhomYfJbmMU78u\\/EGot5JmJKdrslZ1\\nFd1cwosUe3wLlQCcgr\\/vmmCAUZJBzW5k\\/VL8u+s63l9fqCkKzzl5Z0SUuQr8FTEmGWlhI3ee\\nlRGWeeeZHye0WSeBJ6h7N0VlU\\/Kw2SUEqbwDsWerkwLhus7R6z5xcp0SX8OU7zuQcCio37Ko\\nS5ASglKl\\/VuKi+TlQJPIuovImHE2zAh2azbiRmeLMtvG8yB1Kh9XQ\\/dWfh1oeYPBpWG+CVnI\\nn5cJSxWEWlJ1OtNhsgoBue7BN3EElYSoKE24VrCXHElTaDH0V74pzt3SHzTL09NLkPKEuvDy\\nszTs4Gcyyl3JllCEJcCHy0hKvpmmQV5N+f1HtF\\/jGDaL\\/GMU7jjyt9ruOKJUsLrnqHhbC9Xl\\n3JOo0DB+HpCkyczJvAJdlFTT5n6shh1F2322qi2mYaWtl4LZWps21RNnmGKAtl2QkEh6XUlb\\nLi1BIQ4j6qwxLtsS2ZJuUEskoNikgi5ewQy2i\\/xjHx1+3aLNtifr5bbmH5dUszJyrqlNJmZm\\nZmG2ktlTadYBLanJhfDNthQz5jzkiYC1JQlKypRASLjiQOfDT2cLXibIZW4tKE2KlqCUi+9S\\niALk7hrv4R99BGH9I0rKXUXZqXFClZxyQfVL1AUm45abdk5htxxpxialPIAuWfQ6y62pqYfS\\npK21pKUrQsJ+3k9I2zX9UTUjcEkvPetUnIzDQ+r+GzPl45En+8cBxz80ZbjU00crks+lQtdN\\nk3AICkm2cGxSQRpqLEaWjJ+jpsjMlrOnWym1ocBsbGxQpW43B5EEHWMiYI6fk8bcOZzVSLiE\\ns4rL6Ocp1TY1c9VOSnVSapVPnK3\\/AE\\/MpROyBUWty43WXQZJL8lUW7hnHklUrIUpwLyIRmFT\\nk0pCm5JvNQC9dLsyCfo5N3UdyZCnCrKGXweF0EX3bidNBztuHiGxJTRUE9g6FKNhdtYHrJSA\\nBzJIA4mO3ZqclpGWenJ6Zl5OUlm1uzE1Nuty8uwygZrW664UNNtpyGanCEjfmejX\\/pNab1hY\\nS2fW6\\/MXbTLMtCkp2FUvysuLly666lxLVOten6q56dqc3s1IkUS8rM1SdWFt0ynFxKJqNXWn\\nrywGGmEy6laMjPyuKuJEoX25bDq06i2LStOooS600\\/fVwMKmWmp2UeC9tR5cVC4krUWVy9Cl\\nppE2mP8A\\/c9pK8oHeTGJmOFyz1Bw6YfedoMtLSvzdRZKQmFI2tKw6tda1MMtusssszd01MTT\\ns0G2pidnbgm2Fyw6j2VeTfWcSSjOLsfzTuCcCpyOpnZ9ARV602QFJYoVLdQXn1TCE3bnZhrz\\nUpPbyjFSQ242KvxztXwxgRh9pp6WrddaukSzbmelyDw3CdfbJVNPtqB\\/YEpdzMlaH3Jc5Vx3\\nTpDaZON2n9dVTwdwJp9VsfBNU0TdteqC3Waxc8g++sLqV+1WVW6mnUqd1XFSFk06ampirvB5\\n+rTdUShEvRcjsG8F7NwStVFuWrLFyZmNjMV6vzaEGq1+oNNlHlM2tOeylmtZwSNOZPk0k244\\nEByYempqY+usTD60cMrZlLUsujS1GpEmAooZBXMzsyUoS7P1KcWVPz09MagLsy+taiEoabDb\\nLbbafrY6SqFWpMrR2cJYMpScOYOkHC43IoVnnqxNAICqrX5vMpc9POlCVpSta2pYBtpsqQy1\\nk4OxrjyuY4qjtQqs48+FqAQhZSlKW0qu22hluzTDLdyW5dpIbSVKWouOqW4U3Rm2rqyPtHwz\\nhnD1z6iuyGURlG4+P2CIdFqvqnxzwgrgew+6HCuB7D7obq4HsPujIbNhfkq\\/wghud4I6QYQh\\nxDeMuCG53gjp+3vhvDiG8EZEN4Iqrie0++KRkQ0g6kd1\\/Z+uG8MV\\/XV\\/jK95h+rie0++GC\\/r\\nq\\/xle8w+DcA8xeHYthFf1j6PcIWhFf1j6PcIcRvPh9oh4fm\\/2p\\/\\/AFhsrie0++EF\\/WPo9whw\\nv6x9HuEN1\\/WPo9wjIRvPh9ohKfrq9fxEWwkviOz4mFYSXxHZ8TDsOQ2WPO7Rn8PhDN\\/64\\/xR\\n7zD1fEdnxMMn\\/rj\\/ABR7zD6dw8B8IWjefD7RCMEEEPp+qOuMeL+sfV8BDd\\/8H\\/jfDvhm5zen\\n4Q8f\\/A\\/43\\/swzc5vT8IyEfVHr+JhxH1R6\\/iYThNzm9PwhSE3Ob0\\/CHEfWHr+BhUNX\\/qD\\/GHu\\nMMl8B2\\/Aw9f+oP8AGHuMMl8B2\\/Aw+nePEfGCEotX9U+j3iLotX9U+j3iFH6\\/rT9kep3jxHxh\\nuv6p9HvEN1\\/VPo94hwv6p9HvEIK4HsPujKRuPj9gh+Gy\\/qn0e8Q3X9U+j3iHKuB7D7obq4Hs\\nPujIRuPj9gj0aWPf8LH7Ybq4HsPuhurgew+6HCuB7D7oQhYNiDyN4cRuPj9ghvDeHEN4yN0L\\nggggjIgju7RTxCXhTpKYGYg7cy8rbeKFnzNWcByP3PTVZlqdcbO0yIbMxQZyoy+1IUGi6Vaq\\n8wmJ99uTSpGu0mYAKQmeaQtR3lKJhSWXVZ5Dds3XOPPzbso85KJ\\/Ojzf7mKeBGDOJBfW\\/NXv\\nhjY9zTzqiS4mq1W3qdN1dl1RKgXpaqOTTDxzILrS9Va0ZE6SqLclZylVNq4ckZpt1JTe+dh5\\nqYZsdySFNqOhBN72NiR0JsSmw4xiSjOEZXm5WbbQeS0PSk0q178ZUcQNxtpf4PlnMKzi7ybG\\nk9SmZLyuqWZadNxXpLyW3nHad+phcVIvKvTzKGUqIBs+lXLIzK3W1sMyk7MPrUzszMS\\/nq4d\\nTesKnJqO8FmabGfHMLadOWWQyyYHXn0x6lV\\/WjS8WcLL1w\\/rStlRsS7AuSzqs5sw+W6beVvT\\ntFn1bBa20uakrUnSloupCiAjWTnmPLGoMlPWvfNQtyqNmWqVPnKvb9TYOsAxP0x95mZaIWEK\\nzRNSLjQK0pOtu1Unh0Fi0InpJuabKlpclUrSsg3yNlMw2bkn66VrsN5Gax1AEOx9KKbmZd0p\\nAU5LuMqAsLrlXQpRtYG9nwLm90gAWAsO1VcT2n3wwX9dX+Mr3mH6uJ7T74YL+ur\\/ABle8xVa\\nN58PtEVurcjw+wRm1yamJxwg0+dFO+FTS5KWRjHbNp1OcRnlLUTEdb2HNdfe1SFGWao11z65\\nlKNZwywdDbTqvol+k5HlIUuqT1Eq1OrNLmXJKp0ioydUps2yrJ2Vn6fMNzcpMtHmcYmGW3Ud\\nCkDmEepphpe8hiXhzYGI9LRs6Zf9lWre1OQXAstSF1UKn12TRtEKKXcmJ5rz0EpVq7uIMdS7\\nBZ\\/NIV+lkkdhNyc+2k7j52wuXdI13jzJm4sNFJIuN06wg9duclydxZeSP7dKkOEDcLZGx6xy\\nj7uCCCOgImcEEEEEEYR8o7iGrC\\/QV0prsbdRLzP6kFzWrJTKwSJepYgstYf015sJIV5SzPXP\\nLOS20zZ8pS1tkLaC0nzuxvAPTE2jl9b8ctPQNdtlqaLa8UMYcPrOflkvbNcxIUluu4iOqdZB\\n135WXn7IpindcFluackXCoPbHaQlk8B2D3Rxt5Q9Q84xZS5BKrop9FbWpOa+SYnJqYccBSNE\\nqLDUqon84FPBIis8Yu56m01wYlEAj+M4tbhPgUFv2d8OE8B2D3Quk5pHZl6t0IJ4DsHuhdH1\\nR6feYoCIXHfGjNaKL80gsF7UdZL8pVsSLQRUmRq+dSJKsytQrO5Z1SBS5ScPHgPqLz1Ime2o\\nwJq4KY2pJIQ8qZUcvwpZp19s\\/wAdoekADfkDFf5Lq1vui0s7YqqmNuzZFp3pdTwUjXQhL1LF\\npS7yh9UFqbuuXWypeRQ+EKQQ+WjEr\\/DdhL1YmphI1kS0i4nIg+Y8+80EZE9KEPjduyO\\/jv4d\\n23j8KPKI2UYUA7aXpiKVUJloArSC5V5mp1BpSL2AVTKPLKcNvqK10TeOzPJ8kvMcBYlq6k5X\\nKjVXZZtdrZmpOSlm2VBWtwmZnplIHBSTci5A1+ctliGqwuT1xWkmnSzP4kXBYOHdPcSrV1fL\\n7pkrkq7e4nW8qty163KLH4sxnwSUxCGw6kTP3pQmiAUMTSp5RO8J8gZcm21cM89qy2lPMFlJ\\n4ZqiUt8o+xCXIYWaM+Fbcw2UXRiBet\\/zcoF5uoXYduU63Ke+6ji224jEiqNMrc1Q8pt\\/YhRZ\\nf1Iy2CUoH7hqc8pAKZKllpJO8penJlrVUN3HZMTCePBREfQmjI8wwhNTA3vibWFag51lMmjS\\n\\/BSEgWA14Ximtrk\\/22JJxANxIU+UlE7rAutqm9Lb9ZwXJ1uLHcIydhVHA9vwEJQqjge34CIK\\nfqepP2RSEPWPqH\\/GPuEOm+f0fGGjHBXaPdDtvn9Hxhhf1T6viICLewH2i8KQo3z+j4wnCiOf\\n0fGGevbBDxj8P\\/i\\/+1DiGzHFXYPfDmGV\\/WPq+Ahlf1j6vgIIWY+uf8U+8QjCrP1+0H4GMdf1\\nj6vgI9v+TPcbe8H7YfI4ns+IhdH1h6fcYbo+sPT7jC6frDt9+73GMdY9LxF\\/s+yEQvFyPrD0\\n+4xbFyfrDxx3Qg7j4GPCNFd4Pwt9kOE\\/WEOEfWHp9xhsniO0e+HCeI7R74YhKNx8fsELxcj6\\n6f8AGT7xFsVTxHaPfGPHjnD19e+OQG4g9BELw3hxDbnD1\\/ZDcHCHEN4+ptW0rtvqtSlt2VbN\\nwXfcNQWEydCtmj1GvVicK3G2xsKZSmJqbe+ldbQC0yfPdyy35FCGHZhxDTLbjrq1ZW2mkKcc\\ncUqwCUISCpSidAACSYbbzE5UpKiogJSASSomwAABJJvoACTbQRw0OI2wYHcjjpTYnJk6liCL\\newQt59DLqjdb\\/wA+3cuXeBCXJa0KC85snm9TN2TuCuW3Nt6wOyG4xtaww5LHQowM8kqGJc5U\\n8YrolUpdW3edRLNETNBAbK5Ww7ZLCXZVeZ1ZO5pu5GNd4uF4lDWxn8vsvxC1T1VvE0xR8C4f\\nayqfrWNKnLUCUaQRmUS3NrTMpWEAqQl5llDhsA4kZlImFIwHieuuttylMeb7QXSX0OBxQ01T\\nLNocmlA6ZVBjIq4OYAgxGKw\\/wtxIxXq6KBhnYl2X3WFFAXIWnQKnXHmEL1iHpv5vlXkSMqlI\\nWp2anFsSrLTbrrzzbbZI2g4O8jNpPX4ZOdxIqVn4M0Z9pp51qrTqLxuxtt7LZ7O37amTSNqG\\ns1vMVG7KZNtO7NlxkPB7yaQNLYn2dYtIatnCqwqFbdBktcSUhTaVTrcocqdRLaFytAoTEvLI\\nSoNt5\\/TSjmqhvNOeWz+CrWJN510rRNVmYl5dw75SnASDASU7m1eThD8wgqOZEy68So55ZbOK\\nzxBtl8mbARcZNaxNterLOZBk8LypoOGA8CDkfrM+4zMvsgAJE7R11BteYqS0PSDV44c8nGfm\\nOzerUz2KDlUptxYYGU2zDsGC9MKIJ0Dj8kq29IJEYz4dclRoV4OoamsT6rXMWq8zquKYuqtu\\n0mkMvMEnOUtGznJGddaWQEuS1bqdelnlnUW3lk3GaFCvTCnC2mKt3B3DG3rVpOsj9Z2\\/QqPa\\nNIdW3rasw9J0eUbcnFnXczcm0szLilOrWsq1lOdIaxVkSMyfrKz49HZlwyAyEU10dfr\\/AKsU\\nriDy4MdJQ9J7McJYO2WyLiVoTN06ms17EpbWMpTMVqrsGUeNgFJWKOh5BAyu+ikC9aBsbwjQ\\nwkiV85dSAFKShMslVtPTU0VTa76g9rOOAgkEG5v2bWcXL2q5UhFRRSmVZgtUpkMKTnqgZTLi\\nn50L1RxbmEA8dTcMuu5mbmptwvzkw\\/NvqzKnZl5x91f+M46pSyczmNdeXXxzba6Ov1\\/1YNdH\\nX6\\/6scvYs2kY6x3M+dYyxhiLEroUVoTWKrOTsuwSRpKSjrqpWTQODcqy00DmKUC4iyZKlU+n\\nIySEhLSibAEsMIbUrvWtKQtw961KVzJisEU10dfr\\/qwa6Ov1\\/wBWIb2veerdeo89c6x5H2GK\\nwRTXR1+v+rBro6\\/X\\/Vg7XvPVuvUeepY8j7DFYIpro6\\/X\\/Vg10dfr\\/qwdr3nq3XqPPUseR9hi\\nsYcaY2JdGw7sCs3FcCyaDYlq3NiRcDaXEtuKkLbpM\\/MoS0pxaEbdyXlKo2wFnVU6pKe3MbXR\\n1+v+rEdnl2saGbJ0X74pEnM6lZxbvC3cLKZs33UvMUWnOuXFc0ywhGQXKzMjbUxSZwuZtatx\\nJRkVON5zvZjht3G20DCOE2+1tXa9Tae+pvRTMm9MNifmb6ECVkRMzKiDmCWVEAmwOFVaomg0\\nas1xdgaVTJuaZCx6K5vsi3JtG4I\\/KzK20C4IBIJFoia2DY+MGk9idf1zWvPM\\/dnUJmu3\\/ctb\\nnqtN0hDk\\/cNZXMzTTVSZbmHUz1Snqg+qVadLbS2WJhTswhDRCslZSwuUmw1Kha1+YxMyTQUC\\nm08bZp6QdSgTmQND+65l2Y1UrmHmA5SiG3JkbMonFltORnJ12Ibdwlrl8TDOpO3\\/AHAtEq4t\\nGqVUK2A\\/TZNSFKAUoKrD9e1iklopQzu1wonYBH1nx1tRdp2I6jh6Tw\\/harUKjqZpjEtV6UJ0\\nJXKMNNTLTdnm0NtszCXZdtsIUhKGk+iSSI+ac7jSsU6rTfmEwUdm7kU8HZhEwt6w7dSnmX2l\\nlRcUtNyVEnU3uQdT8npjcqdhrrNztw4qTUk1rF9dyYVUC7pJWzVNrUlVcn7Nqj6Mj5Q7lLVZ\\nlSpdqXUtS5RpgBld+nbygOkvT28GJSfn6ZMTu3TXWbBtdVj1yqSDynJZTVy15LrRo9EQUvS0\\nwGJihU+bOtL1Nc8tKGY22wRCEYwwMmYaqf4mdnbdblViYkqlLUeQluwnEizcy8y1T+0mVNqs\\ntGaaQ4haULbdbcQlY2v44caGTdkl1msrl3mVMqYXXKkqW7NWpQqXW8sdmrULQhaAtJUkqyqU\\nDrrwJ0DrZstcldOLT8ne10JUiZYt5oLdtSlPlKVgzgfQh25JxpeesqaaapSVqUnyKbWhqbOw\\nDZttNIaaQltttKG220JCEIQhICUISkBKEJSAkJSAEgJCd0OXlaysuZO7088Nlnfl6T2+PfEZ\\nr2Ja3iic8\\/rU87Nu+kGWtES0q2og9lKy6LNsosBfKM7hGZ1bi7qitZyemp93tZp1TitcqdyG\\nwfzW0D0UjnYXNrqJOsIr+qev9PwhGFHDwHp7vjCcacXCD3\\/A2EYqfrDx+GsJu\\/savR7SIZw6\\nfPmgdJ90NY9Ru8T932Q9ff3G3uB+2LVHJJ7MvXuhBXA9h90LLPm9py+PwhBf1T1\\/p+EZLXD+\\n2H2R7CJ3AnohvC6uB7PfuhurgewxlQAXIHM2hCG8Lq4HsMIcIBqQOcZEN4IIIyIbb4+r7Ybw\\nxX9dX+Mr3mH0MCcyT0mMiHIpCK\\/rH0e4QtCCuJ7T74WjefD7RDwGiT\\/Ft7bfKEFfWPjhuhuv\\n6x9HuELq4ntPvhuo5qPbl6t0ZCN58PtEJT9ZXr+IikJL4js+JhWEV\\/WPo9wh2HIQX9bsH2\\/G\\nGT\\/1x\\/ij3mHi\\/rH0e4Qye+v2AfEw+ncPAfCFo3nw+0QlBBBD6RZI8L+3WPF\\/WPq+Ahu\\/+B\\/x\\nv\\/Zhm5zen4Q7f4p7D74aL5vT8IyEfVHr+JhxH1R6\\/iYThNzm9PwhSE3Ob0\\/CHEfWHr+BhUNX\\n\\/qD\\/ABh7jDJfAdvwMPH+Ce0+6Ga+A7fgYfTvHiPjBCUWr+qfR7xF0Wr+qfR7xCj9f1p+yPU7\\nx4j4w3X9U+j3iG6\\/qn0e8Q4X9U+j3iG6\\/qn0e8RlI3Hx+wQ\\/Ddf1T6PeIbr+qfR7xDhf1T6P\\neIbr+qfR7xGQjcfH7BHqd48R8YQVwPYfdDc7gT0Aw4VwPYfdDdXA9h90ODUjxEOI3Hx+wQhD\\neFycgT0DOEIyBqR4iFwQQRQnIE9Ah+CGETKeSBvr7tdBjDiReddmJ\\/D+vXvYk8645rk+R3JO\\n3HSWxqnNpEpb1z0iTbbWQQ3LI1RqqSYhrRJk5Aq+VTmHWkJhq482lNu3rZ99SbKnvpHfuzod\\nQoNRdZlid6JcWFS0zDrOYSZiVbmCjWl9fCqLQck3NbFC2ljfcnPksLEcFk6m1geNotTZLPea\\nYyl2SdKjIT0mQdxKENzwueH9BGxFjrlv6RiTbac2XqDIBXnFkOMK3nMbJxYRvOtl9Ds889xO\\nW8DIR5t3KU2AvB3lG9Km2fJlyMunHe472k5Qy5lEy9GxLnGMSaWxLtbgmSTR7ulESCkgJekt\\ng6j6NYj0dLMmcpKaYIBDU0HRvyIDzaRq7hw12ScsyCd2XTBw+UY4efchygcteDLZEvizgjh9\\ndrzwJyNUoE5ceHczLrJSMnWabZtHeUEa7YanJfztcuIat6jzYqOGqWhbmZSJNpld0m5LLZlH\\nd+\\/MUZlG5143MTDaXIANLdCR+SqSidRYNTTS1buAzloW0JB3GwjVmrie0++GC\\/rq\\/wAZXvMV\\npswZunyU0TmZiUl3lHeTrOtJWrPMkkhRIV1kADotVxPaffEDCSha0neglJ8QSD7xFDL0sOI0\\nPiAIbq4ntPvj0V+SKxHVifycuivXHJlD03QbBfw5mkCYEw7KDCy5K3h3TpaYBzWwv5mtmnTL\\nMuvV1JOZlVtJMu6y4vzqFcT2n3xNq+ThYgi5NC3ESxJmYWuew3x5uNMqz9EUS9u3datpVmn6\\nuoovhTtfbupaw6wlBzGxmHvpmpa8Nhs72GKpmUUbJn6O+hI5vS70vMI17mkTHcb+oyjCruSo\\n9nfR6WcRa\\/5ySh0HvIShQHcTEhWCCCOs4sWCCCCCCIvfykS+A3R9FfDZl8qM9UsT74qjAdWN\\niKZK2fQaC8tko1HduatciG3NcLl\\/J3E6mUwMosSeA7B7o3v\\/AChW9vn\\/AEy7Fs+Xd1pawcCr\\naYmmjrfR1q5LrvGtzakjaqbDblGct3fs2ntdLhdLzRly1ofR9Uen3mOBdsM6Z7aFiFwKzIl3\\n5WRbFrBPmchKsOpB3n8uh1RJJN1bwLAU\\/iF3tq1PLv8AVdDI4gdi22yfe2SRzJhwj6o9PvMO\\nEfVHp95huj6o9PvMLo4Ht+AisY0BFyruJPvt9sbo+R0tfyi68bL0Ukf7kW3adrsOL1wpf3R1\\nSq1WaQydXZEM\\/cvJmYGuFpD7Hm+csokm4VSwTJ1abJP00xLSwI\\/BEs2p05ZcczNJ3jPMjqzj\\nRpyRNtCnYC31c7iVImLkxQnJRpWSgHabb9uUBEq4M16isqhU6u0dVoZbI6y1g6rO+\\/DWWS1a\\nsu4E75uanZhXDzih4yoIOW4ZSqeBPnDPPmHEuHkjE\\/lg4mnrhbeF6TNlkG5DQkqLTMOPBNtD\\nebqkyohW4uGxBAMd5bPJb6J2O4cZIsuoqem3SPzzOVGbnWSbjS0s2ynT9HXviB\\/KIb8RXtLn\\nDKxJaaD0tYGB9JmZxgPJWiTrt33ddE9NsllIzaedoVMtmZUt1ebrTrH0SUNoW9qYwNk9Sj1u\\noZHOaqLEpnu3iRltqMhxyBnyM+GeYG9Koya5Yi+Pu95RjSPnGXSuRt2tWpY0i2XS6mWNmWJb\\nNAqraFFpnVDtwSdZmy0EkMuzK29o\\/q+UOdH4Tynktk01RSErnHZ2cXuyJ15t1lsk85LMu0Qe\\nghPNH0JrX7DwrJy9yC8JNCkk63I86WNOCVt94BtqSbnkTHc553Wq4+CCl2qvtNkXspth5TTS\\ntdbFtlB4ancN0dkQqjgR1+PdCUKI5\\/R49sV4Tdv1Aew2iv4eMfh\\/8X\\/2oeI5\\/R49sMmPrKHV\\n7iO+HiOPo7oZV9U9cYIVi9HEjq8e+LIvR9btH2\\/CGT7d3x+zfBDtj65\\/xT7xDqGbRycT15j2\\nH45Q8hlf1j3\\/AKvshlf1j3\\/q+yCFGv2RPp\\/\\/ACTCcXIOSknrEMLGviOvshSfqq9fwEcgn6w8\\ncd0LjcQegiGwORB6DnDiGF7weutYbhxFU8R2j3xQbwD0wQ3BDgbiD0Q44Q34wuOA7BGPDaDv\\nHr+f2Q5g8ePXFAcwD1e3nisY+6Be4HrrSH4OYB6QD6xDhPAdnu3Q0aOaB1Zj1Q5Rw7D9vxhC\\nxpfkfd1aG4vjbXyTWNNYw+xPvmxqdU3Ke5edvylakEKDS5ebqFpzDxmKe4y6laXlTlLqs3OL\\n1kkIaoq1trbd1QrUpHb2A+IbmFWL+Hl\\/JeWzLW9c8g7Vlt6yVuUCeUqmXFLpKd+s\\/Qp6osJy\\nCgFO8FDdEVxhK1ibwxW28O1Ko0jEDUi7N0KpUmcmKfUZSryNpynOSs7KONTEutc2w0ytbSwV\\nNOOIOZK1JVKcBVqXw7jKgVWbbadkZepMtVBt9CXWlUyczSVQztuAtryycw6tIWCA4lB0IzCY\\nRWMVb0uJnVeqqpGWWgIclqSkyDSjkrXK3G1GaUFgJCm3JlTWrknUyzj4MuqJUVjMkgkqVrEk\\n\\/WUpW8FRzzO\\/n3Dmj41+5JambBLja5piaa8pbflnGl\\/RkjVKM1hDiFJO0bUHEgjIjdxSXftr\\nsuoYm5\\/yF1xG0Smal3wgpKinPaJQ5LpIIPF3MZjI7jl8467j7GmP5hmq4wxPX8U1Mt2D9bqM\\n3UnWQCAtuXTMrdEsyFJKgywG2kbggCwj6gS1Kk6e2W5CSl5Vg6hMsyhtKgbWUrIAVq1Hpquo\\n77mPtdqroV\\/FEG1V0K\\/iiOJk61SKiQKfUadOqKdYplZuXmV6u856jSytOWRBzGYIIOWRh\\/mO\\nge3viPqfWggKWUnkr0T+bzHj7fC7+X+L7vuhfaq6FfxRBtVdCv4ohDMdA9vfBmOge3vhHnJ\\/\\nrqeH5w7u7x9\\/IXMn8X\\/y\\/dC+1V0K\\/iiDaq6FfxRCGY6B7e+DMdA9vfB5yf66nh+cO7u8ffyF\\nzJ\\/F\\/wDL90L7VXQr+KINqroV\\/FEIZjoHt74Mx0D298HnJ\\/rqeH5w7u7x9\\/IXMn8X\\/wAv3Qvt\\nVdCv4og2quhX8UQhmOge3vgzHQPb3wecn+up4fnDu7vH38hcyfxf\\/L90L7VXQr+KINqroV\\/F\\nEIZjoHt74Mx0D298HnJ\\/rqeH5w7u7x9\\/IXMn8X\\/y\\/dCVTqCZCnTs6oHKVlpiYOY4ltpSkIz6\\nFKyb6MuoZRCX5fTFB+5seMGsDqTMOzybIsmbu2py7K9Zbl14lVoyMtIzLYSjaTstRbUpk7LK\\nIUlEvcikoUlbz6Img3u5nQ3ZYLU35a+y0dQZq1EK26yOHmnYhC+G5Yy3xAaxbr7elDyquJNy\\npd+dLbo2LdWakppGapN61cFZVu2Lbm2mwNVEjWnLUpD6kKQ35QurLdmUF594R2f5EVLZmNpV\\nfxvOJ7SS2eYNrNaSspugVGeaFLlGrkWC36e9WS36WbOyAkFRzJp7blWk0fAypUKyuVWeR2qL\\n2K5KmNKnnONyRNIk02sQc+pCsoOxfDKzmMPsPLLsmXCdW2bbpVJeWnLJ+dlpRsVCbOR1dacn\\njMTS9XJOu8rVATlH3MEEXlMPOzUzMTb6i5MTT7sw84d63X1qcdWe9S1KUfGPnEtanFrcWcy1\\nqUtR5qWSVHxJJ9sEJuL1E7uJ4fE+iKrWEDfvJ4Dp7hDRSio5n0DohCU31O74wmLeEIE5knpi\\n5as9w4c56fshFZyGXOfd4+MPgXIHOCE1HMk+rsikEUUQkEngB4HphauCR3fdfrlDiBvPqHXX\\nGGzys1ZcyR7Tx+EIxUnMk9JJ9cUhYFgByEOQms8B6fHthuvgB48b4VUcyT6uyEFHNR6t3q+2\\nMpsbu4X165mCEl8O0\\/b8IQX9U9f6fhCqzvy6B7T9kIL4gePG6H4UkXUPb7IRX9U9f6fhCCuB\\n7PfuhVZ4D0+PbCC+AHX498ep+sPH4aw6o2BMJRRXA9nv3RWLF8O0\\/b8IyE7x4j4wlG71\\/KEV\\nHIE9AJ9QhhDx05IPXkPXDOH4cGpA5kQQ34wuTkCeqG6uB7PfuhxA0J77ez9cPwhxhBXE9p98\\nLE5AnoGcIRkIG8+qG0DefVBCKvrGFobk5knpOcOQ5CCvrHt9273CGTv7Ir0e4Q8O8k9MMVnN\\nSj+6Pqz3Q+NAByAhaN58PtEWwQQRkJ3DwHwhKjcnxhq\\/9fsSPeTDRfEdnxMOXTm4rqyHsHxz\\nhsv63YPt+MZCdw8B8IeTuHgPhFkJLO8Dqz9f6IVhJfEdnxMOI3+Aj2Gj\\/wCB\\/wAb\\/wBmGi+A\\nHX498OXz5wH7nP1k90NXOb0\\/CH0\\/WEEJxYvgO34GL4Tc5vT49sK\\/qnXAQpP1hCC+A7fgYQX9\\nU+j3iF18AOvx74bucPT3xko3eJh6EF\\/VPo94huv6p9HvELr4en4GG6+A7fgYyEbj4\\/YIIQX9\\nU+j3iEFcD2H3Quv6p6\\/0\\/CG6\\/qn0e8Q4nePEfGHUbj4\\/YIQVwPYfdCELK+qfHHdCMZCd48R8\\nYXBFFbkqPUfdFYsWckK\\/xSPXuh+AakDnDFXA9h90bquQlvT5k0p8QLNfmCiUvbByrOyzA2Z8\\nqrlsXPbFQkwdYhRDVGm7kdGyJJJ3o1CXGtKizklR6jGfXJY3kiyNPPR+n3nAmUrder9mTKFu\\nNNpfVedn3DbdNQVvAnza1UabMoQ0UuvOsol0621CFqyZ23U6+mgpABAuqxsDfS1yL3sCOMSj\\nCU4JHFNAmCoJSmqSjayb+i3MPIl3FG1zo26vgeIsd0Tp7TmA3NTTZ3ByXSvIkDNTTgSMh0\\/S\\nKz9HSBEWn5T\\/AGIg\\/wBiNipLMqCv\\/ps4fVl9Rl8ilJsq47aZQAlMwpQJutbmst1gAtBtMusu\\nGalFURwM1BokjJxLiFdO9tR3n8Lz0p48M92\\/IRpF+UaWS3dWgRQ7paYKprDXHmwrgXMpGS2a\\nXW6HeFlzbK\\/MWlTD9RuOjLUNdol6Vl1bcJSWX5VhacCZVqUU4myXnWwg2SSFWdTYkkn8oskC\\n5JItvsY6F2gSnb0upKy\\/9XYmAbXsZd5tSvC7bRSo2GiuIuRDUsuZ8pt2R35qYL8urq2b6ygb\\n89+yUjj5vsRHNq4ntPvj4jDiY1qZPyxOewnQ7lvzCX2EJGW8ZDWYWR1lXbH20Ys8js56bRaw\\n7ZSx\\/wDyflPgoeq3ieYZkWdUNfrKPqNiLd2vj6rQgrie0++JR\\/yZK\\/jLXtpZYXOupPz1bOGV\\n\\/wBPYJZDjRteq3Xb9aebCil5xEwLwoTb2aHWmTLMZFhx7KYi3xvC+T0Xyq1OUKlaBtihOJmD\\nGJdnbLIlL7tNXb+IiPN2LoS40ixXVpc15chIdaL+q6qWmJ1symzJY3w+4CQHJtUmqxtmE7Lv\\nygBGoIzPJVY\\/nJTaxAI2lFc7GqSKr73ktX\\/uwLPv7S0TvoIII7ci1YIIIIIIgG8sTeP3Z8ox\\npGTKHFLk7fqlm2bJNnzth9y2Hdp0uptJJaaOqqusVWZAyXqB4NB55tIdOs9H1ez9PxjIvTFu\\n5N+6Wuk3eKFpXK3Bj5izUpHVUlSU0t2+a4mlNB0NtbVLNMRKMh7ZIU9s9qveoxjmjgR1+PdH\\nzcxbN+f4lxFO5lKE1XKpMIKt\\/Zuzrym08bBLZSlKQbJSAAABaKQnHe2nJt64PazL7hI3flHV\\nL07vSuO6HCOB7fgIXRwI8eN0N2+f0fGF0cSOrx74jUYCvrH1fARKg5Om3UW7ohYV\\/R7OZrib\\npuKbJSlO2cql3VwyTpyQFKPzQzTW9ZwrUQ1x1NRCNzVnywlrWoTZQATTJV47iDrzTYmllWZO\\n\\/WeOXSTkOAB1qaNtBFsaP+CVADRaep+FdhtzTaQvVNQetmnP1FeoSVaz0+7MOlA3BTnTGxHE\\nu6G8NMJr\\/vfNpDeH+HV1XUS4Apptu07an6sSsKASpCUyO8KzTkPXxv5MTCsQ7VttOKbpUXak\\n4w0pSbns69iGqzraAvcEpbpTScoNsqW+CRb6FzTaaPgjB1PX6CJKhyAdy3AvI0uVQ6sjS6ip\\nalkkAlRJOpjzbdKS+FYl6S+kJiHtErbvfGzFK6ZctrUthEpXL3rdRk2Zcqfmj5NLyr7LMoDM\\nzGow2hKXnEjXjvS0ZQSNs0CUyyUzR6cHBu3vKlW1vnd0vLWefj9ZXGMG2EOTs4y0VKW9NzLT\\nZWola1uvuJRrqKiCpRUvMknIn6xjYAyhLaUNoSEoQhKEJB3JQkAJA4k5AAbznlluyjvTGqwh\\niny6dE3fXbgA0lpCBr3LUBxFo4JrLqnlZ1m63nHnlniVqIUTbhcqV3crwvF6OPaIsi5P1h44\\n7or9IuhQ7z8BGgh2yclgdII+Pwh6n6w8cd0ceg5KSesQ+G4g9ENnUEc4LaX7yPZb5w4iqTko\\nduXr3RSCMeCHSDkpJ6xD6OP4w\\/BzAPSAfWIbXwPXWsNucPX174rBBBGO5w9f2QIOpHr664Q\\/\\nBzAPSAfXDgbwOwQ0aOaB1bvVDlB83sOXx+MMLGgPL7Yb3Q5T9UeOG6LoTQdxHXn6\\/wBEKQ1B\\nCyfqjxzwujh2H7fjDZB4j0+PZC6DvI6s\\/V+mGFCxI65w2LBZHPd67H7odo+r2fp+MXQkg7yO\\nnf6vHshWGFj0j369euFL1Se7r5w5YO5Q6CD68+6HSDvI6eHo8GGDRyWOg7vXw9uUPUnIgwhQ\\nuCIZheL0HI5dI+33ZxZANxB6IxyLgjnDatFA9ab\\/AHWjDbG1rSewer7OImjDijjJbFOqjqjc\\ntl4dXfdsrJSdRCS986M2rS5406oUmoai3J6SckJlmUqiWppLS0ToEn8\\/aHLHafuHk4xIXnd1\\nBxFFNSGRSMU8PqbLzrbIXrBqaqFqNWTccy5rlZExUqlNzQK1IU6ttLaE548Y4ytW7b1zynkV\\nx0GjV+TKVJVKVqmSVTl8lABWTE6w+2NYDzjkCc9wyJzljNZwTVJGXkMdbNMKYwLCOxRV52m0\\n\\/wCmks7kDz52RemVONN\\/kkutTMs6psJC3FKBWqwsP7RsSYfZZYk6pU2W2QEoMpUZmXGRKgpK\\nXGApTDwTYAJWkBVgVXOp+XtPl4p6dfk\\/1UdH+WDrTTbb9Yw+vR6WCSguOKclLduKlzKworcC\\nkIVdiCgJy1irJRzSsbls8Aa3Myq5XFDE3C5QlmWxTL7t2o1GQE1tHi4Ei3Xb3oiEaimwJibV\\nKoUkJ19VSNmnWtdGh3gLdO0dRaj9szbgIVNWtVJqmJ3g5FumvqnaK0UKUSktUtGZzSvXbSlI\\nxxujk8Uq13bJxGUnLX2chdNICtxzKNer0l1OXMlQFFOeZWnL6h1Mxsj8l3EgAFIruDHlJUnK\\nxNTUzK5178rM\\/wDhJJobBFgAzLIynRLZ1FrUjyisTSuRE1PsTiU2HZ1amNKGnAv00y76rk\\/t\\njjpUdLkDSJTFhcp9SLrm5KXtDEzBvE1E22yUyUtWKa3cS3FqUdiadSqrITknMlOr9BNUQrTm\\nDsDnGSdN5Qa1JeaRJXfYFfp5CEKcm7dqNPraSVHcoSdRFBU0gbyR5W+obsis8IIl06GmPlsh\\na2bWlLolW9bWmrWq8nPfV4alPnVU6sua4BKdlTV8AF6iyhCvi5TETSLwfmESiLqxXsNSFIQi\\nl1GeuSmSSyjMtg0iqFFOf1UhRazlFgIKwg6i1gRuc8iXZxiAKXhTGVLnSUEIlnEBmZSbiynX\\n6RPhIITfMhyj8cwTY2Fn0ryhZWZCUz1ElniR6T1KqSbg2G6UmG1FJJG9U2LDQgnU+i\\/aGmHo\\n+3lUZajSt8s0OtTjjbcvTLokZygKU695jLIqc0yqhKeeVk20wiruOuPKDKUlSkpVk1rjoPs7\\n4gG6DukDpGaReOtr4JTskcT6jddNrfkMxK0ilUus0r7nqHUK15dOTlPapdKXTlNSIkZqaqzb\\nSkvTEo85UdoHG5ubVovSuI1JwYta3sVaZP0677ZVUbefRUZiUm5iYplNnnUUJ4TkhNzkvNtt\\nUpcpJtTbTzofTJB9SlqJeXxL5QWw1nYtUZGnO16SmqhMsy80ulioS01MmQnFTjUvUZVAl5Gd\\n8zEzT5mUdEzJhxLqUFLjiVXN34UxRTsXUxdVpbc00w3NOSbrc20lp1uYabYdUkht15pQLcw0\\ntKm3ViyrKyqQpIyI1x0H2d8GuOg+zvhKCObsyeY6\\/X8eRiTQrrjoPs74NcdB9nfCUEGZPMdf\\nr+PIwQrrjoPs74NcdB9nfCUEGZPMdfr+PIwRjppU4jt4S4I4r4puPtMowywuv2+kJfSFIfnL\\nft2fqlPlQClYW5OTcgxKMM6iy6\\/MJaCFFWquDXycNsv1G4sT8SqiXJiZblafbctPTJU69Mzd\\nanHK3XXVOLBUXgadSVuua2s55XkSczryguXZxEVh7yfmJUo3NBibxTuvD7DClrQpxDuU1XWr\\nwq7CSnzVCbt2zK\\/LPJOadhMLBzjQtoN2mm19Hy3ZtxtLU3d9UrV0zQP11Ifm\\/mmQUs5AlLlK\\no8i+2kEgJez3KK0x9H\\/JVkBRNgO0HEygG5rHOOKdhWXUlIC3KbhqQaqK3EKG9px+oVOUXyUl\\nQJ1Rbjvyn6zaZpdHQu6ZWnIUU3PoP1KZW88nLbeZaQl7m5BS4lOlrHMkvIHDM9g78oSU8o7k\\njV6+J7h7e2G+skc\\/x90WlfQPXE5CEjv8Y47hQnnJ7Se+ElLz3D1+PHxtKiePq5oTKwOG8+z7\\nYUAToBBFVKAHXzDxzQiTnvMBOe8wceuHNEDmT17PjCkpue7ifs8YPHj2w2eXmdUcBx7ej0Qq\\n45qDIfWPDq6\\/shnxgSCTmPq+fy\\/VDthuA0H6\\/X484ItUch1ncPHjflF0IqOZ6hw74eSLnuGp\\n664x7FhOQJhCL1nM5dHHt+yEVnIZDiePZ43RloFhfifhBCZOZJ6TDdRzJMKrOQPXuhuo5An0\\nDthcOIHH1Qko5kn1ePbCKzmcugfb7soVO4E9EN+MOIG8+qPVnQDn90EJLO8DoGfr\\/RCsIE5k\\nnph9A1vyHv6vCgLADlDZ8\\/VT6fhwhvCjqtZZ6BuHo+3P7YTh2FoFz4axav6p6\\/0\\/CGy+Haft\\n+ELLO8Do3+vx7YbuHeB0cfT4B54eSLAd+vt+6HFaBXf9th98JK+qfHPCMKLPAenx7YTh9AsP\\nE3jxAsPE3ih3A9hhudwPYYWWfN7Tl8fhDdfDtP2\\/CHBvHiPjC4RJyBPQCfVDCHjpyQrr3euG\\ncPgXIHM2hxGgJ60\\/XBBBFFHIE9AJ9QjIHIeFh8Ibhks5qUf3R98NlHNR7cvVuhfhDeHwLW7h\\nb4fKHwLADkLQQir6x8cN0LQ3O8k9MOI3k93Xwj2GbpzWerIeqGy\\/rdg+34wus5qUesw3V9Y+\\nOG6MhG8+H2iDr2RbCSzvA6s\\/X+iFYRX9Y9X6fjHqTdaj3fIQtG8+H2iEV8QPHjdDdfADx43w\\nuv63YPt+MN18R2fExlp3Dw+OsOwg5zen4Q3XwA8eN8Lr4js+JhuviB1ePdD6RZI8L+3WCEV8\\nB2\\/Aw3Xw7T3wu5zen4Q3XwA8eN8LT9YePw1h1A9HxN\\/ePlf5Qiv6p6++EYVXwA6\\/HvhKMhO8\\neMLghN39jV6PaRCkIv8A1O1Q9xMPx6nePEfGGTn1FdnvMdr6PV3Kw\\/x7wSvoOqaFn4t4c3M6\\noa\\/7DRLvpFSmG1BOaltuMyziHWxmHWlrbUlSVap6mePmHrIHx+EN1koBWg6pGWqUnIg5jJST\\n0jqyh9kgEXFxmFwdxGmhh9t1bMwy82SFsuNuIPJbawtJ9RAPiI9J2WUlEww5lkEutZjdmQCN\\nbgOjLxwwC5X60Rf3JtaV1EaGu7T7EpN6JBTmUIw6va1r+fUkqcYyyl7aeSpW0P0Sl5MzCf1u\\n9mDhZdJvrDLDm91KCzeViWhdalhCU65uG36dWCvVEvJBGuZzMASkoE5nKXYH0KOC0mbWGIWj\\ndpBWC0kOuXxgfivaCGcwC4u5bCr1GS2AXGD55nUt5bZk+cc3U7lhTcyabNymZTOUzLZIUrKC\\nW3W75TmSLWO8XsNbbo7ErDSKjSZnJnKZumzIQQLqyvyxyG2vpWWLC+\\/TkY80DDh8pnKpLg\\/s\\nsm2+U9PkzpRn6PKecHjHaB3AnojpWx39lcDKP\\/rmXmmOrc0XxnuO7Ngc435b+Y90q4HsMSat\\nIyz5P9dbaX7B2f8A\\/wA45Gmx+XA\\/SCT7fR+CRCEbBOSbvZdg8o1ok11t0Mqn8UpeyVKUEkFv\\nEqh1nDp5nJQI1n2rpWwPNBzcBRksb9fSuB7D7o7V0ervdw9x\\/wADb+l3VMP2PjBhpeDDydoV\\ntO2zetFrLbqQ0lTpUhciFjZJUvMeagqOZyaBMGTrVInBqZWq0+YA3ay82y7v4Xy+qFS7nYvs\\nu3KeyebcuN4yLSq47xa8epZBBBH0Ai44I4atVSVoVHqtbnSsSVHps9VJsthJc8jp8s5NzBbS\\ntSEqWGmXNQKWhIUBwSSY5mMb9L6402jonaTt0F8S66Bo\\/wCMdWYdzlwozMlh7cUxKNtJmymW\\ndmX5pDLMsy7rIfmHWmQFbQA482+mWlZmZWQlEuw8+sncEtNqcUTv0ASb6GGnnOyZdd39m045\\nb+0SVfZHm71aqzddrFWrU+QqerNSnqrOLBdUlU3UZp2bfIU668+oF15f7I866R+yuuK3wzbO\\n8jpHu\\/TDVH1u39Pwhwk+cPHEZR8yHlqdU44slS1qK1KOpUonMok8So3J7zFGHX3e43hyj63a\\nPt+EclTZOYqVQkqbKpCpmozjEjLoIXkp+aeQwyMm0LcILjiRk22tfMlC844tP1h2+\\/dHcej9\\nRBceO+C9BUkKaq+KtgSEzm3tQiVmbrpSJtxbWu1tG25ZTrriNq3rISQFiNTU5xNOptQn12yS\\nMjNzir7sssw4+q\\/G1ka21tD0nKqnZ+TlEXzTc1LSybfpvvIZTrw1WLGJkFnUyXlZ21qHLI\\/W\\njE3RKRLoXqAiVZdlpNltWzDSM0tIAOqG07t3EA8nyll3osXQC0t67rtMqmcD74tRt1xSWwl6\\n\\/aaqxGC2tb0vqzO2uRsymq5tfKQyWWX3iJdfJYcteU3tbjShrZT5eHDcZWXemQcsjwLQO7fx\\nyI4xi9y6N1N2xya+Ncgheymbzr+FVpSy9daSkqxLti45xtsJacSsv0y3J9hxLymUllx5aXNu\\nllDnN3kNUpTmGsX1dWVap7FslIuKI9NX0dTWJty6tSdKspQ1GUqVvuY762rzKZOQfQghvzeh\\nT62soIShTqHGmQBqLZ2UgctOEQO7MlxN3bbjOYIVWae4sZje2xMofcTxB3obUNxB3+b50Zyp\\n+sO337ow0wol9vfNIORKZZE\\/MKAz3alPmW0EkEFIS643mDmCoEKSM4zK4x2BjVd6hKtXuESg\\nX63HXAR7G0kdxEcE1M\\/lkJvezYN\\/7Ykf\\/r36WhxBwgG8A9MEQlB3j1\\/YfsjSw4G4g9EPwcwD\\n0gH1xx6eA7Pduh60c0DqzHqMN7oOuvdDtPAdnu3RWLEcOw\\/b8YvhgixI7\\/dwghZJzSOzL1bo\\nfNHNA6sx6o49B3Edefr\\/AEQ8YP1k9hHuPwhtY9Hw\\/VCFjS\\/L9UOIIIIYWPRPdr16oQk2I79I\\ncsHcodBB9efdDpB3kdWfq\\/TDBo5LHQd3r4e3KHqfrDt9+6GFC4IgWNfGHKD5wHSD490LQ34Q\\n4G8A9MMQmLkHJQ693j0wun6w7ffuhsOIy480Lg5gHphtY3H1HrrdDaxYhXfr6t0OhuIPQePV\\nzwvDVJzTnxI3ekdfXDhJzA6t3q+yMdY3Hlv663w4NQDzi6HyTrJB6Rv9x9sMYcMK4pPaPj4z\\nhuGCLEjlD5BzA6t3j0RdCSDkcunx9nphWGVCxPtEIULg+0Qqg7suj3fp98LIORy5j7\\/HwhqD\\nkQfX2QuDwI7RDCxY34H49fbHiDcW4j4dafrh0g5HLp8ZwuDkQfX2Q1Scx44+MoWQcxlzj3Qi\\nPFp4+35w7B4Edoi2YlZWfl3JWdlpeclnk6j0vNMtzDDqTuKXGnUrbWkg7wpJHHmixCuY+ju8\\nc\\/bHYWGFh1TE+\\/7TsKjhQnbmrEvT1PlpbqJCSJLtSqbrafPWxS6czNVB9OX7FLK3RjTk0xIS\\nszUJp9MtLSLD05MTC1FKWGJZtTzrylDUJbbQpZI1ATcboclJWYnpuWkpNpb83OTDMrKst6uP\\nTEw4lphpAuLrcdWlCdR6RGsbN+TF0TcPsOKfXtImSsC2bcvXECUmbTt6p0uiyNLnU2RLVGWf\\nqrurKsMIAuGv0yWLqlM7VyVt6SfbdMvPLDm4MAAZAZCPjLKt6m2vQaRbtFlkSNEt2mSVFpMm\\nkDVZk6fLty7CdYpzUsMoTtHDk446dqreTH2O0R+MI+WeO8aVDHWLqziipzT77s8+WZFE286+\\n5J0mVsxTpIKW4oJDEuhsOJbIbW+XXQlKnVE\\/VLA+F2MIYVo+H2ldouRlG\\/PH7lXnVQe\\/LT0w\\nVKGcoXMrc7EKuW5cMtA5W0AXwRZtEfjCDaI\\/GERLtx\\/XEezw7+r+ESzInv8Ab10T3WvgizaI\\n\\/GEG0R+MIO3H9cR7PDv6v4QZE9\\/t66J7rXwRZtEfjCKjNatm2CpavNSnhv8A+N5uW8ZHLh0i\\nPQ8pRCUFK1KKQlCUkrWVFICUJBupSiQAkakq04R4UpAudAN5JsPWet57rRbflLOIbibW0VsI\\nJOZW8uuXJiHiHVKa2laloXQKdbtsWzMrQE6jqppV1XTLywb13E+SzKXA3tmtr0tYVut2dY1n\\n2m2EoTbdsUKhqCVBQLlMpstJurKwSFqcdZU4tzM7RaivM55n5zltqmrEjlRMBsLdZx2QsTDz\\nDKQq0kFqcQiZqt53VfFedSlSUsIW\\/asxRAss+UDKVSpxxagJRjsiPrRgSlqw35PuxLDrja2J\\nmbpFdxfUEOoLbrrmI63NTcg46ghJSpuSc7BBUkktpQCbgx85tv8AVPpHHlTShYWhiYLACVFS\\nQJKXlZBNt\\/8AVJd8qtoVrVl00hbWT0++LS4OYeuE4IdyoG839fPjpFGWJ4H2RcVE9nVFsEUJ\\nAGZIA64MwGiR18TCwjn7Pv68YrCbjgRu4q6OgdcJre5kelXd3n1Q3gCSTdXs5+PyhdraDQdf\\nHjFSSTmd5MUgixSstw4+6HQCTYR7FFq\\/BHHn7Pt8c8IqVkOs8O+Kk5Ak9\\/jOEScznGQhHs4n\\nn17viRQniT2mECcyT4Ai5auYenu8c\\/ZCKzkMuc+6H49AuQOcWLOZy6PGcILOZy5h7\\/HxhRRy\\nHjj4zhAniT2mCHgLADlFizuy6fd+n3QlFScznFIfAsAPb4wgeku\\/AdD36xas5A9e7x6IbrVq\\npKuge3gPbCizmcuYeDDV9XBI7T8PGcPoFh46w5DeCCLVHIHr3ev7IWBcgc4cQABfvt8PthI7\\nyT0nj1c0N1HMkwqo5A+oRmlo76IzWlLh7crmGF4SdMxrsqoJE7YV3TMrIW\\/edEqqC5Q5mgXG\\nUy6beqypiWn6Q5K1xuboUzOokHZ+4bbROMIe8fmpWU83M3MNSrcxNS0i0\\/MLSzLianHAxKNP\\nTDhSywZqZU3KsKfcbQ7NPS8shRefaQrZU2k1CtTJkaWwqbnBLvzKJRspMxMNyqC8+mXaNlTD\\nrbCHZgsNBTimmXVIQopCThCo5qPVu9X2xbH2l+4fXzhbdVWsfEW1a5Zl3UN8MVSg3BIP06oy\\nyss2ndk8lO3lJpvJ+TnpZb0lOyrjM3KPPMusun4uNo6y7LOLYfacZeZUW3WnUKadbcQbKQ42\\nsJWhaSCFJUAQQQRGCUqQooWlSVIJQpKgUqSpNgUqB1SoG4IIuCNbQks7wOjj6fAhus7wOrP1\\n\\/ohZRzJMN1fWPb7t0eI3+Aghu+dyR0kn1fphtCjpzWegbvVx9ucJw+kXI7tYc3I8ft+75wQk\\n8ckHrIHx9whWGz53pHUT69w9xh9IuR439kISLkeN\\/ZDZX1T447oRhRZ3Adefq\\/TCcP8AXXQh\\n+KKOQPZ7eaG5OQJ6AT6hCyzuy6T7PGUNXjkg9ZA+PuEOo3evr7YIacOqG8Lq4Hs9+6EIfRoC\\netP1wQQgrie0wsTkCegZwgdwJ6IGxvPHdDiBvPqhBRzUe3L1boQV9Y+OG6FobneSemMsCwA5\\nC0OQir6xhus+cerIezP4wsd5J7fbCB3knpJjIGgHgIIRX9bsH2\\/GG7h3gdA95hZX1j2+7dCC\\nvrHxw3Q4jf4CHxuHgPhCK+IHjxuhOLl\\/WPV+n4xbGQjf4CPYIbv8Ejt9mXfDiGr\\/ANfsSPeT\\nDsKSLqHdr167QyfO5I68\\/UPthos+bl0kd8OX\\/rJHV7ye6Gi+AHjxvh9ofV7zf2fcIVa7nv8A\\nd84nwcndc6Lw0HdFyrkpWZTCG17W10aoA+4eWVZWr5qGhrNfc+G1nLMrQrWW859KrMkrQFKT\\nrAEE5AkA9PPl7e0xq+5GS4zX+T+wnkXXFuuWlX8TLaW4ovrcKPu\\/r9xS7a3HlFKhLydwy8ux\\nsRsG5dqXYSM2F57M5spTMuJzAPmkJJGYBSk55E588aTHClSdOkZwIbyqm0N5SSClL7DjyAD3\\nhux+tpwtHYuFnfPqFRnSpSlrpEgpat\\/5RMswh2+pOjmYHv8Af5e1z225YGMl1WY4hTK7QxCu\\nS0VslLgLa6PcE\\/QltKDrj7o1DLlBDjzrg\\/CdWfOPZC\\/qnr74+y5QCgiztPPSxpyGkSzLWkhi\\nhW5ZhsMJZYlK7etSuOUaYbl0hhphqWqbKGWAgFlpKGXEhxtQj4xfAdvj3xY1Uc85ZpU4N01J\\nNOjXNcLQ09e\\/Eflt+46mOVaux5vOuM7+xffYva1+xdKb24c+6EF\\/VPo94hq7ubV6PaQIcr4D\\nt+Bho\\/8AU7VD3ExhI3Hx+wRgR6pOEl3nEHCrDO\\/S828b4w+sy8C6jYajpua3KbWi6gsIEuEr\\n8t1kpZSGgkjZ5IyEEY38nJdhvXQK0Pq6pxL7v9jthVRJp3bOTC35+1LSplqz8w88ttKlTD05\\nRX1zSSFBuYU62lx1KA4sj6D0+YE1ISM0CbTMnLTAvvIeZbcF78fS9\\/hFxSznaS8u4SFdoy0v\\nNr6WdCVX38b+OsZqxr25VOvLt3k9dKmfbLqFzGHHzDm02w6vZ3TcNDtl5CkTObeyW1VltvOg\\nbeXZU69K5PttZbCY1DcuNXvmfk4sYKepcsk3TcuE1ACX0Olxwy+JtrXRqyRS4lKZn\\/vcDitq\\nHW\\/JEzgCA8WXWtRjCY81wniaZtcsUCruAXykqTIPlACrHLdVhexINiASIxqqvJTKgq9iJKaA\\nPIqZWlPvIiCSNxHaIcDcQegiG0Lg5gHpEfOKKWhzGW2gzSfnvSzwQkw1tdjdT1YKdiiYI+5+\\nh1av7Qtr3AMCmF4v5a0sEGYR5zUYkJ4Ds926M\\/OTRp6Z3S3seaXs\\/wDcegXzUUFetrJW7adU\\npObWQILmzqih53m7IvEHaakQDaZNGR2dY8mwbLYwhiMtnk8aROJa\\/wA6U6jdrEowPLCbxtg+\\nWVqh7E1DQ4OJbNTlS5YcfQCtOdolkYMsJmL7p5yJ8kk6lMAkkZhUo7K8xOZ\\/XR3HeMt5zjWJ\\n8o+uJqkaD2HlBae1Ju6dJCzWVy+u+gu0ukWDidU5p7zBsXUS9QaoyFMvKOankPoQpTGsjang\\nEwXrvn3t5bl7fms1Ao\\/ZXahTUIBSc1HWbDyvMyyUned4B0bfKbrgMphfon2olxYTWr+xNuIs\\nCZCUuLte3bWpiXVSnF9TSbuUEzA82V2y2iP12mI55E9MEtsiRMhCUCoYsr08VFJSXS3L0+nh\\nYJHpptIBnMNLoy70m3Wm2maCGKoAbhFNkpe1yQO3mki2h0P5e4HrO\\/WLFgiwXbsnHlDMS1Em\\nlhRyOq47NyDQAz3pKkKd3p35JIPmkRlik5pHq9UYzYDs60\\/ccxq57KUp7GtkN3lD0yvLPiNb\\nybPIbjq7+AjJdB3Eenx454vLFq89YfF\\/2puXR4XaS5b\\/ADl44pqJvNLH6KUD\\/wAoV\\/8AtDpH\\n1ez9Pxi6E0cSPHjfCkRPcs9\\/22PxjVq+sYVRwI6\\/Huh2wfrJ7CPcfhDJB39o8fGHDZyWnty9\\nf2wlf1j3wmOQRxI6vHvhWEAciD0QvDCxY35\\/ZBFyDkode7x6YctnJaT15evd8YacIcA8CO0Q\\n2ddOYMB1BHOOQgi1J1kg9I9vP7YuhjxjH3HvEAORzHEbxD8HMA9IB9cMIdMKzSU9B9h+3OMc\\nixI5Q4vUA9aw9ScwD6+2FkHMZdHj7PRDVB35dO8dvj3Quk5Ht3ePHTDChYkcOENwtCiDxHp8\\neyE4qDkQeiEqFwRHihcEQ6Qd+XT7\\/wBHuhwg5HLp98NAeBHaIXBzyIjHIuCOcJQbi3L4de60\\nOYqklJChzHwPSM4tBzAPr7YrDBFiRyjxY\\/O9v2fI+qH4OYBHPvELpOY9hhiyv8A9ZHxHvPrh\\n0k5HqPHx454SoXHeN0NwtCiFcx9HZ0ejxwhOAHLeIYIuLQ2fRVcbjv8At+cOknI9XP46oXBy\\nOY5oaJOY6+eFUK5j6PHjuZIsbHhC9COYMPAQRmPHVG1nk28LVPTV14wVGWz8lUuzLVU62FHy\\nh1EvPXFPsbRHmral1U2mS8y1ucTN1eUKjk9lqpk5eanZuXk5Nl2ampt5mWlZVhKnnZh+YdSy\\nwwy0jzlOvOKbbQhO9bhSOfOJOGj9hsxhjh1ZdjsIbSu3aLLmrutZFubuCcK5yszSV5qUpMxV\\npmceaJcXqSrbbO8NkDnrykMW\\/QGCU0WXcyz2J3zLKCVZVppcmW3p8ggnR91cpJKBGVxmZeTm\\nBBAv7yccIiu41XXJlvPI4XYE2jMnMldUmwtmnpIIAJZQmanUqBuh6VZNrKvGQEs2GGW2yQVB\\nI1zqHes71H6nDMnLq3c0L6w6R\\/EP\\/uRSCPnV26jvCff8\\/Hoa\\/QcNgAC50+77+hrXWHSP4h\\/9\\nyDWHSP4h\\/wDcikEedurkn3\\/Px6GvvZjmeuj0Na6w6R\\/EP\\/uQaw6R\\/EP\\/ALkUgg7dXJPv+fj0\\nNTsxzPXR6GtdYdI\\/iH\\/3If0xkvzzTbSStXnrCRmCMm1DLoIG\\/cM9+fWI4+PpLSbU7VVFIJU1\\nKPLAyUT+yMt55JBBOajkeHNxMSbB0maxiig05WYCZqkolXZpzLyJdS4soCgpJUEoNgQd+46x\\niTygxKTDtxdLSyL6C9rC9iDa5udd2kQfNLipnEnls9IesvgqYsGZZpUuw4kltlVmYUWhh28E\\npe1FhRqzs3OhWq4hM0+HGc2Ni6jI7MdI9YjDqjTjF38pLyg98yq0TEp+rdjTTqbNNsPsJcpV\\nRxmrhprimpnUmWnZiRtyVdeS+yhwPIWHES5GxjLaPstjWVRTzhKgN5gzhrAWD6I0lQsoJlqQ\\nw7dQsLLV25Uv0QSokmPlftAnFz2LaxMLUlSnJuYcUU2Kcz8y\\/MkpsbBJL5ItcctN74qSOKkj\\ntIi0uoHPn2AmGcEQoIHEkxDYXU+fwRl1nu\\/TCJUVHNRJ8eoeqKQQoADcIIIItKgO3qhNSieo\\neOMLCSe4cz193fBFyl8w9cJEgZ5n38\\/v9EBUB29EIkkn3Doh9COW7iePh1u+JFVKJPVzDxzw\\nkpWW4cfd48dYpWW4cfd48daJOW8\\/p+2HwLaCCAkAZnx1QiTmczzwEkn3DohFauYenx47yHkp\\ntv3n3RRRzPVzeOuEVnm9fdFyjkOvmhEnPeYcQnifV8+vsjxZ4Deevf8ACCLVHIdfARdCKjme\\nocIeSLnuGp+Xrj1IsLes+MWE5Ak828wxUSokniT4Hohd5f4A6ifgPcfVDeHoWBcgc4ISWczl\\n0e\\/x8YUJyBPq7YQJy3nfz7+f9JhxA4+qHtw8B8ISWd+XR7\\/0e+O9tG7HataPOK1Dv+mNuT1N\\nCF0e7KKleoK3a086wuoSSVEhLc3LPS8tVaY4ohtuqSEoXw7LKmGHuhieJPaYQJzJPTGNU6VI\\nVymVCj1WWbm6dU5R6SnZdy+V1h9BQtIUCFIVY5kOIKXGnEocbUlaUqGXSqlO0ipydWpr65We\\np8yzNykw3bM0+wtK21WN0rTdNltrCm3EFSFpUhRBmEP2po56fFqyeGeLtOkK2\\/N2xT67g1i7\\nSHGqdetOptSkGqiJKn1txt155xjyhU18wVZqbpVQabel6hShU6bLPKj3aavJ5406GdYeqNZl\\n13thHUKgZO2sVKJJrbpq3XioydKu2mB6aftKvuI3tS04+\\/SqmrbGiVepOMTzUp2DoB47ztKq\\nhwpqVRWy9LuvXBh7MLdCdhMsLcnq1QWSpWZRMBT1clGBkkFFZKjm8wiJMWH2Mdv4g2cuzcVa\\nVTbqs656c5RKu3W5NmqybktMJ2M5S7jk5pp1qoSOZ2ZmXWVzKWwh91D6SHmdJgna1heiTFO2\\nK7cZ9+lVSmtsU3Ae2WaUHJepUpYDdDpeOipKSEstp8xbrrjq2WTKrl52ZkUSrk9PdTVfAtL2\\ns4aYx9hdhmUqkwhSK1TJRH5SUq8uhHnzaGwf2Sw6SiZZaVlmhLvMuslQcMqmC2o5An1dsN1H\\nVST0CN6PKIckzVcI5at46aMUrOXbg6EPVq5rDYfXVrjw9kFBcxM1ahOlbs1c9jSoKFOlK5qv\\n2\\/KZzM9850eVqNZkNFL6skhPSfYPtyi1cQ4YquFp4yFUZSC4ntpScYV2sjUZVVi3NyMyAETD\\nDiSlQIstsqyOobcBSOYKlS52kza5OeZU06kmx1KHEAkdo0ogZkEgjcFJIKVpSoKSGvGCCCNM\\ngbz6uuuEYKzuHLodd8EMnDmtR68vVu+EO1q1Uk9A3dp3D2wxO4E9EZCBvPqj1A3n1Qis5qPV\\nu8emLYOMEOQ5CSzvy6B7fGUM3zvSOon17h7jDonMk9MMXDmtR68vVu+EPgWAHdBCK+AHX498\\nJRcs5q7N0Ww6QAjxsfWdfgIItX9U9f6fhDdZySevd49GcLLPAenx7YbrPAenu+MLaB08b+rr\\n4w8gWHjrCSuB7Pfuhurgez37oWXwA6\\/Hvhus5ADPifHtyjKTvHiIVCJOQJ6vbzQhwhVfDtP2\\n\\/CEFHIHr3ev7Ifj0akDv+NoRhA7yT0kwsrgez37obk5Anq9vNDiBvPqh+ETvJPSTFIIIyEDe\\nfV17oIIZOHNaj15erd8IeE5AnoBPqhgTxJ7TDkLRvPh18IZunNZ6sh6hDZfH0d8LE5knpJPr\\nMN1HNR7cvVujKb0\\/xflAjVRPd8SIl8cgPW01PRDxFojpUX7ex+uXZ5IWlKafV7Ew6m5fN3X1\\nVumfbqusEJQW2vJxvUdY7ma4lCJ8IBSlS2G3AnW8471N5jMgkZo5hlmmI\\/8A8ndrXlNi6UVt\\nlxJTSbtwwreyBcLjZuCj3lIFxaCrYpQ4LYCWlIAcUW3A9rIS1lvrv5sJnpBaQkKclVoz1lD9\\nifUoZp3pIG1OWQ59\\/NEH24TRpezRyrpYRMpkZ+kuLQpwsqIef8wOVaWnfSSuZCAFIItooCOu\\ndlS\\/PKLRGyopKpSaZBtcfsaZfbGmYb0s8\\/nEAflnLfRbXKS6R7LIc8mq05h1cTCnXGXFrXXs\\nJrDqFROTDbaW20Vd2ossNuJ2yWW2i45MuKL7mJzD23lZR7PPayzLoO\\/M7RtKsznv5+ff0xsL\\n5eWgKo+ntPVJbTiPutwhw5uBLi5Uy6X0yxrtql1p4j9fNpVbKmDNAAIdZckh\\/wCBGNcVBd21\\nEpK888qfKtnjxZZS0rPPeTmg5ngTmU+blE+wtUE1nZ5gOqpSUdvh6m3QVZyhYkJdpxCl2TmU\\nlbCgpQSkKUCQALCKAxzK+a4orrNrBqtVPLYWGRyacWi3IFCkkDfa190ckviB48boZv8AFI7f\\nbl3Q6X9Y9X6fjDJ45ry6AB8fjG3TuHh8dYiUehxyJ1xi4+TG0YZgzO1mKZTcR7emW\\/LfLXpR\\nVv4wYg0uUl5gkbSWUqly9Pm5eScQkyshNSTbZclvJ3FkdF\\/J5K+us8ndTKctxx1FqYy4n0Bp\\nLjLDaGETLlCuktMraG0mGy7crrxemCXg665LjJhhgQR3bhB0zGFcNvK1UqiUsKOgupEmwlSr\\nAADMpBVYacBYGwtmkrzUyQIuLSrCOeraEIJ1PNF\\/V3mN58aLPlB9ZNL0E6BIl8tG4tIGwKMW\\nwyHPKgzauIlw7BSylzYavzEZnapW0SZfYh0pf2T29OI7XyjerqY0YcC6CJsNip48fPCpAlJM\\nwaFh9d8kJsKAzAkvuhU0RtAP90ciFZJLWq2lvmXwHilwWuqkvsa33TKm5ZXEfmum2u+3oqGh\\nxq+rJRp87rshII01W4hI4jeTY9x3ExD0hVG8dnu6\\/SYSi9B3kdPw\\/THz6V9YxT8OkcCOvx7o\\n2fck\\/ICb0kLlm1KWhFKwiuSbSQjNtbz90WTIoZcXlqoKmZx95A+sssgDzErMav0fW7R9vwjb\\nhyRkmF4sYqz+bmvLYeScmlIH0ZRPXLT31KVu\\/ZUmnILQ1h5qnuPFNQbdXjL7Jcdubs9GEvf+\\n+5uVlbbjv7UjXde4INosTZKyH9pOEEEA5aoHrH\\/6dh58H1FvdxOliCYlE6OculyqXO+Upzap\\n9PZ1jnrfTTEwsBPNkrybJQzyz1N5I3RuPlPdfD186H1qh1g\\/M9p4y3FsUpWZpBuWsYd00vPK\\nJLZl3haQTLJSAoOMTRWVayQmS7o0Sv0N4zKtTVU7QWEZE64LSKs46SNXcle2ZAOv52qfTFL+\\nUz1YuaWOAtA2zSkU3R4YrCZcZeUNqrmJd9SSn3SCSWH\\/ALnkolwdwclZgpyzMTfySKf5tsBw\\nQ8pISuZViWaJOijnxXWWm1HuWw2hQOvokEkWi+ttcx+UrDaSbF2lNEXNrBiVeIPMJWkW7x64\\n0lYDNBMncT+7N2ap7J3HPJhqaWCd2WqPKDq5b8yekRkCn6w8cd0dHYHN6ts1N\\/Pe5XXm8tXL\\n9hkKeoHPPeCXSMstwT9Y63m93g8CO0RL8RK7Ssz5\\/wC0Qj\\/EZbb92X1RyHPG808f4wHsQkfZ\\nDlJyI7YXhsDmAemHCTmAYjawdDyPs5X++MFY3H1E\\/C8XDcQegiFweBHUR8Ibwsg5js3d0eL1\\nAPWtobjkEnWSD0j28\\/thwg5pHVu9UMmFZgp6N47D9sO0HiPT48c0MrFx4QQpCqDuy6PHfCUX\\nIOR7d3dDMEP2Fbino3j4+OuF4YoVqqB5uB7Dxh9DKxY34HowysWN+B6MEXtq1VA8x3HsMWQQ\\nwsa357+ut0KQQQUnofrjkAcjn0b4ccYZtq1kDpG4+jvHjdDhB5ujeOzx74ZWNL8obItoYdpO\\nYB9fbFYSQcjlzH3+PhCsNQQqg5jLnHuhdCvwe0j2Zw0ByIPRC4PAjtEMrFj3GGz6Krjcej84\\ndoORy5j7\\/HwhWGwOYz9cLpVmN\\/EeM4ZWnj7fs6++F6EcwYuBIOY3EQ+QoLSDz846DDGL0LKD\\nnxB4jp+0Q3DJFjaORQrmPo8dUKQ3BzyIPWCIWSrWHWOMNLTbUcd\\/cfvhJFwRzi8Eg5+CPAhY\\nEEZiEIuSrVhpSb+PCEAlBsdx4\\/b8x0cwNCfD03\\/jpQJyaYD1HsRly8qiVJbU2Zmmuss0Jrzx\\nq7X58mJGcSgDaLaknyD5pdEi+3ZdTNOS65mXJhRdOY84NgaraebPNIKx\\/wDbOeNWvJ24duUn\\nDep3i6ypqexEuAS8m6U5E0C3Fv0+XdSCNZIVV368XMvNcaZl3MtwI2zIQltCG0ABCEJQkDgE\\npASkDqAGUfN7yj8UGvY+nZJpzPKUJCaMwEq9EOypLtQUU3ICzUHn2FKFipMq2FfVtH0W8nvC\\n\\/wCD+z+Qm3W8k5X1uVqYKgM3ZTIS1T0hVrlv6PZYmEp3JXNOEfWJN8EEEc9Re0EEEEEEEEEE\\nEEEfcWAB85zhAzUJFeW7eAqZZ1ss\\/wAEkA+gEcwj4eOwcNVAVifQM83KapwHmyTMS6FJPSrN\\nQy6MzvzMWtsQaQ9tUwa0tYbS5VFICyMwCzJzXZjLcXKl5Up5KINxaNLiFWWjzygLkM3tu07R\\nGYk62AGp0v6rxAK0aX5msY66Z90z6mlz9cxqrD01s2Q2lEw9eOIdSnFt7zs2XnqgnJkaoQJd\\nKjmMtXNSMU8ELbNm45aa9pTgdNXtTSXxBtup+US7klM61DvC7aWnbyS3HUyrvlUtO7RgOuOs\\nuFTLrqkobXGUkfXjaTZzGVVKVXSlqkoQctgUN0SmtoKRp6JSgFOgukgnUmPlLiTP9OVDtAQs\\nOoCgd4UlltJB5m438d8OItKkjnHv90IxTWT0j1xBg2OZPh0Y0cLFY5hn7IsKlHny7N32wlrp\\n6z468otKzzbvb49ULDfJPrPx1+wQQoSBvMWFfR6+77YTi0rA4bz454dCAN+vw+\\/rSCLu2E1L\\n5h6+6LConj6osUrLdxPu7e6Fx6AToIqSAMzCJJJ9w6ICSTmTvhJS+ZJ7T3d8EOpTbXefh1zg\\nUrmHpPRCRIAzMBIAzMIlRPwhaU31O749ddwpVvHgPnASSc\\/AHgxSCLVK1R1nhDoHAeqPEpO8\\n7+\\/rfFq1cw9PjrhFaghJPPzDpMXE5ZknrJMMlrKznwA4Do+0w+BYWhcWE5kk8TvMEEWqVkN3\\nE+M4UBc26EOoTbXnu8IsWczlzD3+PjDdZ4Do8e73woogDM+jt5oQJ4k9ph8C1gIFmwsN568d\\nd3frFizkMun3ePjCUVJzJPTFIeSLC3rPjHqRYAcd5693vjk6DXqpbFbpVxUWadk6tRKhK1On\\nTaB5zM3JPpmGVZDMLQpaAHGz5jzZLTiShakxIi0XsfqbeVapSmn0M0bEa36bOy0qXSpFFvKn\\nsusVKllSiAhTzktN04rO+bfkqZsU5PgxHGWeb1\\/Dx2Rl5opX7N0isTltNzbktNMPsXTbjwOS\\n5ao095jysMlYJDh1JOdYQkBCDJzDmWs4SaX24YDk8YYXfmy0BP0uXeQ28E3UJV9TSiSQMxEp\\nNMy84m6rJZRNoT+3rzdDeTtjJdCxcrDsy6U03FCAwhKlHIzV5dK3JJwAkhJmkdtJKCU5nXnZ\\nTMqzItLfw1xUqFlvpp9QU\\/ULZdUSuW1td+nKWoKXM04rWEpSpZDj8otaW3MlOtJadUtbmpPl\\nNeS5pdapVW0odEqgsvS7jEzX8SMKrbl1LYnGFqem5+9LApbIJYmZdW1cuGzZNllpTba56gyT\\nM0xMUydzlsi6Je9bTt+6ZYIQmsU9iZdaQCUsTqNdmoyqSSo\\/rWeYfl9Y5k7DIFXP37hniXPW\\nPPeTTO1nLenHQqdkknNcss+aqfkUnIB4AAvMghE0jzVBLiULbrHyZ\\/KmRhRpjYtttmJme2dG\\nYVIUDET2aYrGzSohzsG1NPEOPPYZQ4C3MyRz\\/Rrd1SqFSaXZJXR+1DZVT8YSL85JMJbqyApw\\npbSlJmVgC7jRICUTm7NchuaSOze9ModTBSgiR1yrPJr0t6lVfS70ZaGy5SphmYuPGCwaAyBL\\noln8pibxItOlMN6zLTalTExfNHl0pEqkLuNiUl2ma8pEcWO6MR4bm8NTrcs86xOyc2w3PUmr\\nSS0vU+sU2YSHJafkn0KW24082pKiELWEFQspbam3F8BVqkTtEn3pCebUh1tRyqKVJS4gKKQp\\nIUAoEFJQtChmbcSpChmSYbvq3BPTvPw+MNFndl0+O6FVq1lE9e7s5obqOaj1bvHpjSpFgBxO\\np690a9IsB7TFsWrOST17vXF0JrPAenx454cSLkd2vshUIqOqknoHt5vbDEniT2mHL6twT07z\\n2c3t90M1nIZdPj7PTD4FyBzMEJE5knpggiijkCYWvUhI64CAakDnCKt5Pb7t0IK+sfHDdCpO\\nQJ6IQJ4k9ZPxh9sW14AW+EZG6El8ezIfH4w3Wd+XR7+PuhUnMk9MIE5knpjIQNSeQ6+2Drr3\\nQiviB1ePdCCzwHp8e2FVHMk9e73e6EFHNR6t3q+2HYUgXPgLwkvgB1+PfDde4dvu6vSIWWcz\\nl0D7fdlDdZ3gdHx\\/RDyRYDv19v3Q9FkEEEZCBYeOsEJunVQrr3evdDBZyQo9WXpO4e+Hb53J\\nHWT6t3xMMXzkkDpPsG\\/35Qsbx4iHE6IJ9nuHxhrwhudwJ6IWWcknr3ePRnDdZySevd49GcZi\\nNxPf18Y9Ru9fX2xI++Tr1ktX9pQ22X3Upq1oYZVssBsFl5Vv1u76el9x3VKkKlxcqm2m8wl0\\nTL2fnNJIkXYyNFC7ddSV5FFUQSRkPNNPUBrZ5hRCl5bxnqncAM4jC\\/J6ans9KfGOh7Z9Kaho\\n\\/VCqmXSSGXTRsRbAkw86MynasGultnMZ6k1McMyYlI4zspFKozoKiU1F9vJX1SlbGuonPIFQ\\n2XH90QeO6sPKep\\/n\\/k04+ygBctL0WbzXGZKpHF9GnFWspOpaQUAG5Ga6Uk5Y6s2GTNk0NCib\\nImqowBuFnUTSt+thmdJ0tv3am8KL5QRTHU6T+DlecbWpNQwFkqQiZW8HNoKJiFfc6WEMFwra\\nDAuBDhWttsPeUhCVOFhaGtR1nubS3KacySlD7ZzOZGzmn0AdQySMhzJyHCN3PyhujeT33ow3\\nD5KUCrWjibRvLdqVCZ+YKxaE6ZUMBwpb8j+6MPl1LLe38vSkrdDKUtaObGc1reaG47KZmkDL\\njvc2mSt\\/HNzq3ZdsZvk5Taqj5OOzGZKy4puSnpQqUrMT5hXK1TiM2ddyDLhNiq6ctilFsiav\\n2vsdhj7EqLW\\/Z7DtrW0mJCWfBAsND2oIIBBBuCoHMfqycyT0k+rm9kMFnNaj1n1DcPZD1RyB\\nPQCfUIYRbu6KuibL8mnrnlehnjLby0vqXRdJi4Kk26pZW0mVruF+FjKJWXRmSyGpmiTky8lI\\nDbjk6F\\/su1zI6f8AkxVV2+FWljRAXs6diDhnVlBSj5PlWrbueUTsUhfmvE0FXlCilOu2JUZr\\n1CEEdsbOllzBOHVE3tJqb11Nmpl1ocOSAPZ6rSoC89Ikla6IcRp\\/2b62+BH6PjuuSbESk4jM\\nfKSZ9xvDrRWpYbQpqdvbE2oKezOuhdLoNpSzaAkebqPCrOqUd\\/nMNHPPMRJniLV8pXmZhEto\\nYySXliWff0hJl5gnzHH5ZvBBqWdPA67DU7NpQTvyfd6d2v2uOhnZ3iRRBOZmQa0toX6tIMAm\\n\\/AFwE9wNtbRj4mJFDnrf\\/TD1GblwfaLiIskVSciDFII4LWNx9sVLDkbiD0ERug5IKTdXWMea\\nilbYYlqbhzJuIzUXVOT01ebzK0jUKC2hNOe22awrWW0UoX5+ppdScwD6\\/Htjd7yQUuhFLx7n\\nUqWHn5\\/DWUWCUlsNycvfDzS0go1tZSp5wK1lKQQloJSk6+vRXlIOFvY1jApNlOChMi4uLOYm\\nowX4fkwu3faLX2IN9ptQwxe+VBrDhANvqUGplP8A58twQbi8SbdGRlKqBcrxSc11iWb195Cw\\n1IpWEZnMEo2utu4a\\/PuIh2\\/KSKs5UNP+0ZJbSGk2\\/o04d0hhSVrWqYbfvrFWvF50H6iw9WnZ\\ncJR5myYQo+etcTJNGFlS7Mrr5OSVXO60COOu1SqUogjnzDyOOWW\\/0QnPlDczMu8pJdsu8+68\\n1I4U4UysmhayUyss5RZqeVLsg5hDapycm5lSU+aXn31fWUqL78myUEvsA2begE5qI49qACTM\\nVWffKrD9IuFQVa6r5iSTc2htmevNVNIJ9KrSzRtqLIkyqxvyLY0G4i27SNd+C6CmzAoq1i7V\\nZ5fRqAJl2tU5k5729bPd9bh0dvIOaezd3eyOqsIEhNkU46hTtZipOEkEbQiffb1weCjk3qZ7\\n\\/qZfgx2kg5HLp948GGK0SatUb8Jt8f4qynhytb1c45YmtZl\\/+6L9xtDpB3ZdHx8GF0HiPT49\\nkNUHJQ693j0wuk5EH19kaVxN78L6jrrfGMoXBELxeg5HLp98WQcIaTqkpPX6jDEO21aqwTw4\\nHsPccj6IfA5EHojjQcwD0w+bVrJB5xuPaIb8YId8YIsQcxl0e6L4YIsSOUELpOYB9fbD1pes\\nnrTuPwPp+Eccg5HLp9\\/j4Q5aVqqHQdx7\\/RDaxcHmOj7oSsXF+I6MPIIIIZIuLQ0DYg+3whRp\\nWqrLmVuPwPjph4Dkc+jfHHw8aXrJ38RuPwPjnBhjxhSx+cNx6Bh4DwI7RCyTmOvgYaoP4Pq7\\nvHdCyTkeo8e+GCLG0IhaFEHmJ7PaTCcEJIuLR4Re4Pq6+Pcd+sOknI9R4+PHPC4JGRH6R4HG\\nGiTmOvn8dcLIVzH0d3p9\\/bDBG8H1whJscp9V+fL7R98Owcxn0xWEUqy7D4zhbshlSbHu4QpQ\\nuLceHXLh0IWac1fNV9XmPR9kOgct4\\/T9kcfC7TuXmq4cx6Oo9Xtz6c9yYZItoYfpUFfEQ9kJ\\nOaqU5J06SZXMTk\\/NS8lJy6PrvTU26lhhlI\\/HdecQ2nMHeojfwjjQSDmIyZ0RrQF548WWhxou\\nydtPzF4TuXFo2+3t6W6eYo+f10hpX7l3pjS16pM0Ki1esvWLVLp05PlKjbOZVhbqWhqLqeWl\\nLaBcEqUANSL7ag0l6vVykUVgkO1WpSUglaRctiamWmlOkfotIUpxZOgSgkggRv7wNsuXsq2L\\nYtWV2SpWzraplGDjKChExOsyaJeYnciErDk863OTjhOS1OvkqJJMZBx8XYkstmhpmXcy5Ovu\\nPAkAKDSCGG0nIDNPmLdTnmcneoR9pHyCr889UKtOzUwsuvOzDq3nSbqcecWXH1qPEreU4onj\\nePrJTJRmRkZWUl2w0xLsMsMNJ+q2wy2lphtP8VDSEpHcNYIIII00Z0EEEEEEEEEEEEEfZYdz\\nqZS6JNKykInWpmTWpW7MuMqeayB4677LadUbsl7sycx8bF8rMOSczLzTBG1lphmYZKhmkOsL\\nQ4gqA1c0pU2jIg563m5iJXgbEKsKYvw1iVIUoUOu0qqOtotmel5OcaemmBm0tMS6XWDuOVw5\\nSFWIwajKidkpqVNh5xLvNAngpaClCud0rKVAjiNd8RJ9KPDJ\\/BHlQtPOynWi1TsSLls3H62n\\ny0WE1CTxLp07cVzzLIUCXmpW8a5VqO68lWoZymzJSM3FBHCRup5avR0VcK8BdOyyJF19yyac\\n9gTjOmUbcddbwxv6tCoWHXppLebTUpYuLb4o9UXq5Ny+IMxUn3ESdEfUNJ+Z6T6zH2mxo5Lz\\n87TK9JPtTkjXqFR52VnGPSYmUNSDEol5pQASRMMS8vOJAt+TmmlWAUI+XO0mkPUjFtSadbU0\\nJhzzhtKh9VJJbU3e5uppTZaXc3zpNzrC8GYHE5Qhmek+sxTMDicoh0QOFipI5\\/Vvi0r6B6\\/H\\ndCJUkc\\/q3xaXOgeuCPQkncDCpUTx9XNFhUBx9XPCZUTz+gePfFhIHE5QQsI5+z5n5e2Lysnd\\nwB8bz+iLCQOMJlfMBl46OHviwnnJ9JghYAG6LlKJ6h0d\\/TFhIA9w6YtKxwHr6OzphKFpRxOn\\ndz+XxhKl8BqefW+KklR37vhFIItUrLt5h3w6BwHqgSnirf7fb9nVhSgn4CESc95\\/R9kVJJOZ\\nhq67n5qeHOenqHV7c+jLe8lNvHiYXFHXNbzU\\/V5z0\\/ZCMEBPEk9ZJ95hULSm+p3fH7ooTkCe\\niESScyf0DweMVUrPsHjOEVq5h6e70e\\/sh5KbDXeerQ4SALn7\\/Dx9kWqOZ6hwhFZ5ge32ERco\\n5Dr5vHVCMOoTxPq+fXHwhCRc5j6uu74wRQnIE9EVhJZzOXMPfDsORYTxJ7THPWXcbtqXbQbi\\naUsCl1KXemAnIqdkVlTFQYHW\\/IPTDOe4\\/Sbo+dWr8H0n4eO6G7qtVO7idw+Psgdl25mWmJZ9\\nOdmaZcYeQTotp5BQtJ7lJURbdu8IypGbmJCdlJ6UcLU1JTUvNyzo3tzEs6h5lwcQUOISoWIO\\nkSaNDXERuqIvHDl2YS4uhtUe76Kc8w9Sa\\/5RJz7bWqANhJz9PYmVAgHXrB1SpPmtZ2RoA0FM\\nTVyWNeEq35ghm57InMOaupawVlyVVUPmsO6x1XXZuqW\\/RFAlRcPlAXmXiUq3\\/wAfJ\\/bfhdWF\\n8cTDGTIiflWpzRNkGYbcdp84QRoVOzUi5NLFybzIN8qkx9XcP1VmuUWl1hgWaqdOkp9sXvlR\\nOSzcylB\\/jNh3IobwUkHUEDuHCfEgWzOfMFbcC7XqrqkOCYAcbpsy8nZKmAlQVnJzA1W51kkJ\\nAymkoCkuh2OZytnJ\\/N6NV8DG7CWjhvAfEyqr8qplOZAkcMb2n9rNvUJtDRU1K2ncCW5iftNb\\neylac4mctksyrMlRVVLelHd1Epll6QGFt4aPGLNPRW7bui3pyjlhxaUTDtKcSlaFyEytt7yS\\nu25NolqpQ6g2lT8i9Kysww2F05Kl9ueRdt0axVIseTltBn0gPF13ZBiOedKnKPWMvaLwZMTC\\nwpRpVVyKVR2ibsTRXS2A8qZo7MlR+27ZrL12mvV6ntJRPS4Ls1kTb0khIE5ZIJsqwbngAQps\\nomikLYcWuBATkCfV2whGRelXo63forY53vgteIXMP23PbegV0MuMSl1WjUc5i27lkkkkJRUa\\neUonZdtx5FOq7FSpKnnHqe8uMdI6lnZOZp83MyM40pialH3ZeYZWLKbeZWULSeBsoEBQJSoe\\nkklJBPCjrTjDrjLyFNutLU24hQspC0EpUkjmCCOXKA7gT0Q3JzJPT4y9EKrOQy6fd4+MNnFa\\nqCec7h6fszhtA0vz+H64bhs4rWUTzcB2D1w3WczlzDwezvhQnIE9Hv5oQh5A1vy0Hj18YIIT\\nWeA9MKQgo5kn1dkep9JRUR+vh7BC0C5vbQfGE1ndl0\\/DwIQWch27u+FFnNR6t3j0wgs5nLo9\\n\\/j4xlJFgO\\/X2w7CSjkD17vX9kIKOQJ9XbCizmQOjf6T9nvhBZ4D0xkIFh46wQkTkCeiECeJP\\naYVWd2XT8PAhBZyB693j0QoC5A5m0OoFhfmberd8et0Ik5knpOcIE5knr9nNCyjkD7Obj4zh\\nCMgDcB3AQuCCCKEgAk8ACT2RkboIaOnNZ6BuHo4+3OGLxzUB0D374dE8Sesn3wwUdZRPSYWg\\na+A6+2HFEhIHdr6rQks8B6fHthus8B6e74wss5k9A4fH2w3V9Y+OG6MtIsB7YWkWA8I3b8gT\\nUn5LTlrEo1NIZarOAl\\/U2abIaKpthm5cP6wmXaLiVOBSZmlsTetLFDwbll5r8n8oSqXDjU1q\\n21TXE81cZQQrLiunz6gRuy4NqzyB4noiHFyGc5LMcoVY0vMO7N2oYf4nyUkjUcVt5lu1pioq\\nZzShSWj5JITbus7qN5tBoK2rjSFzLMamEmz2Hcz9BWpJwJOWRJlp5jI8+Wq6vIjLeOiI3tyk\\n1Tnk27UQhIUpvDdQmFemE2TJvys4vW99G2Sqx1VuF7gnpLYg+AumJUT6FddaToTo4xLm1huB\\nU8dPFRteIg\\/yiKRbco+iXUi4sOytSxrkkIySG1tz8rhU84pe7XC0KpjQbAUBquuayT5oTHws\\nBZNCmEnLzKm+gAfWKTLyqwTvO8kqyO7cObIxI2+ULNsLwt0bn1NNl9m\\/75ZbfKEKebZmLdo6\\n3m0Oka6G31ysut5AUA8WGVr1lNp1Y3mHSwabPo50zyVZ83nsNpA7c0H1jjEG8ktwu+TTglBu\\nPNZ7E7QBtoDjCtv6Wsct5ggXvrcjSwEY23ottCxAr9NNHXpfS1Gp7f8A+vvHGPvnjkg9ZA+P\\nuEMlHJJ7MvXuh0+fqp7SfcPjDRfADr8e+L4TvHjFOxLL+S+VMlrTZo7sy0UoXo7VGTkFKbDq\\nlOJxulalONIH07qEhqlMzCxrMsqXLA6i5hO0I69+TDzsojFXSyprjg8tm8P8Mp6Wl9VRLsrT\\n7juiXnHwdXUAYeqck2oKUFHylJSFZOahHZWypwrwJRQVEltVSb33NhVZwpBvewCVAAcE2toB\\nazcOHNSJYaeip9O8cZhxWvL6\\/s15xMSiJ18pOmplV7aJsiXnVScva2L00xLrWSwzMzdYsFuZ\\nfaQdyXX2pKUbeXv2iJVgf3oZyxYiU\\/KSpyWXiZoryCHkGaYsXE2bflwPPal5yv2qzKvngNR5\\nyQnUIB35y7ueecYW2c22c17W13KSPH\\/4zTzbv3Xt3X4XhnFJtRZnW11y48f2Q2bd+6\\/qvwiN\\nLB2QQRwwoXBEVRCjZ4j0\\/A+O2N63JFS7bVlYzzidbbTN02nKubyG9lJ0iqvM6qciQsqnnwtW\\nscxqH8HztEyTkQY3u8kesIw\\/xhzz\\/wDHG3uHPnRZn4b4598pgq\\/E9iMAn0pugpUBxH05IKAP\\ncFJSr1euLg2DgHadQrgEiXrBTfgTSJ1PwUR4ExJz0XmnP1PqqtSSgO3dUXG8wMnEJpFCaKkk\\ncfObUjeD9TgIgu8v0ojlQccW1rKtS2MGwgHPJKVYSWe6AAfqjNZOQ4KOXEZxOz0YE7TDNS94\\nzuKrDIjMZbKRIzG7f464ga8vZPOzfKo6Scq4hpKKRIYKU9lSCvN1t3AXDKrKW7rLVm4Hqo82\\nNQ5bJtoFOtrKV1RsJlEymwDZWAFWewrSHAon86Zacmlp0P1UqWoJ0uAkXJNyJvtgcK6hUQfz\\na8U2\\/tJeZQD42B9sYj4VhSLDoGYIJFSWAedK6vUFpPYpCgR0Ax2QDwI7Y67wyP8A3i2\\/1S0w\\nP\\/66aPxjsFBBGXQcj6d\\/xiKVb0qjUFcfPpsn1zDn2\\/GOZpi5ff8A7q4fas\\/Pj8YdjeAemF0n\\nMA+vthqg7suj3fp98LIO\\/Lp3jt8e6NUsXF+XX3+qGYdpOYHqMXQkg5HLp98KxjH0VX4Ho+\\/X\\nSGVCx7juhRB5ujeOzx74dMqyVkeCvfzevhDIHIg9Hj2wuDwI7RHixY35wmORScjn6D2QvDRC\\ntZIPPwPbDhBzGXRu9HN46oYWOPt+yCL4XBzAPr7YQi9ByOR4H3+PhzQ3BHItL1k9adx+B9Pw\\nhSGSFaqgebn7Ie8YZULHuO6GVCx7jugi5CihQPrHSItghlY4+35wpJuMp15eHL5fdHIA8CO0\\nGF0nMZ+uGDK\\/wSf8XP3eD2Q5Scj1c8MqTcd43QgixtDtB5j6O7x18IUhuDzj0QslWsOscYZj\\nyLwciD0QuN4B6YbxclWXZCFJvqN498IUm+o3j9eh+2HaVZ7jx98LIVluPDm6vshp2QslQV1E\\ncR8R1QyRcWPGBKr6cR74dQQkleQ3ndzHo+zxw4KwyQQfgeceqSD48\\/nCzburuVmU83SPsjaB\\nyd9puauIF8lklx1yl2fS3koCvOSDWKyyDnkdoXbfXkOGrvzz3auY34aClnmiYUYdSzreo\\/cE\\nzUbwqGaQEupnJt+ap7h1iSou0eSpKQr6qvNyzGUUh5QNa+iNnc6ylYS5VZyVkyL2V2DBXUpg\\ni2uVSZFLC9CCHwg\\/XEXZ5PdENV2iS00tGZuiU+dqJzC6e3dCKbLpP8cKnlPt8lMZgfRjZZT5\\nUSUjJygyylpZlg9am0JQpWfSpQKj0kw8hDM9J9ZgzPSfWY+YSkqUpSlKupRKlHmSbk+0no6f\\nRYCwAHAW9kLwQhmek+swZnpPrMJ7M8x10ejoQvBCGZ6T6zBmek+swdmeY66PR0IXghDM9J9Z\\ngzPSfWYOzPMddHo6ELwQhmek+swZnpPrMHZnmOuj0dCOxLVm7Wr9DuPC3EakU+4bCvqk1O3a\\n1SKywmapM5Tq7JPU2r0moy7uTS6RWZKZclZpJIQ2tzWUW0uuuJj96fvJ93HozXHP37hxTKpX\\nsA6zMh6RnG1zVVn8OZl9YH3PXNMubaccpW1WW7fuSaU6maaU3TavNqrDbc1VN4GZ6T6zHb1n\\nYly7NPete+ZBu4LXnZZynOommGp4pp77SmJiRnpOZS4xVKY4wotOyzyFrDKnG0mYZ1JZPfPk\\n2+UNh5mhyOyXavPil0mUeUMF45eSXW8OmYUCqj1zKkvKoqnSRKTis6KelaZeaXLU+Xl5qn0J\\nte2SMYzll1CQSUVNoFwBtKS6XLJSpxlCikPBxKU+cyuZHbFCXmiJkWchU5k8ST6YpElnSI5I\\nHCbFtM7fWi9eEhhvWZ0uzT1l1QzdUw6nJp1S3VJkHWS\\/cFjrW6v6SURKVulyzaGpSm0GlMpI\\njS\\/i9oE6WmCj80q7sG7qqdHllOKN02TKLve21y6Rn5W\\/P22J96kS6zuT8\\/ytKfJIDrLeYz7W\\nqOBK\\/IyzNRlWWq7RZtpExI13D7qavSpyVdGZqZamZQuAMOJIKHXEoaXcFtawUk8LVvCOIKA8\\n61PU1\\/IypSVvstuONJymx7QBAcl1A3BRMtsrFt0YiFSRzj3+6KFY5hn7Io8y7LOvMPsrl5hh\\nx1l5h1otOsutktOMvNugONONOJDbjTmakqJ3DLciVpHPn2eMoiCm1JNiDcEgggggjQg33G++\\n9rWiNAjjpw1PcD9v2woVk9Q6B38Yt7YT2h5h8e6LCSc8yevo7oAg8dPj11aElY4a+6FSsDhv\\nPjnhMqJ7OqLYIcCQN0eekruHx+fwggihIHGElKz3cB7+3uhYST4c+t8KCQO88\\/lyi9S8swOP\\nu+3x1QkTlmSe0mLVKCBmfQOcmGq3CvdwHMO+HQkDx5wqLnHdbzU\\/V5z0\\/ZCMEEewtKSdTu+P\\nXXMEJKVnuHDn6+zqgUvPcOHT0\\/ZCSlBPWTwHxPVDqU21O\\/gOX3w5oB3Dn7oopWWYHH3QiTkM\\nzzRUniT2mEVKz7IdSkk93E9cYb1WeQH3X15xQnMk9MUgihOQzh7dDg7t3Dwi1astw4n2CEVH\\nIZ+qKk5kk9vZ9kIKOZ6uaFJTc9w3\\/KPYoTxJ7SYYrUVqJ9Q6BCzy\\/wAEH\\/Gy93g9sN4eAubc\\n4cSLAqPQ+\\/h98ZK6O1yOW1eFnV1tagu2L\\/tqtI1SMw3J1WnzikHjm255O+FJUChYWtCkrSog\\nyy4h14cq86sI5tWQUN53HObByH7oEAkb8hkNbgJfdImXZylUybfIL0zT5KYeKU6qS7MS7Trp\\nSjPzUlThyA3jszEfP7yvJBDdew3NoAC3U1dhZA1KQ3R5lsepczME96r8Y+j2wudXObMcMrWb\\nqaYnZXUm4TJ1WflGhcjcGWWrAGw0SNxtzMO6VVJyj1KRqsg4Wp6QmWpqXXlmlLjeRKFjWSVt\\nLHmOtghLjS1ocIQsmONzPSfWYMz0n1mOR5CbnKZOStRkJl6Un5GZl52Sm5ZxTMxKTcq6h+Xm\\nWHUWW28w8hLrTiClSHEJUkgjS2nWkPIU26lK23ELbcbUApK0LGVaFg6FKkkpUDoQSDppGPnL\\nCaNdM0kdGCmaSlkUra4hYISEzVKsJVkGfqmGbzyjeVHmktJLj4sydQbskHZl0s06lSt2eTNF\\n6r5mIjE\\/XAqsSVRTcOHVcZYqFHuOnzjiZCcSl6UnUPSxkqzT35dalImGZ6nKKnWSgoW1Lvla\\niFhMQn9MvASa0YtJfFzBgtzApVr3O+9aL8ztFvTtkV9lmv2fNLmXd01MC3qjT5WpPtqcbFWl\\nqgzrbRl6Puxh\\/GrG2fZRgTbE0lhFYqcucL49Yl0pQ3L4yobSWH5gtp0ZTVpVtFRYaKiGJF+Q\\nbKlLUpR+eG2jB\\/4M4mecYQoSkysFtZBIU24kuSqyr85ZZSuXcV+c7KOKtdRjGNRzJPq8e2Gj\\nys1ZDgn38\\/q4euF1q1Uk8\\/AdsMieJPaYYA3AeEU118OvbCazwHp8eOaE4qTmSYpDh9FNuJ3\\/\\nAG\\/KCLVHIHr3ev7IQJyBPq7YUWczl0ePs9EN1nfl0cfHjjDjadwPietO4Q8kWHjrFh3ceaG5\\nPEntMKrO7Lp936fdDdZAGXSch6N\\/wjJAuQOcKhMnMk9MN1HMkwqo5JPXu8eiECcgT0Q\\/uj0d\\n3HS3z4Qks5qPVu8emEFnfl0fHwIV4QgTmczzwtA1vy+P6vjDw0AHIQk4eA9PwEJxUnMnrO73\\nCKRkIFzfl8erx7BCTxyRl+MQPVv+AhWGjys15dAy9J3nx1Q7Cki5Hdr7IbOnJB6TuHphkTkC\\neiHD6t4T0DP0n7B7fU1WdwHT7h49kPNjdpvPu6vCjqu3AW9g1N\\/hCRPEnrJhuTxJ7TCqzuy6\\nfHdCCjkD17vX9kZQ932e6HRqQOZEbXuRIeZb5R7BZp55ttyboWLTEuhRGbz6cKbwnC00MxrO\\nCXln3tUE\\/RNOHfllE1zGpofcPMOE5hmpU5aQABxdLROZB3BLq88ufoziERyLIB5TDRqBOWf6\\nsYHowAxVPPu4CJwGNqQmwp1RVwn6aOHTMp7eiG9p7KX\\/ACcdsalthYawXjApuSfSboXboJF7\\nEpWoKG8EgXBvrf2xhZS\\/Tk334mZFwP0m6eCLnXUaWtb4xE\\/+UEqB0c8EcuP6tbm7\\/wDkW5\\/R\\nEYzDlZMtVEZDJL0urnzJUh0EE55fgDLIZ8YlFcv9T5Z7ROwpq6lL8rkNIi36c0AsBoy1Vw1x\\nPmpnXQU5qcDtGlQ0rWSEJ2u5QcSURb8OFnZ1pIIyQZFYy3nNSZ0Hq\\/ATl6YpbyOFJX5ONKQA\\nc0viDELa7i1lKrHbC3MZH0a8yRbSMbbugpx3U1G1nJGlLTbfYSrTZvyOZtXPS3O0dhuHNauo\\n5erd74br49mQ+PxhXthuTmSek5x0QjefDr4RSMSaPkx+R0h9JbdwwYtzj+\\/eU74I+T+TMFSt\\nLrHhOsSlWjnOqI1lAEpxNw9CSoD8JIUoAg5DWUMt8Edh7JVXwPTABufqI3\\/\\/AFzx+0+zmYsj\\nDP7lo1Gjz3vKT7r+4+ETZIiCfKRzljzo4kcRhJcR9V5PRL7iIF8pGbWMdNHBwoWlpeE9ztoc\\nyVqFbV4rU42le5KlNpeaK0j6m1bz+uIxNtP\\/AEd1n+70rhcaVWT3\\/DXiYRir9x3e56X\\/ANYO\\ntdIjlgggEcCAR2RWEWVZpKTxSd3YeHx7NwhaOHIqoixI5QRvu5JhllGEeJswEp27uIzEu45v\\n1nGZa2aQ4w2TvGq25NPlGXO8odMaEY3y8krOIcwtxTp4SQuVxAkZwrzzSpE7bkkwhsJ4hTZp\\n6lLO4\\/Soz4Rz35TiVfijrZTfKmpUJS7G3oGqMJ1HFPaKRpwVlNtLi5tgRSNpdJzWJMlVwi4u\\nc30c+dORyBWvK41vYyftFz+1gf3x1b\\/81IxAk5eL9tb0qf8AzHf+rfg\\/E9rRb\\/tYq\\/fJVv8A\\n8zIRAh5eRZHKu6VXD\\/8Agd7dG\\/B8x1vsVWn\\/AN3\\/AGSC9yMJYfv4iQVcdfbEu2vfulVP\\/uBz\\n\\/VTUYw4cJS3ZduoTmAqQ195z85x95xW\\/mBUpWQz3ApHZ94g5KHXu9f2x8Hh6SbKtwncfm5Hs\\nccj7kHMDrG\\/3GIPUNZ6evrebmb8\\/25evjHND5BfePDtV\\/wD9j8fdDpJyIPr7IXByOfRDVJzA\\nPRuPb9vGHCDmOzd3RrCN4PrhqHQOe8du7m7soXBzAPr7YaIPEenx454XQrI5cx98Yzid44jU\\ndeHvhKhcd41HXWtoVhRB5ujeOzx74TioORzHNCB6SbcRb7vlDMPWVZKyPBXv5vXwh2DkQfX2\\nRxoOYz6Yetr107+I3H4H0w34wQ8ghNB5vV3QpDBFjaCFknMdY4+PHPDtlf4B\\/wCLx385Hojj\\n0nIj1QuDwIPWDCVC4tx3jr1x4oXFvZ4xyEEWIXrpz5+BEXwwRwI9RhnUHkRBDxteuN\\/1hx6+\\nv0wziqVFJBHN7R0emGFCx7uEOGyxpvHR9XL9ccklWW48PdCwJBzENEqCxmPSOcGFkK5iew\\/C\\nGlp4j1\\/P5w1DsEEZj9EVhAEg+8dMLAgjPm93bDcEKJVluPD3ePHWr2Q3i4KI6x0QhSL6jfx7\\n\\/vhCk31Gh5dcYeJVrbuf39kKJVq7ub3dkNQc94hRK+Y+vvhojeD64EqvodD7Oj3fqjk5SWfn\\nZmWk5VtT0zNzDUtLNp+s6++6lpltP7pbi0pHWRzxKEwEt5mhyUjSJcAydq2xR7fk9VASEtS0\\ntLyUuQEgBIEtTlpA4aqjxAOccvAGhG48Z8N6XqqcR91VOqT6Bv2ktQlKrkyhQy+oqXpzqHMt\\n+yKsiCARJuwjZWihTk2UpCpuorbSciCWZVloJJVmM\\/pXphOruKSnoV5nG3lYVYol6DSELt2c\\nrNTi0ggFRnZliWaURv8ARbkZsJNhotd+IHYPkt0sCXxNWlJv2s1I05pRGqRJsOzcwhKje4Wq\\ndlVKBvbs07t57bghHaL6E+s90G0X0J9Z7o4Zse72j5x2Bm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9\\nCfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+h\\nPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0d\\nFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dOSptVqlGmm5ykz83T5lIH08pMOMLUnMq\\nKF6igl1oqAJbcDiFZDXR09u0THe66eEt1aVkK40lIBW80ZCdUUncfKJQeTEFOesVSa1rVkQr\\nIEOdIbRfQn1nug2i+hPrPdFlYE2w7UNmTmfAmOK\\/hxkudsunyk921HeeJBLsxRJ0TVHmXNLB\\ncxIuqAJF7FV9RUaJSKuLVKnSs0qwSHVoSl9KRb0UTDakPITodEOJG7QR31cN24E4jIyxOwYt\\n261KbCHE3Fa1oXq2UltbOqV3DJNrcbDa1tZFkEtOLSGsiUK6nqWjhyddwuOO1LACw5FUw282\\n5812jNW8hKX1uFezZtdco1LugOa7T0qltyWSGwy4ylplLfzu0X0J9Z7oNovoT6z3R0lTfL82\\n6yyEisyOzbFzoQhHnGIsFyoeVlPpFX0FO0Rq7mucJaSm59BKRpEEntkGCJ9ZW7IOpzG5Adl5\\nga23meYm1G1jYk33XJuYp\\/Yacmd\\/gXpX+fYnf\\/HoeSeiRya9N2\\/k+CFsvbfVKxOS18VRX0Rc\\nI2AqtSmhLqO1OuGlMpdzbDueyaDTTaL6E+s90G0X0J9Z7o2g\\/wDaC7VxqnZ3sOSbEBSMF1hK\\nk3Frg\\/hcddBvBHMRrE7C8AJIKZFwEW1DNHBtYAgH6LuLgEb93ebj6aS0dOTtpjbol9HzD57a\\naqlpnrIXVVnUz1EsqqqprYE62\\/ZLaSvPNzMcHbOCnJ9y7zMwjRqw0Wtl1t0JewwtyYaK21ha\\nQ9LzDbsu+2VJyWy+26w6n6N1tTfH47aL6E+s90G0X0J9Z7oxnP8A2gG2NWXJhLY+wE3JDOC5\\nmyibanta+6QRbTKUjXUGwtko2LYFbACZJ0AWtb6PTl3E2ySSRvud1zpcx2a5hvoGIQpwaLuD\\nDq0jMNowEwv11noTtKM0gKPMFuITvOZTDP7gNBP8k3CT8xOD\\/wD1SOvtovoT6z3QbRfQn1nu\\njBmfL323vqSpql7MZMJTYolsESq0rN75lmcnppebh6K0pt+bvMZKNkGCUiypJ5e6xU7Lgj6u\\ngyMIFtDvBPfy7KRhxoGOISteizgwwpWtm29gNhYpadUqA1i1SHmzrAFQ1VqyTlnkc8uDfwQ5\\nPiZdemF6NGGaVzDrjqwzhfbks2FOr11JaYl22WGWtZWSGWG2mGmxs2m0t5AfI7RfQn1nug2i\\n+hPrPdGQjy\\/dtSUIQvD2yd5SEpSXXMFELcUkAFxYbrDbYWsjMoNtoRmJyISmwCFbHMEL+tJv\\nEXuElcooJ3aJzyqiLAWBJJ4k3OnOTujVyc1TW2\\/M6PdhsLQ0EluSs+YpaMt6vpWaY5KS7rms\\nrIuLS4rIHz9QZDgJvQy5MmqPvOTOClvsKmEFDnkj+JdNYb1WQ2NkxSaww3LqKUnNyVaQ6XlF\\n0HbBTov2i+hPrPdBtF9CfWe6M5v\\/ANoNtbFu3wFsTmwCklMxgyrWJTe9+wxWwr0wSFWUD+iU\\nxhubD8BufWk3r8TkpKjwsfTpq9QLgE3795j5KZ5ODkvquGVSdizdFDanELEpiLjGyX1L2QBe\\nTcNyTq0IaIOzcYEu2ouOB1b5Q2Gfh6hyRXJ41dookb0xCoS1tPsh+QxOoiXErcT5kzlcdtVR\\ngOy+4sBTZllnJDzLwzQO5dovoT6z3QbRfQn1nujcSn\\/tA8RBKU1PYhsYmiQA4qn0qr0vMPRC\\nuzz1aoKaJANjnWQTe5I11cx5P2Bnr5G3G77v2PTtPq2\\/aJaXva3C1+7MYxbq3IaaL1UI+43S\\nCxOkUrUyppVVn8PLpBQttSCCulUG2dcvTGo4y4nLUaSWS08tW2Z6luLkAp0suP2dpQSc0op1\\npaTuLCpyUaUoMqyK6vSr\\/qCih2ZS2jzaONgw7rfrl1gtO5\\/bRfQn1nuhzLT89JKUqTm5qUWs\\nAqXKvPMKOSSlJUtot55ayzmQfrkDKJPJeXtgaYLbdf8AJxp2Te9M0HaLVZBaFAH0m5RVCWFp\\nJ0DTk6hCb5ypSkpSdBNeTXhl0KUxOhtV7pSZaYTa+UD0mKmhI3b+xN+CdTGnS6+Qm0rKTtHb\\nXv3BO7pdBybl1V27aBV3lALUjVlJ+z36WgKSloErrvmvO5ZbFsvRjFePJN6e1o7V9zA565JF\\npWombs+8bFuBTh2rjadnSpe40XAQoNof2qqOhptt1naqae2rLUkuSv8Avenq1pW668kEZBC6\\nnNTLYG4EiWmlvMhW4cG9YIJGeRUT9bI444jSQG0q8vUGxkA3PU2QXuGtnmuVZlHzr62RC3ip\\nOp5moc8prTfLD8mWqlLdYwVtZwk66rV2kzWHsQSMvYCwWueqEvOqQq2UhuSdczFPpBN1Jis9\\n5MSrKMjVGTYWSDMutEk2scjsjMpNt1u3Rccb2iGTfejtj9hqHjiFglixZTLKdo5N3Nh9ddHk\\nS1r7IOt1CdpTMm8xtU7PbsvrYLoLW0JjpZxeoN31jw6uv0RPTp+khX2UoFWt2lThSfrSU3N0\\n5at3\\/wBn+c06xy\\/BSkFRy1ABu+Ou+S0S8YxMIxa0f7FuGbmwS9Va7YFp1yfbcOWs6xX25Vu4\\nZR88PKJJbD6m9dvajPUXZFG2r+TDirs0UXbhL0Gccy2kMc4arFDS2XD6CXq06y1Rk5QCHFtz\\nDqQbKUUJUkmB1Pyd8XyWZcskzSEn0Q2lh\\/NYA\\/8AV5lb+twADKC+trnSIKMES+725J7k5cWQ\\nV2a9c2E1UmUubJNlX1PMIenFawbLlCxNl7qZLKVgByVozdNbcYRlLOMLWH4wHxe5ArFejtTV\\nTwPxos6\\/pUJXMS9BvmlT1jVpTef0UnJ1amO3VRKnNLTwmpxNsyi9\\/wCxDLO1JLZ\\/UK1JGqYO\\nrOFsfUsBKvpDBmIqbWpcNrTnQfyTyFLUpNlZGQ6TmGXMAoitKvs\\/xXSFlubpjoKb3SlK0OG2\\n+zEyiXmFa6WS0dd+ljGkjDgedWF8wEgnPeRmVTZOfQU5DMcSCOqJfNHl3JWkUyVeTqvy9Pkp\\nd5IUFBLsvLNNOBK05oUAtB1VJ3Ky9MRw6Boj42YJ4xWJhNjVYU\\/ZdwXheVBRIomJmn1Wl1Wg\\nuVaTkpuq0uuUGcqNKqMpKpMy9Nok512ZkUJHlMu06622ZJO0X0J9Z7o+ZHliKdlsT0KjzUu7\\nKT0j9KuTUrMtrYmGM7VIl2gtl0IcRnVKvmyk6gAi4sT3XsRp71N2a4al5hC2ni1PTDjbici0\\nGaq0\\/NISpKyChSWnkJUkgKBFlAEkBaCEdovoT6z3RRSyhK1rWEoSCoqUUBKEJGZWsngE5ZE8\\nMzzcI43ynhr4G9+7S+vyPKLbzd3sIPLTTjv8bez6G16y5btx0attKOdOn5eYdCciXJZK9Sba\\n3HM7aUU+0TrJIC88juA1RfKCcHGJS68CNIGlyrezuSh1jC65ZploNpcnKFMG6LQmH3EnUmJi\\ndka1dDCXXMn0SdFlGtZ5lplErkvinpiYKYWIflX7gVd1ea2jYoVmoYq60vhsqSmcqxdaokmE\\nLybmkKqLk9LnW1ac8pKmzgtp7cpjoy6Veh+3gVXqsLA0jbSvSw7os2wKlPN3K5d66I1ULbqk\\n1S6tRZMLpE7L2hcFbrU6xddOt2VdaZdk6JUa1OK2B+o3kKztXk8FbXsEYik5yQpNalaTjDCL\\nk8w6w09WqI3MJrIlEODMV1CmsUxKH+zQy83JqZDy3Fttxzr5Q1DE\\/hpuqNhHaSKHEvrLjaVh\\nKXGpiXsFKSpVimabyoCiBMXA0JjQk8rNWQ4J9\\/P6uHrhqtX4PpPw8d8Xk5AnohEnM5nnjpRA\\nub8B8evsjhOKRQnIE+rtisJLOZy5h7\\/Hxj36yu4de\\/v4eFoUkXPcNT8vXFhOWZ6N\\/phuTxJ7\\nTCizwHp8eOaEVnIdu7vjJQLC\\/P4dfZD0JKOZJ9XZCCjmezd9sKqOQz9A7fs4w3UcgT6u2H0D\\nefV17oISWczlzDwYRWeA9Pj2wpwhAnMk9MOQtAub20Hsv1r4wms7sunx3Qgo5A9e71\\/ZCijm\\nezdCCzmcuj3+PjDyRYeOph3rr74sgggjIQLDx1gihIAJPAAk9kMCcySefMn3mHTysk6vOSPU\\nN\\/vyhi6rVSek7h8YUNSBzhxNgCo+HXr+ENVHWUT0n2c3shus5nqG4fH0wqTkM+iECcsz0b\\/T\\nGW2La8hYddb4EDefV8DCKzmeyEFneB0e\\/wDRl64VJ4k9phuTxPaYd9W\\/TrrjD6BrfkPf1eNo\\nvItKH\\/dNdGdPQMZSe06P+KvDsA9vDdnE4vG1KTh3VlZAak3SlI38FGoyyCcufzXFHxnEG\\/kV\\nVa3Kb6NSuvGTL0aP+KuXsAicZjg4E4eVJGrmHZ2lt555Efr9lzjkedsJzzSRrHsjK2hFtPk4\\n7aQ4pIBwRjnQjN6asKkNW039rksSLJJBO68XvsbuZmmW3\\/hRLf4oTTr6btANd+njEVrl9v7j\\nrDf\\/ACl7N\\/mtxliK9hyck1oc5NN9Q8vJ9uUSn+X2\\/uPMN\\/8AKVs3+a7GaIr2HX\\/74\\/8Awf8A\\n\\/p0UJ5Ggt5O0uOWJq9\\/vCVhzb4k\\/hvNq0t9F0nx+paOylHIHr3ev7IbqO49mXwhZZ4D0+PHP\\nDdZ4D0+PbHR6BYeOvwiiYkg\\/Jlv7rvHb\\/Jwnv5zsO4Ip8mWP\\/wC15jsOf+xvnj\\/\\/AHOw7gjs\\nDZJ\\/SPTf74qH+2PRY+GP3LT\\/AHd74pibJESv5SqrLEPROHMqzcVR6RW7Ky95iWpETv5S5SnG\\nLm0P64XkFqoUPG+lIYCFBbLlIqGFk448VHzCl5NeZQgAkgy7mYAKQWdsqSrZ1Xt9gukk24D6\\nZp4v7SB649xQD9CzRHBUuT3AzDQ+JA9cRhm1aqweY7j2H7coexxqTrJB45j9MP21ayAecbj2\\n\\/bxPbHC8VUsblDjv+yL43pckrvw\\/xdPTeFB\\/0NMRotjd9yR844u08apApSGpa4LNnEKTntFL\\nnaZXWnEqyOrqJTINFPm6wU6rhuihfKXbK9j+IyNzc3QVKPca7T0DxOZSRbvJi3tgygnafQQf\\nzmKykaX1+h55XwSYlOaK7qDhi6EqCi3c9WS4EqCihXktNc1VD8E6ikLyOXmrB5wYggcvxJy0\\npyp+kNMM64cqlFwVnpsqVrAvt4I4e01Jb46ifJadKgp\\/3wLP4UTrtE3+11W94\\/8AHWo8SBl\\/\\nuFbe7ed\\/T6Yg0fKDKdMSXKgYwTL2psqxZWDlRk9RRUoS7WGtu0lW2SUpKXPK6XNZJzUNiWFa\\n3nBKen9gkz51sC2XFQSkt4XpjISDcgSodlQo7tVpbBULfnEa2vE32woCajUrG967nPMdpLTC\\n\\/YCq3fGFuG7odsi3VDMBMkpG\\/cTsph9onsKkEjqKTH3aDxHT493ujrzDQ5WRbx\\/+dpj\\/APzZ\\nqOwAeBHaIi1RAFQnwNwnZoDwD645lmBZ53kXF9\\/5xvv+7lDpByO\\/gd3p5vHXzQ4Scj1cDDRJ\\nChmIXQSob+I49\\/YfR2Rr1jj7euuEMw6B4EdohcHMZ9O+GqDmMuce7x8IWQcjlzH3wwsXF+XR\\ngh2k5jP0Hti6EUqyPUeMLRjH0VX4Ho+\\/WGVixvwPRi9CuY8\\/Dq\\/T7+2HCFaigebgez7IaQsk\\n5j2GPFj84bjv+fr63wmOSB4EdRHvhdJzA9UMGV\\/gH0HP2d2UOkq1T1c\\/f6IaUm47xughaL0K\\n5jz8Or9Pv7YsghmCHaFlBz5ucdIh4CCARwMcalWe7nHthw05qnInzT7D09nTCFJvqN43jroj\\n1Qhab6jfx74dwQcYIZIBFvfyhsGxvF6FlBzG\\/PiOno9UPAQoAg5gwwi9Cyg9XOPHPDJBBsYc\\nIChcb+tD39bo5JKs9x483X29cKAkH3jphqFAgKB3dPR3ZQqlXMePMent8fa0pHEez5de7c1D\\nsEEZiKwgCQcxCwUD29ENwRcFEcPVCwUDw9UIQZkcDlCVJB7j1vhJSD3H9Xhe0ZlaEVJVUcZz\\nUijXTbtqVyppWsKyQ9NrkaI2lJBCdopqrP5Be4tJd4kRI1w9ljK2fRUFOSn5Z2bUd+8zUw9N\\nIUcwP7062lIHABP1t6o0JaA9P1Z3EmuuN5hmVtujy68\\/reVvVWcnEhRVrILfkciSC0Q7rjJw\\nFsxIJpLK5Kl02T3p8kp8nK5HPd5PLttZZKCVbij8JIMfOzypagZjGypS4KZNiQlk2PBuRTOq\\nSADuSuqKJHBV9b3j6AeTnTvNdnknMBOU1Gdqc8rhmPnZp6SeOqKakgnemx3ERysEI66\\/xlfx\\nj3wa6\\/xlfxj3xy5p3+z7\\/Ho6X92Z5jro9HRaCEddf4yv4x74Ndf4yv4x74NO\\/wBn3+PR0OzP\\nMddHo6LQQjrr\\/GV\\/GPfBrr\\/GV\\/GPfBp3+z7\\/AB6Oh2Z5jro9HRaCEddf4yv4x74Ndf4yv4x7\\n4NO\\/2ff49HQ7M8x10ejotBCOuv8AGV\\/GPfBrr\\/GV\\/GPfBp3+z7\\/Ho6HZnmOuj0dFoIR11\\/jK\\n\\/jHvg11\\/jK\\/jHvg07\\/Z9\\/j0dDszzHXR6Oi0EI66\\/xlfxj3wa6\\/xlfxj3wad\\/s+\\/x6Oh2Z5jr\\no9HRaCEddf4yv4x74Ndf4yv4x74NO\\/2ff49HQ7M8x10ejotBCOuv8ZX8Y98Guv8AGV\\/GPfBp\\n3+z7\\/Ho6HZnmOuj0dFoIR11\\/jK\\/jHvg11\\/jK\\/jHvg07\\/AGff49HQ7M8x10ejotBCOuv8ZX8Y\\n98Guv8ZX8Y98Gnf7Pv8AHo6HZnmOuj0dFoIR11\\/jK\\/jHvg11\\/jK\\/jHvg07\\/Z9\\/j0dDszzHXR\\n6Oi0EI66\\/wAZX8Y98Guv8ZX8Y98Gnf7Pv8ejodmeY66PR0WghHXX+Mr+Me+DXX+Mr+Me+DTv\\n9n3+PR0OzPMddHo6LQQjrr\\/GV\\/GPfBrr\\/GV\\/GPfBp3+z7\\/Ho6HZnmOuj0dFoIR11\\/jK\\/jHvg\\n11\\/jK\\/jHvg07\\/Z9\\/j0dDszzHXR6Oi0EI66\\/xlfxj3wa6\\/wAZX8Y98Gnf7Pv8ejodmeY66PR0\\nWj6Ki3bc9tqQaLXalINtqK0y7Ey4ZJZUStW0kndpJOZlRWA6w4kHNROeZj5fXX+Mr+Me+DXX\\n+Mr+Me+NtRq7WcOz7VUoFXqlDqbFixUaPPzVMn2CFJXdmcknmJhshSUqBQ4n0kJVvAKWnpVi\\nZbUzMsMTLK\\/rNPtIdbV4ocSpBFiRqndyvH0mI9alcWRY07fNBptRuLDa4J64LRuRlpUrPScx\\nVaDUbfq0rMsJ2krMSs7KzzU0W2USqW6hSaTOpQp2TaKuCSNcHI5DtyOfo5x8eeENdf4yv4x7\\n4qlxaTmFHPr3+\\/fG8xttAxjtHqkrW8cYgn8SVmUpsrSG6pU1NOz65CTU6uXbmppDSH555tT7\\noM5OuTE44gobcmFttNIbYkaZJ01jzany7crL9ot4MtFQaQ45YuFpBulpKlDN2beVsKJUlIKl\\nRjXj\\/pGUrBAGXnpWmMLTQ2q9NV+46tLUa2qPJPzk9TWnahMOus65RMSLgdSuYp7QQtlKJrXW\\noJjkaZnLAWZU3FW\\/bN6VnFV2WE41N0Gynnbfw78pC0Jbana4prYVthIQ6qXnpCUuppSXFak4\\nEKjepymfJwW1yjuAlNptrViXs\\/SBwtZnJzDav1Gbm5O2qwuaUhc5aV8syUrPOzNv1ZLIXSay\\nzIzVTtSsKXNyaXpGdrtMrMO9egQrB+8K5Z2Nyao9e1pVN6l161UtvUemSU5LKSdVb6Fmo1OT\\nmWFNTUhPyz8jKT9PmWZuXbmJZ5h5f0Y8mnYpsRVhai45xFWXsQVxxhMwuiyMoGkodUmygJtT\\n0y6pLRUuXdVKv0VcvNsusOlS0XcoHartVxJhGYVISlNap0s4eyYqziFTzz7qUhSktNLQ3Jyr\\nqU3IRNCZDrQDrarEpR0hfmlvpHY6zzlCtl2dt6mPbUIt7DuUnmZpUq6Q2VVOuIVMVhaNnrIf\\nUicp1Nd13FOSjeWqORwh0bb5pN00S97sqsnRX6XUm6p81tuGsVaec85UwzPTbLyZKWMyl1aH\\nH25upOqK3AthBKVHNmkW\\/QrZkkUu3aRTaLIoAPk1NlGJRtShmNd3ZJSXnlaxLj7ynHnFFS1r\\nJJUp+o5D2COxnMXStPkHaNhGgUzDlLebUw72Mu05NzKFpLa1PulASta0KUFLeEy8L3ExfWOR\\na9jWtYgeW9PTcxNOLCkl2ceVMuBCwAUNJUexYbI07JpsJSLBJFosWrmHNx6\\/0e\\/siyCCIWTl\\nASN56v4n3eyIfFqjkOvm8dUIE5Ano3xepWZ6hwhBauYc3Hr\\/AEe\\/shxtO4es\\/KHkiw7zv+UW\\nE8Se0wgo6xz9Q6oUWchlzn3ePjCCyUjdxPDv7B6eyMgC9gIVCazmd3AbvTz+OrnhBZ4Do8e7\\n3woo5An1dsIE8Se0w+BYAcoPffd7v1RYs7sun3ePjCCjqjrPDv8ARF5OZJ6YRWczl0ePs9EL\\nSLnw1h5IsAOO8+74aCEycgT0Qh1+nfz98KLO\\/Idp9\\/s4\\/ohOH0i5A9vhCoIIITdVqoPSdw9P\\n2Q\\/Bvhs4rWWSOA3DsHfxhi8rNWXMnd6TxhypWqkq6B7eb2wxJ4k9pMLQNb8vj+qHFaBKR1w9\\n+sWLO7Lp4+PHCG6zuy6fhlChOZJhuo5kn0DsjLSLC3rPjCwLADlFizuPSfB8dcNXTkg9J3D0\\n8f0c8LLOZy6N3p5\\/HVDN5WashwHv54cSLqHIWPw+33Q79VHer7fu98bTuRQYed5TDRxcbacc\\nblGcY35lSEkpYZVgNidKh10jclCpmZl2M1f3x5pGZ1om\\/Y7qBw8nss91SpXAf\\/PIyyHblxy6\\nIhOchzmeUhwc3KIRbOLRWQCdUHDC6U6yuhIJSO0gc+6azj28pFgOpRq6r1XpragrPPUBfd3A\\nqTv1mkZnzt3AZ5Qjai6iX8nPa8FGwewZi0Wtc5nqL5ugC1tCoJJPeTF97F0Xmaad5GJWlcAL\\nJbp6jr4C\\/uiKZy\\/VWfa0X8IqKEtmXnceqbUnHTrB1DtIw8v6UYbQcwgNuorcwp4KSpZW21qq\\nSAsLi+4dEH54yIP\\/AMj+H\\/39EmL5QFPyyMBsDKY4sibmsX6jPMt6jmqqWkLNqsvNLLhzQNR2\\npyqQlStZwrUpG9C8ozGHJyFa6\\/m4evy\\/4RTnkfMhvycqOoIKPOK3iB0qIP5QivKZz677BkN3\\nFhdsjeDGPt2dKsdVRJVcNyVJbCRb0P2JLuEbt5LhVY6jMDuIjssnMk9fs5obqOZJhZRyB6eH\\nRv8Ashso6qSege3m9sdCAbgO4RSA1IHOJJvyZOQfd0q9IOrJLfkslo\\/IpzoUVbXyip4jWfMy\\n+ohKTrNhukzW0VrAJUWQAdfzCOd+TDtPnH\\/SamENOlhrB612HZhKCWG3n71acZaddyUhLzyJ\\neYW0hR13US76h+xLgjsDZQAMEUw2Or9RPE\\/9ffHxSPYe+LLw0CKYi3F506219JIvr3pHrB74\\nmgRFp+Uv07aUbQ3qu2CTJVPHumiX2ee1+dZXB+ZLxdCwG9h80BvZbFzaeU620bDIDspaIy\\/y\\nlOnIXhJovVkyzi3ZHEe\\/aamcBdLMuiq2xRpp2WcUk7DaziqQy4yHk7Yok3djm35QYd2rtJe2\\nfYkQoXAl5NwC5HpM1OSeSbgjUKbBG8G1iCkkExKCaLOgb\\/2OfZNsHv4CIj7CuKT2j4+M4esq\\n1VZcyvfzevh6uiOLSdUgjmh8CFAEHjwPOPtjg1Ysb8+vv9cVQnUFJ3jdfh9un3RyMbnuSNnH\\nfI8fJHJAaYmMMplKgk66nJtm\\/WXULzUU7NCJJrZ5JQQpSw4peaCjS82vXTnz8D2jjG3nklZ4\\nM3PjVTi8sGaoFmTolQpzUeEhUK+yZhaB9HrS3ziGUKUddCZpep5q1g0l5RDPb7HcYpAClIRR\\nHk3BNuxxJR3FHT\\/s0rFzoL3Ogi0tiLoZ2oYXKty3KqyRcC5eodTaSNf46k2A1JAA1tEsDRGf\\nSuyrkRrAuIuhRUkHglykU9KFHdlkpba+wt8OGUKz5RpSnKdyklanFPNuIr2C+FVWaSkKSWGm\\nZasUItO55hS1PUZ1\\/WT5uzfSk+elcTPdEB8roN5saoAarFNeCtbPPbyb6dTLVBBQJbPW1vO1\\nj2mIV8pso7FN0+MNKjKybrQr+itYk5OzajMqZnanJYoYy0tZbW6tbKHZalSVHaelpUNobTsH\\n3mttNKffvLybJkP7A9nISU2RSZlkgXuPN6xUWbekb6Fogm1iRp6JBNnbZWj9I1Ym90VOTc1O\\npDkmkaAaE3dNr2043jVFhSsqsGg5kkgVNOZOZyFYqASM95yCQEgcwGr0x2Mg83RwjqrCB1Js\\ninpBObU1Um1g7gFGcddyHAnzFpOsOnVy5z2kDkcxzQzWU5KtUhwM9NKGlvrPLV9undY8Y5fm\\nUntnwRY9qs\\/+Yn4aX+Ih0g5HLmPvhZKsiOgnI+33GGoOYzHPC6VZjrHGNaRfQxh+3Tf3cPuh\\n2DkQeiFxv4c8NEHPd0cOz7IWQrmPPw6v0+\\/thgixI5QQ7Scx1jj3wuhWYy5x7oZpORz9cLg5\\nbxGOtHDgd3d18OMeEXFocRUEg+8dMWg5jPwIrDST+Yr3\\/D7QfZwhgi2hhwDwI7Qesd0PG164\\n35aw4j4+mOOQrLceHuPd46YXSooOY9PWOiEKFj3cIOvCORQcvN5ubu8fGFR7\\/G+GqSFAKHD2\\nj7YXQrPcePvHf46YaWniPX8\\/n1Yi8HLeIWScx7\\/HRCMKtNuPOttMIcdddcS0000kuOPOuKCW\\n2220gqcccPmoSj65y4ZCEAFRAAJJNgBqSTwtxMEOmnMvNUd3MTzdXZDmMi8PNDHSwxWbYesT\\nR5xZrMlMqDbFYds2r0S3nVq1VajdyXBL0qhqKUrStwfOI2TbrRczDqIzdsXkUdOG6gybio2G\\n+Gjaxmo3pf8AKVF5DYSlWWxw\\/kr4CnVZ6jbanWwHEnbOstfSxuJfCuI54BcpRKm6g69r5m82\\nwRcJ0fdShq+Y2Izk7ydxtnMUWqzllSlOnX0qt6aJZ0t62se0yBsAg3upYBGsal4IkOWlyAtx\\nrS0\\/iBpJ0OlqQkKmZGzsPJ6uJWrUO0bbrFaue3tkhpwtqS6uhPF5tA1mZdR+iyBofIpaHVsB\\npy+MX8Urim0LyWybpsa1qY8EKbJT5A1a87VwvNC0kt1oENOK8wOtpdjJnsF1amMGZrbtJoUu\\nkgF+rVeQlWkhQTZanA+4kI9ICxIXpqgHLeRSGzzFs8pIZphTmvYLeZUo25tsreeSe5TYPiDE\\nWVCyg9IPEeOeHaVBQzHq5x2xLvpHJ0cmraDTW2w++6mcQR+va3e+JlaW4EoAUlyTpNdk6GSt\\naS5rLp6DtF\\/ROIZySO16TgZoJ2eEfMOjdhbOOtOJW0\\/OYY23XZ1taH3Xg6zPXZLzM42tK3Cp\\nLiXkObPYtZlDLTTNe1XFWzKhh5NV2s7O232bFctJ4kp9RmADbQy8s8qYC9bhHYkkC4JBiaSW\\nwnG87kUuWQwlf5wl6gvfpqXJNho24kPWA56RC+SvLcfX48fD7Wh4eYgXKGzbVi3ncAd2WxNE\\ntit1baCYb2jGz8hkpjaB1sFxnUz2je9rhumq0u5sKLWQ2LMwqt6gFks7EUi3rbt9LWxQtLWy\\n+apMlvYhRQ3s\\/wBibccyz\\/Y45GYxmmHUlLNvstAEEbWouPZZJPHUkmM9+fOMk7gRlFeVLbxs\\nMpi1I\\/GE3PrCbpTT6DX3gpaR9UPM02ZlxqQPScTmBuLakSqS8mrEbwSqZqBZBPpJTKSosOYU\\n7VEL1\\/uJt7oh80PRB0qbhDS6do6YzFp7YbKansObppEm8iZCti6zO1emyMq4yrUzW+h4tM\\/R\\nKdWgOtZ9uUTk29NeuhLkvgfU5Bg7Mrert0WHQi0h0qGuuVq10Ss8rU1SXG2pRyYbAz2Q105y\\njnsWLgdBS3I0hpO472ZxxYyG86xnEpyJ\\/c7uBJG+OFmMQ7nfBSJqXZSSAQzJyxzy\\/wDtzbx3\\n+zcIryp+VPsxls4p6cRVJQBKCxSm2wV3NiUzs5InLuuFKSdVaAkCJXJeTAxdJnatOkEgrDb8\\noyeF7ESU7bjpryCtxjT1o8aLGK+jtQ26RitbsrSalel4Sy5T5uqUjW5QSqJenSbUpNT9Nfm5\\nJE9tVTizJp1lKYKHUrmApxDO1WHlVrFRrsumVqrwn5dL8rNIZeZYKETMm8mZlH0JQ2jUel3m\\n0OtrTqqSoZkfVjjtc9A9vfHE21bGMhjzE71cpjM+yxMlTzjVQbl2nm3nG2GlIQmWmZpBZS3L\\ntltSnM4T6Cgoozr6UwZhlnCNBkqFLr7SXkGgywsuFxxaO0cdK3V9kyCtTjy1HK2lOugF7BWC\\nEtc9A9vfBrnoHt74rHs18j117j3XlcKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74N\\nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R6\\n69x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrn\\noHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vf\\nB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rk\\nKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74N\\nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R6\\n69x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkclTKjM\\n0qdanZVWTjavOQpRCHm1EFxl0J+shYTw5j54yWAqMJOUx0LpPSQwoTj1hZSEvYw4d0eYXVqX\\nIMJXPX5Z1PcdmZ6ivNNALm7mtltb9Rt7V15qpyRm6Kw3OLmqKiXzJ1z0D298fd2HdBoNTEvN\\nLIplQWhqY11ZNyzxISzOZfghJyameGcuoE7RTTYjpLyc9qpwHitukVp4owxiBQk3lurIbpNQ\\nmFsCXqAuClEs6401LT5JQhtotTalASmVyAbRMGyeMKBNyTzQW6lvOhSUgu3bCihbRIP7IYUe\\n1ZOuchTCgpDyhEFEniSesmECST7h0Rtx5WfQ5Ro\\/4tMYtWJSjKYSYy1CemyxKtKEhaOIv0s9\\nXLeQlDZYk6dXWQ7cVtsbQeam4KZJSzEjQWDGo2PqTlCAFHUKSlaTwKVgKTbhcgi+uhuL6Ex8\\n2qzSZqh1Obpc4mz8o6WyoAhDqCApt5u+pbebUlxBOuVVlAKBAIsWrIZc590XE5DPwYQJz3mE\\npBJzH1dd3R0jXITfU8N3efui1RyHsEIndx5oqo5nP1QitXMObj1\\/o9\\/ZGUkWHeerQ7FpOZJ6\\nYQUcz1Dh3+OqL1nLd08ez7YQUrIdZ4Q8hPE+r59fbBFizmcuYe+EFnm6eMXk5DM80Ik5nM88\\nOQtAub8B8etfuixSshu48B8TCBOQJ6N8XqVmd3AeM4QWrmHp7ej0eOEPJFh3nU9da3h3rq8W\\nHeSemCCCH0Cwvz+HX2QQQ0eVrKyHBO7088OHF6iSefgO08IYk5AqPWT1wuFoGt+A+P6obvq3\\nhI7T283shqs5DLp3ejn8dcKElRJPEnOG6jmSfQOyMltO7u1Pj17hAn0lX5a\\/LruixR1R1nh3\\n+iECcgTCizmcujx9nohBZ4Do3+mH4eSLkD2+EJKOqkk8w\\/R6zDAniT1k++HD6uCR2n4eM4aL\\nOQy6fd4+MPNp3d593VzC1ekoJ5dH2Rud5BOUmZrlB7emGGS41T8LMTZydUFIHk8q5TpGQS6d\\nYgkGbnpVgBvWXm8DkEhRExzSFmFNWPIoQAoTFyyDK8wcggU+qzA1d4yIWyjmPmbhnnkYjvye\\nWlIqGnNeM4XlNGhaOF+VZCAgL8oU9feFdCLRVrp2QSmsmZ1xr+cwGtX6TWTLP0jnAi1qEypR\\nBXX0LCd+8NU6dSVEjdmkujLn85WecRrbrNmV8nDaaUqyZ6BNy5sqyimbm5KUUgai4Wl4tkW9\\nJJKQdY6K2Ks3mqSd+esvOgGxA7NhvcBu1ZvruIvuiJF8oKqLKMO9GymlDnlE3euIM+2tISWU\\ns02h25LPIcVtAvaKcqkuWgG1DVQ9rrQUoS5HKw7A2NVOW8uSgJy35BMwQD1ZqPr7IkC\\/KFKj\\nqymiZS0LaKHpjG6ovtbvKG1SzeE0vKLyCjqNO+VziAVI+kWxmlX0S84\\/2Hgyk6krLLOYZSVE\\nbiA0o5Z8N2sT1Z58YiPkoMdh5NWC1ZSnzmYxM9bNe4TjOtMjSwsLMWGpuAFcYj225WbH2Ihv\\nyJo6Ab8PoemLO7fYm1juOnCPv1ngOjf6fHvho+rcE9O89g4evf6ocE5knp8D1QwWrWUT15Ds\\nHCLwQLm\\/L4xTqBc34Ae\\/q9olW\\/Jd6dNvXxpjVNDC1SMnamC0hMTIUkJZm6lV8SZiSlyNdKyq\\nYZpc+sFKSgeSq1yCWtYj7z5LfTi3R9Nurh4LE7VNHmm+T7MDZfNUrjVMl7bKcIWX\\/njZloNo\\nLXkwVtHdsUskdjbL2i3geiZx6SxPuWOU2C6nOlNrbgUZTbeL2IBFhZmH9KTLEE+kp8nhqJh1\\nP\\/6xLNiPF8pApIf0QMGq5tlpVTtJOh0lMvs8w6ms4YYozZeU5rgoVL\\/MKGw2EK2gmSSpGyyV\\nIdjRz8oLpLlR5P8AXOJLpFAxsw2qzuyZU6jUflLooQ8oWCEy7JerLR2yxq7ctMf3\\/MZm0Rjz\\njA+J272tSJl7cT\\/QwExbQjf2VuNr3sbZS5XBmpM+LX\\/IE77fVUlV\\/Va9uNuUQckHdkeI932c\\nDDthXFJ7R8fGcMAcjn4MOEnIhQ7RHAbieVtd3cR174qBXoqChuO\\/7fb8bxyjKtVWXMr383r4\\nerojalyUlQLeMGI9M128pvDQzxQR9Mr5tuihMa6MlD6JHzoUu5jctxnnzz1TJIUARwPs6j1g\\nxsf5L+qiT0j56WLqW1VnDO6KZqFC1l4tVW2qyUJWMwz5tJ2u1OokJaWjW2ikINTbapbzrZVj\\nhqxOWiOzFrE28zfYmySLE+iGSe4jeN8WDsqfTLbRsIOk5QurtM375ltyXG8j6xeAsNTe2pNo\\nl6aHE0NriDLFSiC3bD6Uk5NJKFXA24cickqcLjWeSTrJRvB1G8ou3yomjlnSd0bbh1ZnKqYD\\nVSjaykAShNCxCr8+Uy7oQAuZSLkT5W3tFbJpUkSlG11nJM2h\\/MAXRd0nmQX6DKTIGsCnKVqS\\nWiVJ4lZ8rySrV8zzt+axEf8A+VQW6luo6E92MiZUqakcfrcniVteSMJp7+EFTpQaa1A+JmZN\\nSrG2dLrzGylJZKUMKClTEv8AJLnA\\/sKwgwCFGUmMSyxJvmSTieqzYBBF9G3xa17JItpoLy20\\nsET9Xc3AfRT\\/ACB\\/ISkv6vS0PffTUWjoYLvbSzSnNJDNXnmxluIzblXslc+ebxy4eaU9ZV28\\ng5jLnHujozA18fc5VGd30dbcdOROsNvISSQT0DNg6u7eQvfxju8HIg9ES6vt5avUE8TMKWP\\/\\nAOQJX78326mOUJoWmHe9ZPtsft3+uHSDkcun3\\/bCyTkc\\/QeyGw38OeFknMdfPGijDWPzvbv6\\nHLhwh0Dzg7+I8dBhcEEZj9HVDRB5vV3QslWR38D7IQtNxcbx74bh4lWY6xxhVCuY+ju8c\\/bD\\nUEg5+CPAhYHMZ9MMkXFuhBDtKtU9R4wtDVKsxv4jx47OuFkK5j6Ixlp3\\/pDlx64ceEIUm+o3\\n\\/Hr7oUhVCsxkePMero6z3QlG\\/HkirJ0Vqla1XvfGHA23cTrxpV9zNDl63cyJm4WKHJmnUKoU\\nx9iy61OuWXOtB6bmFpn5ilJrkrMSbymZtxotNRr56t4coqZSZxVXJfDdHfnpeQfrc5LzcxJS\\nDk0FhhycEky860w66hLBfUhLDTjraph1hnO8je4XwxUsW1QUilBpU4Zd6aS24vKpxuXCVPJZ\\nFj2jwbUXEtXSVpQoA5rA6msFNFjSM0hZpuXwXwbvm\\/WFuhhyt0ujOytqyjwd2BbqF41Y0+1K\\nY5tNZITUKzKn6N4nMMOlG3fBnkCdIC6RJVLGrFCxcJqe8EOzNGt1ibxHu6XAzU5JTaJeYt+0\\n5Z9wgMtzchdFel2NpttjNbIS7sgiq6Ri5KUapViWvIUSmybLcpImdQ2RKyzadm0zKUim+TSM\\nkhhtIDbIfnJdtAAS2E7o6Vr2Il63NtBWLiqcwwoKC5Nl3yKQUCo5pVIyKZeVWMvMBW0tQRu1\\ngDlFe4r8qryaMDlcvQ0Yt2wVdnTNIMKwnhRbrZstCqhUEt1dSVLvkelJCpSzqU3Q4pBTn6Lw\\n75Nk++G3q3NIl0GxU2656djY3EtKLUbjcoOVBlQvYoSoG2P1hckTyemDqWHsRahcmLlblW0u\\nzDd6XlMy0l5UATtJe1cPW6C+ZY7i3JVaYrLbhzDrrwIjMWzZrRewSQlnBTA+0LVdYaW2ioWt\\nZVt2pMzSXG1oX5XWmpU16bW8nJt56eQ+6prNCysANx0VBHO+Iv8A2gO0p3tGNn+DMA7OpUk9\\njMylJOIK+gHQB6qVQpp8yQkJupdDSpa05lEpOQXXRNiGC6QEKW07NuptdQQ3KoURbXM0FTl7\\n3IvOqtrbXU5E1PSPuh85Uui0enNkZEzHlVReB3Zarm0kmd2\\/MKllnrH4XwFRxdxCqeuHrknG\\nEK1hqU9uVpuoFE7kOSUvLvDVGQSsuqWOO0zzjrWCOdsTeUdt2xgp013arjNxt6\\/bStMq72H5\\nB26UpKXKdh\\/6MkVN5UizRl+zBJUE5lKJsGTwnhmRCfNqNIJUm2Vx6XTNOptaxDs0XnAeagq5\\ntv0F+Wna3VqmB85VKoT5Cgc52emZs5\\/jHyhxfnDLm3b+aON2nV7fshOCKcm5ybqD6pmfmpme\\nmV2zzE4+7NPrtuCnn1uOKA4AqNuEb9tthpIQ22ltA3JQkISN17JTYcybDn3XU2nV7fsg2nV7\\nfshOCMaw5D2CHPQ5H3\\/Pqx7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/wCfVj3XU2nV7fsg2nV7\\nfshOCCw5D2CD0OR9\\/wA+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/n1Y911Np1e37INp1e37\\nITggsOQ9gg9Dkff8+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/n1Y911Np1e37INp1e37ITg\\ngsOQ9gg9Dkff8+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/n1Y911Np1e37INp1e37ITggsO\\nQ9gg9Dkff8+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/AJ9WPddTadXt+yDadXt+yE4ILDkP\\nYIPQ5H3\\/AD6se66m06vb9kG06vb9kJwQWHIewQehyPv+fVj3XU2nV7fsg2nV7fshOCCw5D2C\\nD0OR9\\/z6se66m06vb9kG06vb9kJwQWHIewQehyPv+fVj3XU2nV7fsg2nV7fshOCCw5D2CD0O\\nR9\\/z6se66m06vb9kG06vb9kJwQWHIewQehyPv+fVj3XU2nV7fsg2nV7fshOCCw5D2CD0OR9\\/\\nz6se66m06vb9kG06vb9kJwQWHIewQehyPv8An1Y911Np1e37INp1e37ITggsOQ9gg9Dkff8A\\nPqx7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/59WPddTadXt+yDadXt+yE4ILDkPYIPQ5H3\\/Pqx\\n7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/59WPddTadXt+yDadXt+yE4ILDkPYIPQ5H3\\/Pqx7rq\\nbTq9v2QbTq9v2QnBBYch7BB6HI+\\/59WPdfnsU8Jbb0tdHW\\/sDbqLLVSnaUoW7WJlBcdoVxyA\\nXN2dcrakNqdKaZVWW5apsy+T8\\/RlTsg88lNVd1oSt5WlcOH92XJY930x+i3RaNcqluXDSprU\\nLtPrFGnXZGflVOIU424GpplwImGnHWJhGo8w4604hcTcLSr6rbr0nUtYiWK\\/Jp9KcvpJJ9QT\\nMbuBLeSJhtI3qdZSMt5jRvy3WjaizcULQ0k7alCLcxcYRbN6LYbHk8piBblMb+aZ1x1IQ2lV\\n12lKDydlG0W5N2jWp+ZdKp1Gf1T8mraIrHuzxqm1B7tcQ4LMvR55SyVPzdLU2TRp9wkqU4pc\\nuy7JvLWorcmJCZmnSO3STxr5Q+CUy62sSyTQAFxMZB\\/1d10BwEWF\\/NZt1CkgDKlicUCSlmw0\\nWqVrHqHCEFq5h6e7xz9kXqVkN3E+PHb1QgTkCeiOgUJG+2g3fPrjHKoFtBFFKyHWeEIEgDM\\/\\np6ouJJOfgDwYQUrM7uA9sPpFz3ceu+CLSecnfxPjoEIKOZz9A7IvWeb190IqOQ6+aHo9AJNh\\nx665RYs5nLo9\\/wBkIrOQy5z7ovO7jzQgTmSemFoFzfgPj1r+uHgLADlFqjkM\\/QO2EOv07+fv\\ni5RzPUPGcWw8kXNvWfCPYIIITcXqpPSdw+J9Hvyh+DfCDytZWQ4J3dp5+OXPu9GecMn1cEjt\\nPw8ZwspQSCTzD1no7TDIkqOZ5zx5oWgXN+A+PX2Q4r0QEjjv+fr+yLFnIdZ3Dxz9EIKOQJ9X\\nj2xco5kn0DshFZzOXR4+z0RlpFh46mFpFgB7fGLCQASeaG5PEnrJ98KLPAek+PHNDV5WQCRx\\nO89gz9\\/whYFyB6\\/Vvh1PopKj0Pv+FobKUVKJPOfZzCG6jmSfQOyFVnIHr3Q3UcgT6B2xltp9\\n+g5cIEDeeen3xIk+TiU3baTWPNaCmv8Ac7ApmlaqkEvK+d8QbUnCptz8FtHzFk8gfsiiwr+9\\nZRJ20lZlCabacqFpG2n6m+EZZKUJaXkmtcEZAJSZoJOYOeuCNwyiO\\/8AJq6AHq\\/pe3QshHzf\\nSMFaCyFSmttzWZ7E+oTJanSsbPyX5hlBMSiG3A\\/5ZLvOLa2DQfkA6S72tN2hL62eylqy7qZE\\nZB9dNbJ1ufMy+9OWQ1cj9ciKv8p+dMl5N2OEosFvt0OTAvYqE1jCjNO8QT+xy5awIuAVDLmj\\np\\/YfL5pmgk\\/VW\\/VX9Nf2tmcQDx\\/PbA13b+RMNn5QNU9tino7UfZAeQ2BelSEwXM9p863DS5T\\nY7LZjZ+TGjFeuXnNt5SU6jZa1ndJ1hAikTasxkuorTlvz8yWliSebLzwB6Y2w8vXV2ZnSxw0\\npLC2HFUvAC3nphTT4dcZmajiBiOvyWYbSCZdxErKSs2hDh13GZ5twpShSFK1QWIkihqURltJ\\n19We7M5IZRmcufzMuwDKNz5PMp5l5O2zVm2XtKS7NWNwT5\\/WKlPhWpV9YP5t9rHQJTZIrja4\\n72uOMTqve1RbZvp\\/UJaXZtoBqOysRvFiCTqT9g6rVSek7h8YZE5DPohZ5WasuZPv8c8NnDze\\nk\\/AcYtJtO4c9T4fq98VikWA79YmafJgaItrAjSiuHZSwTVMW7PoomEZCdcVQLOdnlNTCtQKM\\nq0LlQuSSXVhLr08UtNZlTpHcHyaKiJp+gniZWC1KCauDSgvZzylrdMrp9Nw0wikJWVm1qbSS\\nJeeRVpmXaQt1ptueU5r7V5xDZHZ+AGyzg7D6FCxVJdqBqLh59x1J9YcB8DyJtZ1EQE0qTF96\\nFq0t+e6tR4jio37x4kSKI1PctrQEV7k0tIhSW1uzVBdwsr8mNsGUtrkcYbBl551wEBLyW6TN\\nVJaGj5zjpaLZ2gbEbYYwP5Te2FXdyf2lxSkMl3yPBO8Ln1A205kLKlBei3Sl86mTCaCp8uJB\\ndQGi7LjbJaz2uKGBNYaxDLkXD9EqrWls35SRfSCm4IuCQRobKA0MP1FHaU+fQBcqk5kJFr3U\\nWV5bd97R5yqTmM\\/Qe2FkHm6N47PHvhqk5HqPHx454XBIOfPHzzULgjq\\/WkU2RcEc4esryOqe\\nB4dvjxwjOLk8an836WOHTBc2bVXkr1pjh2obQo\\/cTXqgw2sHc6XJqnsNtMneuYW1qHWyScFw\\neBG4+484jJrRBqxpOkxgrOBeoXb6pdJJAaJ\\/3c21EKcns0HaJqGrmn6UZ5sfTakQbaFJefYF\\nxpJgAmawriBhNx9V1dKmw2rdoUuZT4iJDgqaMljHCk0bgS2JKK8rXehFSlVLT4FII9d++Jn+\\niZNbDE+daJA8ttKqywzQokhNQo84dXIhKCfJd6nCRqncNcojUl8qPtryvR\\/0Xrx2ST8w4xXZ\\nbJdLTpW2brsn502aXh9ChDosorW05k46plC2c0sPxs70ap8yeMVrNqWQ3PM12SdyWvLJdEqD\\nzQyT9bOZYZA1gW0D6TzSkRiT8pPtxVc5O6jVQIKhZukZhpcaj9KNRMzbGItnhRDWaMyq6gjO\\nZKWfPISTMFlK4v5GE+H9lrkoCCqQxfWZRXAgPSNKnRodCCmdOU23hSd4IjqrbVL5np1Sr\\/la\\nTJvi1iLsza+AtY3YGbiN9uEQssCXs5S5JfP9imKY9llw27c6jPPnJ8nG7my64yBQcxlzj3eP\\nhGM+Bb+rU6\\/LZ73ZGUf1czwYmHG9bLhu8pHHeM\\/N54yTBIOYi6cToKK1Nm2iwwoeuXaB\\/wDM\\nD0I45nxaad5HIR60J+28O0K5jz8Or9Pv7YWByIPRDUEEAj09R6IXSrPjxHtiOLTxHr+cYR79\\nx068et+joHnHohZJzHWOPfDRKstx4e6FgcjmPT1w3DJBBsd3A8OucO0K\\/BPHm7Oj0eOaFkqy\\n48PG+GgOYBB48DC6VZjrHHv9MNLTxHHf3fr+PjHkO+GRB8ePGULAgj3johohXMT2H4QqDkc4\\naUm47xu+UEPEqz3Hjzdf6I26clZdKmapi5Zi1kmakrWumRQVj6L5tmKnSqm4GzvWXTU6ONpv\\nDewyOe0GWoUHPeP0fbHaGEmMd84G3pTcQrBdQ5VaZm1UKDNTJlKXeFCcdadqVq1d8MzJl5Wq\\nJZa8nqKZWZcotUZp1aZlZl2nIl3a+2mYSmMbYHxDhqTUwieqMswqRVMr7FkTslOS89LpcdII\\nZS87LJYW6oZEJdUpz8nmtMtnmIGMKY0oVemisScrMuNzvZpzrTKzks9JvrCNM\\/ZImC9lBzEt\\n+hdeW0x5maS6y06lIIcabdGR3ariEqBG791l19MX7f8Acfyv6sY0aOGkHYuPmHFvYgWNUlzl\\nvVxL0uZSeS0zXLXuGSdMtWrQuiRZmJn5sr1EnguVn5NTzzQc1JuVmZylzcjOO5Hx8f61RqhQ\\nanO0mqSr8lPyEy9KzUrMtqafl35dxTTzLza7KQ604kocQdUqSfzbKP03kJyUqUoxOyjrcxLz\\nDTbzTzS+0Q626hK0OIUkkFDiVBSVDQpN+dnG3\\/cfyv6sG3\\/cfyv6sN4I1VvD2jrj8eRjNyp5\\nH39cfjyMONv+4\\/lf1YNv+4\\/lf1Y1I8pHfekPo94f3XjFgxO3Jc8hQ2WbouC1nLmuKTlpC0pN\\nfk92VOk\\/NEyiaZVbj0zIVuoMg+QSlsmpzR2CKavW0BU3l1dIyXUr5xt1yeRqJSymXxEuaSUn\\nLW1i6uYlKkp0kauqMm1A6ylKXrDV6c2b+SptC2sYZTirBM5QqnICYMnMsOVGVk52UnENsurl\\nn5eamGloWlDySFmzTgCuzcUUrSmD4h2hYVwtUEU2tzM1KTDjCJltQkZt9lbK1LSlaHWG3AoZ\\n21oUEglKhYgb4m17f9x\\/K\\/qwbf8Acfyv6sQ77e5fnEFhxsVvD665dCG0MqckcRaXXlKSEec6\\nGKtYtPSHNdCNUmacdKFKC5krTqOZMWXy\\/wBY824yi6ZXEGkOFQ2y6pY1oVOngZFfmzFtVuVq\\nLmSmywrOlt\\/sqF+d56mttVfIp2\\/UtKlnCrc4lIJIkJ6VqDp\\/tWqe5OKUbcLg3sLXJtjyu1HZ\\n5OKCWsTSaDp\\/RUvUpIXNtM85JsI3m2iuF92sSeNv+4\\/lf1YNv+4\\/lf1Y0r4f8tFo2Xg5KsuY\\nl4dMOOuMpcbuBN0YbqaWshJD09eMk3S21JzzdfbmFSaNVThdLaddOd9j6YmF18yaZ+jzLFXk\\nCpKDU7TrlCu6loWtOskLnadOsjJad6dm04pQGerq5mKZxFsc2mYUJ+n8HVumJBtmnJF+UuTu\\nCUTSGHVXuLWb1vpcWvMafU6RV\\/3JqtKqm\\/Sn1KUnCLAFV0sPLWCkG5BSLD62Xhlzt\\/3H8r+r\\nBt\\/3H8r+rHW9KxUsGrhKZe5JKWdUP2KpbalrSokAJCp5thha8+GzdcB5+G77xp+XmEJel3Gn\\nmVjNDjLqHW1j8ZDiMwsdnbwivZiRm5RQTNSszLKJsEvsONHS24LSm43kEXBA9mwU0pH121I\\/\\ntgU37he1\\/dDzb\\/uP5X9WDb\\/uP5X9WG8EYtvD2jrj8eRjzKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\n\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/ALj+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48j\\nDjb\\/ALj+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2j\\nrj8eRgyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\n\\/wC4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/wC4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkf\\nf1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8E\\nFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv8AuP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv8A\\nuP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5G\\nDKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/ALj+\\nV\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/ALj+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48\\njDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1YbwQW8PaO\\nuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/wC4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/wC4\\/lf1\\nYNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\n\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YS0jMIWtKzQ8x\\nOwoEsicu+Qoq6jZRWWjMN3jaw+e7ODDrhUJZNWXLrtaZfOS\\/m2fqaf75usjtLCStKp10IkVq\\nIl60wuTWkkBKJllJmJRagogkkoclkp5zMgc27oDyacarwdtTozTzpRS8U\\/8AyzUUlX5PPUXG\\nxS3lA+ilTdVTKNKdVYty0xNDMErWDD8dUOWruGqlJvN5wJd1eX84tFpSJlKb3NzLrcUm2odQ\\n2RqkWghOocZcW08hbTra1NutuoLbrbqDqLQtteRQtBGTjZ4b93PDRSs+HDxvjYFynuBwwH0x\\nsUKPT5MylsX7NtYr2mEMeTS\\/zbfD01O1aVlGhrNNyVKu+XuWjSaGFFpErT2NVqX3yzWvlSsh\\n1nh3+iPq2pBQrL32G7UcCQN1xr3a6aR8xahJPU2enKfMCz0lMvSzmlgVNLKCtOp9FYSFJIJB\\nSQQSCDFq1fgjjz9nR6fHPCKjkOs8O+Kk5ZkwiTmcz6OqHALC0YcUJ4k+mECcyT0xcpWe4cPf\\nCSlZcOJ9kKAubDjDqU2F+J+EWLVzDm49f6Pf2Qis5DLnPu8fGLiQASfR1nohAkk5mHgLAAfr\\nML6MHjx7YIIIfSLDvO\\/5QQQycVrqzHAbh8T6TvhZ5eQ1RxPHqH2+7thm4vUSTz83bCt8OIAA\\nKjw3fd8IQeXmdUcBx7fHjjDdZyGXOfd498XZ857TCBOZzjKbTu5DjzPXy5R4kZiVHh8eHs+U\\nWKOQ6+bx1QgTkCeiL1KzO7gPGcILVnu6OPWfs4Q914w8kXNvb4RYTxJ6yffDFSipRJ8CF3l5\\nDVHE8ezx1e2GizkOsw62n2n4da+FoUo3ISOHs6HzhNRzPVzQgs5nLo9\\/jKL1HIE+gdsIKISC\\nTwAz+ztPNGc2m2vLQfOHALC3KJcnybmgFjB3SZugJH+6+Jtl0DW2mtrG2rXqFRKdgfqan3Vh\\nRd\\/vxXq7wwY2\\/wCkjNa93UaSBURLW83MHJwZJXNVCfSQUcEK2cs0pX4S0rSPxSNevyeeiGk6\\nCty1JSSFXTpDX\\/WkrU4y4FNStoYcW2lLaW0hbbSXqA6A1MKccDheeSdk+0lOc2kBNh7EabaQ\\nvMyFLpMqoayTqFTHlgSAN4zE2F5L87JX+9lGfO\\/lkz6pTYaqUzBAqeI8OyZA\\/qgbMzVAjUaH\\n9gB05bK9A+llJB662HywCqTvIapc7M8rF94gnwHnBSPEHSwtBs5aqufOmnZdkgVLItqwMOKI\\nlK20NhtMxQvujKULQdZ5GvX3FbRzJwLKm8g02gxgPZoDduyaxq\\/SOTa9wIJPlTre\\/hmr6M+j\\nVjJDlSri+6fT50jKiFIUJa5rct3Jtp1pI+5SwrStdQ2by3FF0LpCi84khl58uvMobadQgY6W\\n4nUoFKb\\/APnbacRn9KtboO7IcF5DiQDv84xe+zKQNM2LbK5BScriME4SW8mwGV52gSszMAgW\\nue3eWCd5PpEAm0UFj98TWLMTPJOZDmI6uUKJvdpE9Mpb9qAkcgN2kcwTxJ7SYQJJOfPnn3Qo\\ns7gOc8fX+gegw2dVqpPSdw+MSpA489B4dfCIXHoCfJ8LcdonJp4fVVxlaW7zxJxbuRhTksWU\\nvNSl3TNnl1p1Ot5Y3trTea8pOWo609J5ZyqjBHf3Ix20q1eTF0SabslMGasq5bjCC2+gFN5Y\\nkXreAd2cwoKPlHz4JgOpGydDoXLfrZTUEdvYWY83w1h9k2Km6NTQq27OZNlS7X4ZybeqLSpi\\nQinSIGl5VhRB5rbStXvUY2hR0bpJ2wb10dMfLObl0zC7uwVxSthEu55MpD5rtkV2lBhaZtSJ\\nUpdM1s1pmlJlsjk8S1rZd5Q0eZbmG1svoQ6y8hbbrTiEuNrbcSpK23EFKkrStKylSVApWCSB\\nlujcvtB5l1lX1XW1tq0uLLSUm+h4E\\/DlGW4gONuNk2C0KQTyCgUm3tjyqQrMAjdzHt5\\/YYWQ\\ncxlzj3R9BfVuOWVfV52e+laXrVuy4rZmEr2gcS7QqxN0twL2zMu6VpVKZL2suw6CfpGGl5tj\\n5sHI59Hj3R84X2VMOraXbO2tbawNQFtqKVWOlxmBtoNIpM7zpbuOtu6HSDkcuY++OysJa4ba\\nxUw0uIKDZod\\/2bWgtRQEtmmXHTZ0LUp5DjISjYaxLiFN\\/joWgZR1iDmM+mHku8ttaHG1raeZ\\nUlxtxtakOIUhQWlxC0nWStCgClSclJVvHMY1s\\/KInZSalXLFublnpZwEX9B9tTStP7VR5e0w\\nth5crMy803o5LPtPpIuCFMuJcSRbUEKSDfhbjE3HBufNOxUsCYz1de56XIk5KPm1N9NNUPNW\\nnIKE3v8AwBuKkrQCk8ny59ot3fyXOk6ymXLs7bsphrd8g4lTx8lXb+LliTlTmNm060h5JoHz\\nwwoP7VlpL5mdgX2GFDpnDq62ZtFiXikpSzNJte50FGeolp9MjVEqQFbYaoQvcCXQAd5Ud0bC\\neUKstvEHQT0wbSU2t56o6N+MUzTW0thalVui2LW65QAUGUnVqbFaptPLglpZU3qJPkim5rYL\\nRzf5Fs+tikYzo7tgum4lpc461ey21T0quUWSBf6\\/0SUDSxKFAmO5NrTCZqVl5luxTOUWebaW\\nRdKgEB1tXqEyFcxcHSPNIwWmg1d0w1rHKao041q78ituYk5gHLLIqCWlgFWQyUoJOZIOVvV4\\nEYY4VzAl77ohUfNeM9LqyG\\/6WnzYbGZUADtg2Qd5UNZASogRmdHWuL2QiqJOtnZRpdzzC3W9\\nPAIHttHD9TTaZB\\/SbSfYVJ\\/\\/AFEXJOR6j4zhcEggg7+OfjphtCiFcx9HdEPIsSDGvh2CCMxC\\nyVZ7jx9\\/2w0SrVPUeMLA8CO0QypOU9x3QkgEWO\\/gePXOHSVZHfwPjOFgSCCD9o7oapVrDrHG\\nFUqy3Hh7oTDViDbcR1p9nPhDwHMZwslWe48ff+iGYJB946YWBByIPeD3wypNj3Hd8o8h2lWX\\nZziFgeBB7IapVrbuf3wolRSernHjnhpSb6jf8euu4jtPATSbunQ2xLexLpstUK\\/hDdz9NlMd\\n7Dklhx5UlKI8kkMT7YYU24EXVako4WapJs7Bm6aAw1T59xh6nyFTpssXCzFO0sT7Rtm7rQuC\\nn3Pa120eRrlq3JTXi5I1mkzzW2l3ElxLTzUwlILb0tMtMTcvMIek51hicl3mUw7FJQ4hSFpS\\n404lSFoWkLQtCwUrSpCgUqSpJIUkggg6qs47F0PdMCs6AuIzNn3euo1XRJxLuFhbxS7Ozkzg\\nbdlQfPlFboks2Xyq2JtSlT1ao8qx5VMSrK52lpdrVNdlLj58267CWdqdMexBhmWCNoNIlATJ\\nspSleMKXJtBKZRP1c+IaZLthNOJuqqSDaaUbzEpS0Ho7YltYXht9rDNdmCaK+4RIzDqjanOu\\nKBU2VG+WTcXdSx9VhalPpCUl8OzIdcdB9nfBrjoPs746\\/sm96Nd1EpNWpNWkK1TqzT5Sq0Wt\\n0qbl5+lV2lT0uiZp9Tpk\\/KuLlpqWmZVxmZYfl3HGZlh5L7KlJUsJ+12yfGfdHy8mZF6Uecl3\\n2ltvNLU24haVIUlSDYgpWEqBBBCgQCk3SQFCw7mZdbfbS62oKQsBSSCCCCARYgkEEEEEEggg\\ng2McXc9vUe6KTOUis02TqslOSc5JzEjUJZqalJuTqEo7I1CQm5d5K2piTqElMTEnNyz6FsPs\\nuFLiFlIyh06Y\\/JiYWYBYqTFPpMpdkvYF0pfrNlTYrKnUtSwcQmp0CZmJyTmCuft6beTL5pdU\\n45TJmlzsyRMzTjTEyrbJ8Z90Yv6UejvS9IrDqpWcFS0lcTe2rNmViYbGVLumTln3JZl97VLj\\ndKrSAaZVtRLxbl5hU40y9NSkoEX\\/AOTxtmrGyPFWVNWnpDC9eLMpX2mHnAy0ltThlKmWkE3c\\nprjzriilC1qlHp1tCFOuIIqrbBgRzGmGHlU0FGIaSlybpLjasi5ggAv01Z+qUTraQlvMQETa\\nJZwrS2l0KhXTWhvhu8VGUr95ya1KUQlc5RpphCSDkhCDRGHsgSPOcmXSUghStY66fkaloTyq\\nszR8QH2iCcmqlb7cwFA6uQ8olqrLahTks5iVXr5hPmapUrPeu0Or2zW6vbdw0+ZpNet+oztJ\\nrNKnW9lN06p099yVnpKYbO4OMTDTjawkqSojzVFIzjj0qI3cR44R9Y5fH2Kkobelq64+04hL\\nja1Ik5tp1twBSHELcYdStDiCFJWhVlJIUlW4n52Gp1Rham1vuocbUpDjbzaM6FpOVSFpdQVJ\\nUkgpUkgEEWOsa0qvodYlSSVrpVVtesoCTqtpnJ2nziyFHJIam5ASg1k5HWVPjeVJ+qkKc67X\\nhPjvh3PJq1Oty8KPUJQnZVez5x6ammUK85S25215yZmmG1aoUc1IKCEpd1SnJO3YEEZg59kV\\njeS+1TECEqanpWmVFlacrqHpdbS3EEWKVdm72BSRcELl1jXdbSMpnEU80pKlBpZSQQoBTbgI\\n3FKkKABHA5bg2IIjX1YnKF6ZmFUwiTbxcuSvMS+oh+jYlSkteSnEtkJDb07cstMXHLjJOqfJ\\navKOq36y+cbHMH+XRuqiPS7GKuEyGwS0Ji4sJbknqNMNBJycKbVuOYn251TifPRr3hJIQpGy\\n1XEvazHyFYt237hZ8nr9Do9bYCSEs1amydRbSD+ImbZdCTnvBGRB3jzo6NuTRYwhuBLi5WlV\\nC2ZpwE+UW\\/UXWka4OYzkakmoyCUEgJU3Ly0vrJJ1VoX56YvWqLsPxuhbeLNmdPkn3gQueobT\\nci9nOUds8\\/SjSnnym1wmYanEkWQpC0XBsvD+23GVDKEy1fqzbSbDzebeRWJIJF8yRLVFLyGk\\nqub9i2ldzmCgsJWJD2B\\/LG6M+JSZOTTi\\/SLbq7oaQqgYv01yx5xsu6gQgXI8tu0piYcdKm0p\\nZuWovpWk6zOzdZLmze28fbUrsnKzq21Ikp1tLsrVKVMy9bpMwydyZhmblVJW40sglJl2pgc2\\ntuiBJc+hdckql1+0LqpdZbHnIkqzLvUidy3fRNzDBqEm+5nmdd3yFBGQ3byfiLbr2lfoxTjk\\n7Z1wYm4cS+1S9Nu2vWJ961J9baiUGrS1NmJ62Kkgg66WavLv852JUF5UHibyINlmKy6\\/s6x0\\naXOO3U1Sq822oqWsj8m2\\/KtU2ZZbQSRmXSamsggKcUfSN44d8phL+RnENCp89ewM1RphymTa\\nbAemqRmzMMTCyR6WRyVQCSpIAGU+jZS7jodbbDlKqcpOggkttOpD6QCQdeXWUzDe8cVtJ4iO\\nY1x0H2d8QicF+W5x4s1MpT8X7GtPFinsrBcrdIc\\/U8u865SFPuP0ySqdrTBYP0rUtLWxSVPL\\nKmVTrKXG3Jfc5o\\/8tJowYjNyNNq+IVRwtrr4bbVQ8Y6emRpeuFhDgaveRmKlbcvJNkgNPVav\\nUR5xgpeXIt6r7bHJWP8AyN9suBw9MDDsxXqayTafw8fppns06qcUzJI+lGG0pGdTs5SZNsJO\\nZSxZWW7qHtN2f4iyIk8QtU2bcIAkMQN\\/RbwJAyoE2tS6a64o3SlDM2tRUAkD0kZt7WuOg+zv\\ng1x0H2d8dI2jjbbN10uRrUjMSFWpFQb20hXbaqcnXKLON5lIfl5qUeW080SkpLjExNkkEcY7\\nTkK7Sqk2lUjONv6yc9QKKHQkn6ymHC26knPPNbROY4cw5inKNP09xbU3KPsraUUOBaDZC0Ky\\nrQspuEKSQQpKylY1ukW0nymHUoS5kKmlpStDrZDrS0KF0qQ62VIUlQN0kKsRqI5vXHQfZ3wa\\n46D7O+Gm2T4z7oNsnxn3Rr+x7j7R1+s91mYd646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0d\\nfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3Q\\nbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74Nc\\ndB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z\\n3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T\\n4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQf\\nZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91i\\nHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+\\n6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8\\nNNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3r\\njoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7\\nHuPtHX6z3WId646D7O+HEpPOSM3LTjBKH5OYZmmVHVIS9LuIdaJGsOC0pJG6OM2yfGfdBtk+\\nM+6HWC7LvNPsqW08w428y6heVxp1paVtuIUDdK0LSFJULEKAI3WjxSUqSpKgFJUClSSLgpIs\\nQRxBBsRGBHLo4Ty12YO4LaRdHkwp+1q6\\/ZdwTLRO3Xbl8yCKzQHpsKzSJWjVyizUk1qFDiJu\\n6VpebWlYVLxhCSSST9g7onG434bp0idCDHTCZLKp2tKtCuPW2wUpdeeue2wxe9lto1tZTSZi\\n4qZI05SknXRLJe1DkdSINqlZ7hw98fbbCNebxbgvB+LGynNX8PyE3MhAslufSyhufYSLaCXm\\nguX3kktX+rlj5xbZqCaJjObKUkNTYKgqwAU5LEMX7yuWEq8dxKnVEi9yaKVmd3AeM4SUrLcO\\nPu+2KqVqjrPCESeJPaY30VQlN9Tu+P3RQkAZmESSSSTv45+OiKqVrHqHCEVq5h6e6Hkptv3n\\n3Q7FqjmeoeM4t6vB7YIIeQnifV8+vHlBBFq1BAJPoHSeYRdDN1euch9UcOs9OXu+EOR6kXPd\\nxhMknMnid5PjKGTi9dR6BuHZCzy8hqjn49nR4HtENVHVGfPzDp6fVDrab68ToPn13wtRuQke\\nHd7uXuixZ5vX48c0ILOQy5z7ovJ4k9p8dcIE5nPp8e6MpIsAOiYWBYAcotUrIEnfzDt5vYIb\\nqVqgk83TxJ6O0xes5ndwHCGby8zqjgOPWfshaRc24DU+7Trxh0egm\\/E8OuXH2QkTmSSeO8nm\\nhuo6xz9Q6oUWrm6ePUIQWchu4ncO\\/iOHbGW2nu36Dw+Xyj1Atrz3eHXw74TWcz1CGj6t4QOb\\nee3mHx9IhdaglJPq7eaGJOeZJ6yTGUBYW5QuJ9nItWt9y\\/JuaPRcaU1O3D+qTdE7mXcnTVcU\\n70+bXEpcaZWhK6FL0rMaqmlLSt5l19pbTivu8X53yvEq7HQdYJn2ZXLWB3yMjKSRG4JG7ybU\\nyzzTll5xyUe1NAG0U2NoRaJ9uagafYwCwwqc62EhGyqdx2nTLjqrR1VupUpup1aZbU6FZPFJ\\nf1W9bUTjpfdbl03BeFdnH0tyTVWuCqzEyoFaGpNqcm5pbp2e2WptqWQVJSzrq1EgMjKON\\/Lg\\nqCvwKwVRUJKjOYqdnUp1K1fRlImpRICAL5v\\/AIvlAF9SEgekL9u7HZXzdoOKsPNaBIy6zuSk\\nuCXWtRVqLXlio303m1rx59ml\\/cTd2aV2kpcbCy5KVXHXFaYkHCACqmovets0wqAddAWZBqX2\\nhQ6tJXrbMlOQhpSm9jTKc0chs5CUQd2XnJYb1iQCd5IJVxyJ39XStdq8xcVfrNcmQryuu1eo\\n1aYClJWRMVOcfm3QpxLbKFHavqBUltpJ4hpI80d6EBttLaOCUpSncBklAyGYAAG4c271ZR3S\\naeKRQsO0dIATTqbKSAsQRlkJOVlgRu0sk28NNLRyBWJkzc3MTShZU1NTMyoci86XCPUV+6LF\\nHMk9fqHphm6rWXkOCdw5+0+OYQ4cVqpJ5zuHjqi2SlJipTsnTpRCXJyoTcvJSjRUltK5mceQ\\nwwlTiyEICnXEgqUpISB5xyyIZQgqKUJBKiUpSALkkmwAtvN7ADiTYa6RqRr98eojoHWoLF0J\\nNES1PJjLPUXRrwTl6g0pcyFfPLuHVuzVbdKJpa3mTMVZ+dmDLqKUy+12DTbTTaGkEZH2lbVP\\ns+1bZtKm\\/wDyPta3qNbkhqtJZHkNEp0tTJXJlsbJpOwlW8m280N\\/UQSkCCO7pRhMtKysukAJ\\nl5dllIFiAGm0IAHcAkWty8ItxlBbZabuBkbQiw0AKUpGlri2nDl4R9LBBBGRDkea7yhlpiyN\\nOrS4t1DCZVhvSCxQrElLIbDTUvTrnuqo3RS2GG0pSEMM0+sSyJcAfsIbI3ERh8hWYy6Pd9nC\\nNtfLpWb9yHKT4y1BqWXKyl92\\/hhekqgoWhp\\/bYfW\\/blRmWCttAUiZrVtVJ15aVzCfLFzADqP\\nPYY1HpPBQ7R4EfPzF8n5hijEEoEhKGazUkICdR2XnbpZIvzbKCNb29G+htTk612c7Otf1uaf\\nQCdDZDq0g20OUgC3CxFodoVluPA++Fgcjn4MNQcxn4ELpVnx4j2xGvGMLxiVfovXAm5NHbBa\\nqaxUv9Tm16c85mSpc1QqYzQ5pxWWt9IuZp7qnBkBrFROWW6QKimU7EjCtFHqublJv2wE02og\\nJQsuU66bcEtNgNvNFlzWlZ53zXmi0rIa7BT5sRi+TsuJFb0WLNkisLdtetXhb7ylKzXmq4Z2\\nvS6Dk4s5NylclWWwpLQS2hOSAnz1yV8A6mKrhBY0yFAlmkrpis88x8zz01S0pKch9VEojdxK\\nSASr68cjeT6v6A2v7X8Mp9EKm5ybYbOiizScQzEvLOpvpYM1htVt93Ad1zHdNWdTVdn+Bqmr\\n8oXaVTm3jvHazNKYL6Cd5IdlXEnhdJt3+VnR5KetPEKSpdVaVK1Gg3a3SKowtLja5aYkaoKd\\nUWlIdS06hTSm3m1IeQ2vdquJSdZMZvx1Tp8WUnCvTn0srOkWESkjbekdiwuhyyA0gS9Dm75r\\nNXt1sJlUtMo1KNOU8FLLTCEkZJYY\\/Y09nS0wiZZaebOaXW0OJ3jelxIWk5pJBBSRvBKeYKVH\\ncGM051UyaF7PMOp1tcBPYuJCrAWP5Y27hawtHFFaaLTyUqsShTzSiN121AceBN7Q4gggiDKT\\ncd43RpYWSrMb+I93T4+MKoVluPD3Hu8dMNAcsiD1giFwQR7x0QwRfQ\\/qgh0CQcxCwIIzENEq\\n5jw5j0ePHUqCQcxDJBB+B5wlSc3iIdpVzHjzHp8eOtVKsjnxHOOmGoIIzEKpVzHjzHp8eOvw\\ni+hhmHgPOPRCyVa3bz+PG+GaVZdnOIVBByIPeD3wypNvDgfnBDtKik9XOPHPDCuUSlXLSJ+h\\n1mUbnqZUpdUtNyzmYS42rIgpWgpW280sJdZebUlxpxCHGlhaEqh0lWe48ff48dSgJB946YSC\\ntC0OtLU262pK21oUUrStBCkKSoEFK0qAKVAgggEEWBHoJBBBIIIIINiCNQQRqCDqCN0dgaBm\\nnJdWgjiBT8A8cK5Ua1owXXUHnLJu+YbmJ2cwqqk5NB1U5LlnXeFsOzTuvd1Alm3DTZl03bQJ\\nZBmKrI1yXTaV4Um6aZTajTKnIVaSqsjLVKkVimTcrP0utU2aaRMSlQp09KLdk5uWmpZxt9h+\\nWedl5lhSXmFKbWrKFledm0K\\/bfnLdr8up6TmRrtutqCJqRm2wryeelHCDs5hkqOWslTbjanG\\nXkONOONn77QJ0+L40Er4k8AcfJ6pVrR2rVTceti5G0zU9M4avz02VLr1AShLszM2lMTLwmLs\\ntSXS5OUadddr9AYXOOT8jc1BbefJ9ltrEpP45wPKNS20STYVNYiw7KtNtN4wZaTmerdHZbCE\\npxGEDPUpFCSmsBImJcJqSlIneptjW2NVM7DDmI37yF0tyk64o3kwbJS26TceZAjRQF5Im5Bl\\nCRLTPYUbcU04hxJ85KtYZ5kZjjn2jjv3iOt7CxCt2+rfoteodZpldo1wU6Sq1Ar1Im2J6k12\\nlzzCJmTnqfOSy1y77Uyy4hxCmlFDifObAO0bR2Frp6fYe6Pl7NycxIvuys2y4y+0tbTjTqFI\\nWhaFFC0LQtIUlSSClaFAKQoFKgFAiO0GFszLSHmVpcacSlSVJUlSVJUkKBBGhBB0IJBFlAkE\\nGNSXKb6KgrtPc0l8PKbrVGnSrEvitTJJGTk3TJRtqVkL0bZbRrLfpLCGaZcSwo50hqm1INtM\\nU6rTLujdDwO5W49PN6eiJnku5JOoekKizLzdMn2lys9KzbDUxKTEs+gszDUxLvIWy9LvsrU1\\nMMvJLbzSyhWaDvja6eWiHN6N+ICrhtWSeewfvmdmZm1ZkFcw3bFTcK5qbsqemFLW4fJGwuZt\\n+bmSXJ+jANKmJqfptTePcvkx7XRPSzGzPEczlqEk0s4SnZhes\\/TmU510RTiiSqaprYUuRFz2\\ntPQqXSlvzJsP8U+ULsuVTZx3HVDlyZCdcScQSzKLCUnHVJSippSkWDE6tSUTZIu3OqS8or87\\nX2WCgJHCFQsHjuPsjjkOKRu4joPN2d3CHSVpWNx7RzjtjskpB3+2OVodQQglRHZ0HP2fZ6YV\\nCge3o8cYaUkjvHOCLwSN4i8L6R6vHfCcEJ6668II6yuvBPC29g45WrRpSJxzMmp0po0apFw8\\nHXZqmGVXNLBG4TomUbzmhWZjGK7tCppW1mLFu5TW5Sm6XdDG0QVEEpSKvTGUrQkb0pC6Q6vV\\nyUXlKGas6ovCzz7\\/AGGJHS8XYjo5SJKqzPYpsBLTBE1LhII9FLMwHEtpIvctZFcjGaxUZ2Ws\\nGphYSLeguziLcglYUE3\\/AItjGsW3JfS00Yaq7W8O67iLZIQ6H5qp4e1ufmKFPpQgAOVqn0p5\\n6RnJPJCElm5KYWVKQzrNZ7HLYXgpy5ekdYyZOmYwWZZuMdNlVtJeq0sg4eXqsJGzdW5PUSTn\\nLVcWg6riGmrNk1LcDqHJnVcQpj7IKSefLt3fZHwF2YVYd3ul03LaNHn5l0qK6i3L+Q1bWIIK\\nvnWnmVnzkfO1VzCmyR5yFbiHq\\/M7PNoDfZbSdnNDrrqkBtVXkmfM6whFgkpbnm3JepouBfK1\\nVWW7gfk9EgWBhnatizCykmlVao09AUlSmZSYK5NZCr5nabNdrIvKvc3cbO9QAsoiN0WBXLaa\\nIuIrUlT7jvK5MHq44lAXTMUaI4uiuzGsAtuVu23116kMyiNxRM1ubt4uJB1mGyNQbZbIxis3\\nECisXDaNxW3eVCmM0s16ybgpNyUZ5WSXMmpylzk3JrOotCxqziyEKSojJSAYL92aF1uzhcfs\\n26ahRnSpS00+tsoq0lvBAZam5fyKclmwciHHkVNzVGqQsnMdNyeEuk5gfWvulw4qt1Uapyw1\\nW7lwmuyrUqrFDa0uJQlNKmaTcSklRJ2QklN6yVA5+brc+4m8jPY7i0uTGA8eT2Ep52600rE0\\nu1PyfaK+rLszQXSpptPAuLmqy5+ilX1R0Dh3ynphWRrEdHpdVHopVMyi3KHUNT6TjgKZmRmX\\nAD6KGmpVBAsSCbx6JsvWKdMhJbmW0E\\/gu5tK47v2TJJPRqEmOQSpKgCCCCMwRvBHSDwPr9UQ\\nV8MOWL09MGZiVo913RR8TpCnjZuUHF+zm11RLK8wsPXBb67Tu6YmMytcvM1eq1MpcCQ60\\/LI\\n8mXs0wn+UOWS8mTk8ZNH67bbWkJTOVzDK66ZdbL7hWSuZatu5Zez3pFlAVl5Obmqy9VsKS6p\\nStmjnHF3kN7ccO53qTTKVjGRF1omcOViVW52OuUmRq\\/0RPuuEZQWpKXnCCbIW6kFcXLSNtGz\\nerBAeqVQoDysv5KryDjrJUQi4TN00zjKW7lWVx\\/sbgErDZskydYI1N4ccstoHX+iVbVjWbHq\\nUwop+aMR7Pui3ly5OZSqarrFLqFpoRkDrKFxqCck6xQVIKs2LN0rNHzEBDS7IxwwavIupCkN\\n2ziZZ9VfSS06+WnZWRrE3MMPJZYmFOMPNIeZDD21SgtuhHO1f2VbSMLLWnEWB8V0bsycy6jh\\n+qybJSDbO3MTEo3LutnWzjbq21DVKzeLAkaxh6qpCqViOgVIqy2RKViRW6M9socZU6l1pZvo\\nhxCV90ZGQRwQrjOeSmHR06q0qy6ehXYd\\/EcIuFcldwLUwFdGq2d3aXUju9kQYyzw\\/qZPhY\\/A\\n7+7x5RvDTpob2F342Ug29YNrDeTw77iObgjhjXZMfgPnsQ2f\\/wDbFiq9KZEBqYJ60tgesOq+\\n32QCWfJA7NWvh8+t2+D6OmuDDvsHq4bu+Ocgj59dwMo4S7pB4aykpz4Z7t+WWfEmPhrmxksK\\n0Av7qrts21w2pIcNy3XRaLs1LYVMoS4KjMymoVSza5hGsQVMoU6PMQtYyZalVGccSzKyj8w6\\nr6rTKC66RcDRtF1nUgbt5ANri7bso4wjtH+zYb0u4++wy2CQTYrcWkA2BNt+m7Q27ZgjCG6+\\nUI0QrOSv560m8BZd1tKlPSdPxJti4ak0Nm08kO0y36tUqg2XGn2nGQ5JhT4VrNFYQoxjPeHL\\nQaB9sB1LOOT9zTjWvnI2fh3ftSUvU2mWzqc7a8jQ3ApxvURqVfztq0tQTLqDwndJ2N7VK6Uf\\nRGz3GdQS4QEuyeGK5MM6m11PtSCmUJHFa1pT3xopuv4XkL+f4qw1JqSMxbfrlPS9awIyspdU\\n6sm+gQgkjURt2ihWlO9RCQOJO7P17j6N0R5bz+UCaMNOS61adiY8XfNpUdRx+mWha9FeSkrS\\nCJt68p+qJJ1EL1XLfH0biSFbVK204qXh8oWqz+s1Y2jJIyyk5lNRu\\/FCZqeuS4jLWpNHsymF\\nnJAXmRW3StTiN6UtK8otOjeR55QNZyFrAM9JNqIu5VZ+iUnswbarZqVVlZojW1m5darn6tgb\\nRic2pbNJHMHcWsPrSnMG6fT6nPZ78EusyZlwf7d5AHHUgGV07UZBnPazsqgg5EF9vWz6NUKK\\nvZDFdxUZGQM4lRO7zGX15deaWtX2n0ZboWV2cu7pj10KboNtYIWWyMtm9SrQuSrVHM+TqXtn\\nrivSrSDnnMvJb2VJY1WJpaV7R9tiZR0PVOU\\/5SDEJKm5DGO60yrqVBuXsfDiyaSWwUpac2dQ\\nt+y26ssrclnFAu1F1TTu3SxsW1KbFp0r\\/wBn9tcmUJeq1YwXQWgR2onq3OuupuRoBT6JPSyl\\nccqppCTvz6axec297O5QKDLGJagpIBStqSkJWXUo20Wubn0PJA1uQwsX3Ag3idyu7KUjeEzT\\nn+Kykf8A5brfDn39mcNVXlIjPVlZpWXTsk7ubMhxQB6vaYgNTmNvKSXuh1M5jBpQJYmvLEPy\\ny8RL0tCUfbnddMyxMSCa1Q5VcqtLS20Sr0uZdllYbl20MvhDnzExh\\/pmXSXF3Fed\\/PiZZEu+\\nu48W52ol+W1NzUylNyVN5TGqdnsXUApJCS0lIVlKpfyB22R\\/8Z2wYPklgjMiWln55Y1FwEO1\\nGmLUQn+Ikg6a74jM15S+FmSPN8NTTxG8TdelJQjTSwZlJo8gdO+5tr6Aqr1ZGtqyDuQ4az6E\\nn0gNkDfu49HoQN8gZkUzhkRnO5Hr3JlFAb+lQ+A8+17RWxvraGkVi5KA623rOtorFzVyeQy4\\nSEkJS1Sp8IdKT9ZrNJA3q+qmFmdC+\\/y2DMXRZ7bp1tZDLtafbTkfNydcpEupRIyJBbGR83zt\\nyoz\\/AP3F8ENgdrtyp+a+qWcFTT6RystGMU3uOaQBzNxfWq8qShA\\/0mNm1hf8KnTf1JoBHrvb\\nnyj0CTfgAJ+axu\\/+fh\\/1SKC\\/W8iV0tYUM9yZtKh\\/GMuk83MmPP8A29C28jr7W77YRk2othtm\\nquBbuXmocKpVottk\\/XcSHVJ\\/BbVnuS\\/sLr4\\/8rLU9VX\\/APh8ef8AuO4DvYbcJUEW1GA58ewn\\nGVjx3XsbetJ8qahfwKR6sUzHG3PD\\/D5x6A6cQJQjfTnwf3Lzax6ylI9aYUTiDSj9eTqCd34K\\nZZe\\/0zDe6IBqNGnHunzLb1KxNpzS2MjLTDd2XnIzTKkpI+iEvSXS1kcwkof3jmT9WFKjbmmX\\nYFHnavS8YcQxLU9K6lNS1pYs3s1PJEtsyqbblG56nrmHmG07XJjaTGowoIBUENrZPkKYcfW2\\n3T9s1DeccKUoRM4enJLMtZASm5r0yQSTbUfW9E20JyGPKfw66pKXMIrbzEat4k7RWtrAJdpD\\nA1OlioHUakkCPQRo9wU6uNuKk1OJUwobRp9AbeSFp81wJStxBbUoKQVBe5Scxn5ojmYjL8kn\\nymNQxI+atH3G+53pnFmkSym8Pb4uCoLmJvE+kS6St62bhn5x4vT9702VTtJWoTDrs5dVMZXM\\nTjq7gpkxO1uShSKxKViTRNS6siTqvMqyLjDw+s2sJGY5y2vitPn9IjjHa5slxLshxbPYXxBL\\nFKpdSXJSdazrk6nIukiWqEi6pKe1lZkJVYqCXGH0PykwhqYl3EC\\/cO4gpGLKNK12iuqclH\\/y\\nT8u4UCap04hKS9JziU3yuIKgpCvqOtKQ6yVtrQpXMQRbrp6fYe6DXT0+w90VVG7yDmfd8oug\\ni3XT0+w90Gunp9h7oIMg5n3fKLoIt109PsPdBrp6fYe6CDIOZ93yi6CLddPT7D3Qa6en2Hug\\ngyDmfd8ougi3XT0+w90Gunp9h7oIMg5n3fKLoIt109PsPdBrp6fYe6CDIOZ93yjvjASsCUuO\\no0dagEVen7ZtJUAVTVNWXG0hJ+sTLTE6sgHPJrhlmRC5018JP1CtK\\/HjDJuXMpTaDiHWp23Z\\ncgAs2jdCm7ttBvMIbQtTds1ykpeW2220t1LhZbR9US8rOrKaDdFCqqlhDUpU5fyhRGQTKPK8\\nnnN+\\/LOUeeGfEawOUaTuXuwhVbmPGFeMslKFum4n2HNWzVJhCUqacujDufRrvTCkjNl2Zty5\\n6BLS4eA8pbo8wZbX2EyGfp15IuI\\/pvZVUsOuLKpnBmIHS0i+YopVcHnzHoiygF1JVXO4izfo\\nm2YI5G8pWg3aka0hFyhTRWu25Ksso+L9\\/wD8N42sbEE2jQuSSczCK1Z7hw957vHRFVK5hw5z\\n0+PHWkSAPcOmOmkp4n1fPr47uQ4opWQ3cT7unx8IRgJzzJPWSYIeSm57hv8AlBBBBCbiwgdZ\\n4D4nqHt4dcPQb4seXkNQcTx7Oj0+7thmtQQnPn4AeOiLycsyT1kn7YZLWVKJ5uAB35Dv7IUl\\nNz3Df8ocJyCw3neevdFhOZJPaYRUrM9XAeOnsi5avwR6e7xz+1FSsuHE+yMtCbC\\/s7hHqE21\\nO8+4RYtWe4cB74RWrIZdPu+3h64uJyGfgwgTxJPWSYc5d+7n4\\/Lv8IeQLm53D4\\/dvixxeok9\\nJ3D4ntGXvhkTlmT6emL1rKlE83AA78h39kN1nM5cw98Pto3D1nr3e+D66uNvgPv6vFhOeZMI\\nKOas+bLIdX6YvWr8H0n4Q3dXqDdxOYHV0n0ZxmoFhe3h4Q7CDq9ZWqOCT6yMwT8BCkhIzdWq\\nEjSaeyqYnqnOStPk2E\\/Wemp19uXlmk9brzqEDPnPDeIak5AnojJnQpsgYkaYGjDZLzSn5O4M\\neMLZaqNpBKjQ2LypE9XlJyadGs3RpaddSVt7IFOb5ba13EvtgX1va4vYXPfbvtw431h1hpTz\\nzTKTZTrjbaf7ZxaUD3nhePRwoNHkrCsejW\\/JFPzdZdqU+kSqlazaTJW5SGZKXKgt5ZSnYSSS\\nQ5MKKTuLyiCqNJeljdZtHRi0irsW8pExR8FcUalLurzUXKmmza2qnNlWze8+ZqKpZoFxJSlT\\nxU6dUKjdNibPfN2H94TIVs1\\/MU\\/LNuAqK0OTzJkUFKk+clSXJlAQoEFKyDwG+NzysN2otTQJ\\nx0dbmNjOV+Xs205BO7OYXXr8tmWqbAKm3MiaCKy6dwJSypIW26EOo4d8pMHE+17YRg4Aq85r\\nsqp1N8w7Ov4kotOU44m31UIprylKUCEoDhHohUdxYaWml4PxlU0gJTLUuaDYOgvJU2adQ2k3\\n3qU8hCRe5JTb0rRCppbe2qdOa4hyelUnsLyAonI55AZndkd26O+1HM5+rsjpC1Wy9X6ekkkI\\ncddOe4fQsOuJz386kJHWTxjup1eqndxO4fE+iPohXFXmGU\\/oslX+Osj\\/APQRxVNH0kjkm\\/tP\\n3Qg6rWXkOCdw5+0+OYRkdoY2Z+qNphaLFhqQHGLs0iMGaDO6xWEt06oYiW8xU3lll+Wf1JaQ\\nXMPuCXmGZhSGVJYWH9QjGsnVGfPzdsbTORNsVN\\/8p1ot095CvI7euC8b7m3UpC9ibFw4vC6K\\nUpSDMSy1CYr1MpUjm0p0smZ262Jhll5smHpYzlbpErYqEzVJBhQG\\/K5NNIUb62CUqJJOgFyd\\nBHko32sww2QD2jzTYB3ErWlNu7f749IWCCCO3oteCCCCCCIX\\/wApQslNL0o8Cr\\/aYbaRd+Ba\\n7aedbQyjyuese+rlm3X3igJdemUSN6UyWL75WfJZaTYbIbYCRHOaXkdQnd+D0Anm9PviYF8p\\nksVyfwU0YcTQ1m1aGKd6WIt4Dc2vEW0pK4G2ju4vJwtdVvXmdgctYZhEPUHPIj7c++OJ9rcl\\n5pjqs2ADc2ZOcQBzekpbtSTxJmEPa63tzuIqvELZZrE3YHKtTbovoD2jTalW7s1xfjbujk0q\\nyPUePfC4OWRHj9MMW16438R7unx7YcoV+CfR3ePgIrAixtx+O6NOoBQzD18+h8I3pclTcXle\\nGWJ9qlYUqhXzT68Gyvz0N3PQmJBPmlJ1G1rtN4o89SSvakIQrWU5KG0R6oJ3C6ZkFLyXRbnq\\nkqlBUTkxMSsjU21DMFKErfnJkHV\\/DSreSN8Pvkq7kXJ4n4l2kXg23XrGka6Wy4UIemLXrstJ\\nNare9DrzbN1TakjW2qGdvqoWjbKErXQuq51r8oa3M9ZNDq0s3v1swahJTqt\\/m79anjilWYJJ\\nXwa49k\\/\\/AJb8qypNAFtjE1NcKNwzec4flqi6CTwVUaU6EgAlS8oNrmOz8GTBq2xKkrUordpE\\nw\\/Lr0vbzeqvtNAC+5ElNNXvuAOlrRCs5fiwhZHKd42z7cv5NJYh27hZfsk39MQozWHlv21VH\\n0F5Cc\\/KbgtesPLDTj7KXnHG21t6nksviVZk75Za1uzSVayl0iQQ6rMnWdZl0MPZk8c3Wl58c\\njzk+dG6H5UThyul6QujJiwGFJZvbBy5rAVMAHUdmMNL0euJaFeaE7VDOKzGsSpSy0ptO5LSI\\n0Y4RzwmbMkmCoqVIzM\\/KE57wTMLnEpOtxIbm0BOW4JyTzbu6azabwxR5tNyWVNMqO82DTjK1\\nE6m+dhN7nQm28Ry1jCW7Cpz6CCP2c44BltZE1d9IsNAmy0BJ5WOkdvJUFAEcD7D0Hr6PtEXQ\\nyQsoV1HLPrG\\/h1j49cPAQoAg5g88QeIWpOU9x3RXx2RUEgg+CIpB2Qhab6jfx74TC4IIzEKp\\nVnuPHmPT9vv7eLQEg+8dMLA5jMfo7YZIBHwPKDrrxh0CQcxCwIIzENEqz3HjzHp+339vFUEg\\n5iGSCDYwlSc3cR10fHSHaVcx48x6e3x9qoUU8N\\/V0\\/b1w1BB4GFEq5ic+s\\/Hx7OHhF9DDW7u\\nI5\\/K3x\\/W8BBGYhVK+ZR7D39\\/gtASOHjthVKgrt6PHNDKkka7x1vjyHYJBzB3x8df9h0HEi3Z\\nm3642U6529PqDSEKnKXPISQ1OShUMt2ZbmGCpKZmXUthRQFBxH1aV5bjvHthUHnB9IhbD70q\\n+zNSzq2JhhaXGXmzZaFpN0kHjrvBuCLgggkFSFrbWlaFFK0EKSoaEEbj1odx0j5jQs08cWeT\\n5vWVwlxcaq156O9Wn3ppqnSakTU9aZnZxKpq7cPn5otrUxtSqYr1lzU1Kyr8w87Oygp1WmXp\\nupzE8JsZLFxWtC3r0sq6aTdto3RJpnbcumjzQmKbVGNotlbbi9VLkrOy0wh6TnZabZl5ySnm\\nJmRqEtKT8u+xEOW+bGt7EOgv0C4ZcuNKO1kp5nURPUycCdVucknlIWG3UglLiFJUy+0VMzCH\\nG1KTHWWjTpX478nFiMumlt++MFrlqHlNbsqanHZeiV9lDaWl1215taJxFrXlKMKZROlLDkvU\\nW2GJOrS8\\/JtUmoSdS7avJ9ou2+UmsTYQl5KhbVGGnH6hTUlqTpeNsibrmGVKysyVfUBmU+sp\\nYnVgioKQlXn8r0xsl2zv0NbFFrrjj9KulDa7Lcdp6QQM7KRdb0mN7kqnM6xYuSoUAth2eRtE\\nfjCOKvWxrMxksWu4WYh05uq23cUmuVKc20Tco+g68nUKZNuIdEjVqXMIanaXN6qw0+0kLbca\\nUZd7FvRp0qMK9I\\/Dqj4hYZXQxcdsVDUlphDmzYuC06shsLmbdu6kJfemKRVZMLQXJd8uIelX\\nJeo06aqdJm5GdeyqQ6hSUOtuJUDktC0LTkU5BSFJWknMHPMKTnlu4HcfldVaLXMI1lyTnWKj\\nQ69RZ\\/TtG3pKoUypSLoUlWVQQ9LTUu6kKsSlaCAUn6qj2ghyl4jpagky1RptRlVIUk9nMS0z\\nLTDZSpKh6TbrLrailQ1SpJUki+givaS+jpeWjLiVPWLdKFz9LmUu1GzrqaY2EjdVvl9TbM82\\n0HH0ylRllp8lq9IW+5MU2b1TnMyMzIT85j0Dzg9hHfEvHG3BSwdJ\\/Diew3vxssTzavLrZuWU\\nbaXV7crjTS25asU3X1Ev5JcUxVqW8tLFUkHXWtow6GpuRi7Y\\/YA4h6NuIVRw9xCp2xmmdebo\\nlblA6uhXXQ1OKblK5Q5tbaNvKvahbmZdYbnKdNoekZ5hiaYUlP0a2F7ZpfaXSfoqsqak8a0d\\nhCakwEpbZrEuEhLdYp6QEps7lJnZVH9Cv3U2hMs60EfPfbBsom8AVRU9T23JjC9QeJk3\\/ScV\\nTXV+l9HTizdRCbnzSZXfzhoBK1GYbdB6eQ9luUM+scfSOfxuhwFBQzBB8c44j0xxoWDx3dvf\\n+iFASDmDkYv0gjeIpWORCyOO\\/t4+v9MKBQPP6DDFL3MsekfEQsFJVwIMIKAe7w+XytBDqCEA\\nojn9HHx6IUCxz7vd3++Gygjdr8fZ+uCL4qCRwMWgg8DnFYSRzHtgi8LPOM\\/ZF4WnnJHoz8eu\\nEYIOuuufGCGVWodDr8sqTrlHpdZlCCDLVSQlKixkoZEbKbadbGfSEg8eMdIXFou4OXBtHG7f\\nmLfmXQoGYt2ozElqE7wpqRmfLqU2U5nLVkAk55KSoJTl35FQojnMbCRq1UphvT6jOSetymXm\\nHWkK\\/t20ryOAnUhaVA8Qd8PNTMwx+0vOtdyFqSD4pBsfWDGDNc0JZJRK7bvuaYSM8pauUhma\\nKs8iP19ITUmEFI3KHze5rZ5+Zq5K6oquh7itIqV83v2vW28s0GTqsxKvK4jVW3UpCSbQvnyS\\n+tGRTmvW1kp2fa6uo9o7sou2h5x8O+JbKbSsWyoCVzjE4lNgBNyjBJ8VsCXcV4qWVb9TpGwb\\nrdQb0LqHQODjaT70BCj6yfhGqiRwj0mbLJTQafeVEADiUrta7WWUlLygpwgUSu6yUvKaSpwK\\nCCohG2SlSkZfSpvDTno7TIlr70nZRun7FqVbpl8YlLEomXKG5dMm1T6wtTbcuUNpZVKoKGko\\nSpKktp1o2Z7Qc4Pv7oNcdB9nfGW7tGXOnNU8L4ZqC73Ut+QK1Kv9bWYcmTdQuL3I1OhjZMYt\\nqkv+1KDXPsHZhm\\/+I9wIuO\\/feNdP6v8AyjP+GvTX\\/ORjr\\/8AGY+aF4acFTln2Hb10nXpZ5tc\\ntMy8\\/eGJrLUww8goeacl52qNB9p1BKHElCmlJK0KPnFJ2ea6en2Hug109PsPdGK1jOkS9zK4\\nBwhLqJSSpqly7dykgpKuzl0ElNzlJV6JUSNbmMx7HdefAD05OPBIISHqhOOgBVswAW6bBQAB\\ntvsL3taNUU7h\\/pQ3QgJrEtiTV0OSzjOpXrlnHU+TPj6aXUir1gBDboUAuWWBrBStZCszCElo\\nrY1zeW3tmSpySQAqduGhKASUk6xRIz864N5AKSkOBR85GrmobZNdPT7D3RTXHQfZ3xnjanWW\\nkFuSpdDk0cEtSkwAO8JTNNt314tnW+gjVrxJPLJJQwSd6lh1auW8u8tNQY1nU3QzxLmilVQr\\nVoUxs5BSRO1SdmUjzCPoWaQmWUBmpO+cBK0av1FJdj7ym6Ef1V1jEIZZAKl6Zbu8nzSSmbmq\\ntuA85IzkiSdVeY85EZ67QcwPu74ptDzD490a+Y2lYufvknmZYHgxJSt7cgp9p9Y000UCOBBj\\nGXXKivc6lv8AtGm+7S60rPDnpwtGJtL0NcMpTVVUqtdlXcGWshc9T5KVOQTnk3K0wTAKlBZ\\/\\n8MICFJQM1J11djUvRwwXpOqWrIk5xxJzLtVnqrVNchRI1mZ2felQADq6qJdCVAArSpWsT3UV\\nq6h6O\\/OKFRPOY0MzivEs3cP12pkHelubdl0HdoW5dTSCnTcQRoN8YjlQnnPrzb5HJLikDhwQ\\nUjgOEfOUyxbIoaUJpFoWvTAgDIyNCpcqvMADWLjUqhxayANZxalLUrzlKUrzo+n10jcOAyAy\\nGQyG4bt3NCUEaR1559Wd9515evpuuKcUb2v6SyTrYXsbGMRSlLN1KUo8SolRPrNz74vKzzDL\\n2xaSTxMUghuPIIIoSBxOUWlY5t\\/u7\\/dHoBO4QRfFpUBz+gQkVE8\\/o4ePTFhUlPEgQsI5+z5n\\n5e2CFCsnhu9\\/r\\/RFhUEjMkDxzDifRCCnuZA9J+AhAkk5k5nrhYAG6DrrrxjBrHXBWq2tWUYt\\n4VrnKVNUmoS1wTspQ3XZGpW9VqdMNzsvc9uvSam5iW8knGG594SqkTFOmm\\/LpVSZYLRJSMuS\\n15SyX0j6JK4a4jT0pTce7UpTIqCXnZSUksWaFINlL1y0aVSWUs3LJMt+UXPRpVjZskqrtKSm\\nlzU\\/T6JqvUoDoVmOB3joyPo9PZuMYSYs4TXHhxckljTgtO1O3KvbtTYuJxu3XnJKp21U5J3y\\nlu4LfclcnWZZlwF6ck2hlKJ2jjaFU9T7EnkYzwdhzbfhNOCsXrakq9Ioc\\/A3FriO0ekZpxKE\\nin1A3S5MyE5kaaeQpf5TKy8kpnpWWeNz7KNqdRwLWEKJMzTpoNy9RkHHMrM\\/LJNkJKiCGZ2X\\nJUqSmgnMgktLzNOOId9AOn1OTqko3NyrqVtuA5hXmuMuDett1JCilSeBJOXBSCWlIXD\\/AGiP\\nxhGivkzuUypGk1R5exb6madb+Plv05Kq3RUlqRpOJdJkWwZm6rUYzS2xVWG0GYuG3pf6SnOa\\n9UpiHqG9NylI3c0+pyVVlm5uUdStC9ykKUkLaVwU04jWBQtG\\/PI+d+ytazYSqPkRtG2a4k2a\\nYln8M4nkHpKekXbXN1szDDhJYnJV\\/KlEzJzKElctMtgJcAUlaW323mUfQ+i1il4ipUrW6JMi\\nbps2n0V2CXpZ5IHayc41dRYmmCQlxtRIUClxtS2loWrm9oj8YQbRH4whjmOkesQZjpHrEV72\\nQ5L6\\/wC749DXZQ+2iPxhBtEfjCGOY6R6xBmOkesQdkOS+v8Au+PQ1IfbRH4wg2iPxhDHMdI9\\nYgzHSPWIOyHJfX\\/d8ehqQ+2iPxhBtEfjCGOY6R6xBmOkesQdkOS+v+749DUh9tEfjCDaI\\/GE\\nMcx0j1iDMdI9Yg7Icl9f93x6GpD7aI\\/GEdM8rJhoccOT3XiBIMCcuLBeu2xfRU2D5Y5TmH3b\\nFvNlG5SUy7cjWTc86hxbQVLW+h5lxRSyy92xmOkesRkVhVTqBiZh7ifgtdbaZygXfblcpNRk\\nlLbK5mgXXSZi3LgZaQ4lxIDbMyyWyptxAenCvIEjaddeRpiVqj7UJrDE28WpPG9CnKY2FkpQ\\navTm3KjTnCojIFiXRU2GQtJKnplpCDmVlcq3a\\/QBXcHTzYSC4wFWURfIiYAZzgb\\/AMnMGVeJ\\nBFktKJ0BIgGkgDMwiSSSfAEdg4qYe17CPEq\\/cL7paLFw4fXdX7QrCdmWkOzlv1Kaprkywkqc\\nCpWcDAnJRwOONOyr7TrTjrSwuOve2Po6tpaFqbWMqkKUlYNvRUk2I0OpBBHjuuNY+ba0KbWp\\nC0lK0KUhSVCykqSbKSoHcQQQRwIg8dsEEUJCQSTkBzwoCwtyhMUUoJBJ4D2noHX0\\/YYZKUVE\\nk9vUB0eiLnFlauoZ5dQ3ces\\/Dqhq65kdUek\\/DvhQBJsIcACRc7zw+z59XTdc1jkD5o9sIKVl\\nw4n2eObm90VJyGfq6z1emECcySYyW0ewe89fKBIucx56ePyHW6KE5DM+jrhEnPMnx+iKqVrH\\nqHCEVq\\/BHp7vHxMPQ6Bc26EWqVmeocO+Gjy8\\/MB3cT2\\/ZCjq9QbuJ93T49kMycsyftz74cQk\\n3ufVz5fcP1QtRtZI9f2fPoxRashlzn2c2fdCBOQzipOZJMIKOsezh39sZjaPvPPu68YUkWHf\\nxihOWZJ6yTDFatdRPoA6B43wq8vM6g4D63b0Q2UrIdZ4RkAXNucK6Pu6\\/XFi1cw5uPX+j39k\\nbXeRLsX7tuUZwWfdllzUhYtLxDvyoBLa1JZ+bLEr1Jo8y6tH7CmXuSt0N5Cz5qnkssE\\/Txqe\\nJyGfgxIu+TgWCuraQmkFiiuXS4xZOENGswPLbKhLT2I14SlXl1tLKShl92Sw2qLKVAh0sKmG\\nknYqmEqU8oNS7yv0W1ag5TmUMqSDrqCQQOJAEb3DMv51X6S1a4E6y6RbMCmXV5woKHFJS0Qo\\n8N+kSndISoJk8Np2XWvV+dapSZBAOWS1tzPzoUjPn1acVk8c0jnMRSeXcvEUjRew6s9lakTN\\n54y0yadT9Jqu0i17UueZm0HUKUFQqlSoTidrrDJtWq2VarjMnnShqOzpdp0gKJM1UKjUXATu\\nHkMuxKt8d+Z+clhI\\/cuZ82UM\\/l97zE3fejth22tINBtO+bzmmwlQU4LtrNEock46orIWGvuL\\nqKWAG0KbLszrLc10Ib4mDYxd5amDJEjOzhKmS7r5AJ7H6NoNVxLL5zqCTP1OVSCk2Sp1IIuF\\nX64rz30XserTwslyqPJZbBt6XnNQlJJ0C3ES0u8Re5OW\\/EW0S2K1tKw65vHk8k8sE5fWcW00\\nAd+46inDnvAIEdoOL11E8w3Dsjr6xG9UVN85Zq8mYSd31c3luDhnv+iz39PNH3ilZDrPCPoF\\nVVZ55xI\\/MS2gf4gWfYVG\\/gY46mNXSOQSPaAftvFizmcuYbvTz+2JD\\/yaOw03Lp13\\/ec00Vyu\\nHGjzds5JvAKyZr9z3hY1uyaVqLKm0tu0GYufcHWnlOIbDQcb2+pHcJyBPREvv5LTh8GqLpgY\\nrTMo4pU9VcJsP6PPltSW2xSpS9bkuSVae\\/Y3Vums2o9MNZhculiXVwmYlmziT86xhRklN0sO\\nvTKjut5tLPPJV\\/lUti3NQ3akbGjtdpUpNHBLhXru\\/JIU7fnvRp3ncYlvQQQR1zFjwQQQQQRp\\nt5eHD1V88m\\/inVGmTMTeGt24Z4gSzTZyWUNXhTrOqTwQWnApEpRbxqc86CuXKWZZ1zbKCfJ3\\n4CaVZHqPsj01tNrDtOLWiBpN4diVE5OXRgXibI0ZktB9QuNm0qpO2y+hheRcdlbhlKbNNICm\\nnFONJ2TzTmq4nzJUqzG\\/iPbHLW3eQLdepM\\/b0JulKlybjVySmnFq0GtwicaFzoRltuUYr\\/Fj\\nITPMu20elkhW\\/VbbiwTfd9RTYsDwud4h2lRSQQftH2w9SoKAI+0dW7du\\/THGoVzH0d3d+iF2\\n1lCuo8R1dPbFBrRw4jceY69\\/HfESBKDY7utevsjN3QDur7mtKLD1Li1ty1xN3FbE0W8s1\\/Ol\\nAqDtPQpCiAtK6xK01Kxreblro11oShcunRLrZp+K7dPWopTcFvVemoQFaoU9KiXrSVFOeqta\\nGKVMZZjXQhx3pXEIPCm6RZOJ2Hd5leo1a17WtX31a5SlUtSq1Jzsy2sj+9uy7Lrbo36zalpI\\n3xMiwgrhoGKFi1IlLbaLlpspMOKVkEytTeFMm3CRlualJ19zM8+4g8Dx1tzT+D22PZdiwJ7N\\nmZMlJTDgFszdOrGWdVe4PaeY1pKCToAlAIMdZ7Bpn6RwLjKhXzrlJtc20neUmoU9KWQN4ymY\\npa1C2uYqOlwIw++U7Yamv6JGB+KUsyt+bw5x2FuzK0M6wlKDiNZlfXOzbz25TLQrdl2zJav1\\nHXp5nWOslIMQbA+d16fXqfnl5POSk4lJVzzjDjKylPHd5C3modKQrmJ9Ablp8LziryZulJSm\\nJQTdStK06NihTXNUrdkRhnd1BvOuzjOWeofuTpNwyb6yClMnOTOWqrUU355WDE\\/5Ncs3JqUA\\niepbuqnL678q+y6gZjgAwZk59OUdw0hzz\\/Bs8yLlclMKKQreEpWxNE8TYpcdAJ0vexsNKW2i\\nSmSourAH7JlJeYuL2zNEsqB4FQQym4G4FPHWMrGnNYZH6w9o6YdNuFBy4pJ3jo6x43+2OLSe\\nBBy6IdtuBYyO5Q9vWPiIh602N7afA9fKKuBv6Kt\\/A9ceR4\\/HlYIaNuam4jzfd2D4Q7hEIII3\\nwRUEg+8dMUghtSb6jfxHP7\\/j47\\/IXBBGYhVKs9x48x6ft9\\/bxaAlJzH2EfEGFgQR7x0Q0QCP\\ngeUHx66MOgSDmIVCge3o8cYaJXluPr8ePgqDzj0QyQRvhJSFdx68LiHSVEbuI8cIWBzyIPWC\\nIaJVnuPH3\\/b1QoFZHd6RHkNEW0I1+zr7b9zxK89x49PT3QoFEcPVDUKB7eiFAsjjvHthtSOI\\n9nyjyHgUFdXSOjv8ZxwN0WvQrxo03QbhkGp+nTicihfmvS7oz2c1KPpG0lZphRJbebUk7ylQ\\nU0txtXLg849cKBfMfX39HjhHjbrrDiHmXFtOtLSttxtSkONrQQpKkLSQpKkkAggggx6lSkKC\\nkkpUkgpUkkEEbiCNQRGHli3xj1oCYny+JeEtwvzFuTjyZOpS04y\\/M2xdVKKw59zd80Zl5tnb\\nb1iQqLK5abYfSahRZyRmQ+w1LM0HeUOwm0uLSD9rzQoF\\/UaSYmL5worM4yq4KCVrbZmKxb7+\\nqym5LVXNuBpmsSLLZZVMSUtXJChVGfl5VUfCfp8jVZGaptSlWJ+QnWHJebk5ppL0vMMODVW0\\n60sKSpBG86wzBAI1SAYwpu3Cu\\/8AA+66fi5gVX7gok3bk2qqyUzQZ2Zl7ktZ5La0vrlH2CXa\\nlRnJdx6XnZd8ulyRffk6lLztPdmlq0e0rZZgvb3Tks1wy+HNocrLhikYvaZQiXqwbSAzTsQN\\nNhHbtqPosvpKX5Vas0m4G+0p03duzPa5VcITSJZ5apqmuuAvyS15EKJ0U\\/KLN0y00d6kZfN5\\nqwS4lKw0436B0jPsTbbU1JTAUAUrQ4hWqttxOSslAZKQ6k5EozQridyVpEMMZ8FsNdLLDyYw\\n6xIk0ytYlA5OWtdFPbYRXLdq5aS2mqUZ10FK0TAQ2zWaM+oSlWkkZENuy8lNyOgHk+OV6tjG\\nR2i4X47TtJw+xjdSxIUy5HVy9MsPE2a1ktMMDXcbl7YuydzyRR3nG6VVZ0rRb85Lz09KW23v\\n1olxStT1Fy7ipaea1XFM65Q4hSTucZUNUrQFDNJSErQc9olJ1RHzCxdgbaFsLximVrEpOUaq\\nyDyZmQn2FEsTjDbhDM\\/TZ5CeynJRy6gHBolRclZ6XZeD0sntqSqOFtpWH3W0GXn5KcaVLzcp\\nMIBW0paUlcvNMKOdl0EBQAUTdKZiVeUkNvRGJ0l9F3FDRavhy0sQKWpymT6pmYtG85BhxduX\\ndSmHdRM3Tpo6yZWoNIWyqqUGZcFRpDj7O3S7KzEhPzmOIUR2dcTTLno+GuPVkT+FmNdvUy4K\\nFVG220OzgVLlubaSRK1GSqMuWpyhVyVUoqlqtTnpYqCnmFuJbcdl5mPlpm8mPino3u1O+cPW\\napijgogOT6q1KSyX7rsySJ2pZvOlyTSdvJSjRIVdtIl00hxtpyYqkpbpWzLL7r2WbWaZj6nI\\nbfcbaq0u2ymZuEttPuKGUHsyby0wpSVAsG7Tl0uSrriF9m3xBtP2M1fBk0\\/O0pp6foSlLcCU\\nhTs1IIGqg7lF5iVQDcTaBnbSCmbQ2UB13WGFjn3e2LwecHsI74bxUKI4GLfKAdUnr4iKOh4l\\n5Q+t5w9R9Y7s+uF0uoPE6p6D38I48OdI9Xd9sXgg8D6OeEFJG8QRyIPOD6RFwWodfbHHBSk8\\nCR2GFQ+ocQD7ISQDvAPjBD7aDnB9\\/dF2sk849O73w0S8g8c09vD1j45QoFJPAg9hBhJQO8QQ\\n5ghvmRwOUXBaunPtA+GUJLZ4EevT5wQtBCW0POB7u+K7Qc4+PdHmRXL3iCFIIs1x0H2d8V10\\n9PsPdHmVXI+yCLoIt109PsPdBrp6fYe6Cx5H2GCLoIt109PsPdBrp6fYe6DKeR9hgi6CLNcd\\nB9nfFNoOYfDvj3Krl111oYIUghLaHmA9\\/dFCtXTl2AfHOAIV4eJ\\/XBC0WlSRzj3+6EcyeJzi\\nhUkcSB2kCFBvmfZBCpcHMD6d3fFpWo9XZCCnkDhmrs4es\\/DOEi+o8AB7YUEpHD26wQ6J5yfS\\nYTU6gcDrHoHfwhoVKVxJPaYtKgOJhVidwvBCynlH6vmj1n1nuz64SJ5ye0nvhMudA9fd9sWF\\nRPEwsIJ7vjBChWObf7IsKiezqi2CPfQT3n2\\/d9sEEByOYIGR4jiMjzb+btgJy3mEyvo9f2eO\\nyC6lHTQc\\/v4+H649SCTp7eX3xiHidg3cVn3HI4w4HztQtq67dqTVwpkremFU6oU2pSCvKm61\\na7kqULZmW3EBx+ltgtv6y\\/JUEKMmvftybnKm0XH1qlYXYtTtPtPSAlGvI8nky1JtzFlqWCiq\\naoTWs23TbvS0hxyr2w02yhxaV1S20qknJ+j0DWCTzk+kxjLi7gOzc84LzsN77nb4k30VFKpR\\n405iqz8q4iYYm0TLCml0yuNvNpdYqbS2w7Mark2pt39eo8xnhHCm2HDreF8dASlQkWlt4Zxo\\n2yl2oUZ1waSs\\/fKqfpDqsvnEu64m1kupcYfQ1OS1xbMtq1awBUQptzzqmTJQ3UKdMLUJWdZS\\nQB2hAUWJloX82nkJU4wSUOJdl1ONKnY0isylZlg9LnJaQkPy7igHGFqz81SScik\\/gOjzF9Sy\\npMcxmOkesRFp0DOVxqVDqdMwR0wZ+aoFzU55ukUHGSptmWRMqBaalKTidL7JKGHlZANXuguy\\nE+2th24WGFtzVxTkli174pNxSkq83NSZ8tlmJqSm5WYbmKbUpaZbQ9LTVPnG1uMOtTLS0Os5\\nOKS4hSVsuvhWR+W+1fYzjLZJXF0vENPV5q9mepdVlM0zSqtJgjLN02dCUpfayKQp1paW5uUz\\noTNy7KlJK\\/oPhbFVAxpTE1SgTYeSlKPPJFwpE\\/TnFpCg1NMAqJQfSDMy0XGHwFFt1RQoD77M\\ndI9YgzHSPWIQgioM5\\/R+Pd8\\/ePXI+zHM9dHoar5jpHrEGY6R6xCEEGc\\/o\\/Hu+fvHrOzHM9dH\\noar5jpHrEGY6R6xCEEGc\\/o\\/Hu+fvHrOzHM9dHoar5jpHrEGY6R6xCEEGc\\/o\\/Hu+fvHrOzHM9\\ndHoar5jpHrEfaYeXUbOu+j1ouESjT4laolGsdemzYEvOKKUpO0LKVCaZQN6n5ZoDLMZfCQRt\\nqDXajhytUnEFKcLFTotRkqpIPalKJqRmG5lkrSLdo2XG0pcbJCXG1KbVdKiDjzUkzOS0xKPj\\nOzMsuMOp5tuoKFgHgqxJSrek2I1F41Lcu\\/oxP2fi7aelHa8gV2hjBT5G2L2m5RsuS8liNbVO\\nSzSp2YdQlLTDd2WbKSSJFtCnVvTlqVycedKpxpMaCInsTVkWDpbYAXtoyYqDWl61RBJUyfRs\\n11KnmQWict246ItagBWrPqsvJzSGVENTckw3KTiZqTmKk2qFNpOaNGJ+ifi3cOEeKlJckqpS\\nX3ZiiVxlp75gvS2XZh9mlXbbU44geWUiptMrzbOU5TZ5ubo9VZk6tIT0qx9qcPYkpWP8J0LH\\nuH1pXTq9LJVOS6VhbtIrLf5OoUyct6SHmJlK05lAJe0fbuw+wtz5u7VsGTmFsSTyltK80mX1\\nLDqUEN9qv0u0uLpyTif2Q2b\\/AF1PNGymVR0BDNxwrOXBIO4dPWfG72xVxzX3Aeb7+0fCGrjg\\nQMhvUfZ1nujNAvoIrAAJGZXqHXH4fCjrmqMh9Y+wdMNScsyfT46YCeJPphFSiT1Dh3+OEZDa\\nOHrJ+z9fee6PBdZudw6t48z9wgUrWOfDoHMIQWrPcObjFVq5h6fHjuSUrIZnf0DnMZAG4DSH\\nQOA9UUUrIdZ8Z+O+G6lBIJP2nq37t\\/6IuUeKj2nwYZOLK1dQ4Dq6e2FJGbwHvPH293dDn1Bb\\n849ezl3+uLVK1iSTx9QHR2CEFKzPUM\\/TFy1cw9Pd3\\/phFSshu4n2RltovY+wbrDn7PdAhP5x\\n38Pn64tWrmHp7u\\/9MN3F6id3E7h1deXVF5ISCSdw4nxzmGKlFRJPP7BzD0RlAWFocihPEn0w\\ngSVHPwBFy1Z7hwHvhFastw5+PUPth5CbanefhB0YsUrM7uA9vX49kTEvk5GHyqLo0434mPNb\\nJ6\\/MZJa2WCT5z9Kw9tKlzUtMADNIaFTvmtyyTrbTaykxm1qBtTsOhxeondx4Dd44R6AnI84c\\nKw05OvR0kpiUTK1K7qFXsSKkveFzqb+uuuXJQ5tRKUjM2pN2\\/LpBTqlqXbIWvepWurLvYyJv\\nf8q622LAHce111BtdsDS+psbAxPNnkqX6\\/25HoyknMPAkG2ZeSWAvuBIfWRc2ISo70iOz9Ji\\np+VXvTqeleaKXQZcrAJzRNTs3NvuZ78s1S4kzvy3b8zvygpcsrfSrv05bwpKJpMyxh1ZVg2N\\nLqbeLzTWvRvu3m5VKwpTaVy9SvSdbmGkHJmaS+06EzCXUCbNi\\/VBV8SbumUr1kM1RVNR+KBS\\nGWqYoI4ZJLkotWQz1lKK+J3+ebpbX83ifpP4\\/X3LzJm6fcWLV8zFGmMgC5b8rX52QtzMZDLV\\noUpTkEcSU62+ORvJiZ\\/Cnyj9rmMjd+WpEnU6bKPaqCVzlZlKfTnAsg2z0uiTaUJB+opQTdKI\\n6F2xPinbP8J0cWQ5OzTE04m9lKRKyLjj6Ckb0pmZ5lRPApRxUY+SspnZ0dTquMxNvuA\\/uEJb\\nZA7EqaWfSeEfTqOsc\\/UOqOLobXk9FprXAmVbeUMsiDMZzBB683Trc+frPIqOQ9gjuqYV2k0+\\n5+m6sJ\\/tQopT7QB9kcnK1cWvmo28BoD6wP13ixZzOXMPf4+MT7vk42HS7M5OaTup+W2asW8a\\n8Tr6lplTakKmJGkCgYXI1HXAAthifw6qKEBpRabfVMjc+p\\/WgGKVqpJ9Q6TzD1x6eHJjYZnC\\nLk+tEKyHWVys21gZZF0VWUd1EuyldxEp6cQ69KOhCUI2srWrpnpdwp1s3W1EuvZB5dt7H5Lt\\nK\\/OzZSSmTpi0g23PTT7KUnMdxLTb4A3qFxewIMgw23nnlrO5uXWb33KWtCQCOIylZ8QIzygg\\ngjpCJxBBBBBBFi0IdQpC0pWhaVIKVpCklKhkQQdxSRxHBQ6QY8trSGw4fwax+xtwncQttWGW\\nLOIdiI1k6m0l7VuyrUWVmEDVQlbEzKyTMxLOoQGnmHGn2M2lpz9SiPPg5cXDBOGXKRY2OS8u\\nqXpeJUhY+KVKbUgDXVcdp06nXE+F5JDombyodzTCFBKdXaBhWu4yt1yj9uch21BpNRCbmRqa\\n5dR0ulqel1qUTfWxdlGUkC+qgSLC4iWLWc0tKv8A9afW3x3PIzeFrsjU8SAN8anQdYA+BCyV\\nZ7jx98M0nVOfTxy5\\/tHjKFweCknrBEcruI+48u7rx4RAlC47+EPmnNXcfqnn6D9sSycBLycv\\nHBzCm8Q+ry6q2Na0\\/NPJVrrTWGaVJt1TJzfrqaqjMyArNKlBA10JWNQRLkq1h1jj9kSKOTdu\\n\\/wC6XRnpdIcdC37Fuu5rXUCfpQxMTDd1yqnNbMrbS1cplmFJ8wplvJ0+cwsI5U8qujKmsG0O\\ntNpPbUavoZWoXu1K1OVeQ44FDUfsqUkU6EXKgb3Av0F5ONT82xZVqS4bIqdGU6hO\\/PMyE0yt\\nCbcf2PMzawdfqkblXEom9bXpOOmCV3WTU1pRQcYsLK9a1QdaSFpRSMQ7SmqRNqSDrBYElV3C\\nASSSBv3gjytrbYnrQxIlqRVmVydSpFwzluVSWWN8tPJemaLOsOa24bCZK21kgaika+4pzHqS\\n6NteNdwdtNS3EuTFJROUOYAy+j+bJ59uTb3c\\/wA2rks+nXJzzOcedFyquFkxgZyjmlhaSGES\\nbTuMNWxIozTKEplmaVis1JYrUdmVCFKbDElJ3exJBDZJYXKql3Aw8ythHSWxytIxFQiSvMK3\\nh+nVMAkeiqYlUpmNCSbpXNtpXvyFFjrvxtqdKMs8gZbCWnJ+nLNlG6Sbs3J0sUsuqTpdQUSC\\nQNGaVEHpz4jxz++FgcsiD1gxx0pNNzstLzTZ8yZl2ZhvnzbebS6g55cSlY4w7SrLsh9xBuQR\\nZQJBB5g2IPhrHPy0XvwI39\\/cY5FtwLGR3KHt6x8RDptzU3Eeb7uwfCOKBIIIO\\/mMO23AsZHc\\noe3rHxEYik21G74ddd6QQfRVv3A8f1\\/Hj38rBDRtwo3Hen2js6ukeriYdAggEbweEIhBBB+B\\n5xWAEg5iCCEKTfUb\\/j113eQslWt29HT2QolRG7iPHCGsKpXnuPoPD1+B3tEX0Igh0CDwhVK+\\nY+vv7\\/0w0BI4QqlQV29Hd0wypJGu8db48IB0I8D1940h1CqV8x3dfT3e6GgUR2dEKhQPD1c8\\nJhopI36ju60MOgSOHjthUKB6j44QzSojs6O4wqFA8PVzwkpB8efW+Ew6CiOHqhUKB6j0Q0Ss\\njjvHjh9sKAhW8e3iO2Gykjw59boIxfxf0b6ZdJmrishEtRriWVzE3SvNYpNadOa1qby+jplR\\ndJP0yR5FMu5Gabl3XXp05aaFPKu4maOdQp+Dek+1cd2WDSFy9KpN1PpfmcRMOmEFKJdEw46T\\nMXnaks3kqVYceXXKfIKR8zVCqU+Vp9Djjgsjjv7ePr\\/THX+IOGFp4l0\\/ySuyezn2W1Jp9alE\\nttVSQUc1BLbxSoPyxVmXJN8OMOZlaUNv6jyNjVG8NY4oRwjtHpKcQUM38ynfq1mhPlIQicpk\\n8AXm1tJ9EpCjnauw8mZlCqUXNcJY4rWE59qckJt1pScqFEHOlxkKBLEyyr0JmXNvqL9Ns2cZ\\nWlxDZTL+wnxwsfFW1KNd1q3PRbqtivy6Jij3XQppuapk63nqqbmC1quSM3LuAsTkrMNMTEnM\\noclqgxKzLTiYy8s3FKq2+hmnz4+eKGQEhh1YXMS7CgQBJzCswtgIBIlX9owpKdRpUsNYx562\\nEuMWktyfl6LuGw6v872FVpuXNwUGcTNTlhXcylTaEt1ml7Uu29caGEIYk63JOS9UYAMrL1Gp\\nU1U9IzEobQq5SHBzSnpLFPt6pG2sRJSSVM1\\/CS5Z1lFwSiWG0rnp+054BqXumhNqKlGdkENz\\nUswG3a1RaK5Mshzgzal5O2ONjk05jfZ9U5jEODCorbrlMbCnZBgqCvNMSU1IWiXQhWVC5hba\\n6Y4sNqcFOmVok0dw4G2q4bx9KM0urJl5WpuBKUy7iz2Uy5a2enPkhwu2JJl1KRONgqSBMoQt\\n0566RXJi6NmlDL1G9cG6hKYNYozLZmpxFEkGhZ1YqC0hx1VzWO2qW+bJuacStp2uWs7IMuTD\\ns1U5yQuOaVmrQzpB6AGlJo2vTk1e+HFQrtoygW6nESwm5u7bLclGzkZydnZWVbqVutFR1Upu\\nulUF51W9ppxrUdckXUO4WplTVSo0+8xMsKCkqlnVy05KObycy0pLjShmUhxCi2vLJoqTmIyB\\ntjH26aQlqVrctLXDKoASHHFCRqKU55AGbZacYdyTnuflFuuFJK5k5GNvgPymZBKW6ZjqUfpj\\nzSENmoSjTs1JFSAkKW9LpDtRlbjTI23PouCoKaFkCKY38nej1pbs\\/QFiTmXSXCGA02HCo3ut\\nhWSUfJJKlOIXIuLP11rOsQgIImn35hFoJaQSHkYp4I2nJVueLhmLkYt9Nq3E9Mvqz2zt5WE5\\nIVyZCHM3W1VibMu25tCtgsvvbbX9jdyGVnXLS5u6tFTGBcu84hx+UsvER+XrtAmXc3nDKU6+\\nrelkVClNoRsmZaXq1AuB9TufltZYQCsdUYYxHhzGTanMLYhpFbUhrtnpaUnGDOMoukEvShc8\\n4YsVJ\\/b22iq\\/ohVxfmbEmxjGWHApxyV87ZCilCkIXLursLnKl8Bhw8ky8y+o7st9DGzClDhv\\nA6d46uyLtp0j1d32x2Ri7hDiLgRiBX8L8VLam7UvO3HmWqhS5pyWmWlszLKJmRn6fUJNyYka\\nnS5+WdbmZOoSEw\\/KPtLBS4XW3W2+s43LiOzWUOpKFgkFKgUqSRYEKBsQfG3ssTVLrTjDi2nk\\nLbdbWptxtxJQtC0HKtC0KAUlaVApUlSQUkEEXhYKSef17ouhvBDeQHcfgfhaG4dBaxwUfScx\\n6jmIvDyxxyPaO7KGmsoc\\/wAffFdoecD3d8eZFdx674Ieh\\/pT6j3xdt0dCvUO+GW0HOD7+6DX\\nT1jtHdnCcquR6\\/X1YwQ+2yOkjtB+GcXbRH4w9sMNZPT74rmOkesQWPI+yDrrf17IfbRH4wiu\\nuj8ZP8Yd8MMx0j1iDMdI9Yjyx5Hr9Y9sEPtoj8YQbRH4w9sMcx0j1iDMdI9YgseR6\\/WPbBp0\\nfu8ehq8LyOkn0H45RTbo6Feod8M9dPT7D3RQrT1n0d+Ue5TyPsgh2X+hPrPdFheWeGQ7B35w\\n2Lg5gfTu74oXDzAenf3R7kVy+EELlazxUfXkPUMhFsI6yjz\\/AA90WwrszxP2\\/KCFipI5\\/Vvi\\n0udA9fd9sJwQWQN5v13fbBFxUo8dwPoHX2xbBBBnA0SOvVvgggi0rA6+zv7s4sKyeG4eOeCy\\n1b9B1w58dfdCggnu65QoSBxMWFfQPSfHjohMnLefbz98JlY5t\\/WfHdC0tg8L953dd2phwIA7\\n+uUKE85PriwrHMM\\/HrPshMknjv8AHsiwqA4+rnh4IA36+4DroQqLySeO\\/wAeyLCoDrPRCZWT\\n1DxzxYVAcT6Oc+MoWBwA9QgjrXEnCq1sTJENVeX8lq0u0pFOr0mhtM\\/Jk6ykNuE5JnpILUVL\\nk5klI1nFS7kq+vbJro+aZ2kzoCVGTtetocxYwGU+WmrYqc\\/MiTprLzpcU5ZdfW1OTdl1Aq2j\\njlCm5ect6cddnHkUtc4+Kwz2KpZPDcPHH7IZzctKTsu9KTsuxNysy2pqYlZllD7D7Stym3mX\\nUqbcQobilaSkiNk6um1ajv4ZxZR5PFGGJo3dpNRCiZZyygJqmTiCJmmzjedRaflXG1tlSy2p\\nC1lYk+GcX13CVQYqNFn5iTmGD6C2XMqggkFbZCgpt1lwgdrLvodl3QLONHeJFOilyhGBmk1S\\n5b9Tq9JaZr6ZZLlSw2ux1ii4i0UNtbWY1KY5MPityMoj9lqlBma5R2gEMKn5d\\/WbTn3TLipV\\nWKRLzAQ+cs5V8hp\\/M5EJQgnVePUytYGfXEDu7dHGU+cW7lwyrc3ZlwyUyiekGGpuaZk2J1le\\n1ZfplQlCmqUOYbdGu09Lqm22lBHkzLABUnKXCDlR9MHRsmJK38dqCcabKZW3Lt1K45gyN3IZ\\nbSUN\\/NuJFMl5+Uqrh3zMw3ddMrdYmiENOT9OClrTyfj3yNJWrqfqmyHEDU8pYW6cIYheYp9c\\naUbKDMjPqLdMqoBJAL6qcppAHbTsy6So9k4J8pKi1VLMni+UVTpshKFVWmtqdl1k2HazdMCl\\nzDVhdTi5Bc4FrUAiWYQAImeQRqD0cOVc0ZscDIUmSxCbsa65rYMCxsWhL23PPTTyUIEtRrhc\\nm3rbrDjz5cYkJSSrrtVeKG1Lo8up9ps7NqbfNInAhMypUgtYBSpZD0qsEZjVmG0jIH8ZxDCO\\nPnZceK8V7O8Y4Jn10zE9AqlHnE5ilmekn5dbraCAXmA4gJmWTcZX5VT8uoWKHVA3joqlVSl1\\n2VE7Q6lJVeU9HM7IzDbxaUoXCH2kntpd2wJLTyEOJ4pBjsaCOKaeZfQl1l1t5lZCm3GlpcbU\\nR0LQSlXgb4ViFqSU6HQ63BBBFuBvx5jhGdHIQRx8EJgjkII4+CCCOdptSn6PPytTpk09I1CR\\neTMSs1Lq1HWnUZaqkqzIUlQJQ60sKbcbUttaFoW42e6sQ7J0etOfDxOEWkXa8oaujbOW7X5N\\nbNKrdEqz7aWlVixLkdamHKJV3djL+WUedbmqXWAywxOyVZlteTYx4gi5dj22\\/F2xyrOzFGLN\\nVoFRWj6ewrUlLVS6q2EdkXUEBapCopZ\\/Jsz7CFGyW25ticlm0y8RTFeDqPi+QXJ1NlOfIpDU\\nyEJWtsEhWRaF+i8wVAKU0u1lXW0tpyzgj6acvJP6QGh89V7xosnNYvYFyy1Ps4j21TnTUrXk\\nnFhLDWIdtsLmZu31NKUJddwSq5615lapYu1GnT843R2dURJJJJ385ifphvpEV62Eoo12tu3X\\nbikeTqMytLtWk5ZaS0Wmnn826jLBvMCRn15qSQlqbZaQGhhBpX8jjo16WtOqeJmirXKBglic\\n+XJudoMpIuM4XV+fdC1KYr1pyEuqo2BPuuhAFWtWTdpZR5TMOWlV5mbTUE\\/T\\/ZxtE2e7ZZQP\\nYGqqZHEaGlPVDAtadalq1LBCQXXKYpS+yqsik2ImJZxxLaFI86Mo8tMqniDH+xGuYXdcmZBp\\nU1Tiq6FoUVtEEiyG3l2La9bCXm8jhyq7J6Z0iHKpWe4cPf48dSKlZbuf3fb1eDkTpG6KuPmi\\nhdyrNxxw8rNnzzrjvzNWFtioWpc0s0ojy22LnkttRqyzqJS48zLzXl8jrJZqcnJzALAxxJ5z\\nExdlnpVxTD7LjLyDlW06hSHEnT6yVAEXGoO4jUaWilHGnGHFMutracbVlW24lSHEKG9KkKAU\\nlXcRfjxihIAzMIqOZzP6BFVHM8OHD08\\/phq65xQPSfh49ENgXNh6z3afbu6t6AEC53nh9nzP\\nRtdc1tw+qOfpP2Q2UrLcOPuiqlao6zw+2ESeKlHrJMZLaN2mg3d5698CRmOY7vj9w6vrFCdU\\nE+DCBOeZMVUdY59HDPm+0+M4auuZ+Yn\\/AIx+Hf6unPMSmw13nq0ORa6vXOQ+qOHWenu6u2G6\\nzkMuc+6LiQB7h0wgTxJPbDqE3N+A95gHv4W5xRRyHXzQgTlmSeskxVRzPVzQ0dXn5o4Diek9\\nHoh5Iue7jHqRc93GHVOp8\\/W6nIUilyz07U6rPSlOp0kwnN+bnp59uVlJVlI3KeffdbaRkcit\\nW7MmPTuw0tCmYRYSWDYEqWm6Phjh3atnyqmswymm2VbUjRWlNFYbcDSZWmAo2mqrV+tvJjz4\\n+TVwxcxf08dFuyxLCblW8WKBedVl3EhTL9EwzTMYj1pmZ1lBOxmqXas3LOZqBXt9mjWcWhKv\\nQTxirJo2G11zQIDkxTvmtvgFFdYfbpiwjdkVIam3XTvH7Hx3xX20muN0Kjzc+4oBFKpFTrDo\\nvYFEpLLeSDa6gP2O4NB6VxYEgAXXsopippyaWB\\/Rk7I01tViLHNmcCTu184Zv+iADuMajsfc\\nSn8PsJsZcWHXGkTln2BiBfiXHghSFVCi0Gq11lvZu+Y+t+dl22mZchRmXHENJStSiiPPfG2m\\npga61uzEw95y1qUtbjry\\/OW4tRKlrWtWalEkknWI3xMw5XTEY2DoNYmyjDqmahiHVbQw8p7i\\nVgaoqtdlaxWmlJIO0EzbNv1+UKApC0B\\/aecltSFw3bdl\\/Ka3TkZZhD4eVvOQEsC+M8uAzbA3\\n5gk6uWajlUfkK0VcpgPHGL5lJMxiDEyJMurALkwzQaemZ7YrNypCpyuTze+\\/atu6WNzMPKBq\\nKHK\\/RqU2q7VMpC5gpBOVDs\\/MFKkZbAJV2EjLqKhfMlSBvSY7rQhLTaG07kNoShPUlCQkewQm\\no5nP1dnNF61cw9PdDZ1eqNUfWPsHT2+OaOuUjeo7z1745zj7PDSx6tiniZh5hlQW3Ha1iJfN\\npWHRmmQFOu1W7q\\/T6BIIbByCnFzdQaShJ3EnrJj1maLRaZblGpFv0WUbp9GoNNkaNSKewF7C\\nQplLlGZOnybO1UteylZRhphsOLUrUQPOJz1vNw5F3CoYu8phosUd9gu0+0bzqGKtRe1FKRJn\\nCu26zfNFfd1AdVLl0UWgSTTihqomJxnPcI9KiOh9jkl2dMq8+UkGanWZVKiNSmUY7U5TfVJV\\nOHUAaptc20mGGGrNTT9vrOoaB0NuzSVqA0vr2qSRexsnTSCCCCLkiUQQQQQQQRD8+U3YVuSe\\nImi9jawwlbdw2Xe2FlWmkN5Kll2ZXJO7rfl33CnIpm\\/u8uZcm3rkjyKdUUDcVzA40VfKFMJn\\ncQeT6qN6ykml+fwTxUsK\\/nphDSVzbdDrL8\\/hrVGmt5e8lXNX1SKhPtNlaQ1S2p15KWpJbzEH\\n2j076SwXXWQkqcYlRPt2GoMg63NrI0OpaZcTbiFEabxqK8z29KmwASppKXwQLlPYrStZ3j+p\\nhY7r34RBGac1vNV9bm6\\/tHP0+uHCVZceB5+jrjjQcsiD1giHja9cfuhxHxHjcfRHExFxY8Yq\\n6HoJBzEbgOSkvMIquLlgPOkmcp1vXjTmdfINppczNUWtu7PeFF752oHnpy1fJvP19ZATp5Qr\\nLceHuPd46YzQ0Br1+4zSdsMOvliRu1us2ZPHWKdp89U552ks6oI19pcMjRUhKhxOeRWlMVbt\\nkoRr2zPGMilGd1qkOVNiwJUXqO61VkIRbXO55mWgBqrtCjULIM82YVUUbH+F51SgltdTbkHl\\nE2SGaohdOcKydMqBNdoSfqlGcWKQYmt6Ftf2tFvS2VblSNUp9cl0n8MVOVXIzZQnIZBo0iV2\\nh\\/8AnhoDPiIpnym3B9Vp6XWD+McpIKlaXjHgymizs5qKDVSvHC24p2RrDiXdbIuy1p3ZYEs4\\nyB9GhDKyoh8askDRNuL5nxYlqY45qs3NRarSAFABHlDCG6xLqK+ZZNNcYbP4zwb3l0A4JfKY\\nsHPuz0MsN8X5OU21TwVxkp7M7MlOfkdm4mUibt+sHX3FO3u2mYftZDMKz3ZKCdavvJYxJ2tJ\\nw5LrdKlSszUsPvjUg9opU3JIOgtlTMyTfIhAN73MdA7ZKXcVNwJ+s3KVNrdvbKWHyL3P1UTC\\nrgA3UQfRiJHhzUPnCzaK4VEuS0uqQXmd6PIXVyzSeb\\/5XQyQN+SVAc277xKtbt5\\/HjfHQ+Cd\\nTU5TazTFKH61nGJxCfwtSdZ2K9XPfklcmCocAV\\/u47yB5x6I6PrLHm1UnWhu7dTie5LwDyQO\\n4JcA9UcgzKCh90W0zkjwV6Q9x6sYdJUU78swebm9nDu9ELg8FJPYejj1cYaJVrcePvhRKsuz\\nnEalSb+Px667sVSb6jf8Y5FtwKGRyCvVnwGcOELKD0g8R8R1xxgOe8GHTboOQVuPMeY9vRGK\\npFtRu4jlHgN\\/RV7evjuI39\\/KpUFDMHMeNxisMUqKDmPSOYiHaFhY3cecc4hEJUm3hwPzi+CC\\nCElIPjwMJi9K8tx3j2wqDnvBhv2xUEg7vsPuhogjfBDsL\\/G9ff3\\/AKYUB5x6IahQPUeiLwop\\n4ekQ2UA7tPh90Hh111aHYX0+v7IUB5wfSIahQPUeju6YvCiOHq5oaItoYQUcRoevZDtK\\/wAb\\n1ju8emFAeceiGoUD1Hoi8Ejhughu1tDp18PC8Ogs8+\\/r5\\/HqhQEHgc4aBY593X4+2FAecH0i\\nEFAO7Trl+qPIvmZeXnpZ6SnZdick5ptbMxKzLSH2H2nBktp5pxK0OtrG5SFpUkjmjEy9dHio\\n0Wryt9YK1ieti46ROIq0hT5WqTNNmpKoS7u3YnLYrjTzUzS5tlwBcuy8+htK98vPSqEJZVlm\\nFnn3jq490KBQPA+jx8I2VLrNRori1yjoLTySiZlHh20lNtKBStqZl1eg4lSFKRm9FwJUoIWA\\nTfKlJyYk3EuS7ikkKBKQTlUQQRdIO8fmqFlJ\\/NUDHeuh7ywlx2ZU6fhfpgS1TkpuneT0uRxe\\nk6U63VpMpUGmxiFbsrLhVQldnkpVx0OVXMPIaDlQotSXMTNWTJFw7xgtTECgUa4qPXaNXKFX\\nZRqcot0UCflqlb9Xk3FFKJiWnpV16XSCtK0LKHCyh1t1tZYWjZIiGXxhvaOIUiJS46Y28+22\\npEnVZbUYq0gSc\\/1rOBKlbPWyUqXmEPSjigC5LuFKcut8K8QtKHQcrsxcGD1xOXjh1MzQmq\\/Z\\nFSZmqjb1QYT5y11S20TCX6XUdiA390ltTUvOajQE66mTCpFdGbTPJtwLtLTMVfApk8D4vcu4\\n7h+YUGsM1Z7efouZS2foWYdUfRllNqp61ltlqXlbuzkdP7OfKCnaZ2FMxMXZ+TGVCJtSwqeY\\nHoi6nFlKZ5CbaB1bc4ASQ\\/MBKWTOSSpKkhSSFJUApKkkEKBAIIIJBBBzBG5Q9Bj6m1rqrtn1\\nWXq1Bn5iSfadZcfZbfcTLT7TSwsys+ylaW5mWc11JLTqSBrlbZQ5qrGlXQx5UDB\\/SKap9tS9\\nSTYuJTqQmawtu6faSak+E6zjli18pYlLgaKUrUJJlqVrjKG5h+Zt5MohNQc2v0S5qXXUhMs9\\nspoD6SSeIQ+kgEqLYz1X292ttGVHJOrtUtK8yPn5iXBmOtleIxL1aRquHK5Sn0TMu+A5LTDS\\nkLPYzcrMMqUl1hZSQ1OSjz0o8MwbfcBjsOkVqhYrpvnFPmpWoyM0gtrQMriDmSCtl5pYC23A\\nCM7DyG3kXBUhNxfrvlmtHeRxnwCsbS6sOnIeuDDaUYpN9CWbSucnMOa5USy07OKQVOTD9hXb\\nMbJaW0FLFNr1wTsy9sKc2RFqCxz5iJzmANZoN1Ue8MDb8lWKxal+0WsU8UqdK1yk9K1WmP0+\\n5aC555KWarSXHXEoa2SQ4xOKQfKJpOvDn0sdH6uaLmkDiRgrXfKH2rUrbq7bq77YSbhs2qpF\\nRtOugoGxL09RpiV+cWpdTrclVmalTSvbSLuX08wVi2U2l4Cw5jeW7NM69LopGJpdnL+w8Q01\\nppmbzISSG25tvs52WSdRKTErmOdZj5+7ccELwvil+YbbUJOeXmQ5awOYFUu5fcVOMpUy5YG8\\nxKTCybrF8fQQeBEVhtmDz58\\/XF2soc59\\/vjblux0JHiNRFIlvkfbC8EJa6uo+OrKK7Tq9v2Q\\nWWON\\/Xf4x5kV3HrvhSCLNcdB9nfFddPT7D3QXWOF\\/V4cut\\/qTlVyPx+EXQRTMdI9YgzB4EH0\\nwZlcU+4jiOvEiCx5H2RWCCCDOf0fj3fP3j1+WPI9frHtgggihIHEgdsGc\\/o\\/Hu+fvHrLHkev\\n1j2xWCKZjpHrEU109PsPdBmXy9xj2x5H2GLoIs1x0H2d8U2g5h8O+D0zblpyH3+Pw4R7kVy+\\nEKQQlrq6h4684t1lHnPu90GRR3n4mPQg8SB74WJA4kRaVjmzMI5gc+XP1xbrgdfu7OYwoNjk\\nTw7r9d8KCBxuYWKzzbvb49UWkk8TCJWeYZe2LcyeJJ9MOBvwHvPDrfwhQAG4QqVJHPn2b\\/si\\nwrJ4bvaYTJA4mLCvoHr8d0OBAHf1yj2FItKwOvs74SKiePq5otKgOJ9Hj4woDkPZBF5WTw3e\\n\\/wBf6IsJA4mEys824dfHuiwnnJ9JhYQTv0+P3QReVnm3dfE9w9vxiwnLMk9pMJlY5t\\/WfHdF\\nhJPHfDgAG4QRepf4vrPd49EJk85PpMWlYHDefHPCRUTx9XNHsKCSe4c+t\\/wi9S+j1\\/ZDaYYY\\nmmXZeaZZmZd5BbeYmGkPMPIUMil1p0KQ4gjiFpIOfDKLyoDuEJFRPH1QtKVXBBKbEEKGhBGo\\nI3G\\/EH3w6ABa2hHHjcEHf6uFvbHQV4aOdhXHtZijsu2pUFZqDtKAcpq17\\/2SkvLDLaP\\/ALHI\\nOyAGrrapGetyWG2Lum9onllrCzEWrXLZMlqZWhNkXfbAlWsiJZqz68l+bohd1EbR2zXJOaKE\\nNtme1Ds47oUoDdxPjjCRJPGN47WFVCQVSMQyFMxVRnLByl4jkmKrLmwsFIMylbjbqAfyTgUe\\nxNi2kERvqRiWuUKZbm6ZUpuUmGrBD8vMPS76U6XSH2HG3rGwunOUHQFJGhzSwN5ci3RMsUbH\\n\\/DWv4f1dK0S85c+Hbr1ZoBeUtWu9VLSrT8vcFHlGEBKVtytQu6cdWQsS7aPMRujwV0zcHMcZ\\nFubw0xIs3ERCWdu9JUipokLpkWAvVL1VtSoNydepqMyNQT9Gpwc3amsN8RYLksq1LuZLFxUK\\nn1MlOomZdY2c8ykjhL1BgszsuMs89jMISVBOYVqgR0DV9GxuSnmqzh9ddTtyqyjwm5Hyl58m\\nTfQc2lyFXp6pepSCmjvbcKJx5O8B0lIJpDFnkz7GcZhx+kKquzqquXKUNlzEGHitVifyD7rd\\nWl8yxolmoMyrKVECXKUpSnoTC3lM4kkA3L4ilJSvS6QlJdfSJKfATYAJnpNotKunRSpinvLU\\nbKU9fOVTvqfdtCqBSlE4mWcV\\/epzKXVmfwQtSiwvf+Ah5avXH0W4hJCgpKgFJUkhQUFDMEEc\\nQd3vGecQpsPNPDT70dC1L3BVjjHaMqENmWv6XevIpYQC2t5u7qbMyV7y7pGrsl1ypzUq24ht\\napFQddS9sywL5bzBmvpkKfihRbwwaq6tmiZn5QLvyxNoUjXmFu02UZuKVDz3nCX+5KfRKoWE\\nu1N8treVy9jLyOdqNAbensPMSWNqUi6kzeF5kVJ8JsVJS7SyhirJeIHpNSsnPJQQU9sr0Sro\\nfDm23Z9iINoXUl0KaXYFqrpQmVzEC+Woy63pNKAT9aaclVkXJbFjEiaCMVcKNK3DXFumJq1h\\n3tZuIdOS007MTNn1+RnZ6QS6c0pq1JTMOTlMmSRqmVqDFOmEKBSphKgYyBp94UCo6qWqiiWd\\nVu2M8PJlncMglbitg4rPmacV0745jqmHK3RZl6TqdNnJOal1ZH2H5d1p9lQ3peYcQh5gjeQ8\\n22ba2tFsS62JthEzKTDE3LOjM1MSrrcww6k\\/nIdaWtChfS6VEd8fUwRRJCgFAgg7wRvBHj1R\\ndmek+sxpCCOHt05d3L7OcOdn3+774pHO0OvVq26izVqDUpuk1FgfRzcm6WnCkkKU04B5j0u5\\nqpLjDyXGXQAlbauA4PM9J9ZgzPSfWYflJuckJqXnpCamJGdlHW35WclH3Zaaln2lJW29LzDK\\nm3mXW1JzIcbWhaVAEEGxCHGG3W1tOpQ604kocbcQFoWhWikrQq6VJI0KVAgjeIywXixhfjZa\\nM5hXpL2Dbd42rWkoYnlVijMVSgzD2TjbE7OUt1pyZpFSlg6VStboyxNSLxMxJpkVNh2NL+mD\\nyBjFVkp\\/E7QVvGVrNMmmnqm3gxeNcYeS+1quuGUw8xEmHfJphWuGmJSiXy5LFtImHpq+HXg1\\nJKzwzPSfWY+zsvEW78P53y22aw\\/JIW4HJmnvEzNKnQMhlOSDpLLisgEB9Gzmm05BqYQDme5d\\nlvloVeSZlcP7Y6W7jSkNBDDGKZDsZfGNNa0SFPqV2MpXG2wBcPrk5xxRU\\/NTU+4Etmj8c7DM\\nP4kS5M0xLdPnrHK0QoS5N9zLwC3ZXUkhspmJW9kpl2xdUQjsTMNcQ8HruqlgYo2XcuH96UZS\\nE1O3LrpM5RarLNu+dLzKZacZaVMSU439NI1CVU\\/Iz0sUzMo++wtDsddkgD3Dpj0G8QGNFTTR\\ntSXw80p8Mbbnn2kON0atVBL8u\\/Rp6aRquz1r3rT3JO4rOmHS225MNGfZp8yG2GKjNVFsFk6A\\n9MnkAMXMOm6jfWiNcbuOliJZfn\\/uBrr1MpuKtKkwFvBukzrAkrYxCYRLI2gckEWzXpp51mRp\\ndsVZ36dfdOG5zC2P6R+EGzfEkhi+kpCTNMyauyrdLWsApl6pR3g1Pyj1gcqXZdpbyUl1posl\\nLh49xZsxxLhOZW1OST62gVFCgi61oFrqb7MramUJuApyVddI17RtkggR2iSTmYQUrPhwHP09\\nccxctv3DaVcqlsXXQqzbFxUSbep9aoFw0udolbpU+wcn5Gp0qpsS0\\/ITjKsg7LTTDLzZzC0j\\neI4FxeoP3R4D4nxvPpjJDZQSFApUm4KSCkpI0KSDqCDoQQLG9xeIBa2hFiNLbrW4W4Wi11zV\\n81P1ufq+0+z1Q0JyBPRFSc8yT1kmEVKz7OYd8OJTmPcN8HXzihJUSfAhFSs9w4e\\/9HjqqtXF\\nIPbl7u\\/m3c8ILWEDPiTwHT9nXDwHAeA8O\\/rdHo104nTw69w91jrmqNUcTx6h9vqhoTkMzzRU\\nnPMk9ZJhFR1j1c3jrjIQjhw3kw8BYWiQJ8nZwnVdmlniTivOSa36dhHhJNyklNhoKbkbuxFr\\nMpSKQpbi0q1DMWtRr6YQ03qOukrVtgyy6w9Kh0oa35LbFAoiXCldWrDs6tKcs3JakyhC0KHO\\ngP1GVcOQ4tDPLgdR\\/wAnYwk+5PRSxLxZmmdlUMXcWX6fJOagymbVw3pDNKproey11FFz129p\\nctAFDQY1kEl9wDYnpM1xM\\/fkpSUKzaoNFlW3EHM6s7UVrnn1HfkAuUXTiOcaoIIJ3cjeU9iT\\nzHCGJWm3FB2eMhh+XG4Hzh1t2dRvFwZVuf0BIP1jdGeOrditIytUdakfW86qr2nEktyyu\\/Tz\\nXf4aG0RXOXtxIDVC0fcJZWZKhP1e8MRK1JBaQW\\/meSp9tWxNrbAzJf8Anu7mm1kpAEu6jNYX\\nmiPTY7W0qMzMEbpeUKU9Tj7iUpJOX4iHRl0mNi\\/LGYlG\\/wDTZuuisTKZmn4WWhZ2HskpsBDe\\n3Ei9edWB4a8xL1q8KhITLygFlUiiXzUzLsqjAGx5fZ06ZmSMjMzOqD0tsIAB7A446OPNHQvk\\n94c\\/BTYJgORW32czUaOmuzFwUrW5iWaerTfaiwOduSnGJeyhdKWUoOqTFT7VKoKrjXEkyFZk\\nMz30azYkoCaa23IKLepGRa5dxwEaKUsqt6Vo+1UoJBJ5vb1emGJJUSSd54nxzCFHV66t3Abh\\n18Mz7IbLVzD09nR6fHGLNAzW7\\/d4xWcSfvkvOEiri0lNIfGuYlkOyeGOEFFsWSddAIlq5itd\\nLdTZmZcEAmZRRMM65JuKQ4NlKVJxKx+uW1Jm7RHL+TP4PpsrQbvXFSblnWqljbjVcU3IzRCQ\\n3NWhh\\/TKXaFJQ2NUrcMtdbN+B17XCCXUMJaSphxyYkaR1ns9kfMcJUlJFlzLbk6s6el526t1\\no3G\\/9jlkXJJ0sbWsLCojPZU1i4sp3O8rvzrOU6gf1MI567iRaCCCCJpG2gggggggjGzS+wiR\\nj5otaQmDiJRM7O4g4Q35b1BYLZc1LqmLfnnrSm0NJ3uPU+5maRUWEADWdlmkngTGScEMzDDc\\nyw9LPJzMzDLrDqf0m3UFtafWlRHrhDiEutuNKF0uIU2oafVWkpO\\/uMeTHvQopUkpyJSQQQQo\\nbjmDvz6R6utUEggg7xvHjoMZf8oTg9+oLpu6T2FTUgulU238XLpqVuSCwdaXsy8ZpN72QgEh\\nAWg2jcdEW24EoDjag6AEqjDpKstx4cx6Ps93Zw4EqMk7Izs5Iuj8tJTUxKOi1vyku6tlemov\\nmQdLnS2u6KddbU0440sWU2tbahxCkKKVDXXQjj845JCwodBHEdH2R9JZ9yztoXVbN1U8lM\\/b\\nFwUW4pBQWUFM5RKlL1KVzWnJSSl+VQQpIzT0bo+PSopII4jxkeqHiFhYzG4jiOiNW8y1MMuy\\n7yA4y+2tp1tX1VtuJKFoUOIUkkEcjA244y4280oodaWlxtadFIWhQUhYPApUAQeBETNsML4l\\nJKt2JiDS3i9S0zdv3NKvNZ5zVHmVSs8pISkklE1TH1NOIRn5rpGZ3k7AeUTwZTpFaDOlBhNL\\nS66hULlwfuarWtKsIEwqdvCzWG77sdhtIz1kzF3W3Q29o2FKCV7VhK1JSI0VaDd9\\/dzoy4az\\nDj5fn7YkJqyKgknX2KrWmnqfSmVKBJUTbooz+asinbagzy2ipKGCFy\\/dXhTY9XU4XXxQ2KXO\\nOKV56p2iLXRppxzocfdkVTWeeeTwW0NmpMcG7HJiYwdjHGWEnHFJfoVZ86lc2mZyj1BUk8\\/u\\nIIfSZBxKwkApCTYhdo7sxUpjEuGMP1xIBYrNKbQ9l1CRUpJEwGiATlUyozKFJJuld03Bjyxs\\nIqomTu1EopWSKpIzUoAdw2zQTOtnPMDW1ZZ1pGeeanQlPnFJjKxKinflmDzc3s4d3ojr7TJw\\ngc0W9NfHvCVEo7I03DXGm5mLdYdQG3HLEnKuuu2S+ttBUG\\/nGyKrRJrZoUrJE1kFZZKP27Tq\\nVBOagpJAKFA5pUDkRvzIKTnmCdxHqj6E4nQ0+5IVOXJUxUJJp1tVvrCyVpX4ll1rTTde\\/COI\\nKqwZaZU24nKsFbTgPB1lZQtJPcba8N40McgCDvBz7OY98KpVnuPHx7fZDMKI+MLAgjMRFbff\\n3fd9vqvqVJKe8c4dAkcPHbCwUD29ENEr5j6D3+O2FAcsiO0GEqSD48\\/nDakhXjzh826R5qt4\\n5j0dvTDoHgQesGOMSrPcePvhdDhQekc47ejojGW2b6Cx5c\\/Dq0JBKdFDTdfreOu6OWbdCtyt\\nyuboPdC0calaVjMH0HiIcIdKdys1Dt3j18ezOGo8KOKdRy+Xy3w6gigIIzBzEVgIvoYRBF6V\\n8x39fR3++LIO2GlI4j2cfVz63wQ4Bz3iLwsjjvHthoDlkQesEQoFjn3dfj7YbIB0Igh2CDw9\\nI5x2xeFEdY6Iag84PpBhQLPA+v8ARx9Hthsotu17uP3x4RfQi4h0FA9R6IvBI4boagg8N8Xh\\nShz59u+EQjJ+ifUfUbH5H9ToL6fX9njsi8EHgYahYPHd7ovghBBG8Ede\\/wBsOgpQ58+3fF4W\\nOfd7fHqhoFnn3j1H1xeFg8d3jp78oSUpPC3hpHkdN39gRZ17OqqskhdrXMlaZhmt0RIZ2k0h\\nWu09PSTZbafcQ4NoJlhUrPleSjNKCQiMlMDOUJ0lNF1+n21pA0yqY34USimJeXv2mTK5q\\/ra\\nlGlKSh9dYmywqvbJGqpUndrkpPuvBKZW7NgyGXPkgecH0iDW1gpCwlaFpKFIWApKkqBBSoHi\\nCMwQcwRwhdXYpWKKSKBjCjyeJ6MkKDDM\\/mRP01SgAXqPVmrTtOdASlJDTimFoSGnWXGlLQqW\\n4YxtiLCU4ico9QfYUnKFt5szTzaTo082vM280NcrbyHEIPpICVgKEknRh038OcYqfSr4wpvq\\nQuxujzMhPPty7pkrutaeQ5tZaUua3Jsy9QlFlxh1tCphluXqiGn35Cfqcrk472hyveDNv6TW\\njfZWmThcy1U7rwiZRbWKclTW1PT8vY9VmRMPioMEeWA2Hc06qcYKmG0G3Loq9emXvIJJtSYi\\nbmGTdCuNi\\/cKLkruEOIEiFrk7ksqcfkGlrdAL7M7TpV6XadlZrIInJdhbEvOJKkTzM2jWbVt\\nR0TOV2xT0f56oWZpbYes4hYT3lS5y0cRrysaSdmbdu60avKTdMqTd+WHIS4mqZNfNs5NtKr9\\nsSbLcumZXIytvTso\\/OCbgGAtnA2YVetIwlNzGIcB4rabbq+HZpLbOKcOzzCryVbpks32chiN\\nMqbtzrFKMrVp6V7MNUaYflmkuXtWNpWHtrGHU0TERZoWJGG1CQn3Afo2adOVSWXXjndkip5K\\nVNKdU8wizvazMu08tKcEYrrKHOff74+wxIksO6ffNytYQ33S8SsLnao9PWBelLmmZn52tGpB\\nE\\/QxV2milVNuin0+ZYpl10V9DUxRrjkqpTHW1GW11fEBShz+vfE7fZUw64y4BnbWptQsdCk2\\nOhANiRoeMcwPMuS7zrDqcrrLi2nE3Csq21FKgFJJSoAg2KSQRqCQQYc66uo+OrKK7Tq9sNto\\necD3d8XbQc4Pv7oYyp5fZ8Ibhxrjr8emK66en390N9dPT7DFdZPSPXHmQd\\/XqghxmOkesQZj\\npHrEIZg8DnBHnZjmeuj0NSHEEN4IOz7\\/AHffBDiKZjpHrEIQQdn3+6CF8x0j1iKa6en390I5\\ngcTlFNZPSPXHuQczBC2uOvx6YptOr2\\/ZCOunp9\\/dFNoOYH3d8ehCeXvP3QQtrq6h4684t1lH\\nnPu90Ilw8wHp390UK1Hq7I9sBwHsghaLSpI5\\/VvhEknjFCpI5+\\/1DOPbE7heCFS50D1xbrKP\\nP8PdCJcHMD6d3fFpWo8+XZ4zhQQT3dcoIWJy3kxYVjm3+zx6oSJ5yfSYsKwOG\\/x092cLCBx1\\n90EKlSjz5dm6LCQOJhIrPNuHrPri0nnJ9JhQAG6CFCvo9f2eOyLCSeO+EysDhv8AZ8IsKlHn\\ny7N0ewoJJ4WHXr+zlaFFKA6z0QmpRPUOiLCQOO6LCs8B6z9vD0+yPQCdw9fCHAkDvPPrQfGL\\nyQBmT6Oc9kJqWTw3D2xYTzk+kmE1L\\/F9Z7vHphxKANTqfd11aFQoTlvMJKXzDd19Pd74sJzz\\nJPWSYIcAJ3D18IIIIIIdCQO884IIIoSAMych1w1W6Vbk+an2n1cB1e2FR6ATuhVboTuTvPTz\\nDv8Ad7o69uTDiybr2i63b1PfmnAdaoMIMjUdxzBVPSRl5hwJJzCHnHGt6gpCklQV9spYSMye\\nwQ0W4pZ6BzDm7T1xkSz8zLOB6Vfel3E7nWXFtLHGwUgpPqvbnDqVlk3bWpK9PSSopI7rggi\\/\\nXCMaJnAKp25VGbgwwvms2xWZB0v06YXPTlOn5R\\/NK0Kk7goa5WfktmQEpUiVedyCVl1SkK2m\\nStgcoFp54CbCTuqcl8YbWlPo9nfFOVcsyGFEKceTd9Bfp92JfzBS2\\/ck5UGW17jJlKkIVYpQ\\nHDefHHu\\/TCRJO8xsKo5TMTyyZLGWHaDi2UQkobNZpzDs7LpPGTqLaETcq5v\\/ACzS+0sSArXS\\nVUDG2J8OPB+kVedkVEgrMrMuy\\/agWsHkNKS1MI0F0zDbyTa5STYjZXgry3ODdaTJSGJFBvjB\\n6pOOtNvz0oRf1lNaw1VzLz9OlZS4Gkheaiy1Z84W2v8A5YdUg57b8JtLjDPFymtVCwb8svEK\\nULQdeVatwSbtWkWyrLOq0XaqqNNfzyHk1QlKa6AUrU1qKbK4l9w2DZtzhZrFv0+Yec1s55pn\\nyOfzP4RnZQszSik+cEuOLRnxQUkhXTs\\/gEaVPsVqwrvq1u1eRcD8i648+iYlZgJKQ7KVemqk\\n5+RWNZWTiG33AFKyVuziicUeS1sdxV2jtDnKzgWfcuUsvpOI6MgkXSlKluS1aTdXoqdeqLra\\nE2PYqN737hvym8QyhbaxDT5GttCwU9k+jZ5R0GsxJtrlCLX0NNSSd7gBidxIXzQKgUpTUDJu\\nK4MT5VLKB3AAPKKpYk5\\/VRMFWW7KPqkvlxKVNulaVeclaV6yVDIfVUFaqkk7xuzHAZ88KKw9\\nNrT5wK2TM1cy8XLblAhJkb6lVX2l1tCUtlw1uWmKdiClSW9+vNVjydKs3nGnFbQnYDg7y3Fk\\nLcYp2LWHt4Yb1FCEtzVas2fRddAcmkqAddnKLOpotYpsqRrKEu23cj7awlpSlJzcTzfizyNd\\npdHQ7N4bFNxlT2wF9th6dZmphKPzQ5TppMnUO23AsyrM+pJ0K1AEi+MP7d9n1dCETE7MUKYV\\nYdnUmM8sVG1wmeklTDKUWuQua813EWBKQqS5tHP98X\\/GV3wbRz\\/fF\\/xld8YFYM6eOCuMiWEW\\nDijY98TjqGlpoqKkLfvEpWE5LctirtU+toCdYJUo0RtCXQpoKK\\/NTlnTcR7dqBS2++\\/TXlHL\\n9eIUWdocgdV9kuISknL6R4Mk5EZcI5nrWCsTYdmnZKs0eoU+bZ\\/bZWbk5iVmmxzXKTLbM0gd\\n62UjfxBtbklPSNSYRNU2ck6jKrtlmZGZYmmFfVuA6wtxs99laZtY7C2jn++L\\/jK747Ww9xlv\\nvDZ5pFGqzk3Rw8HJm3qmVzVKdSV5uhptwl2nPOnPN+QdYWVpSXg+gBB6jBCtVaVApy4g7iM+\\nbdlv9vNwzi7I9J9ndGPhrEuIsHVaWr2F63UaDWJQgsVClzTspMJGZKltLU2pIflncoS\\/Kvpc\\nl5hu7bzS21KSUT0hJVKWXKVCVYm5ZzRbMw0lxBIAAUApJyrTqpK0kLQTmSoKAMdZcsvoOUXS\\n6wLktMrAqiKmsXsMrZW\\/edGpraDUr8w0pSXpmr0+blGd01eOG6zOVCmqZ\\/XtVt\\/53ozXzu+1\\naUpLwxiSSSTvO8+OgR6DWjXi6qwroFu1uaUi07nmW23lOrOypFZXqMSdTBUdVmWfBRKVNZ3b\\nES826tKJDVXGJ5afk+zohY6\\/qpYc0Qymj7jnVahVLeZk2gJCwcQFByo3PYCksoS1IUuY1nri\\nsiXUmXbNFcqNDkWn0WhOTTv2Q2Z7RpDbXgCTxxKhiXxLTPN6Tj6ksEDzWroaSGqtLs3K0U6r\\ntjziXJ9BCu1lAt16Sm3I4A2zbPXcJ1t2blm1qp02e2ady6KZUoJQtagAC80oiXmrWKl9hMFI\\nEzcaVVKz3Dh7\\/HjqSUrLcOPu6+0+N2UClZdvMO+ECchme0nj7fjEtAtoP1xSHQiilBIJMM1K\\nKzmfQOYCKrWVnPgBwHx7YQUviB2Hu8e\\/hkIR7Tv7h11uh5KbDXeerRRSs9w4c56eyG7iwkZD\\n6xHqHXFy1hAzPHmHjx7csh9DzBxzSE0p8A8HFy5mqffmKNp0u4W0ILim7Ql6mzU7zmUs79qZ\\nG05GszmzUUtrEuUuusoUpxDrjjcuy684crbDS3nFHWyG0lSiba6JBO7hDzLS33mmGxmcecba\\nbHNbiwhI9aiBE\\/Xk+MIDgRoUaNOGD0uuUqNGwqt+tXBKLb2apS7L5Q5fl4yikk6xMvdVy1do\\nOKCHHggPFppSlITjTiZc8rVbtvG5pqbYZppqNTmzNvuJbYYpNP12peYfcc1QhpmmyrbjiyoI\\nbSlf4O+NlWIVd+5qyLorQcDbslR5zyVZOrlPTLfklOBOW4qnpiWRlzg+iI6vKFYnfqR6GuPd\\n0NTCWKjP2TNWRRlBwImE1PEKZlrJZfkciCqZp7VdmKsgJJ2aJBx9SNm2uPnBt0em8Z4owHgS\\nTcJnMTYibedQAVFMzVp9ik09woASMqHJmokqUlKQEmxAC7dzYKbl8P0Ks1ZY\\/Y1FpPZNk3AL\\nVPlDMPI\\/OIKktS4ABJureSReGJjViFMYs4wYo4nTKndpf9\\/3bdraHs9aXl69XpypScokH6jc\\nnKTDEq03kA00yhsbkxzdGZ8jo1PlwAFGWS64Ohb+b60k556wU5qkc2WX1Y6dk2DNTctLD+\\/v\\ntNHqC1pSo9gBJPUI7v3JGQy1QAAOAGQyGQ6uAj6jzctL06QptKk2w1KyUuzLSzKdzUvKMolp\\nZsdyGk5BpuTpHFtQfcfdU68suOvuuvurOhU44oqUojmpSlHxJ9Vqlao6+aESeJPpipOZz8CM\\njdDnBhWkZpXaPGB+wW\\/I4lYvWLbdeDaC4tm1X69Jv3dPag+uin2tL1ioFO4KTLqOslPnJYlJ\\nZyZfYlmhmdmXmmUDmt1xLaB\\/jKAjBSkrUlCRdSlBKRzKiAB6yY9I3k4sG14B6CWinhc\\/Krka\\npQsGLPqtxSTiA0qSvC9ZL7ub0lVJCUFQlrsuSsNbVxKHH9QOvth5xcZuwQR2pKy6JSVlpRrR\\nqVYZl2xa1kMtpbRprb0UjS8Wk02Gmm2k\\/VabQ2nS2iEhI08BBBBBD8OQQQQQQQQQQQQRCF+U\\nm4KKszS3wwxqp8ktikY2YUM02oThSCmevjCypqo9YWFgApSzZtew7lwysKXrMOL2y0rLUvHX\\nSrPt5xE575RlgkrEPQeo+KtPk1v1fAPFG3q9OTKGtqqXsu\\/A5Y1eZ1UgKQhy5KlYs6899Vpm\\nmr2qCk7RmC2lXBST1giOPtqtL+jcZVBaUFDVSQxUmtNCX2w3MEG+uabZmFbkkXtawBNZYgl\\/\\nN6pMWFkPETCdN\\/apBcPAG7oc9mpveHaVZbjw5j0fZ7uzgslRScxx9\\/UeqGiVZ9vOIVSrLceH\\nMej7Pd2cK0Um+o38Rz+\\/4+O\\/SRul5KfEBLshiphjMzGqqWmaVfdHlczmtE20KBcbpOeSUMql\\nLXSnV+uXl56moNaU1oV3Qmati7LSdXm7RqxLVmUCl7zKVmWMu820nIFLcvNUwuuZZjXqGZyK\\n98IbQQv02FpN4fLdfUzT7wfm7CqIS4W9v90zKWaPLqyzCwq5maEvUP1ltoKPP1Il26Kt0\\/c7\\ni7TJN1zZyt0U+et5\\/WOSA+4hNSkFap1s3XJ6nsSbZH\\/10CMkF0xwxtPkzg7b5I1VH5KSxbJy\\njrpACW+1mmlUZ9BJBGYTspKzzutgXsxUAs27J2WT\\/wCEGyd+nKVmmsPTc1Lpvcudi04mpsKt\\nfVJYmnpVsADRm2uXWN38pdwLXYmmXh\\/jfI012Xo2PeFEk1UqioEtz9+4WTSbWraG155Ayljz\\n+Gbamss95WFKSvdqLsepirWrRZoqCnUyaJN855K20kTKOLXvJCnNiHTwBCyUpSkpiYh8o+wG\\nVifoJ0\\/FmmU8zFc0dsTLduebmkELmGbGvtxOH9yyrTOsFrQ5cVWsWqzjjaHVysnRH5l0JlWp\\nl9mFTg3UyuRqtJUvzpWYanWQeJbmkbJ4J\\/ctuS7alAgec\\/mM8zl23hecFc2eU17OFzFEmF05\\n4jeltkpSygjeB5pMSRP9oTawjnTaBTfNqvOKSnKh9bc82bWumZTZ4+BmQ7qL7tbnNHe7bpGQ\\nUcxwB5x29W+HQORzHr6R8RHGJVrdvR09njOFkOFG7iOjo90YqkG99x61\\/VFeBRGihp9n2iOT\\nCtbpz6Off74vSrLceHuholQUAQd3SOI+0QslYOQO49PN6eg9Xqho+zn4\\/Z14QKRxGo5db4dA\\ng8IVSvmO\\/r6O\\/t4w0BIO77D7oVSoK7eju6YSQDvhsgHQw7BIIIPqhyh0K3KyB9h7jz9GUccF\\nEdnOIWBB7ecc4hhbf3Hl4jr2mEWUnUajrh9o+EcklRScwcvce0Q6Q6FbjuV0cx7D8I4lDqk7\\njvHt8d+cOUqChmD9nbDBSRv9sHor7j17fj6o5KCGiHVJyB3j2gdR5\\/T68ocpWlQ3H0c49EeQ\\ngpI3+3hF0EEEJKQd\\/t4x5FQSk7vsMKBY593u8eM4SghsoI3a\\/H2frghwDzg+kGLws8+\\/390N\\nQSOBi8LHPu6\\/H2wggHeIIdhQPA+jx8IuBI4GGoIPA5+\\/1ReFEdfbCC3yPt+f3QeOsOgvpHq+\\n2LwoHgYahY590XAg8DnCCCN4PXfCChPDTrv+yHMXa6uo9o7sobAkcDFwWRx3+z4R5CchG6x6\\n79PfDoLHPmPaO3hnF2sk8493vhsFg9Xbui6CE2I3g9deqKSspKyLa2pGWl5Jpbrj62pRhuXb\\nW+8rXeeUhlCEqddVrF1wgrcUc1kqMO9dXT7BDXMjgSIu11dvo7soFEqJUo5lE3JVqSeZJuSe\\n8wE31uSe\\/XXTjx15\\/aYdbQ84+HfFdcdB9nfDbaHnHw74rrp64TkTy95jyHOunp9h7ormOkes\\nQ21k9PviuY6R6xHmQczBDnMHgc4IbwR52ff7vvghxBDeDM5ZZnLo5oOz7\\/d98EOIIbwQdn3+\\n774IcRTMdI9YhCKZjpHrEHZ9\\/ug9R7\\/d3afq9a+unp9h7oprjoPs74Q1k9Pvimunrj3Invg9\\nXf8ADrSF9oeYfHui3XV0+wQjtDzD490W66uz0d+ce5UjgPj8YIWJJ4kntihIHEj4+qEcyefP\\nn6opCoPaevXCpWOYZ+yLCtXUPR35wmVgdfZviwrJ4bvb8IIUEk7hbvPq6uOZ4QrFCoDiYRJJ\\n4mLSQOJyghQRzPs+Z+UKlfQPX9kWEk8TCZWObf7u\\/wB0WFRPV2QoIJ7uuULCQNw9Z3wqVAcT\\n6PHxhMrPNu9\\/dCZIHE5e\\/wBUWFY5t\\/WfHdCwgDv+Ee9dfr8bwoTzk+kmLCsc2\\/3ePGcJkk8T\\nFIcCSdw+UEVJJO\\/7B74pBBDgQBv1+H39aQQQQRapaUjefRzn0QuCLoTW6lG7iroHxP6YQW6p\\nWYHmj2+vr6oQUpKRmT3wQsJ4q0Hsi9Sio5k5+4dghBboG5O87+wdvX454SW6VbhuT0c57TCJ\\nIHGHEovvv4cfXHpVfRI6+zxPOLiSd5Ofb7+iE1L4hPrI93Hu3c+6LCoq3c3RCalBPb0d\\/RGQ\\nlFt\\/qHAdeyPUotqd\\/wAPv674uJ5yfXCKlZ7uA9\\/b3RQkk7\\/sHvhJS+Yevu8ZQ5b2Q4ATu68Y\\nuUoJ4ZE9HfuPuPvhEnPMqOQ58+AHjj09cUUoJBJO7pPE\\/aYaLcK93AdHT74UkE9w4+7Trd8V\\n6I7z17Pti9x0nNKSQnn6\\/wBHv3x81WrZt2vtlFao1PqJI1UuTEugzKBlkNlNJCZlnIE5Fp1B\\n35ZxzilAdvR3wiTxJPWSYzGFOsrS4y44ytP1VtrUhYO\\/0VJIUPEHw7vUFYVnClJPNJKT6iLE\\nDvEdD1nAS3phSpigVOoUJ9J12m1ny+VbcQdZtSC4tqdbIO7WVOOlJCVpSSFBfdWEWlrpRaKV\\nyW5UKze9wYnYRy08zJVyzq1WZuuSC6K4tKHJWkzddbmZ+06i2gqfpL1NfbpgqDbTU83Oyrz8\\nnMuVKz3Dh7\\/HjqYT8vKTkq\\/JTrDU1LTTS2H5d5CXGnWlgpUhxCtxSeHSDvTvEbKfclMQSC6R\\niynSOJKQ+2407KVSVZmHm0PIKFvSk2pHnMrNoBC2Zlp1LzLiULbWhYChJKJiiuYfnmJ+l1Ga\\nk5hhxC0uy7qm1nIoKCXLEJeaJSM7L4cZdTdDqFIUoGWTo1aRlk40WBa93WhXk1e0Lllkqok8\\n4lLU9S5xtwszlu1yX1nFSVSps2Fyb7LhcEu+2EMuzEi7KTEZW7Zz8dX8RP8A7kQk9GjSGurQ\\ngxOVPpFQuDAe+Z2Xlr0tppwvTNOcCVNytbpCHlJZYuKkIWFNqWUNXHSWnaTOvMzbchUaZLuw\\nWxft3Ei16BVaFX5K4KHXqZLVS17hknQ5KVmmvta7KddSErTNMJCkOszSG5tDjbstNtNzrDqH\\nPmBt\\/wBhc3szrIqdJ7WpYPrK3X6PU+zGZIBC3qdUOzAQ1VZG9pkAIbnGbT0ulIVNMSv0P2X7\\nSKftCoyXT2MvXZJtCarIINgb2QmelUqJUZR9WikEqXKPHzd1SgWHpjv7bOfjq\\/iJ\\/wDcjLep\\n2FYmnrou4gaL2Lro+c3qG2ijV9DaHqxR52nFK7OvymbRSC5VLYqyZVipMpcQip09xUhUHVS1\\nenW14dbVf7n+Ij\\/3Y+xsS96xYF10i66O4ryqmTCXXZZSi2xUZJw6k7TZnVSomXnZcrZWdVZa\\nUW5lkJmGULTofJ72uzGx3H8pWHy4\\/hWsIRRsZU1KVOpm6LMOJBm22BcOT1KcV57KWstxImJI\\nLQ3OvGN7jvCMrjDD81TXG2lTSUOOyC12AD5RZTDihYpZmkEsO62QSh6xWyiIUuOGDd+6PeLN\\n\\/YMYn0r5nvfDu4Z23q5LJLqpSYVLkOyVXpcw6yyqdolcpz0nWaJPBttE\\/SJ6TmkoQl4COoHH\\nCs5D6o4dfWYmNcupoW0jSKwOt\\/TtwXpRnLyw3t1hjE+TpzA8ruXCll95S63Oy7LZcma9hdU3\\nplFSfCdqm0pirrnJlcpatKYahvqVl28w74+uk\\/KS7LjExT5hqepVSlmKlR59hxL0vO02caQ9\\nKzDLyPQdQtlaFBxHouJIcT6C0k\\/NCuUaYoVTmqfMtuNqYdWlAdSUrypWpBStJAKXW1oU08kg\\nZXEKFrakUrLdznn6B09fZCBOWZJ3e0n4kwKVkCTnkMyfHSf0w0WsrPQBwHjx7MscAAfE841M\\nWrWVnM+gcwHQI36fJ4cGFXxpfXpjBNyS3qPgZhjUDJT6WipEle+Jjztq0VsulJQ0Zuz5bEUJ\\nGYdc2CtQLZS\\/q6BVq5h6e7v9XTE275Ppgl+p1oV1TFSfkQzWce8Rq9XpaZUkIfesyxFKsi35\\nZ1CkpcShq4KfetQllKKm3ZWqtvNDZu6y4njmoCm4ZnTnCHJ3s5Bm9te3N3QP\\/wDWQ9a27S8T\\nDA1PM\\/iORKklSJTPPL\\/i+bgdir1TK2BrpbW97RtG0o7hEjZtLoDasn7gqwddSSBryNHbD72Y\\nPROv05W78UgxEe5dnFMUvDTBfBqTmgmYu67qvftal2llLoplm0z5mpLU0kcZWfqV1zkyyg6w\\nXNULabjLoiTXpN3CatiGilMuqMvbdKlZJSAo7Py6eBqM04nVyGsZeYkmHc88nJbV3KBMQZeV\\n1xYOJmmfeNIlpwTVGwnt+3cNKaWypLIm5GXduK5ApBIHlctc9x1ekzMwU67qKVLtha2WJeOM\\n9jNLOPvKjFRUO3pmAZCdnTdPoJdpjCKSwjNYpzt1+qrnGk+iVCWWoA5HDHUGPZwUDZYJVJCJ\\nnEEzLsaaLKJhfnrqrE5sipKTSw4bWHapBsVJtrttOW29WQ4R5sqy69v4aygGUDdzgulY\\/wAQ\\nx2apWe4cPf8AZHxtny5blZuZIyMw8lpJy37NhJOYPQpbqkkDiW\\/RH1qlao6+aPo7UFBc2vW4\\nbSlCe4gZlexSiPV6hx7MKzOq\\/igJ9mp95MUWrLcOPuHf46IkF\\/JsME\\/1RNPypYpTsspdMwBw\\nju+55OZ2YcbRdt8iXw4o8kskgNLmbcuK9Z1pzeQqlhKUZqK2495OWZJ6yTE5n5MPgabM0R8X\\nMdp+WEvVccsWhQ6U6pjLyuyMJKWaZTJpEyoJUsm87nv+UW0grbZNPbe2pddcYZlezunGoYqp\\n103aki5UHTwAlU5mT\\/4lTAPcfC+fRmO2qMvp6Lau2J5FoZ06XF7rCR3XuQQLGTPBBBHVMWHB\\nBBBBBBBBBBBBBBBBBGPmlVgxJ6RWjbjpgdMssuLxPwuvG06WuYVqNSNx1GizSbXq+ZW2gOUS\\n5E0qrsl4hnbyLYfQ4yVIPlszUtOUqdm6dPy7spOyM0\\/JTso+koelpuVdUzMsOtq85LrLyFtu\\noP1Vpyyz4+tTHm28rngP\\/Y8coRpGWjKSiJS3bsu9WLVppYY8mkfmTFRhN6PylOZ1EIbkaFcF\\nUrdtMIZAYb+ZVNM+YkZ0TttpXaSlHrLaLlh96nzCgBcomEiYlidL2Qth8A3sFOgW1iIYql7p\\nlZoAWBXLuHS5zDtGhffYZXeYuRax366Uq4KSesEQslQV2jiPiOr9Eca24UbjvT0dHX3w8B4E\\nHsMc3qTl8OB+fXyiEKTbvHD7+vhaOZpNUnaLU6dV6c+uXqFJn5SpyEwg+fLzsg+3NSr6P3TT\\n7Tbg\\/wAThEvLCPEZFwW\\/hzirbziUip0+173piAtSky8w8zJ1hmVcUQlwKlpg+TTCClKkusqQ\\npCFAoiH0lWY35A9HdEhDk18Rvut0fzaUy9r1HDW46jREtqJLholacXX6RMLVvBT5VO1inMpO\\neozTEIzCdTLlfyqMPrmsL0HFMqkiaw7V\\/N3XUCym5OrJQlLylf8AZVCUkW27\\/VVMqKSLqB6F\\n8natplcR1bD7yh2FcpweabVYhybpilL7NKTb68nMTi121UGEg3ABTKJx5wvoOlDo2YpYSzjk\\noii43YR3JbElUJtovM0x68LZmWaDXkthCj5RQ5+akK3KOIbUtqbkWHggrQmPLytJmqWPiNOW\\n1XpR6m1aQqNVtOuU9\\/JL0lVpCcck35J5OeqHpeqyXky95yUF6utlkfTy0U7tFy4S0yRdcLk7\\nas7OW\\/Ma25SpZChUKaoJzP0SJGdZk0HPeuUdI5gIF\\/Lc4BzGjrykGMsxTJF6n27i7OUrSAtF\\n5xKUpmV3+uYmbvmGtlkkNtYoUy92m28m3G2WWElJCkuLsvyeMSt1uTqFKccSE1yjy9VYRqkN\\nzbKEszraRuzpL7ZUNbCSURoDHm1eiGXUleU3lZmZp7iiNVNOZnJVw77JHZrINrXeSN9hGOQO\\ne8fohZK+Y7uvp7vdHC06ebqEhJVCXILU5KsTKMjrZJeaS4EKO7zka2qoHIhQUk6qo5NKgrqP\\nRFmutFJUlQIKVFJHFJBsQfAix\\/VHPCk30O8H1gw8QtSDmD2jpHQYdocSsdB6M9\\/o6RHGpVlx\\n3j3QqDwIPWDGKtvn6jDfpI7x17D1raOTSvLcd49sKg57wfT454YIeG4L3H8bm9PXDgKy3g90\\nMEEaH2+73e33R6QFap38fv8AmO+HaV8x9ffCgPOPRDVKgd3A9HNz8\\/wi8KI4eqPIQQRoYdhf\\nT6\\/s8dkKhRG9J9IhoFA9R6O7pi8EjgfXwhCkA7tO7gflDZQDqND17PVHIIeB3K3Hp5oXByyI\\nPYRHGhYPV7vX35Qolak8D6OaMdTdu7x3e39ceZiNFC469R61jlkPcyx\\/xh8R3eowuFBQzBzH\\nj1RxSXkncfNPXw9fN6YXBIOYJB6obII3iDKFapPq8fh7+UP4IbJfPBYz6xx9I4erLshdJSR5\\npBHVzejmjyEEEbxF0EEEeFIO8evr7Y8gGfNnu6IvCyOO\\/wAdPfnFkEIKOR9vXyghULB47u3v\\n\\/RF4POD6RDeDMjgcoQQRvEEOgpQ58+3xnFwc6R6obBZ58jF2uDxGXtA+MIKUngPh8IIc6yTz\\nj07vfF0NgQefv9UXZkcCR6YSW+R9vXjB7+uuUONZQ5z6d\\/vi7XPQPb3w2C1Dr7Yu2h5x8O+E\\nlCu4+v52jzKOQ6\\/VDnaDnB9\\/dBrp6x2juzhvrp64rrJPP8PfHmU8j7ITkT36+Pdz+3mfU5zH\\nSPWIrDbMdI9cVjyPMg5+7w69Y9biCG8VzPSfWYIMhG4\\/ZxHf0QPUvFcz0n1mG+Z6T6zBmek+\\nswQZDz6069Q9S8EIZnpPrMGZ6T6zBBkP6Xx7vl7h6l4IbwQQdn3+774XzHSPWIprp6fYe6EC\\nQOJA7YprJHP8fdBYncCYMg5n3QvtBzA+7vi3XPQPb3wjrp64ptDzD490KCVHh7YUEp5e2\\/jx\\n64c4VKlHnPu90UhErUersimZPEk+mPQg8SB749AtwA8IVKkjnHv90Wlwcw9cJEgc\\/f6otKwO\\nAz9gPxhQQONzHsKlSjz5dnjOLSecn0k\\/GEisnhkPHXu9kWZk8TnCgANwghUrA4b\\/AB0\\/pi0r\\nJ4bh454sghYQT3ePyggOfPnv6YIIIWEAb9fhBBBBFqikDziAOvn9HPC4IuihUEjMnIePXDdT\\n54IGXWePoHD159kIkknMkk9cELCCd+ndx66tCynzwQMus8fQOHrz7IQJzzJPaTCKnkjcPOPV\\nw9fP6IblSlEZnsA5ubcIUEk9w5x7dKdwueuP2DSF1vAbk8enm+OcNySd5PpMWFQHWejv6ITK\\nirLP0AfCH0N+rvPHwEeAKVqTpw6+3wi9S+Yb+vo7On3dsJE85PpMWlQHcISKiePqh4JA3e3j\\nDgAG7rxi9S\\/xfX3fbCZOW8n0+OeLVKA3cT0c3NxPwhIqz3k90e9WhaUk79B8eucXKXnuG4e0\\nwitwIB51cw+J6oTW8N4Tx6e6GxPOT2njDiUE7+6w59e2FFQGide\\/refdFylFR3n0dHj9EIqX\\nzD1xRSs9w4e+ElKCes9EZCEbrjwHz68YEo4q9nz68YqTlvP6YSUoq7OiKEknOGy3hvCN\\/wC6\\n6OwfH3xlJTbXefh1zhyL3HAjcN6iPQOs93r62hOeZJ6yTATxJ9MIqUT2dHfDgSVeHOCGlTkJ\\nKryM1TZ9hExJzbS2X2V55LQoZZhQyU2tJAW04gpcacShxCkrCVJ710HdLGq6I1\\/MYTYj1Saf\\nwIves+U0K4X3iVYdXBNvISKsHSAGKNMO+TpuiVSUMyZ1bokG23BVZSpdIKVluHH3ePHX87cV\\nBp9y0qZpVTSSy8nNDyT9LKzCQdlMsqI3ONKIKQrNLic21pU0taVMVWjUfE1EqOFsRSxnKFVk\\nBL6E5fOZKaR\\/Q1VpzigrsZ+TcsttWVSHm88u+hxhxbZk+EcVVXB9bk61SZgtPyzgK0G6mn2V\\nWS8w+2CO0ZfR+TcRcEiy0KQ6204iavZN5N3JINJcdYXPMstuKWhQUidllAFqfYUnNCkuApKy\\nhagFlKkbnkx9tru9KfV9kRluTP0zK1atbpWi5izVgmqUsBvBe7Z15Zbqkg2HCzYs6+84Q4lL\\nKCm1krUFqYD9sLKVy9Hl1yQqBX2K\\/Tmp1kIS4MmppgKzXLvDVK2zmdbUVnrsrzzU0rjra6U\\/\\nJ3a9sqq2y7FM3Rp5CXpNeWaplSZQRKVKnTCleaz8tfNlaeCVIdZKlKlJtt+UWpRaSpf0wwRj\\nCl44oUrWqYQkrAanJQrCnpGcSlBdlnSkDMBmS4y7ZIfZW26EoKlIRnToq4oSUnU6jhPeCZOo\\nWjfLcxLScpVGGZynfOs\\/LCSmaPOSs0h2XfptyyazJvy0wlcu9NIZaXLkVGZMQ5OVZ0GZ3QW0\\noa9alFk5tWDOIqJu+sF6u+VPJTbk1MhNYs+YmSCF1Wwqq+aK4HHXZyaoL1tV2aDa66hpMlNq\\nafYeafYcWy+wtLrLzS1tutOoWlbbrTiFhTS21hK0LSpJSsHI5Zg9+aYOjpReVA0Ha9ZqG6e3\\nj9hkhVw4d1eYSy07LYg0mRe2FPfmllpUtb2J9IZdotVUT5DIVR9isGWnHbXk0K7a8j7aj+Fe\\nG5nY9XpoKreG2JirYEmHl3dnKOlQcqeHg4s5nHKepfnci0CVeZOOoSluUpFooLyg9nnnTCcU\\n01gdoVJROobTumSkJS6QBYInUJDSybATbTBKiqaXHn6uOFZyG5I9vWe6EFKy3Djzno+2ORrV\\nLqdv1Wp0GtU+cpNao1RnaRWKXUZd2TqFLqlOmXZOekJ2UeSl6WnZKaZel5mXeQl1h9pxpxCV\\nJjiCQBmY6qDZBIVe4JGUixuNNR48PbyjjFKNfSG7gft+XPfHJUekVKv1ek0GjSjs\\/V65UpGj\\n0qQl0lb87UqnNNSUhJsIAJW9MzTzTLSQMypwAcY9NDATCyk6POAWFOEck5LJpmE+G1s2pMzz\\nAWmXnpm3aJLy9arato224V1eotT1XmVqaaK3514llBOoIMnI0YEKx35QDBxM5IKnbZwien8b\\nrmUk5CTTYPk71nPL1s0rQvEifsqXdY3l6VcmE6pSlUTmsfrmFuYY13ZuhubrwZt2VO7f8563\\nlw3jd\\/uSzUDmct4G8Exz3tzxO1SZdLRcSW6TTJusTLd7hx5SFCVZI\\/rhSwsIG8iaRa4UIvDZ\\nJRlTKpiaykLnpuXprCik3Q2gpcmHAeKCp1vMbWBYUNSCBrGxXxGkKPIYj4r3M4uXo1Ep11X1\\nW1goUZOj0eTnq5OoQpxaG\\/1nTpZaGwtaUhDQ1lpSd3n13zeVYxBvW778uBwP129ror921p7N\\nRDtWuOrTdYqC0k5ZJVNzjyk706oKfTLY5XfGFOGWhzdVvyk0JauYvV6h4cU4NPBE0imPOruG\\n6Hw1mVOSMxb9Bm6JNnIoSquy4WvWdbQqIXSpYTtRlJYZFK3kqc4b2m83Hd2f+9oVnGi8h\\/DC\\n5XCmM9oFQQTN4lrSafLvuAZ1yVGaXNTcw0sAANzdRqTzLoG92nC4slN5Nt6q6F1ej0BlVmKP\\nT1TTyEk5UvzxSlttadxUzKSrS0E3smaUAbqUI7WpEuJKmSbKhkpLIW4OfaPEurBz3khSynee\\nA6BDwnMkn9A6PRApWZ6t+Xs49Z+ENXXDvQD\\/AIxH\\/wCSPj17uGYjrckuLUo71qUpXio3PvMc\\n36rUTxJJJ8TrFFqU4oIQCcyAAkElaiQOAzz\\/AHI4n3eqLoA4DL0ZtC7RowQmJJ2mVmycJrYR\\ndkg+EJdlr8uGWN2YhIUlKU6gF716vqQhWs6hCkpdcccC3HPOs5L\\/AEfzpN6fGjFhO\\/IfOVAm\\n8SqVeF6SzoSmVcsXDdD9\\/wB3Ss2tQU0yzU6Jbk3Rmy7vmJypSsqyDMTDCD6jEXnshpmVuq1Z\\nSfrqap7CrcEATE1rxCiuV3aApN9QAJZhuXsZiYI0ASwk8ybOOi9t4s0fA6jdBBBBF1RKoIII\\nIIIIIIIIIIIIIIIIiM\\/Kd8AilzRu0oaZIq1VCu4E3lPpaZCUqT5bf2HLCnEBLylLScTCrabR\\npKGGQ3slFXlEuaNa\\/K26Pf8AZJcn\\/pD2RIyTU5dNsWkrFeyFFJVNN3Lhe8m71StPzOz8uuKg\\nU2uWiyXgprUuB4FxlZTMNRXG1JNawvWJFKczxlVTMsLEqMzKKTMspRa5zOqaLO43DhBBBIjW\\n1eX86p0y2BdSUdqjnnZPaADvWElHDRR1G8ebalQO7gejp93X4zyVQ4UHpTzju64ZIWFDMbj7\\ns+uF0qz3Hj7+6OLFoFtBpxH29bvhWJHA9dc45IKCgCk7vaD8CI2PcmXiUbWx0qFjTThTIYl2\\n3NSbKC4G0fdBbDcxXKW6sqzC8qWm4pVLeaVLenmdRZI1Fa1ELKDmPV48eyPucPrzn8P74tG+\\nqSc6jaVxUe4JdoqIS8ulzrM2qUeyyJl5xptcrMJ4LYeUk\\/WiG46w0jFmEMRYdUEqVVKXMsyx\\nXbK3PIAfp7q77wzPNS7x1F+zI0veN9hKsrw1iaiVxJVkp1QYefCPrrlFLDU60N9y7JuPtaA\\/\\nXOl7RO10MrxFLvqtWhMPFLF00jyiTaUcwurUIuTKEo8\\/JBXSpiqOuLRntPJWNYZp+i1O\\/Kdt\\nHdu48GsCtKCjybZqeGd4VDCu8Xmw6ZmZtTECVXWbanZpRBYTI27c9uTtPaCS0+qcvoBQfR50\\nplXhRiBKSFXsDEqhTBm6Yp2g3TIvNgoM9RJ9EtOlOqclAT9LmlNKTvybmcuffst05MApHS20\\nOMecEJVMvPzeI+GlTXZbuuz5Ob5oyGLtw3n1OvZNiUavKjUCafcDjOtKpcAfYDm0Txf5P+LX\\nMOVinedLMuKFWQ1OIcuhTdNqKly88hSFa5ms86opOiHOzvlUAT1\\/tRoqKnKPuy4DoqVPDsut\\nHpJXNSgQ4wpC06ZXUCXSCLlSVKtmFxHm7YV1jyu3BIuK1nKVMusZcV+TvlUxLqPSnWW8yj8V\\nLGrnkmO0wc8iD1giMZMM56YpF0zVGn23ZV2cQ\\/Ivy0y2th+XqMgtxYZfadCHGXmtnNSy2XEJ\\nWl5QbySrzVZHIWpHDhzg8P09cfQivS3m1SfIH5OYtMoI3EO3K7HcR2oXa3C0cSTjfZvqsLBf\\npj17\\/wDzXjkUr5j6+Y+PVCoJHCGaFhY3biOIPGFUqKeO8e0dOXT2RolIvu9nD1Rikcx7YeBQ\\nV1Ho7unnhZDikbuI6D3+PZDIHPeP0QqF9Pr+zx2RjKb32FxxHEde2Gykg3T94+fW+OSSsKGY\\nPaIVCyNx39mWf6I4wHLeD6RDlDwO5e49I4enohgoI3ajl1v+MAUDooevrd8IfAg8IUC8tx39\\nfOO3phqDlvB6uI90KBY5x3d\\/V8Yb669\\/zMeFBGo1HXt9UOgQeG+L0rI6x0Hx7OENQeceiFAv\\npHq8d8BF9CIRDsKB7ejxx9EKJWpHA7ug7x47MoaZ57+MXBZHX2w0W+Wo5Hq3whBRxSbdc9\\/x\\njkEvJO4+aevh6+b0wsCRvBy6wfiI40LB6j28\\/Tn+jshRK1J3g5dW\\/I+jhDKm7cx3G9vb+v2R\\n5mI0UL\\/bu9RtHKJeUPrDWHTwPqyyPs7YXS4hW4HI9B3H7fRHFpeH4Q9I3+sc36IWCkq3gg+O\\njiIbII3iDKlW7Q9cPlpHIwQyS4pPA7ug7x47IWS+DuUMusbx6uI9seQkoUO\\/wheCLQtKuCge\\nrn9XGLoITBBBBCSlJ4ezSCCK5npPrikEJ7McD17oIv11dR8dWUV2g5x8e6E4I8yK7j13wQtr\\np7PR3ZxXWSece73whBCcquR9kEOMweBzghvBmRwOUeQQ5zPSfWYMz0n1mG+Z6T6zFdZXT7o8\\nsOQ6\\/UPZBC+soc59O\\/3xXXV0+wd0N9dXT7B3Qa6un2DugsOQ9ggsOXXQHshxrK6fdFMz0n1m\\nENdXT7B3Qayun3QWHIezrkIIXzPSfWYpCGZ6T6zFMyeJzj0DkPZBDiKayRzj3+6EII9seR9k\\nELa6e30d+UW7Qcw+HfCcEe5VHh7evsgi\\/XV1Dx15xaVE85ikEehB4kD3wQQQQQoIHG5ggggg\\nhQAG4CCCCLVKSniQO07\\/AEDiYSU+PwQSek7h3n2R7HoBO4GF4sU4hPEjPoG8+ocPTDUuLVxJ\\ny6Bu8emEypKd5IHjo4mCFBHEm3XP9cLqeUfqjVHSd59WWQ9vbCJJO8nPrJ+JhBTw36o9J3eo\\nc\\/6YQUtSuJz6uaFBBPd49fG0e5kp3C\\/f9\\/3Whwp5I3Dzj1cPXz+iEFLUvid3QNw8ducJFQHP\\n6B498WFajw3dm8+OzKHktcbes+rcPt98eWUrfoPd7OPWsKKUBvJ3nmHH4CE1LJ3cB7\\/TFmeW\\n\\/hCZX0D1+O6HggDvPP7oWEgd55nr7++LyQOO6EysnhuHt+yLM+c+nf8AGEyvmHrO73\\/HKFdd\\ne2FgE7ovJA4wmV5\\/V3Dp6e7tz9UWk57yeriPdDZb3EJ9fN6OOf8AxvgIUATu9vs9nq18YXlS\\nnVWp5db\\/AF\\/GFlLSgZk+jnMNVuKXu4DoHxPj2wmTnmSeskwmpee5O4dPOe6HUN8tTzPDr27+\\nEeXUvQaDreevdFxUB1no7+iEiSeMWk5bz+mElKJ3cB44xkob5e0\\/Z14ndCwkDvPP5couUvmH\\nr5vR0+OmEycsyT2kxYtYQN+8ngOeGillZ37gOAHAQ+EgbvbxhUXuOlW4bhz9J7ejshEkDj9s\\nUUoDdxPjjCJPEn0w4lJOp3fHrnB1bh3\\/AGRUkk+4dEJqXlmBx6eYH4xapeYyHDp5z8QOqElr\\nCBmfQOmHQNwA8I9395667oqpQSMz9pPjxnDNbhWecJ5h39Jii1lZzPq8ePbCSl5Z5bz6\\/wBJ\\nh9CN3E8+XXt+EOpSB48\\/lHyd326a5Ky8xT5h2nXFR30T9Cqss87KzUjPMONvtbKbYWh9nN1p\\ntaHWloclpltqZbUlbZC5AvJw6bb2NtpO25eb6ZbGLD2UlqbftKWppl27KKwpuSlb3kpUaiUz\\nC31ty1cblxsZGtuBxsSdNrdPlU6IFKCQVKO7x6yfHPHz1Puu8cHcQLcxyw1mDJ3RaM229UJQ\\nKc8kr9FKdhUqZU2WlJM1JTkip2Tn0bliVUiYlnG5qRlnUQ7aTs5pu1LCb2G5wMtVaUD81hip\\nvCwlag4kdpT5hwArRTarkQ0\\/a\\/m0wmXnUIWtjKq1NlO0ScwBiBqYKnHaNOluXq0mk37SXKvR\\nfaSqyRNSqlqdYJKc5LsupaG5lxYnGS081NsNTUu4l1h9tDjbiDuU2sA55ZDeOBB1SD5qvO3x\\n3fgTitMYUX9T6y6pxdv1EopV0SreurXpUw6j9dttDMLmaW9qz8sEgLdDcxKhSEzKlp1i6KGk\\nhaOOWG1s3za8yFUK5WdV2mvzDbk\\/atysBtFWtmqbLINzMpNKCcyltucadk6rKoVJ1Nt5zL7y\\nk9CP457o+VMs5ijZVjmVqEmJikYkwnWQ+x26SlxickJgodlZpq4S42rK5KzrBJafYW60czLv\\npfRkopeKKKQFNT9JrEikocbV6D0tMtpU060q2ZKglSXG1ZUrbcSlVgtNhrR+UHaCcvhfihSd\\nNPDCnsqw2x1qTVOxNapjYck6Fi07JPT0rcwUwAwimYmUaVdqDj6AtCrrpNbnpybMxcsgzEbE\\nkk+4dEeizh5SLE0wtHHFLQ7xmb8tpNftKcpdMmdZtU9LUlTrMzRKvSdqoZ17Dy55el16jKd2\\njCfJaY0tpyVkZltcA\\/SDwBxF0csdb\\/0er7pjgvqxLsetd5uTZmFNV9L7jTlv1uhNuITMTNKu\\nqlzlNrNDcKEuzEjU5XWbS6pSB9j8O4qpG0PCdB2h0IJakMQywVPyZczro9cY\\/J1amvKAF1Mz\\nKHShwpQJhoJmEISy81m+cG0vBs1g\\/Es7IuoJaW8pTTiU5W3Av8o262NQETLZDyUXJQ4XmRqy\\nQJRXycXARqg4S416SNUlECp4hXZJYYWm+626mZl7XsaVarFxzcmvJLLkhX7kuCSkH8i8sTlk\\nFP63CT5Rtu0rroE1XbftNhwFukSL1Vn0pOaTOVNSW5Rp5JH7LLScquYQQDm3Uc8xxR2DoVYD\\ny2jBopYG4IFpqVqFiYf0pF1KbU3sHb3rQduW\\/ZtDqCW1sTF4Viuvy6td0hhbadu7kFLwqxRv\\neUrlz3letRmm5SkiZn6gqdmlIaZlKDSmC1LPvrPmtIl6TKNLeWrJIDalcdx+cflCYuVVl1BE\\ns4XTX6t5vLJQMyl0umlsM5EpuQpwsyAKECyi65vJIV0bspoIp0rJJdQlH0ZIdvMFfohM7OjO\\n7nKgBZAXMAKV9UNotYCyYqHLf4x\\/dVjtYWDdPntrTcKbPVWazKoATsbvv9bE64xMEZF4y1p0\\ny15qW19YS3zxNoa1S\\/Ma2nuzZTaTUzOKHmsNBlBPAreJKiBwzShBB6nPX9bpDYtTeOOOWKmL\\nU1twi+r1rlbp7MySp+RoLk2uXtymLJJJVSrfYptNT1Sgy5iWVuM+R0eXJA2s3rTSsgBkHMg2\\nTv35tJQR0kknLM5\\/RvZxhH8Xuy3CGEezDU1T6LKN1BKQkA1WdCqjWleiPqqqMzN2JuSlSQVK\\nOp5jxrWziDEVbq4JUifn3fNiSbiTaIYkwb6+jJsspOgFxYJAsmOfdc1fNT9bn6vtPs9UNCQB\\nmYqTxJPWSYRUrWPUOH2xIkI4e09e6IiAAPiecSwPktWj4qt4q6RelDVZALk7EtGjYOWfMzDK\\nXGl12+p9q6bum5BxTZ2NQolDtWgSD7rbrT3kF5vsALamngZq0ah+Q40dzo6cm5gTJT8oJS58\\nYJOfx+uoBKUKemMUG5OdtJTjYKltvs4ZyFiSE026S8ibk30LQwQWWtvEdYYMpv0VhumSyk5X\\nXGBNvi1lB2b\\/AC5Sq35zaVJZ8GxFgUpjzeQYSRZTie2XpY5nPSAI5pQUJP8AawQQQRKI2MEE\\nEEEEEEEEEEEEEEEEEM32W5htxh9tt5l5C2nmXUIcbcbcSpK23EKSpC0rSooUlQKVpO7zYeQR\\n4Rf5aawda9fGPLv09tHp3RS0xNIDAtEq5KUay8Qqs7ZqHNZRcw\\/ubY3Xh+4pw\\/srxs2uUVE0\\n6klKJ1Ey19ZpQGJiFhYz4EcRzjvHjjEpn5Tpo6fMmIuAmlPR5AiRvegVHBu+ZthoNstXHaTk\\nxc9kTc2tIG2qFet6rXPIJWrzxIWVLN\\/UbREVoEpOYJB6RHF+MqR9B4kqtPSnKyiaW9KgDTzW\\nZCZiXSDoCENuhtVtM6F8bgVZUZbzSdmGLWShwlv+5r9Nvu0QoA24g+EcmlfAK9ff47emFQSk\\n5g+npHdDFDoXkD9bgBzHs6OodsLpVlu5urmiKKRfUDXiOHq6+\\/CiRzyeGKCsQtHej0SemA9W\\nsNKlM2VNJWoF5dHaQipW1MFvgiWZpc4iiS\\/++CiPj6yV5SYdF68RduElEZfe21StV162J3Wc\\n117KQDbtKWUq85LXzRNSEulw+Ytcu7qndqtQheTQxS+4\\/G2oWJOTYZpGJ9DckmG1OBtsXRbi\\nJiq0Z1SlDMbSmruCnttAoMzNT0ojXWpDaFywtDS9DRr9qloTTykyd30xTsmlS1lKazQ0vzjQ\\nSgnVCn6YuppccBTruMSrR2v0YT86dpFHOA9sVXbbQGabiUCqygULNBFWUXXQkCyUBqsMzbDa\\nUmyGClIyBWWO2MEVX8LNl9OdUrtJ\\/Dx+jpm5uu9OShtBUr6yiuluyz61HVbySSSUlUQxOWY0\\nen9FnlGcY2KVTjT7UxMrMpj7YOzlkSMm\\/TcRJqZqtwychLMlTDFPo+IUredvSkuwEsokaYxl\\nLMNOJlm8cpOcanZWWm2VBbE0w1MMrGR1m3kBxBOWY3pUOHD2xKO+U0aMovXR\\/wAKNKahSO0r\\nmCd2LsS95qXZTruYeYlPy7VJqFRmdmVmXt+\\/ZGk0umslbaG37+nlbyuIleFtXE\\/bokXF5v0h\\n9UtvOZMs8VPyys+YAqeYQn8VgZx3vgquIxhs3w7WS4l6dpaVUKqKScyhMSQbYQ44q6vyjzCZ\\nSaVe3pTlrWtHLGOqSaZWptCUZGlO+csaG3m80S4kJJ1KWnc7IvfVB1OsdpA5ZEHrBEOW3Qcg\\nrcfxuY9vQfZDAKI7PHCFQQeEZqkkd45\\/PlEGjkQct4P298KhYPHcfZHHIcUjdxHQfh0Q6StK\\nxuO\\/nHOIQUg7\\/bBDsKKeHqPD1QqFA9R8cIZhRHWOiFAoK4ekc8MLb\\/WPt+\\/1GElIPjz63w9S\\ntSOB9B3jx7IcIdSrcdx9nrjjwsjdxHXx9fGFAQeB9HPGOpvmPWOvVr6oR6SPD2j7vdHJAkcD\\n6OaFAsHju93rjjkOqTu4joPw6PAhwlxKt2eR68uvgeBhooI7x3b+HXHnHt0q36H38Pb8e6Hg\\nOWRB6wRCgX0j1eO+GoUU8PSIvCweO4+z7IRCSgjdr8fZ+uHQIPDfFwURw9RhsDzg+kReFnn3\\n+zx6oCOBHqMJh0Fjn3e7v98Xg84PpBhqFA8\\/oMX7xv3jPnhBQOBt74QUA7tOuuMPEvLHHJXb\\nx9cKh5J45g+sesb\\/AGQwCzz7\\/Z49UXBaefMejuhotb9PWPsH3R5Zae8e37\\/ZHJAg7wQeyFA4\\nsfhE9R3+\\/f6iI4wHnBy6CD8RCodWOfPthooPA390GYHRSevXu9scmH\\/xk+kdx74UDqDz5du7\\n28PbHGJfB+sCOzfCgWg8FD07j6jlCSCN4PXfBZB3G3r+f2e+OTBz3iCOPB5wfSD3ReHVj8In\\ntyPtO\\/2x5HmQ8CD164ewQ2D550g9hI9+cXh9POFD1H4wR5lVy+34QtBCe1bP4XsI94i7WSeC\\nkn0jvghNiN4i6CCCCCCCCCCCCCCCPLDkOv1D2QQQQQQWHIdfqHsgggggj2CCCCLdZI4qSPSO\\n+CCLoIT2rY\\/C9hPuEWl9PMFH1D4wR7YngfZC0ENi+eZIHaSfdlFhdWfwvUAPaBnBHuRXh6\\/l\\neHhOW8wmXUDnz7N\\/t4e2GeZPE5xYVoHFQ9G8+oZwQrIBvP2fGHan\\/wAVPpV3DvhIuLP4RHUN\\n3u3+smGqnwPqgnt3QmXVnny7IUEqPC3jpBdA4X67\\/sh0SBxIHacoTU8kcPOPVuHrP2w0JJ3k\\n59ZMWlSRz59m\\/wCyFhu559w+fL2QZlH6otw8N3qhdTyzwyT2cfXCRJ4k8ec8\\/pMJFZ5hl7+7\\n2GLSSeJh1LduFveeurQZCfrH33PXthUrSOknqyy7PthMqJ58ugeBv684TKgOf0CLCs8272+P\\nVDgQB3+Py6PfCwkDh6+MKEgcd0WFfQPX47oTJ5yfSYsKwOG8+z7YVCgCdwi8nPMk9ZJiwrA4\\nb\\/d64sKirj6BCKnEp3Z5nqy6uJ4CPQL7hc9da+6FZQNVH1db++3thUknifRzQit1Kdw3n2eu\\nEFOKVuzyHQPRxPE8ISJA4n0c8OJRffqeQ8Ot3KDNwSLcuJ9n64vUtSuJ9A3D1QmVAdZ8cYsK\\nyd3AdXH0njCZUE8fVzw+lvdf1Addc49COKj13nrxi4qJ4n0cw8ZwmpYHDefZFilE9Q6ITUtK\\nBvO\\/mHOYyEotvt4fOHIuJ5z64QW8BuRvPTzDs6T27tw4wktxS+odA+J5\\/d1QkVAcfVzw4BwH\\nqg66vFSc8yT1kmE1L5h6+6LVEq7PZ+mE1LA4bz6Mh292Xvh1KOJ17uXz+EHXXXsipIHGElKK\\nuodEWkk5kn0nxw9UN3HeZHpPd46umHACT8Tyj0Ak\\/E8ovW6E7hvV0dHbDVSio5qPr4D7IoTl\\nvJhJSid3Ae\\/f3+Oh9COXrPXw\\/XDwSB484qpfEJPUT09nf6umEVKCBmfQOmLVuBA6Vcw74aKU\\nVHNRz+A6uYCHwAN0e9W65xctalnM8OjmHjxzwgtQIKcgQQQrPeCDmCDzHMbjuyI7Yopee4cO\\nfr+yEyQBv9HXDyEbid\\/AfPrxhxKNxPs+fy\\/VHc2hvpFzGibjMik16c2WBmK0\\/LyVypdLhlrP\\nrW5mnXUykZllunLdSxVwgATNuvPOFqZnaLIJTLRsy6E1qmtIcebmJuXbbUX0uoUidlVgKYm0\\nKTucCkkBxSSUqzQ6VFK0RCrr9Ilq\\/S5qmzW5LyCWXcgTLvozLL6RuOba8iQCCtsrbJyWTG43\\nkr9LCfr9CXo\\/3xPf9\\/8AhXJ\\/96kxNzAC7ow\\/ZWiX+akbTVVMTlrIcYlm1BAU\\/b0xSnm21rpU\\n9NL5b8qHZSnEtFVtGo8sDWKQ2wxilppHpTkkkIYka4QAFKclQG6fVFALKpYSk2sIRKPrX1x5\\nO20ky0wMD1h\\/9jzC1uUN11Zs1MrJW9TwSbBEz6b8sLpCZvtm\\/TXOtpTIism9avYV10O76GsN\\n1Khzzc4ylR+hmGiFNzchMBIKzKz8ot+SmQkpUlh9eopKwlYyD0odATC\\/TS0gNC3TeoLtMkl4\\nYXJS57FGnTMo2+q9rPtdqqXVZFMnmQnyabrNoYpSElbNVl5lssz1sXHW9tNPMW7SKZOYeSlQ\\nYnpVicl81MzCAtBz35jcpChwC0KCkKTrKyWFpjN3RJxoXbdRnMLa66VW\\/dry36C+4taxSrlQ\\nkKTLJQSUok66mXalyEj6Kptya\\/MTMTb4oXyetrK8FM40wDWJpUtQsZ0WqiluvKPZUbGrFOdb\\npE2b6MtVNaGaXOOAAdqmmuOrbl5Z1UXltawLLYnpsnVmpYPztFfYmHW0\\/XmqY08l95sEWKly\\nxCn2wCLsrm2kpUt5IjLHHW6vuSw1uCaacCJ6rNJt+nqG5XlFUC2pgoVn5rjNOROzTY\\/3xjPI\\njMCNPypGNSMHNDrEVMlOJlrjxPEthRb6NbJ1abtbmBdC0hJDiNjZUlchbfbz2M49IjXSpYjd\\n9pXXcmfuOi2fLPZtUOUVU6i2FDVNSqiUqYZdTu+klae2082VAHUqR3c8QxOW5xsF2432NglT\\nZgrp2EtsLrVeaRkn\\/vuv9uRqKWHglwh1Mjaklb0zKLUhtba67PtoSEL11Y2y\\/D52obfsLUx1\\nAfo+FXE12phIzseb0JaJ5YcSSQpqbrC6fSnrmxbdG86GtcS1D8FdmlUnEns56tjzCV1yqzVB\\nJYSpKt4W1IImpxojULBII1UNK0nLqm5piWTxedQjd+Cknzlc+5Kc1HqEdypSEJSlO5KEpSkc\\nwSkBKR2AAAdQjry0ZTazr02oZplWilJPM68VJBB\\/ctpdB\\/F1gOc59gKVnuHD3+PHV9V6o6XX\\n0NDc0nXkFLAUf\\/KE29Y3C54xfVdQT+iPedfhaKKVn2cw74yL0P8AAKqaU+lHgRo9UlMyDipi\\nTbdt1iZkklb9KtJU4KhetdaSASoW9Z8lXK450NU5R3b4xvWrLcOPjx+mJQXyXvRrF7aSGMWk\\n\\/WqeHqPgfY0vY9oTL7KikX9io5NNT0\\/T3\\/qLfotiUK4KVUGgc25e9pMqy2qDGdhql\\/S9bptP\\ny5m3plCn9Cf2O1d6YJ4XLLawL6XIA4QuTYMzNMMWuHHEhVt4QPScPqQFH1ROBo9KplApFLoV\\nFkpemUejU+SpNJpsmyGJSQptOlmpOQkpVhOSGpeVlWGmJdlIAbbaSkjo5iCCOtAAAAAAAAAB\\noBYWsBwHICLHGgAGgG4DcPAQQQQR7BBBBBBBBBBBBBBBBBBBBBBBBBGsnletGtOlFoA48WZJ\\nSXlt32Xb6sYcP0Ib2kyLrwxZmLgckKe35wM\\/cdrouW0ZUEpAXcJzcaABjzX0qI3cR44R660e\\nYVykujUvRI018e8FpeRXJWtTrymbnw8JCVNOYc3shF02gyy8lthqYVR6VVG7enHmWWmvnSjT\\n7IQks6goXbNRrml11tFwQqmzZA3EFT8mo211vNIKjus2m+oEQ\\/E8r6bE0BosFhw8lIupo31B\\nUUlwcDZAGo3YSA849EOG3eZfoPf46uiGAJHDx2wsFA9vR44+OmKDUkjXeOt8RFSSO8c\\/ny68\\nI+1s266rYt221edCc2NYtWu0q4Ka4SdRU3SZ1mdYQ8lOYcl3Vs7KYaVrJel1raUhSFqTEu7C\\nXE2Wn5XD7Fi1Hg9KTsvb150fNTalKl5huWqaJKa2SloS5s1mTqDGsdm4XpdeS0qiHEh0p3He\\nPd2ePXujfzyZeLCbuwdq2HE\\/M7Wr4ZVhQkELWjXXa1yuzFSp2qFq2znkVYbrkq4dXZSsqqmM\\n6+a0ITyr5U2FFT+GaTi+Ub\\/ZWG50S064kekKZVFttturIBJEtUUSqGwdEideVxIPQPk+YhTK\\nV+pYamV3lq9KF6WQokgz8gla1IQm4AL8iuZLhGqvNmk2NgRKh0gcJbT0tdGbE\\/B+qusKt3G3\\nC+r0KRqLqS+KROV6jmati5ENtr1VzVtVz5rr8qjNxszlNZQpC066VeYrRaRcOF2KdzYdXjT3\\n6Lcdv1+vWLdFIm0lExSbntqqTVLqFOmUKIKZmSq0jNU9xJTrBwrBGeer6WmiBfSbhw8mLZmn\\niuo2VPeSNBwlTpo1VU\\/N05ZUo70szCKhJoQDmyxKsJHFIiPjyrvIW4141Y8YjaWGiXV7Nr1R\\nv+epdz3LgtVp1NoXCLrl6dISFbrVoXJV5tdrVZ24ahJi5anJV+o2omWqU9UxIzU8lyUlDpfJ\\nt2o0SiuVrDmKapJ0ik4ilGJqSnJxxTcpLVqXUmXUh10hTUqmaacSpcxMKaYQacyhbiVLSFbf\\naphCbmlBclLOzUzJOPSzrbSSt5yTcAel3Ut\\/Wc7JVlBtsKWfOFEJKUnLHPSvLceHT0d8Kg84\\nPYRH3OImDeMmC89T6LjThZfWFVfn5NM1L0u97aqtAXNtpUWnnqa9Py7ctVJNuYS60J6nTE3K\\nrLZKJhQOQ6\\/BI4eO2Or2nWJhpD8tMMTTDoJbflnW32HUgkZm3WlLbcSSNFIUQeBjmJ5l2XdW\\ny82tp1s5VtuIUhaVC1wpKgCCL7iIdpXzH198KA84PYR3w1Cgeo+OEXhRHD1QFF92ndw+6Gof\\noe5l+sfEdw9HGHAOeRB7CI40KB6j0QolSknNJy6eg9ohogjfBHIhZ59\\/Xz+PVCgIO8GGSHgd\\nyvNPsPd6fXCwOW8GEFAO7Q+77oIdhZHHf7x7hCgIPAw0C+Yj0j4ju9UKA57wYZU33W7xu69k\\nIKAd2nXL9UPEuqTuzzHQfgeIhdLqVbvqno5vQRuy9XZHHhZHHf74UCgeB9Hj4QwpvmPWOvVr\\n6oT6Se8e3l6x8I5IEjeD3Hvi8L6fZzxxyVqTwO7oO8Qsl8fhDLrHDvH8ruaKDw1Hsj26VbxY\\n8\\/v68YfAg8DFwURw9XNDUKCuBB7D7+iLwsjrHX39MJt6vH7fjxjwo5G\\/XXKHQX0j1eO+LwoH\\ngYahY5wR1+Of1xcCDwOceQkgjeD13w5zPSYvCyOOR7fsyhrrKHOff74v2h5x8O+PCAd4hJAO\\n8A+MOQsc+72xcCDwMNgpJ5\\/X4yi7MHgc4SUDhce\\/r2wkoT3j1\\/O8OQpSeBIi8OrHOD2juyhp\\nmRuBPoJ+yK66uo9o7soQW766HdvFjw6I5eyPMhG4\\/Z84fB\\/pT6j3xeHkHpHaO4mGG06vb9kV\\n109Y8dWcILXcR4G\\/zg9Md+7l+vuPRjkNoj8YeuLsweBB9McfrJPOPd74rmDwOcJLfeR4jw69\\nY9ZnVxT8Ry8eiI5DMjgcou1lDgpQ9J7447M9J9Zi7aLH4R9efvhPZngR17YM44p+3l3d3uEc\\nhtF\\/jGK7Vz8b2J7o47aL\\/GMXbZfSD6B8MoMh7uvVBmT+j7hD\\/aufjexPdBtXPxvYnuhhtl9X\\nqg2y+r1R5kV3e3roHuv5dH6J69fd8eZh\\/tXPxvYnug2rn43sT3Qw2y+r1QbZfSB6B8c49yK7\\nuuvd4R7mR+j7h84fbRf4ximsr8ZXrPfDDaL\\/ABj7INos\\/hH15e6DIeY9\\/wAoMyeCfcO7r1D1\\nPcyeJzimYHEgemGOZ6T6zFI97Pv90Gfknr2eqHu0R+MPXFpeQOk9g7yIZ6yekeuKa6e30d+U\\nKDXifh1693tgzLPD3H7TDov9CfWe6LC8s9A7B35w2Lg5gfTu74prq6oUGu72nr16cx3QWWd5\\nt67fCFipSuJJi0kDn7\\/VCJUTxMUzA4nKFhu3EDwHXwgDY4n2QqVjm3+7v9kWlZ5sh7T49EJF\\naRz59njKLdoeYfHuhYQkcL+MKCUjh7dYVJJ4mLSoDiYR1lHnPu90WkgcTlCvshXhCpX0D1+O\\n6LConj6uaEyscwJ6\\/HP6osKyeodXf0wQoIUe7xhUkDiYsK+j280JFQTxIHafGcIqfH4Iz6zw\\n7z\\/J7\\/QCdw9fs6tv14wqyU7zc9bwL++HBJO8nuHdCKnUp3fWPRzekndl6+yG6lqVxO7oG4Qm\\nVAcT6PHxhwN+JO\\/Tq\\/wgKydEj3a+zh74VU6pW7PIdA+J4mEiQOJHjq4wmVk8N3viwnLeTDyW\\n\\/V3DU\\/r9sAQTqT9p69sXlZ5t3vhMkDeTFhXzAek+ngO\\/1QmTnvJh9Ldu4e8+PWnKFgAbuvGL\\nyvPhu6+f7IsJyzJPaTCK3gNyfOPsHf6PXDdSlKOajn0dA7BDoAG4evjHsKqeO8I9Z+A78+wQ\\ngTzk9pPfFpUB1nohIqJ4+qFhJPcOcEXlfR6+77YTJ4knrJMWlQHWfHGEiSeMOgAbh6+MEXKX\\nnuG7r5\\/shJSkpGZPfCa3QNyd539g7evxzw2JKjmTmYcSgnU6Dlx+6FpQTqdBy4\\/dF63CvqHR\\n3wkpQTx49G\\/wPT74tUvmG\\/mz6Ozp5z0QiSBvJyHOT43xkJRuvoBw63fGHQLaCLiSeMN1ugZh\\nPHPIniBl0DgTv9kWOOlW5O4e090N1KCe3oh0DcAPCAC+g3xcpX4Sjx5+kwipRPUOiKFRVxPD\\nh1DqhNSstw4+7vh5CNeZ9w65+zvdSi2p3\\/D7+u+KqUB1no7+iESecn0xRSgkEqP2n4mGi3Cs\\n9CeYfE9J93Nzk5CUgd54nrdC4ucdKs0p3J9p+zoHHp6B8+3dFz4U3vaOM1hTKpG67Iq0rUAp\\nBcDE9JIUWpmSqDbCkLmKbPyjszSavLlSRMUiefaU4hDesOYUrLt8cY+xw\\/wrxDxmuOXsTDKw\\nrrxIueqtuoatq0KDUriqb8sUHyl5ySpkvMuMyTLWsubnH0tykowFPTDzTSVLC1OSjDEyqoiX\\nVTXJZ9ipNzhbTKP099pTU4zNF0hrzd1ha0udp6Fjc7tMuQmJmVnJaYk1PImmX2nJdUuVB5Ly\\nHEraU0Uel2qVhKmyn0g4EqGoESltGLHS2cZ8OLUvy2XiqhXnTUzzEqt9LsxRK0yVStaoE4rU\\naBm6dUGJmQdWG2233pUPy6FNzbZVtn0UbOkzNV\\/Fevt7Gj2jKTjFNeeQSg1ASan6rPAHiml0\\ntWxAz1VPVDWQQ5LbtMXJRckbpkYJy9+U\\/SKqlrYZYW16ep9eti0Za4JK9MQ5S4EsSaZ2oplr\\nefmbRoslUqUpim1J5+5pyrIq1vyrjVCMiUzU5v3xlFHwmwco2G9tLdQirH5tQ9MONKn5uRlX\\nkVCuVKbcYbYbXNVCadlWpstMMtZVBxDCJaWZaaT8n9pOHcN4UxxX3cOVin17D8i8qbpE3KzS\\nJpp5L6G3pKXcebUUuvyankSk06lWR2Zlu1F0u5U\\/QmlY5m8TYQpMhMS8zI1+qNtylWbcl3GO\\nwabKkTswhK0pCUzrTZdbYSCWmH3G1lKm0lWDuKOIdPZ+7zE+65xNOo1OlK\\/eNcm3NZ1FKoVJ\\nk5mpzajs0Fa2aXSZUoQEAqU3LZblZZwDsZcTqxjNiviHirXgUVO\\/7urlzuy2trt05ipzz78h\\nSWVHWJlqPIGWpcoCpShLyrWstSgFKlEcsPjmMLdFtzD+nzQauTHKuN2kyhClJebtCieT1u8Z\\n1tQBbWhzVoduTTKiCqWuVwo\\/YlasTenS3l07LSqcyHXUheWeYaTmp1WZ50tpUrjzdMdfeRJg\\nlVPwvibaLUGz51iafNLprziRm+iqOtTk\\/MtLAuUTtWdcYeBvZyjosBx5\\/wBu9dQ9VKXhuWUB\\nL0aVEzNJSTZM3NoQGGljgZeRbbW3xyzq73um3ZNuyxlaUxrfXmSqZWcsjk5lsgefINJRu4BR\\nVl0xzKlZbhx5z0ePHVQlKAEJAGQAAHBIHD1cw6oSJyBJ7THXjiy44tZGq1FRG+19wHcBYDuE\\nc6KOYknibwE5Ak9pj0meQv0Y\\/wCxm5OjB1qpyS5K8cb25jSAvFLrOxmEO4iydOVZ0q6glb7C\\n5LDemWaxMSj+o5L1MVAKZYdcdaEBXQP0bZ7S\\/wBL\\/ALR4lWJlymYhYgUtm7npPVEzT8PqCl6\\n5sRKq04tbTaH6dZNHrszJpW42XpxEtLNZvPtJV6sMhISdOk5OnU6TlpGnyMtLyUjIyUu1LSc\\nhJyzSGJaUlJVhCJeXlWJdtDLDDKG2mmkJQhISABcGymk5nqjWHEkhpKJGWVw7RzK9MkfxkNh\\nhN9+V5Y0ubyPDsvmdemiNG0hpBtcZ12Kzu3oSEg8LOHfHIwQQRdsSyCCCCCCCCCCCCCCCCCC\\nCCCCCCCCCCCCCIlnynbReE9beBel\\/b9NJmqBOzOB2JUwy2lbpo9W+cbsw3qMwGZYLalKZVmr\\n2pE5OzUyttc3cduyEultRyflpxinpsaOFM0ttFTHDR7qaJZM1iJY1UkbWnZ7IS1Gvyl7OvWB\\nXH1hp1aJWj3nS6HPzgZAeekGJqWbcbD+sY7iujiu0CpU0JzPOy5cldQLTbBD0vqSLBbqEtrP\\n9bWsbiQcGpSvnkk+yBdZTna59o2QtIHH0rZDbWyjv3Hyzkr5jv6+jv8AfCoPOD6RCtXpdTt6\\nsVW3q9IzFKrdDqU9R6vTZxBamZCq0yaekahITTRJ2UzJzbL0u+gnNDrakkdDRKiOzojjdbRS\\noggpUkkKSRYgjeCDYpI3EEaHQ2N4rWHaV57j6++MttC3G6SwMxyoleuCoKp1lXDJTtrXjMFp\\n+YblaZUEomKfUlsS6HXVfNlclKZMvutS70w3ThUW2U\\/TrSvEMEHhF6VEcd493Z3RH8QUGRxJ\\nRKrQak2pcjV5KYkZlKClLiG5htSA8ypaVpQ+wopeYWpCg26hCwk5QIzqRUpuhVWn1mnqCZum\\nzbE4wF5i2pbDiV9m6EqSVMugFt5GZOdpa03F4mYYSY0bJmSv3B+\\/abVKZUG9RqtWxVJCuUSq\\nMtrStyUm\\/J3JunziWXMg7LTKFuyjwKClh9Pm5\\/Ye6ZchMeT0\\/EiiKpzv0bZuG323JiTUfqre\\nnaQ4tU3Lo1RrvLp788tbpAakWm48+uzLzxNwouNV44NYiV7Du4HVJXPNUx9L9Arim1AhNft+\\nbbmaPVm1qQgrbqdOn5dS20vGVLwDo2d4McrlVaKqUoWk9hy5LtDZsHErDVlU1T3ckIbS\\/WrU\\nm31Lly44FvTUxSKolZU6USdstIRqr4exh5LmNaGHZ3BM8zjGnAFw04BEhiFgXKin6Pfc82qI\\nQkgJcpk0ubfUCoU5g2QOsaDtjwZilLUtiWVVQakpKUec5lOyalEJSMk2hAeZSo5iETLK5dpK\\nhnfVYkTb61RMG9Iaypy37lpFi4s2NUtXy6h1+m0q5aWHyh1DTs1S6mzMGn1OXS68qVdWxLVG\\nTJL0suXcOsNKek3yBmB9+qqVyaNd6VLBW4ni9NN2XcBnLxw2mXikqTKSMzMTBvC1m3n1Fbk2\\nKjdcjKtDyan0CXZCNn8ZglpGWHiVKNXngTipTK8JZLanpu1ay7KVqmJecUlDFapKzJ1yjmZL\\nKs5Cs0+UVNNp1tgtiNhFh6Y100jYyV+Uli6JJOqlVVpwaplbbTkj6RxhKBS58pAIS0Gqa44V\\nFT04omKYo2NMc7Pai7LSM1VMPzku6Uz1Kmm3mm+1GXMiepFQaU32v5v5aW7dsEhC0kgxJq3s\\n+omJZRMwluRrkq6g+bzbbjYmQg8Zafll2WlJ1sh5KFEAKaXa0RF9JTk8NLbRVXOzuKGFNWmr\\nOki6sYk2QVXjh+qVbdLCZyerlKaU\\/bbcwtJMtK3nT7cqTqSFiSCVJVGFQWRx4D2Dx0x6RVj4\\n0Ya4jIRL0G4pQVGYQUKt+rBNOq5K05LYRJTSgioEJz2i6a7PS+RALsYV6SHJNaF+kd5dU5zD\\nlvCu9ppa3lXrg+qSs6eemVpWpb1VtxEhN2ZWlTUyW356bnbeFbmSlWxrUqt99aujsJeVLLO9\\njK40opYV6KDVqES60b2AU\\/TJlwOthIGZxcvNvqUSeylE+ik0HiHYtNSylqos4q6bq8wqiCy7\\nbS4am20hDhO5KXGGk2AKn1XKognAg8PHbF4WRx39vH1\\/pjd7pGchDpPYYLn61gfXLex+tZna\\nvtU+UWxZOIsvLtpU8sPW7W6g9QKmWG\\/oWlUW65mpVF5ClNUCWLjbEaa72sK\\/MMbgmrTxIsu6\\n7DuaSIE3QLwoFVtqssJVvS45TavKSk2GnUFKm30s7N1pSXWlrQpKo6Uw5jPCeMGe2w5XafVb\\nIC1y7L3ZzzKTbWYkHg3Oy4ubAvMICrEpJGsU\\/VcP1mhuFuq06Zk\\/SyJccbJl3DoSGplvPLvW\\n\\/wCydWdL20j5sEHgfRzwolakcDu6DvHjsyhmCDwhQLI47\\/f9vjfEjKDw17jv69kabrXXr1xy\\nCXkq3HzT18PX35QqDlvBjjgQeB9HPCiVqRwO7oO8eOzKEEcCPUYOvlHIBZ59\\/Xz+PVCgIPAw\\nyS8k7lDV6+I7x7e2FgecHsI74QUA7tOuX6oIdBShz59u+Lwsc+72w0C1DrHt8euLwsHdwPXw\\n9B4Q0Wu71jr7ISUpPC3hpDsHnB9IPdCqXljjkrt4+uGQJHA+PjF4Weff7PHqhktnuPjv9\\/zh\\nGRQ1B+w\\/L3w\\/DyTxzB9Y9Y3+yFQoHek59YMccFpPPl2+Mouz5wfbzQ2W7c08uj84M6hvHt0j\\nkgpQ58x17\\/bx9cXBzpHqhgl5YO86w6D3jfCiXwfrAjs3wgoV3HrvtHt0HeLfD3Q91knnHp3e\\n+LsyOByhoHEK4KHp3euL8yOBIhJBG8W674MgO4\\/b8OvjDrWUOf4++K7Q84Hu74bBah19sXbT\\nq9seac\\/n16+HCE5FePr+cOdcdBiusnp98NtdPWPHVnF2sk8493vgtHljyPs5w4zB4EGKw3iu\\nZHAkemCPIcZkcCR6YNZXSfXDfM9J9Ziuurp9g7o8sOQ6\\/UPZBDjXV0+wd0Gurp9g7oQ11dR8\\ndWUGuege3vgsOQ9gjyw5D2dch7IX11dR7R3ZRXXPQPb3w31z0D298Guege3vgyp5Dr9XVzBY\\nch7BDjXV1Dx15xTXV0+wd0Ia56B7e+DXPQPb3wZRyHsgsOQ9ghfXV0+wd0U1ldJ9cI66uoeO\\nvOKa6un2DugsOQ9kFhyHX6h7IXzJ4kn0xSEMz0n1mDMniSfTHsewsSBxIHbFNZI5\\/j7oRims\\nkc49\\/uggsTuBMLFY6z48c0Wlw8wHp390I66R0nx6IptOr2wQoJUeHt0hbWUef4e6LcyeJzhE\\nrUersi0kniSe2Drrox6EHiQPfC5Ukc\\/x90WFzoHrhBS0J4qHvPszhMvpHAE+z4d8e5SdwPXs\\nHh9se2QN5v13Q5K1Hju6QPgePjhFhUBvUcusmGqnVngdUdA7zmYSz5yfbzQsN8z7IM4H1R7e\\ntYdF5I4Zk+oes7\\/ZCSnlnhkns4+uECtI58+zxlFhWebd7fHqhxLe4ges\\/H7wI89NXMD2feR7\\nYVJ5yfST3xYVjm3+yEiSeJ9fjdFpWB19nf3Zw6G78ye7d136QoIHE\\/Lr2QoVKPPl2bosJA4m\\nElLJ4buzv4+rKLSecntJ74eS3bu7h8+ft8YUABui8rPNu6zx8euLCc95MIqeSNyRrdfAd59n\\nbCClqXxO7oG4eO3OHAANw9fGPYXU8kfV84+oeuEFLUvid3QNw8ducJkgcT6OeEysnhu9\\/wBn\\njfCgkndB118ehChIHE+jnhIrJ4bvf6\\/0RYSBxiwr6PX0+PG+HQgDvPwg90XkhO8+zieyEisn\\nhwPtHjoi0nLeT6TDdb3EI\\/jH4A+njCwCdw9fCPQCd3t5de2FlLCRmT2CGy3VK3DcPb6YSJzz\\nJPWSYsK+j19Hr4+OuHko5C558vl8YdCQO884uJCeJhJSiocMh0cfX0+iLSeJJ6yTDZb2e5G4\\nfjc59G\\/KH0pA7z8PCFQstxKOO89HeeaGillRzJ7BFpIG8n7YRUonhuHv7e6FhJPhxMehJPhz\\ni9SwNw3np5vthInnJ9JihIHGElKJ7OiH0N8vWePXW+HgkDx5xVS+Yevu8ZwitaUDfvPMBx7e\\nzrjl6DQLhu2t062rRoFaui46vMNydIoVu0udrdZqk46cm5SnUumsTU9PTLh3IYlWHHVnIBEb\\nftGzkMNMzG9dPrGI9PpOjpZU5sXnKhiITUL5ek3cgpdOw3o8x85sz7JUQum3nVLHdAbVk4NZ\\nna6LEOL8LYQlhNYkrtNo7SklbaZuYQmamAnQ+aySCqcm1Ag+hLMOq0Po6GNnTaPVKw72NMkJ\\nmdWCAostKU23fcXnjZllJuPSdWhOu+NL6lqWcyfRzDsEZR6O+hXpQ6VlQRKYGYQXRdtKEx5P\\nO3i\\/Lt0CwqW4hZQ+mfvWvO063ETLAS6pdOl6hMVZ5DLglKfMup1ImBaM3Ik6FuASqdW7vt2d\\n0hL5k9R1ys4rJlJu0WpoKOuql4ayjYtlUoobPVlbrF4zUu8jXYn0a2Q2hVu9MPMMqZK06eqN\\nGt2RpsmzLUu3aYwyh2XkpdpDcpK06hUxorl5RpsNNS6WpZmSZbyAdaZyjmLGXlZUqT7aWwTR\\nVVJxIKU1eulUlIJOoDjNNaWmdmW1fm+cTFOcSoEKYVwtag7Hp+bU2qszfYZrHzGnJEzNkcUL\\nfKVMNKH\\/AGSJpJ3hQiPFot\\/J2bHofzfcultijMXzUW1MTD2GWFbs7QbTStB1nJOs35UJeVum\\nuSkwk7J5uhUiypuWdbUWKxMpUCnf5hdg3gLowWUbcwrsWw8IbOYDBnk0SRkKP85Py7bgl5uv\\nVl7WqlxVUNKdSmo1ufqVUcStQMy4MxHQl5aVk3MF6TsajCSQrNKaxXEpmJrLIefLU1lapSXc\\nB3oXMzE4hSMtpKpIjCnF7HOgWvS5i+casTaRb1Gl1LSazeVfkaVTm3dVbokqYzNvy8v5Q7ko\\ny1MpTG2fUAmWlFryTHKeJ9q2ONoE63K1GfqNacmHkolKPJpcbke2KgGkS1KkkBt55JslCwy5\\nNOADNMOEkm+KBs4pFAZMyJeUpLTaCp6dmVpdnMgAzKdmnl2ZbUL5k9qhtBOjKQAI2J3rpR27\\nSi\\/I2XIruGdSC2KjOJdkaK0vdktttWpUKglKgQpsop7agNo1NOtGMK8SMT6lcS5q7MQK\\/TpK\\nn0iSdcdnZ96To9DodNbUXX3FvPLZlZOWRmFvTU28pxQGb77hb3aCNInlscN7YTO0HRxs6cxI\\nrTanmEXvebM9btkS6koyYm6bQwZa7bgaUsEOM1BFn6qNRxt+bSsojRNj1pZ6QGkrU1zuLeI1\\narlNE15VIWjJu\\/NFk0hxA1WTTbWpxYpaX2GvohVJxibrD6Enyuozbri3V23gLyTtqeOyxO4r\\nU3gOguZVlupMqerTrZKT+RoLbrbjCx6Sf\\/jMzIvNEhxLLyCEnW1falgzC2dmhNKxFUkjIX2l\\n5ZNCrC+afWhSVgjKbSDDrTibpU62oaZO8qTpJ0fSK0mJ37jK5J1\\/DjDKhSVk2jVaTNpnKNW5\\noqVV7ouGnvNKcl5hucrM6qjsTso4uWqFMt+mTjJUl8qVglZ0p50xPqTmUgSzJO\\/JR855Qzy3\\nhOzSM9+qo8eKvjJWVnZ1eylWHH1njqJBSgE5ZrWfo2weOayN3AR23S5QU6ny8urLWQ3rOkbw\\nXlkrcyPFXnKKUnfmlIMfSeg4cpmBcI0LB1GKvMqJTpamsFZQZh9LKAqYnJgNpQnziemC5MzG\\nVCEKffdKEJSQkctYhrEzWqlUKrOKSZqpTbsy8lF8jYWbpZbCipQaaQENNBRKg2lIKibk8iTk\\nCT2mGjjhWchuSPb1nugccKzlwHR09Zi1pqZmpmXkpJh+anZp9mWlpaWZcemH5l9xDTDDDDSV\\nOPPvOqS2002lTjjikpSkrUEnKbbJIAF1HQAa2v8Ab+od8fAv1u7zEvL5LPosCoXLj3pk3DTd\\naWt2SlsB8MpqYlkutKrNYTTrtxLqcq46M5afpVHZsajS03LBanZK6a\\/IF9hBfamJnkYKcm3o\\ntsaHGhPgDgI9Jolbnt6y5WuYjlGzW6\\/idejrl236h2ZQpZnGaXcVYnqFTJlS1EUSl0xlGzZZ\\nZZRnXHVOFaUKNQpCSUnK8Gg\\/NXFj5zMflXUq59kVBkH9FtI4RYNNlvNZNloiyyO0cuLHtHLK\\nIP8AaiyNP0eZJJBBBEhjOggggggggggggggggggggggggggggggggggggjzzuX50Uxo56eN0\\nXxQqaqTsHSXpxxhoTjbDiZJi8pmZVTsUaS3MKSlD06u62\\/uymWmvNk5O96YwckhMaRkOlO5W\\n8dPOO\\/3+6PSH5Xbk557lF9Hu37NsiuWtaeMeGl3i78Obju8VRugvy1Qpj9Iuuz6xPUeSq1Qp\\nlMuJk0ipKqEpRavMNVa16K35MiUdm3EwHtKPQl0odDO5hbOkRhJcdjJmpp2Xod1hlFYsG6Sh\\nO01rZvejrnLcqrxly3MP0tufRWae04lNWpshMZsJ5f2hYVnaXWp6oMSjxpM66JpEw22VsS70\\nxYvsOqQLM2f7QtBeUKbUhKLlKrV\\/WJByVmnnEtqEs4vtELCTkSV2KmyQLIKVlQSkkXSBbkMY\\ngQd6Tn1gwsFg8dx9kcYlakHMH0cx7RDpDiV9R6D8Dz+\\/qitikHfGnh6CRvEXkocSUOJSpKgU\\nqSoAoWkjIhQOYyIzCgdx7YahRHWPHCFQQeHjthhSLG59ShoefXrtCSkHuPOOLkqNM29W5W6r\\nFuCu2Ddcg5tpCv2nUp2jTsq7nnrNOyExKvM6+WSxKPy2sdzhWjzVZ\\/4Q8qDpG4ViWpWMNuUz\\nHK1JcIbNfp+pbl+SsulCW0Lem5GTdpdVTLoRtVifoKJ6aeDqpm5EhYWjBcKI6x44QqCDw8ds\\naDE2GMM4ylRJYuw\\/TsQMIQW2XpxsoqMog2uJGryymanJAnUoZmktqVqpCxoZFQcX4kwu+HqN\\nVZqUBUFLaS4VyzxFrdtLOhbD1gLAPNLAH1QIkm4Faf2jDj05KU+2cQGbVu2YLYbsrEFLNpXE\\nqZcWhtqUkHpmZeoNanFOkpTK2\\/XKpNbtdbKU6uW0CxtIrFGyNjLsVw3BSmtVPzVcmvVGUsoB\\n+jYni43VJUIScmm2p1Ms35ubLmqECClV7UoNc1lT8g0X1A\\/ruXylpsE85ebA2pGfmh9DyAc9\\nVMd3YT6S+lZo\\/GUZw1xUnLqtSQCEN4fYhFVxUHyRrzkU+STPTKZulS2YJJtyr20veU62qpRP\\nLmMfJKps6HpnAWJDJrN1poeLRnZvvKJWvSLPoDehlE5TUHUF6e0K4vvD+3+WmkNymMKM24nR\\nJnqelNwTYZ1ycwvJf85brM0zaxLcvcgD0ALK0vbEruylLukZ6z55XmGYJNXoaljIDOblmUz8\\nvtVEnUfpqmZdGW1nFDNUdtXlh9glpEWn8z35aWHeLtoPB7YMV+mUS7JCTdfSgOPyLz7U07Sa\\nikNNKTNSLsnUJZ1plSHGX5dCkw2MIOWEw\\/qD0nQdIPD2v4WVk7Npy5KA1M3RaDzmvk9OPU\\/Z\\nt3JS5UJU2G2ZFi69bzlKnEJCArbNg7pB2Zfcsi68EsVqNX22m2XH5uy7kbNQkUuKVspesyEr\\nMN1GmKc1F69OrMpLuuBK0rlshmeV8V7K9oezmZTNVihVeidg6FStZllLfpinMwDa5WuU5b8m\\nlxWhSlM0l9IIC0JVdItinzGC8YMFNDq8nMF9F102Ysp0pFipK5Gb7OZKAQcywh5k2ulSknMf\\nusfuQQ0cr7VPVjAe9bswNrbu0daoE8XcRLBKwyS1LS8pWahJ3hTRMzCc5ibcu6sMyrTpMrR1\\npYRKL0j49ckRpv4EeVT6MNk4w2xLKWoXJgxMTd4vBlIC0rmLRVI06+mSGiVzLkvbc1TpZxp8\\nCoOtpbeekvWbpe37Q0sy100+nXhKICUqfVlRawEpCUBPlkow5T3ghOX7LSzMOLGbs39YnKuz\\n9J7Ci6dizNVd+1ag6Egylxs+Ry+0ITrBFWZVMUsNax8xc5NSTjiR+wp85IkOG\\/KK2rYULbM6\\n6ziunNlKS3WiqbmQgaKKKkwGamXFC1lzjs22i1w0dQYHiHYnQ50uOtSLlNeJJExSFDsCeGaR\\nWFtJQN5DTMve9s9gLeeXP06fpM9N0yqyM5TKlIPuSs9TqjKvyU9JTLJ1XZeblJltqZl32lAp\\ndZdbbcQoZKTmIahZHHf749EvFvRv0ddJGkobxawqw\\/xNlX5QsSFcqVJk5iuS0orMEUO8aX5N\\ncdJQcj9JRqxKKOWRVlmRp6xy5AfBC6ROVTALE67MKqm7tHmbYuxhGIFnBQH0UjJTbkxSLtpb\\nKlZh2cqFXuqZbyJTKrPmx0JhTytcB1jspfE9OqeFJpVgt8pNZpSFaDWYk2m6igqVuBpRQlOq\\nnrAmKYrOxrEUiVrpcxK1hpN7N38xndN92Zhapc2HKczEg2RewMTwKB5\\/QfHui8KKTmCR45xw\\nPpjZ1jbyPmnJg0ubm5LDaWxgt6WKlCuYO1E3W+4jIKQhNoTcrSL7cmFIzDiZG156XadQttM0\\n8Cwt7WpXKDXrXqk3Q7ko1Wt+tU90sz9HrlNnKTU5F4bizN0+fYl5uWdG8Ft1ltQ6I6IoGKcM\\nYqY85w3iCk1pkJC1\\/R09LzLrINrCYYbcL8svUXRMNtLFwCnURWNRo9VpDnZVOnzkiu5CRNMO\\nNBdt5bWtIQ6nkptS0mxsdIbJfPBQz6xuPblwPshZK0q4KGfRwOfUD8M448LHPu93f74vzB4H\\nON8QRvEa2ORBI4HKLg4ecenx9kceHFp4KJ6jv9\\/D0Qql8fhDLrG\\/2bsuniYSQDvA+32wQ+Ck\\nnny7d32RcCRwPj4w1StKuCgergfUd8XgkcDlCC2Du98EOgs8+\\/3+PRFwWOfMePHNDULPPv8A\\nf7N0XBY58x7fHqhstb9PWPsH3QkoSeFvDq0OgQeBHx9UXZkcFH0EjuhqCDwI+Pqi4EjgT46o\\nbLff6iOvhCSjkfC\\/zHyh2HVjnB7R+iFA\\/wBKfUe+GWurqPjqyiu0HOPj3Qgtdw9Wnygssbj7\\n\\/nD4PI58x6Iv2iPxh644\\/XT1jtHdnF2sOkeuEFvuI+\\/2\\/rgzLG8cuB6+\\/wBkchmDwIPpi7M9\\nJ9ccdFdZQ4KI9JhOTkq3q+\\/nBn5j3xyOsoc\\/x98Gurp9g7oYbRf4xiodWOfPtGceZDzHv7uv\\nUPUZk\\/o+4dc+tz\\/XPQPb3wa56B7e+GO2X1eqK7dfQn1HvgyK7urd3WvPUujl7vDv6156vdc9\\nA9vfBrnoHt74Z7c\\/ij1mDbn8Uesx5kV3e3roHuuXRy93h16jz1ea56B7e+DXPQPb3wz25\\/FH\\nrMU26+hPqPfHuRXd1br1HuuXRy93h16jz1e656B7e+Ka6un2Duhltl9Xqg2y+kD0D45wZFcx\\n16oMyP0fcPnD3WUef4e6KZnpPrhjtF\\/jGLdZR4qJ9Jj3IefWnXqHqM44J+Hd3c\\/gPU+zA4kD\\n0xbtEfjD1wyzJ4nOKaw6R649DfeT4D9cGcncPietYeF5A6T2DvIiwv8AQn1nuhrrp7fR35Rb\\ntBzD4d8KDX8U+v1eHV4LrPC3u5c+jrDkvLPOB2CEypR4kntJMI66uoeOvOLSSeJPjqhwN+A8\\nPVfrugyKO8+8mFiQOJA6vG+LSsc2Z9nj1QiSBxI+Pqi0rHNmfZ49ULDXcTu7uXXgfXHoQONz\\n111rCxWebd7\\/AB6IsJJ4n1+N0JFZ5t3t8eqLSSeJzhwN25DTxPr\\/AFwoADcBCpUkc+fZv+yL\\nC4eYenx9sJKWlPFQHVxPqG+EVPj8EZ9Z3ezfn08RDgQB39co9hySTxMWKWlP1iAejifUM4aF\\nxauKiOobvdx9MWQrwghdT5P1Rl1nefVw98IlRUcySfHMOA9EJlY5t\\/s8eqLConq7IUEE93XK\\nCFCoDn9A8e+LCsnhu98JkgcTl7\\/VCZcPMMuvd498OBAHf4\\/KCFCQOMWFfMB6T6eA7\\/VCZPOT\\n6SYRU8kfV84+yFgE7h6+EegE7h6+ULE85PrPjKEVPJG5PnHp5u+G6lqVxO7oG4RYpQTuPHo5\\n+OUOJb3cTy4deOndDgQBv1+H39aRepSlHMnuhNSgndxPQPieAhMrJ3cB44nx0QmpaU8T6OeH\\nwjn7B18PbC4vKirj6hwhJbiU5jiegfE80IreKtw80c+R3nd083PCBIHE+jnhwDgB6oIvUtSz\\nmT6BuA7BCRWBw3n2fbC0rKztTm5eQp8pMz07OOty0pJycu5Mzc2+4oJbYl5eXQ48884o6rbT\\nLZWpW4DMxsUwN5JrTrx4XJTNJwVq2HlvTgbUbrxheOHVNYl39RTM2KLVWV3tUJN5pW3bmqJa\\ndUZcZAWhZ2jId1FcxFh3DEt57iOuUmiSpCsrtTn5aSS6UgEpZD7qFvua2S2ylbiiQEpJNo2E\\nhSqhUnQzISU1Ou3ALcqw6+pNzoV9mhQQm1yVKKUgAkqABI1wkk7zFqErdcbaZQt151aG2220\\nla3HFnUQ22hAK3HFrICEAEnPzdYxK0wH+Tv2JSlSdV0kcba3d00kNuzFnYU09q16Gh1tWa5W\\nau64peq1ysyLwOSzI27aU4gE7OZQcnI3Q4E6EuifoxpTOYN4JWRZ9Vl2wpd3TUq9cV4pQhoI\\ne1r1uyarFyy8u4lJdel2KqxIa+s4ZdGUc6Ys8rnZxQu1Yw7LVTGE4i4QqWZXSKSVpsClc\\/UG\\nfOyEkmy5alTTS7EocKSCbLo+yPEc\\/kXUFytHYNrh5Ym5sJOoKZeXUW72tdD00ytJIBTe4ELb\\nR\\/5KvTg0i1yc3beDdXsa15wNOIvXF0TGHdvGWf1CzPSkrVZVd1VyRcQouom7btutMFptRCz5\\nqVbytHv5PJhJbfzfWdJTFm4cTakgMTE3ZOHrCrHsxDzbub9PqFyTK6hd1fpzzSdXyulosKfT\\ntTqBGprq3lXTjrhtapcaerqKzOtEpVIW8lNUdzSM1IVNtrRTGVgjUW29PodQrPNGaFAY33Xp\\nVXLPF2XtOjSNCYJUlM\\/UCmrVIp\\/BcQwpLVOl1EHz2nmainMea6RnHNGKfKm2pYnDjFMMphKn\\nLukIo4Ini2Rp2lVm0uzSXEm5DtPRIfmjKLHNceH9ilIl8jr8rMVR0WPbVJQZlAdDmRKN5ErQ\\nRple86GqjvAtkDhDo7aOmjBb7sjhBhdh7hPSW5NEpU6rSKbIyFUqUu0ULQblu6oKduGvuJU2\\n3lNXBWKi\\/wDRpzeGoIZXbpLYfW6HpejOTN2VBsFKUUtPk9NSscztUmUBCkfiuyMtPoIzz4xr\\nPxVxupNuUp278ZMS6TQKLLKXnWL2uWSo9KZc2anPJ5I1KalpNMwtIUGpKntB+YUQhphbiwiN\\nQ+OfLPaPNgmbpWENCuDGqutJLbVSaD1mWM27qDIrrFakXLhnjLvZBbcjbPkM4htXk1YSgtPq\\ngGG8CbS9qNQceoNBr2KJx9203VnS89KJdOUXn69UltSTTnG03OJcVrlSqxtYE0jCGEJdtNbq\\n0hINtoBbp0sEtOFOmjMjLJcnHUaWC2mUIGYZiDaJA13aRWId0baXk5xFsU5wFIlqIVtTZRlk\\nA9VnFqnSv62apRck25l+xZZZa5se9NzRu0ehUDinipSE3S2HFrsyhvLum+pqZW3tENTFDpap\\nuaprkyFAtztwuUinrKhrzyR50ReMeOU50s8dRN05y+v1M7TmQ639yuFqZq2G3ZZwLbLVSuPy\\nubuypJeYUGZ2WdrjdJmlFSxSpcKDaNfpL0y6pSi6+++6palErdeedcVrKUonWW44tRUpSiCt\\nRJ6DHX2AvIdnHizPbScUJlW7pWqh4Ys\\/NEaKKJmtTzJl5dYtkcblafOIUCS1OpKQTW9a24yc\\nohcrhGioFgUioVNPZouNM6JJhwuO3GqHJiabIsO0l1XKRvT0gOW2xCuIztE0dLHkcPKaVOtM\\nXve7clc94PNBWbM1JW4EO2nQX8vNcYqSrzZKc8ltLOsnTXiNiviPi9cDt0Yn3zc99153aBNQ\\nuWrTlTXKtOELVLU9qYcVLUyRBSnZyNPYlJJoJShlhKUIjg5C0arOBK3kCRaORzmAdqQd+aZd\\nOS0qyy3OlrM88fb0+1KVI6rjjZnHk79pM5KRnx82X\\/YwOGWvtFg5+dluPZODdnWzXZkx2OEM\\nN06Rmi32b1SQ357WJkEDMJmsTanpxTajdRlkzCZdtSldlLtpOWKNxDjOvYjcK6zVpmdSFZm5\\nVKw1JNHgW5RkNyyFAWSXA2XVADOtZF464kKRUamQZSWcU3nveX9Gwnfv+kXklRGWSkt66xwy\\nHGPtZGz5ZnJc88ZpYyOybzbYGXEFQ1XXN\\/A5tD8ZKuMfZEgAJSkBIASAAAMhuAy3bgOaLFrC\\nBmfQOmJW\\/U5h70W\\/yKTwQbr9bhAI53SEWiJrmFq0T6A7t\\/8Ajb\\/ZaEm2mJZsIabbZbQMkobS\\nlCd3EAJyzJ4EneSMzCK1lZPMOYd\\/X0xRSis5n0DohFS+IT2E93s3xhgHeo3Ud5Ovv4nmeiwA\\nVG3tMVWrLMD1+Of3dvDcbyEGiUdKrlCcMn65SxUMOsAUnHi+xMstvSMy7ZtQkkWJRphEwFS0\\n1864hTtuvzdNdQ8Z+gU2vp2KmGZh1rW5gJo0Y\\/6Ud4t2Do+YSXvixdKlS5m5K0qK\\/OSdFl5u\\nYRKsVG5q64WKDatIL60NOVq5arSaSyT9POIG+PQR5ELkz7u5OzAa+DjGLZex6xruak1u8UWx\\nUDWZC2LQtumKlrNshysGRlWp6q0uoVe66rXJmlvTNFXOVliSp83UJemtVOcnWCMPTFVrEnMO\\nS7qqbKvCYfmFNqDC1S57RpgLNkLU48EJW2kk9nmURbQ7elySpiYauhRZQoLdXlOQ5PSCCrdd\\nZsnLe+Uk8CY3cQQQR0hE4gggggggggggggggggggggggggggggggggggggggggggj5W7bNtG\\n\\/wC3apaF+Wrbd62pW5cylYte7qFS7jt6rypUF+T1SjVmVnabPy2uAstTUs62SAdXNOcfVQQl\\nSQoFKgFJIIUlQBCknQpIOhBG8budxpAQCCCAoHQhQuCORG4g7iDwiNjpjfJvdGrF5dXu7Rau\\neoaOF8TSnpwWbPInLxwdqMzqaxl5anzMwq7LJE3MkrcmqPWa3RKYyfJqTZbbCGWERUdLbk0N\\nMvQompyYxtwfrSLIYmTLy2LNlpdvHCyeDky5LSbi7tpTBbt1+pLaUunUi9JS2bhmGsnBRkbh\\nHp+Qxm5SWn5aakZ6WYm5KbYdlZuUmmkPy01LPoWy\\/LTDDyFsvS7zK1NPNOpU282pSFpUDFeV\\n7Znh6sZ3pRs0ecVc9rJoSZZSuBdkiUtW1\\/qCpcqJusrtaNHN0CTmLqZBlXDrdsXaPi0SABwA\\nbUgdxjyJEPEZBW8dPP6uf3w5BBGsk5jmI8bj1dsehDpecgloNaTZqlx2RbM3oz4mTxffTc2E\\nErKS1mTs84UlLlw4UzWztV2Wbzeedbs5yxKpPTTxdn6vMpa2Ji66XHIQ6dui6KpcdtWfL6Re\\nGlP2r\\/3XYNNTlWuGSkUIW5tq\\/hjMIF5ybjbTUw9OP2\\/KXZQqay2HJ2utF1CTS9c2dYkomdwS\\n30jJpuRM08KeypFtXZYDzlqwN1qDa2k2\\/bTEXm6PPShJU0XmwL9qxdxNt\\/pJAC0WG8qTlB0C\\njYmNNgX0+vv+yFOyEZhmZkpqZkZ+WfkZ6SfelJuUm2XJeZlZqXcUy\\/LTLDyUPS8ww8hTT7Dy\\nUuNuILbnngxQKI4eqICpsgkWKSDax5jeOYI4g34erVw7C+n1\\/Z47IUB5x6IaBYPHd29\\/6IUB\\nI4GGFN91j7uvCEFF92ndw+6FZhmWnGjLz0sxOS6hkpqYabeQrdlvQ4lSSRnkCRmMvNVuj5eW\\ns9VDq0tcdhXHcNiXHIObaQq9u1Sfp83Iv8Q7KzMnMylRknAoJG0lJ9oJOeqlRCRH0wWOfd1+\\nPthQHnB7CO+FNzD7CVtoWQ06lSHWVhLku8hQyqQ6w4FsupUk5VJWhQIJBGsetPvy60racW2p\\nKgpJSoiykkKChbS4IBBGoO4xlJhjyjmmPg8ZWSvBdGx3tWUTsyi4ZfY3Q3LbUOkMXLSG5Wrv\\nThG0T5XXqdc4QlRQNZDbITsiwf5W3Rpv8sU7EJq4cFrgWoMOs3LJv1+2TMLVqhuXuegSjkwy\\nlJBD0zXaDQpVnLznAk6x0fpeUNyvOHTz90cdU6DQ66koqVOlZpWWrtVo1JlII1ckTLZbfQBl\\nn5rgA83oOdVYo2KbKcYFx2fwumgVFy5NWwe6ijO5jclblLLb1EeUtRzOrMg28s3\\/ACqSoqi0\\ncPbZMa0Hs2jUDU5VACfNqoDOJygABKXlLROISlN0pQ3NobSmwyEJFpjmF2NjFQkGrowexPka\\nvSJhQUmq2PdEnWKLMrySotTXzXNzVOmFgpzXLTSXCjZ6qkJUkkZe2npg31SdmzdlKpV1y6cg\\nqaYCaFVFbslqU7KMu0xYA89LTVMl+f6Xhs4AtFtu6LDrCbkwqv8AuqwK83lsp2h1qpUqaCQQ\\nsMfOVImZKdTLk5a7LxmkODWS4haMozNw95S\\/TMwoDUrfErbuNVBZDaNvW6Y3K1xplBO+Wr9r\\nppkztD\\/fZu4aNWnSkg62YKo5rxb5G1Re7R\\/CGI6JiNs3KKfWmlYcrYB+qwzMZpinzS0j6zip\\n2QQqxIbB9GLmo+3bC9VCGsR0Z2QeICTNSpTNs3sn0lA+bzbKTuyNedqB3k65Z4dq6U2FdxbN\\nqfqM9ak6sBOwr0osSxcO5QaqUj5bJJaSeDk65JlWWYQI+xvnC\\/BHSAt9EjiDY+HGLdvLbebl\\nFV6i2\\/dsvKF1B2jtKqEyzOuU2aTuW3NU2ZlpxlxKXmX0KQhcREcKuWI0c7uVLyGJFDvLCKqL\\nWhD8xPSRvK2GFK1gUpq9usCuktrTqrXM2hKNIC0rUvVLpb2ZYS6QeH9\\/Ibr2C2Ldv3A6GW3n\\nXbIu6XVVpJtZCkIqUjITbdWpbgUQVStTlpR1Cstownn5gxRsV2g7P5pM3UqJibDDssvMzUux\\neVItuj0QZWuU5ZkysaekzOvKF0q3EXsWTfwdilpTVIrdPnu2SM0jMKbcdWk5TlXITQZm0oP\\/\\nAGrKhcFO8G3f2M3IbaHWIapiew7XfWB9ZdCltNWtXHbntZT6yorenKBeqqvUEoKidnLUi5aL\\nKs5FLLCGvMGqjGHkFNKCzlTc5hFe+HeMtKZP6zkX5l\\/Di8Zvn\\/8AkVX3Z+0mAjfrKcvxKs\\/q\\ntnPdudtnSnxWt8IanajI3RKNlKNjXpFKplLe8EIqFOVJTTi937LNuTpJyPVGQtt6Y9rTuozd\\nNt1ihvKKU+UUuYlq1JH8ZxxLvzbNspOZ+jalpxYH4StxGxoe3Pbrg3I2zXF4mkWbAStdDVaz\\ngFNkqm5gS9cIy3TlbqAAB1USEqiJVvYvhqoZ1\\/RLcq4rXt6M6ZNQuD9WUsZS+oOkqrUb7GIS\\n2LeidpL4DmaXi3ghiNZVPk3nJd24KjbU\\/NWmtxrPaJlbxpSJ+157IJ2gMjWJhJb+kBLZSqMe\\nwsHju7e\\/9EejXbmMOGt16iaJedGemF6oRJzcz81T6lK5kSNWTJzTpTl52yZcTuyzMdLYq6C+\\nh\\/jXt3cRdHrDOrz82pxyZrtHoaLNuebU4clGZu2ynreuOZzJ1mg9VF7Jxbi2tVa1qNyUHy2k\\ntKalscYAnJVzQOzlAnQVk6X7OkVZMuU2+t6VYVobWH1jVFW2DTDRUaVWgD+bL1aVWyRu+tNS\\nwcJ32uJEAaHUHSABF4cWngo9h3j28PREtDFTkDNG65lPTWFOJuJmFc8844pMnVk0nEa2ZZGe\\nbSZWQnEW3cZKTmHFTd4zxWNTINqC1va4sTuQf0tLTMzNYdXXhdixINrWJWUYrE7ZVzzCEJ1m\\n1u025ZRNty20\\/Y9T7sX9VwbyWwXYvjDnlNbGMRhtCcWt0OZXa8riSTmqSW77u0nlodpA1uCU\\n1FVtL2BBiuqlsuxrTSpRo655pN7O011qdzWtfLLoUmbO\\/QKlk3NwLkGNKAfP4SR6N3vz94hQ\\nPIPOR2juzHrjJ\\/E3Qb0v8HTOLxA0dcUqVJU9RROVyl21M3bbEuUEJzcuqzjXrbDSifoXk1VT\\nTu\\/ZKXkcsV3W3GXXGHm3GX2VraeaeQtt1p1tZQ4240sJW262vNDjawFIUNU7+F1UusUauS4m\\n6LV6ZWJUgETVLn5WoS5zWKbPSbrzZzA3TZWosRxtCJqSnJFwszspMyboJBammHZZwEGxBbeS\\nhQsdDpodDD0EHeCD2b\\/dFwJHAn17vVwjjovDix+EfTv9+cbGMWH+urqPaO7KLtp0j2wx26uc\\nJ9o+Ji8Pp50kdmR+IhOVPL7PhBDzXT1jtHdnF2sk8493vhoHWz+F6we7KLwpJ4KB7CDHmQd8\\nEOcweBziuZ6T6zDaK5kcCR6Y87Pv933wQ511dPsHdBrq6j2juyhtrKHOfTv98V11dPsHdCey\\n7k9er9ceZRyHshzrnoHt74Nc9A9vfDfXPQPb3wa56B7e+POy7h1br1Hnr5lTyHX6vjzMOdp1\\ne37INp1e37Iba56B7e+DXPQPb3x52PcPaev1HuuZE8vefnDnadXt+yKa56B7e+G+uege3vg1\\nz0D298e9l3D2+HXqPrMqeXxhxrnoHt74oVq6h6O\\/OENc9A9vfFNdXT7B3QBruHr9Xj1fnr7l\\nTyHXXVzDjWV0+6KZnpPrMIayjz\\/D3RTMniSfTCg34DwHh4dAeosOQ9nXIQvFNZI5x7\\/dCEUK\\nkjioDtIEe9mOJ+z5x7CxWnrPo78ooXOgevu+2G5dQPws+wE\\/ZFhfTzBXpyHxMKCEjv8AGCHJ\\nWrqHo784oSTxJPV43Q1L6uZIHbmfiITLiz+ER2bvdl7Y9AA3AQQ8JA3kgdu73xYXUDnzPQBn\\n7dw9sM4prJHOPf7o9sTuF4IcF88yR6Tn7Bl74TLi1cVHsG4ezj6YR2g5gfd3xYVqPV2QoIUe\\n7xg66+PLfaFosKwOG\\/x0\\/phInnJ9Ji0rSOfPs8ZQoIHE9ddCDrwhUrPNu9sWE85PpMJFZ5t3\\nt8eqLSSeJzhYAG4QQqVpHDMnnyPX2d8JlZPUOrxn6oSU4hPE+gb4QU8o5gDLr5+70wsJJ7hz\\nPX3d8KCSeFhz9m758dbmHJITvJA7YRU+PwRn1nh6uPuhuSTvJJ7YsKwOG\\/s+P2ZwtLfrPu68\\ndO6FhAG\\/X4ff1pCilqVxOfVzQmVBPH1Defs9OUJlZPV2d\\/dlGRuGuh5pUYwiWcw20fMWbpkJ\\ntSEMVuWsiuSdsqUs6qUruipykhbjG87y\\/VWkhAcWSENrUnGqFSpVGlzN1ip0+lSid8xUZyXk\\nZdNrXzPTLjTYsN\\/paDW9oypeVmZtwMyku\\/MukaNS7Ljzh4aIbSpVvAd0Y5lZPDcPbvy5z9mU\\nJlQSMyR39Q5\\/VG6XDLkIdNa8y0\\/fT+GGDskSPKGLlu9N1V5I3Z+SyFgStzUOYUPwg\\/c0mCAf\\nPGQMbIMK\\/k9mB1DXLTeMeN+I2Icw2lpxdNsuk0PDmjLmM0l2XmnJ833WJuTSkKaSqUqFDmnV\\nhD+1YBVKxTGI\\/Ka2J4Z7RDuNJSrzKL5ZXDcvM1wu2ANkTsk0qlDQ+iXag2FH6pNlETSnbNca\\nVLKUUV6UbNszlRW1IhF9xUy+tM0e\\/JLqKdCbAiImSnidyRkOnn9HRzR3JhTo44+Y6TCWMH8H\\ncR8Rkl9Ms\\/ULWtKtVWiyTpWGz8519qUNEpTaHCEuPVKoSjLRIC3EjIxOewm5N7QfwW2DtmaO\\nWHczUpdDJRXL4kJjEqtImWyCZ6Vn8QZq5HKVOvLTrqco3zc23tXGJVpiWPk8ZS1e\\/MPrMl2p\\nKqXJQKQiSZRLs0th9pUxKyzDYZaYYpEgHplphptIaaaalghKUhCRuyigcQ+XNIFTjGCcBVCf\\nWrRmcxBPNyuXcApVKpKZ9bwVfTLVWSkWJuSQmwqVsLnXSg1WstIJ1VL0uVdmVkcQH5gMZSNN\\nfNXAToDuJiC4O8g1pmX+uVmsSp7DvA6kLca8rauC4UXldiJZ3JSn5Gh2N87UF9xCSNeWqV5U\\nZ8E6hSMlFG2XBfkBNE6x1Sc\\/i9d+I2ONUYXrTcg7ON4b2VOBITuNHtaZfu5hW01iVDEBbZa2\\nbeyGqpbuy64NK2zaeFt2\\/SazcD6SdVx7ZUeQWOCSHnxNT28\\/grpqO0Ex0bcGk7iJVw41SjTL\\nbl8sgafKCbnSk5+YuaqRm29bL8OXlpVYyGrvJzo\\/EPlG7dMYBbSaunCki7cGWw+03R1JBAAy\\nzxM5XmyBcDJPpGu64BFqUXYth2QyLVTfPXE2s\\/WHy\\/cgg+lKoS3LEaAWXKG269iqMpcKNHPR\\n00cqYtOE2E+G+F0s1LlmbrVFoFLptYmpZSgpRrV1zSF1+qj8HaVerzagkBvWCEoAfXJpB4Y2\\n5rtIrpr822VAylvM\\/OIUpOYOrPKXL0tSQoAZtz7iwf73zxqmxRxttu1ZL7o8ZMVaJbtPSXCz\\nVMQLwkaRKlSAFFiRVXJ5hDiyAA3KyQU44ShLTalLSkawMW+WH0T8P0TMnZD92Yx1loBDSLUo\\n71Ft5L41ipM1cN1JpThZABAmqPSK2lTikZFSNotqK4d2WbRdpM8uap1IxTi+bfc\\/ZFSQzOTM\\nv2l7Wna3PKVKt+lcFc1NMk2IuALCZzKMJYVYSirVemUxttIKJBosS67BKSQzJMpcmXU5SD+Q\\nYB1Tuum8hW59Ky4JwLYtWhSVGaOaRPVN1dUntUZ6q22ECVkZZYz3IfTPpz3HP8HGXEPGCpu0\\nubr+Jd\\/tU235IGYnZ2461JUC25BIIVtXtu\\/I0SSTu3urQyMk\\/W4RE\\/xf5Z\\/SSvYTchhhQ7Sw\\nbpTy3djPScsm9bvRLrC0JZdrNxSwoAKW8iX5O0ZOYQ79K3MtDVQnWNiNjDili9VfnvFHEG8L\\n9qKFrWw\\/dFfqNXbkQ6c1s0yUm5hcnSpYnMplaexKyqASlLSEjOOrcD+QvjKd7GYxbV6LhKXN\\nlOS0qDiGtixBWhfYusUxor3BxuqTgSr0lMLCEpVBaptqwtTMzeHaNMVN5NwmamP2BLEm1lpW\\n6H55xNwSW1S8tfQBaSSUyrsZuVo0SMKROSFvXNVsYbilto03TsOJATlGEwlJ2PlF41Zym287\\nJLOQdm6FN3A60jzkSjqjqxqPxp5ZvSRv7yum4VUa2MFKG6Xm0Tcky3el5lh1GzU27X7hkkUV\\ng6hUpt+mWpT56WcUFszpUlDkajZGl1KpKCZGRmZgH++IbIZG\\/LznllLSd\\/MVg9Ufa0\\/D2ccA\\ncqc21KoG8ssAPvauXAulSWkKz5xtxuz\\/AAsk9ZYR8mHYpgUtTE7SjiuqNWV51il5FTT2n1lZ\\nKKw0xSchXqjzmQmXUABPnCjmUqpK\\/tfxhWM7f0mmjyytPNqOlUq5YWABm87s+TYAKCZhDaiS\\nezAsBxl8YiX7iZXHbkxEvS6r4r7wKFVe665Uq9PpaKitMuzMVKZmXJeUbUohmVZLcswnzGGm\\nkICY4OQodUqZBlJR5TZy+mWNixlv\\/vrpSheXOEFav3Otq5dwSNtUSnBJZlEvvJy\\/XE3k+4SO\\ndKFJDLZ\\/dIaQeyObzAHQBu+wReQqsrKMNylLkWZeXZQlphpLTcuwy2mwQ2zLMBKENpA9FAKQ\\nNBltpFXvTy3VrcUVuuOKK1uvKUpa1KNypZJKlKJ1JUq5O\\/WOuqfYSRqrqc2VHcdhKZhI6lPO\\nJzI4ZhDSMt+S9+Y+ylKbT6anUkZRlk5ZFwJ1nlDnBeVrOqz38VEDmEPlKJ3cBCalZbufxxjX\\nuzUzM\\/tzqing2DlbtuF0JsDw+tc8ybmMNbi1\\/WUSOW4ewaRUkAbz3nx6oRJJPuHRFCc95hBb\\nuWYTv4ZnmHV05\\/b0Q0ATu68YRF63AncN6ujo6\\/HwhopRUc1H18B9kbXNEHkXtPfTFVS6za+E\\n03hZhrUFNrOKuNiajYVsPSK0h4T1ApE1Tpm9Lvln2w4mTn7YtmpUR2abMtNViRyddalRaH3y\\nbjQ3wJcpdz6QlTrOlVf0mETC6dcUq5Z+EUhNgBaTL2FSqjOVK4PJ1Fcsv7sLorVEqTYTNuWv\\nIO6rLUxouCa9WMrjUoZWWUR+y53Mw0Um2raCkvPA30LTSkE6KWnfGwlaXOTeVTbRS2SPyrp7\\nNBB1ukkZlix3oSoDjEK3Rg0G9K\\/TNr4oWjhgreGIMszOJkavdrMm3RrAt55WxUtFw37XXKba\\ndJfaYdEymmzFWFXm2Ao0+nzjmTKpWmhd8l9w0tByk3lpwYmOYqVqWcZm3cH8KJyrW1h0HEFt\\nRkblvuYl6ZfVzSjqVLS63bklh86y8lJRVZ+WzS5Kpte07XsagUu07Ltq37PtWiSvkdEtq1qL\\nTrft6kSgcW6JSlUakMSdOp8sHHXHSxKyzbW0ccVqlRJP00W5RdnNFpuV2evVZlNj+WSG5VKg\\nATaWBVn13h9x1JFiEJMSWVocswEqeJmFixsRlaB\\/tQSV2Ol1Gyh+YN0dUYQ4J4R4A2XT8OsF\\nMNrNwtsmmHWlrbsmg06g05Uypttl6oziJBhldUq02hlJnaxU3Juqz7qdtPTT7xKj2vBBE\\/bb\\nQ0hLbaEttoAShCEhKEJAsEpSLAAcAAABwjdJSlKQlICUjQJSAEgcgBYD1QQQQQuPYIIIIIII\\nIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIwY0qeTi0NdMyVm3cc8E\\nraq92Py62ZfEy3G12fidJLSwiXlHVXnb5kqpWW6ehDfkVKuZVft9vU8+kOtqcbXGl0rPkyOJ\\ntsmp3Jod4wU3EqlNLmX5bDHF8Slp3w3Lh1IlZGkX3SpdNl3LUVIWVuu1uk4cSDaGFuJffeWi\\nWE0GCIvWsG4dr4Uqfp7XnCt05LfsabB0spTrYAeItoJhLqRwTfWNfN0uRnMynWQlxX9Va\\/Ju\\nX\\/SJAyrP90Ssd1gI8pbHbRf0iNGK4Ra+kBg5fuFNVdeeYkHLqoMzK0StGXceadetq5pcTFt3\\nPJpcYeSmet6q1OScDSlNvlIzjooKI6x0Hx9nVHrZ3fZln4g2\\/UbSv207ave1as15PVrZu6hU\\nu47fqbKgdZmo0asys5TZ5kjMlualXW94IB35aO9J\\/wCTw6DWOJqNZwnaufRjvSb2jzT+H7xu\\nLD5c26pSlPVDDi5JtTbEugHVYptnXJZck1qpybOSgupKzsen2c7lEnmp5sXKZWdtLTNuCUPp\\nBl3Vn9JYlUxHJrDcwi6pV1D6d4bX+Tc4aBR\\/Jq46lTfKx3mAoFA9R6D8OmLwSOBjeJpOfJ9t\\nPXAYVGtYeUC3tJayZQTMy3UcKJxbF7s09lbiWlVHDS4jIV6ZqcwhCVil2PM36UbVATNOlLpb\\n0rXTaV22FX6hal8WvcVm3RR3zL1a2rrolTt2vUuYACjL1Gj1eWk6jIv5FJ2UxLNryVmRFU1S\\ng1ajuFqp0+akiVZUl9ohlwjX8k+nMy8ORbWsab9CY0D8s\\/LqyTDLjR4BaCArvSojKod6SRe4\\nvcGOHCxz7uvx9sKA84PpENQsHq7e+LgSOEaUt+I8R19sYpQOGncevnD1Lyk7j5w69x9ffnC6\\nXUq58j0H088ceF9I9I7v0ReCDwMNlJG8evr7YQQRvB674a1S26FWQRUqXKTK1ApD5aDc0ARq\\n5JmmiiZRzDJDwGYyHNHwjuF7UjOsVW1a9Vreqcm4JiRmWH3S7Kvoz1XZSclnJWflFgE\\/Sofd\\ncQdbV1tbVT2Qlak8Cew7x6oXD4y84ZHpHDq3cR7Yy5eoTsqkoZmFhsgpUyuzrKkkWUlTLgW0\\nQoaKGTUaHSHW5h5ogtuKTYggXuARuIB0G4ai3jH39haZenRg0WWaXiXP4iUKW1U\\/NF7Bi+2X\\nGmglDLPldZS3eUs0ltISlml1mXaSnzVBX0ZjNrDnlqJiUeYp2N+Bz8o6kteWVjDqqLaeQjPV\\ndUxaN3KbVrZBSm0u3kgKP0alDUDka7AoH6pz7Dv9m8Q2m5KTn2ixPSkrOs7yW5yXamU7wQcg\\n6lQCj+CUgFOfqgmINmuy\\/FhcViDAVE85cvmqNCS7h6fKzb8s65S1sNzbv99IcQoAJUlQFon1\\nF2pY0oeRMrW5xbKLAS804J1gJBF0JZnUzCG0nW\\/YFki5KVJVrEiDDPlIdD7E0S7MtixIWXVH\\n16nzTiRKTNmOMKUBq7es1BCrUOsolILFwP6qgdfVSUqXsBsXGCttU6Wq+HWIr03RHgFS0zbd\\nxN1SgTWqEgltEnNTVImkpBAyUh05HgdYxCjqeFto1DWUzLzVJeVv15CZXswrPMHyeZEwylJ+\\nrqMoaGX1dVXnDi6JaWJWHlQNawvxJrts1NtSVtTdBrdZtOqeac0pE7RpwF1SchmXVNIV52aU\\n62rFI4h8kTAtVDhw3jGqUcruU0\\/FFMlqzKKJ\\/qQnJJUgWGbkZXHWppxIBzBZNxa1J8oecAQ3\\nXKJJTiNEqclXHZJdha61NvCeYcXvJSky6FEi2QAgz+aBpbYnUvZt1hmh3IynV2jk5Iqp08tI\\nH4L9KclZRCiB9ZynuZZ5nduHdlA0x7Um9RFyWxXqM4rJJdpsxKVuVSrLepwumkzLbZA4ty0y\\n4CdXM\\/ssQNrM5QjT0wpDbNQuo4gUmWWlQk75tymXW2sBQK1TFwUZNPupbToCUq8puFOp\\/e0s\\nPLVr5e2Dy2061spPFbAqXdWlwJmatYNzuShQkLAWhu2bjkZtRWBmr6S6msyNVSc1ayefsT+Q\\n\\/jpgOP0mmUDEzIUSH8LV5uUdDWhCjJVU0xouAC5aZRMm\\/otqXfWwqftb2d1UJEz55R3VWzF+\\nVWtkKIGiHKaucSUXJAW600NMykoibnQsecJ7g1USV7UqVfVwarKpihEL47Pa1dmSl1k56o2D\\nziVq81krO6LL3wXwJxpl1TGIWFuFmKDL8v5Iio3RaFq3Y6llLezSJSqVGQnZiWWwlQLExKTD\\nT8s4A7LrZcQ2oRa7E5VvQ2vVUu1UryufD2cmMktSt92hU2AhxR\\/Y36naxuqiSgA1iX5qqS8q\\nn6pe1lJQvN3DbSFwuvV5qYwpxosq4J57ZqS3Zl90iZq6MirUS9J0ypGpSzqTmdlMMtOjiExz\\n1XNg+PcFTCpt2n41wo6wSW52cpVRl2xZQJUzVpZMs0UAgErZeWkFIuCL2lzDmEcQN9jIV2kV\\nFLlv2IuYk5pZJNgFyqlJdSTc5Qtm51sDcXzRxD5HTQMv4OOSWGFaw5qDillypYdXtcVMUraZ\\nBAbpFfm7ktmWSyQotiUoUuTrFL+1CWUN4PX98n0sSbcmXsLdI276A2CVSdNv6yqLd7jgzGq1\\nM1m3anY6WjxzfaoToJG6WyJ1ctqNj\\/i7Q9REve1SnWk5JLVYRK1rXSPwVTNTl5qa7VofQ6cx\\n9Jlnn2tR9MG+ZUITW6Bb1XQkAFyVVUKTMunn2i\\/KZ9jWJ\\/3uTbA37hluepm0Xyh8LZRR9oVV\\nqbLRAbZqk+3W\\/QuPQ7PE8pPNpTYWCUPegLBCkgXjR1HZJhWfKi7QKWVK1zSIcpq81gM37CVK\\npKt5OYqCj9bMTeNC998hPpi20HJi0K9hBiRLhL5ZlaTdNVtysqLIzaS9K3Xb9JpDSpoKyaCL\\ngmEJcC0vuMICHncOr45NnTpw\\/ccbrejNiTUtkUjaWPISGJbbgcb2qVtKw7qN0a6S3uOSQ4y7\\nmw+hp8FoS\\/aRpi2nMjVrdrXDS1EJzVTZiRrDKVK3q1jMOUd4Np5loZcWvnb35js2laSWENT1\\nUm6nKc6sn6GrUuqywbAKR58yiTekhxyA8rJ37wdxNg07yv8AbvRMrdcwdQa+2gHtHk0udYm1\\nWKbHzijVEyKE2vc\\/R9txFhcRBKhsBoLhUZZytyKtLJbeYnGUAWv6Lkut49xMzYbra6ef9dNi\\nXvY80ZK9bOuuz5xKw0qUum3avb80lxaVrS2WKvJSjoWUtOKCCgKIQo5eaY+Wj0aZa9bBudhc\\nlLXRadblptpbD0kir0meD7Tmo24zMSSph1a0LC0pUy8zk4Fp80giOpLv0P8ARTv5D33W6OWC\\ndZemR9JUXcOLSlq0QWw0C1W5GlStYaCmktpBZnWyQ2wd+yQUzqneXvJoUhnE2zGqSKhbtHaZ\\nXG5lSr2zFEnUKXTii19EKnXL8XBpELndgU23fzLETKzqUtztOdlrHSwU41MzJVe2qg0m28JO\\n6PPyBI4EjsOUV11j8JXpOfvibZd3JDaAl2IdU3gq\\/as88dY1G0L8xApa2UkP+axTJm5Z+3UD\\nXfS6CaMXApmXY1\\/J0qYONN1cgpoqVRDy7VxHxytSdcLhYbmq1ZtxUhgFExqJEi9ZNPqjuzfX\\nL5lyvAuMMKl9zz6ZlqyKV5b+xefCRPNYwoaiQFmoUOWmG0brqC6RVKktSAbgEtJWbftYNwIv\\nNbE8ZsX7FVInRa483nnGyeSbTctLAK3aZikfpGIle1c\\/G9g7ortl\\/uT2juIiSdcnyfFlWu7a\\nOlI8jzxsJC5MJUP5tqdH7LVaZiDL6qmmvxaOUvO7s5dJzRj\\/AF3kC9JyUQtduYuYF1nUSlQb\\nqs9ftAedGydUtLQl7Jr7IdLqUNNbZ9ppzaKU8+wG8l2FTfKl2B1MDsdokhLqNgUVGl1+mZSb\\nXBXUKVLMqtxU24tH8a5tEfmNl2PJY+nh6YcG8GXmZCaBt3S804odwKQe6NGW3VzhPtHxMV25\\n\\/FHrMbWq7yK2nlSFOCQsywroShbaUuULEi3ZdDwWwHVOt\\/dK5byg204fJnQ6hp0vnWaadlv1\\nwenK\\/wAlnp+24lw1DRuuaYDTTDy\\/mG5bAuslL7wZbDaLXu2rqecC8lPMshx5hr9cTCG2PpBO\\nJHbJsjqRSmT2nYCdWvLlaViuhsvnNa1pd+eafvrYjs7gkAgEiNG\\/g\\/FkvcvYarqEp3r+ip5T\\nen\\/aIYU333za2JvGBO3\\/AHH8r7INv+4\\/lf1Yyhqmgvpn0hSxNaK+PrxbfMsr5rwsvGtjagLJ\\nKDRqRPh1jJs\\/rloqlidUB7NxvX6wq+AOPVACzXcEcXqKG5oybhq+G1504InBttaUWZuitBMy\\nNg9rMnN0bF3zfo1ESqUxVhWft5jifD87fd5pWabMXva1uxml77nde9tLxq3qVU5cXfp0+yOb\\nsnMNjTeCVtpGg38uPd1bt\\/3H8r7Iptz+KPWY5iftO7aUuZbqdrXFTnJJJdnET1FqckuVQlra\\nrXMpmJVssIQ39IVOBA2eSidTfHzm06vb9kbxtbbyQtl1t5JAOZtaFpspIUNUqI1BuOYsdxEY\\nSkqQbKSpJBIsoEG437+UOi+rmCfTmfiIoXl\\/uR6O8mG206vb9kU2h5gPf3Q5kVy94hPXw69v\\nrc7Vzpy9A+IMWlaz+Er15e6ENc9Xj0xTXV0+wd0e5Fd0HXW6FySeJJ7TnFIQ1j0n1xTMnic4\\n97M8+ur9biF9ZI5x7\\/dFNdPb6O\\/KENYdI9cc3JW7cVU8mNMt+uVITjjbMmZCk1CcE06tzYoa\\nljLy6w+4479ElDWuoueYnzsoSstNDM64ltPFS1pQm++11EcLnfuBhSUqWbJSVHTQAniBw17o\\n4kuDmB9O7vi0rV1D0d+cdoU7A3HGsh1VIwYxWqqZcoD6qfh5d08GC5rFsPeS0d4NlwpVqa5T\\nraqss8o7Rp2g5poVZYbldFTSCZJdaaBqWEl8UZsrdJCfpKzRZJvUBH0z2tsmAdd1baY0s1if\\nC0h\\/R2JMPyVhqZys06XFgEk\\/t0ygaBaCeQUOYvms0upzH9D0+eetb9qk5hzU6fmNq4pPfobD\\nQ2xdzJ4kn0xaSBxIHV43xnpQeS40\\/rmcbbkNG28JdTrrrSTX6zZVqt67DJecLjt0XPR22Gyg\\nFLLrq22ph4eTMLcmCG47hoXIsafNXLIqGH9mWsHTLhaq9iZZ74Y2oJcU79zNQuNShKkakxsQ\\n8SSPJhMJzVEXntseyOm3TO7TsAsrSLlkYsobj4F7aMMzzjx1zD0WzqkjfoNoxg\\/FcwAWcN11\\nxJtZaaTPBGoBt2imEovY3+tpxOovqoKwM8gT49fsi3XV1Dx15xvKt\\/kCtKudSy5cWKGA1vtu\\nhla2ZKs33XZ+XCwovtPs\\/cDS5AvsHZpAYqcww6S4RMgNp2vfdt\\/J6ai4lDl4aU0lKuDIOSVt\\n4Svz6Dm0grKKtU8QKeU6j5ebSDRlbRpCHtZhS1MNwmo+VJsCpYPnG0emPEfm06nV6qknklVN\\npU0gg6WUVhG85gBG6l9mGOpm3Z4emUXsbzD8lKgAgb\\/OZlo3F9Ra+h0vpEbckniSe2LFOITx\\nPoG+JaNrcgJowyCQ5eOLOOFzzCACEUqfse16etREwHC7Ku2hcE8dy5ZbIaqjOo6w4XlPtTCW\\nWsl7R5G3k\\/7XGtOYQ1e8ppJAam7uxDvyYKSVPFX6xoVwUClO5tvNMkTNOdITKsKQG3\\/KH5iv\\nar5cGxGn5vM\\/wvrpGiPoygNS6Vm4AOas1KlKCN9zkKxY2QdAZDKbFMZTGXt\\/oqSBFyJmeUsp\\n7j5mxN3PAWNr\\/nDfEJEvn8EevuHfzxzVBte6Lunfm+1rdr1z1AqaSJC36RUKzNlTpKWgJSnS\\n8y6VOKQtLQDZ2pCggRP7s3Qn0QbBS19ymjRgjITDKkqZqUzhzbNZrDZCmlAJrdbptSrOqlbL\\nTgbM6U7VsPEa51o7uFdsCy5JumN1W0bWp8ohewpjU5R6PKMJJ11IYkWnJZtClH+9tM67iiPN\\nzIBrapeX9SSpbWG9mNWqCzcNuVOuy8ioAn0VrlZGmVUuX0\\/JpmkbxZ3SJTJbBJ1ZHnmIJZo2\\nGZElT3pok31SFvTEqQLblFs6\\/mRBHsfk6dOPEQy5tvRgxYZbmwwqXmbrt04fSTrcwtKGHkz1\\n+v21JiWcStLomi\\/5OlhXlSnBK5ujMuwuQo027q2K7pewkwwYVkqYaue9363VG05pCkNS1h0W\\n66bMPgHPUerMq1qpX+uNbUSqV5U9ILCmllSV3Y3Ouo1glqmSVSn9pq55hL7MoqSOZI1FLmUI\\nWTxyScuuqrpa2dL5po9v3HVHE7kqm1SVLl19JS4JqoPnj+HKN8wiBVLyy9uFZCkUHBVAoTSt\\nUPu02ozU0kHcRMVSos09YSNxMgASBe49GJlT9gdDRZU0\\/Wp5Wl0qcYk2FbvzUy\\/ajjqJgD13\\nI0v2B8niorYlJnFTSYqs8tSEGco2H+H8pSksOhQLyJW5LiuGsmZQU5hp5205TVUQpTKvqxnR\\nh3yJ2gTYy2XaxZF7YnzLLaEtv4h4gVhTYfSoEzLsjYybHpcy6oBSFszlPfkSFFSZRLiErR3d\\nVdLa6n9dNGtqiUxCtYBVQmJ6rPNpOerqLZcpLeuP98XLrQQNzXDLrSrY+4qVcqSu65uRazVq\\ntUmXkqblnlwmZdhM7kN2W0mllOZKQPOiuqrtZ8ovFGYVXaDU6S0u4UzSJqVoBShVgUA4Zk5R\\nSwBoO0fJKbBa13VedU7ZFhWRylug00qFrmfU7USSBvKZtcy1e+pACU31AFhbM7DvRp0bsFGp\\nebw1wUwmw9epqApFeotk21TK0kBYUl2duXyIVqZdC1IAmp6pPvJ1WkJXqIQlP2NaxiwzoBUK\\nhelHWtJKVMU6YXWH0qHFLjNIbnltrz47RCMugc+nHEjHSxbOQufxbxete3SlKnzMX9fVMpj7\\nmaVr12TXqo3MPrWkKLbbCVvPK8xtKl5JOC9\\/cqpoWWMHWpfEmo35PtKIVTrBtWt1bIDMJU3V\\nqpLUS2HgopWlIYrri0jVUUobWhR1VH2M7QsezAnG5TG+MJh6wcnZOm1SpA3JJL1UmEzjSUEk\\nkuPrQm+85jcyB1OE8Ot9jPVmj0pCP+qpdkpJQsEizcsFlxZAsCEMFQTbSw0kN1rSwsyT1kUO\\ni12tupz1XJjyakSTg5il5xydnBu4hynJ3b+qOna5pV37P66KNT6JQGiVarmxeqc6joG2m3Ey\\nainfnnTd5IBERZcROXLo7XlEthPgTUpzWJ8lrOIl0StMCB5wBmLZtqUqqXSSEkhF2NgAKBXv\\n1k4HYjcrVpm36ZpilXjbmGVOmUFtyRw+tOnMPBrcRsq1dCrpuGVfzCVKmKdVZF3PWCdRpZaj\\noTCfkM7S6n2Tk7QaTh9lWVXnGJ62h5wtm1yZCjiquJXbc1MSsuSqwcLYIUIrPbVdndMzCXVO\\n1l1N02k5NzIVC4spyfVJslGmrjKXdCFJC9RExy7MXLvqEnNz13X1OtUqXbU9POz1VFHosu0N\\nULdmWWVyNLZaTnkpam0ga31s98YAYmcopodYUqmpavY123X6rLAhNHsETt\\/Tbr4yUqV8rtaW\\nqVEkpgDWC01SrU5LS0qbdcQ\\/qNKh5XzitifibOqqGIuIl733OKWF7e7rprdwrbUMwgMCqTs0\\nmXaaB1GWWEttMN\\/RtJS15g+TkaTVqkUiRkJyaCiRrssuqaGRyOu6QGmwMtUFSwCoZAE5x01h\\njyFcOU9DbuLcZzcw2MpckcN06Uo0uhSQklvz+fVUVOtnVJUmQlFlJ9EoUM0Qaqbe53Kpuh0C\\nRkUahL1QfcmlEEEBYl5YSTbSwLEJU8+kEalY0EiXFDlx7WldvKYNYJ12srOumXruJFckqBLt\\nqTuC1W3bZr8xOMuKBUkG56Y6EgFaULUptOuHFTlTNMvFHymXZxHYw2pEwokUjC2ks2wtgZgJ\\n2NyTDlVvNopGtmW7lQlSlLUtH1dXCiRw3uGZ1Vza5WnIPEPP7Z4Dm1WpbaoJIH1VPpIz87z4\\n+vksNaUzqqnZybnVBIBQjVlGSd2fmpLr2Q4JyfBA54v3DexHYbgstuU7CFKqU61YidrCXcRz\\nJcRbK8g1RczJSzoIBSqTZlgk+kkAkk1dWdp+LqvnTN4hnG2lXHm1OKZBnKb+grzJLKnUa7n3\\nHSdMxNhbq6v3HcN1VR+t3RXq1clZnDnNVev1SerFTmTmogvz9QfmZp4gk5FbpyzVmeELSFs1\\n2okeTU2Y2assnn0iXZI46wW\\/qJUMsstQqPDNIXw78kaHR6YAZKnSrCkgAO7MOP7uGb7uu8T1\\nlwk8+Zjkivo9f2eOyLRVXkMtpZkZNtlptIQ0lQShttCQAlKGWQlKEpAsEpXlAsAABEBcqClK\\nUoJKlKJJW4oqUonUlVjcknUkqJMdRyOGr51V1OottD8JiSQXlkHLL6d4NpQoZb8mHBnuCiN5\\n+ykbQoFPIU3IpmHE5EPTijNL1k7woIWAwlQPnAtspOfUlOX0pIGZUfSTDdbxO5O4dPOe7xw4\\nRq3qlPTNwt9aUHelv8mi2mhCLFXgoqMYqnnnd6yB\\/F9Ee61\\/AkwoVIaAQAAAAAhKQAABkMhw\\nA3dZ35w2WtSzmeHMOYfb1\\/CLScsyT1kmElLJ4bh7Yxko1uNTzPX36x4Ega7zzPX398XKUBu4\\nn3dvdCZOe8\\/oh3TabU6zUJGkUanT9Wq9TmWZGm0umSkxUKjUJ2ZWlqXlJKRlW3pmamX3FJbZ\\nYYbccccVqoQte47gtGHkH+UV0lzTKtO4VM4AWPPkr+63H2bmbIm0sJQp1RYw+YkqriY66+gI\\nTT3Z20abSZ5yYZyq7EsmYmmNvT6RUKm6GqfJTM4u9lFhpa0ovbVxYGRsa\\/WcUlOv1rQ+0w8+\\nrIy046rTRCSoi5sCbA2HebAcTGmwrz+rw6e6Oy8J8FMYMeLrl7HwVwwvvFW7pnVUi37CtesX\\nRUWmSHFqm5tmkSk0KfIMttPvTNQnjLSMrLsPzEzMMsMOOJnC6LXyZ7Q+woVIV7SJvC89Jm6J\\nYtvu0Rwv4ZYXodSlK0Nqty26pO3fU1MPkjaz99pp1SZQgzFvtocdlzv+wtwdwnwPtaWsjBrD\\nWxsLrRkyhbVu2Fa9HtSkKeS2lryualKNJyiJyfdQgGYqM2H52ceG1mJl51a3DZFI2WVN8odq\\n801IN6KMuxlmprhdJWlQl2j\\/ABkuP96L2tupbD8y5YzDiJdPFI\\/KOHjb0TkTfcDnVY6lNt8J\\nbRS+TIaUOJa6bcGlTiBaujtarv0s1ZtuuyeJmK77aUNLQxMfNE4nD2325tDqkN1BN13RPSTz\\nDqZy2zkjOTxok8kBoE6Gy6bV8NsF6dd+INOQkt4r4wOy+Il+iZafbeZqNMXUZOVte0ak0Wm0\\nCdsW1rWfLOu26te2mC7tAgi0qPg7D9FyqlZFD0wmx86m7TD+YWstBWns2VXG9htvvvEglaVJ\\nStilrtHBb8o9ZxQI4gEBCTv1QlJ1te2kEEEESiNjBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBHReNOjdgDpG0P\\n7ncd8HcPMVqYiXflpT7tbXpVZqFHamCnbuW\\/WpmXNbtyaJJUmdoVQp84jIqafSqO9IIbdZaf\\nbU082280sZVtuoS42tO8pUhYUlQNtQQRCVoQ4koWlK0nelaQpJ8QQQfWIjTaR\\/yaHRav41Gs\\n6OWJd+YA1t8zb8tbVdzxWw6bUoFySkJRmsz9Kvqlsl3Wln6lPXtczjLCm3mqZMPSy2pzQjpF\\n8g9yiOAK52fouGVPx9tOWcSG7gwLqrl1VFbbqFOspcsCpSlExDcmAlKkTQpVs1eny0yjZCpv\\noclX5j0R4IgVW2Z4VqmZbcoumPq\\/qtOWGW77xeVWlyVCb7w000SNMwsLaeYoNPfuUIVLrOt2\\nVejfvbVmQB3ICPGPJBuS2rlsyt1C2bxt2u2nclJfVLVSgXLSKhQq3TZlByXL1Ck1SXlZ+SmE\\nEZLZmJdtaSN4zzjhQecH0iPVsxi0d8BtISi\\/c\\/jhg\\/hzitSkMPS8q1fNoUW4Zmmtvk7RdFqM\\n9KOVOhzIWouNz1InJCcadUXmX0LBVGkzSC+Tc6EuJip2p4MXHiTo516Zc15eSpFUViRYLBWh\\nzauOWxekyq6lKXMKbeQ1JYi0yRl2g9KsyaG1sGVrGq7HaxLhTlJnpWooGoZeBkpk7vRGZTsu\\nogXupT7YJGiRuGjmMNzjdyw41MJ4AnsXDfuWS3bvLo4G1r2gkBZHX29\\/fnCgWk8dx3dnXw5v\\nVG\\/nHn5ONp34YKnKhhNO4a6RVAZLq5Zu17jYsS9VSzAQtxyetnEBdHoLTi0lRYlKPe1fmXyy\\npCW9uuXZe0zYv6OePmj9VBR8cMGsTcKJ5bhblRflmV625SoZFxIcpFSqcjL02sy6iy6GpulT\\nc7LO7J0NPK2ajFbVTDNco+Y1KkzsogG3bKZUqWJ5JmW88ss\\/2jitNRprGifkpiXP5eXdZF7Z\\nlIIQToNFWKVbxqkkX3m8dQg84PqPxEKJdWDxzHQd\\/t9\\/TDQEjgcouCzz7\\/Z49UaIoPCx9x69\\ncYpQRu193Xth8l9J+sCOviO+FgoK4EHsPv6I44LSefLt8ZRcDzg+o\\/EQggjeCPGEEEbwR4xy\\nQUoc\\/oO\\/7fbHHz9JpFUGrU6XIT2Yy1pmVZdWkZADUcWguII+qChaVD8DpFyXFp58x0Hf74UD\\n\\/wCMn0g\\/A98epJQoKQpSFDcpCihQ8Ckg8OcegkagkHmCQfaI+CqGFFnzusqXYnKWtQzJk5pZ\\nRrEg\\/sc4mbbSD+I3qDVz1dU8Pip7BSaQraUivMrIOs2ielnGFIIzKT5RLLmM1awA10y6CAPq\\nnm72DqDz5du6FAeg+o90bNitVWXsETri07sr4S+COV3ApY9ShppD6ZuYRoHCRyVZXvIJ98fC\\n2tilpe4TpaRY+LOJdOp8tubptIvio1GhgISUI1bcn552nryRub1qWspTmBqqCExkTbHKt6a9\\nilhq6J+2L0aZTsdlfuH8rT1uJGY+kmbPVZky66lOSUvLdccc1UvP7Z1S1K6yC1DgT8fXFSoK\\nSUrQlSVDIhQBBHOCDmDn2RoKrRMF4hKlYkwBhGsurvmmnKRJtT2v1iJ7sFzSFHiW3UXtzsYk\\ntNxxiak5RI1mpyqE2s1LT800ycpuApjtFsKSNfRU0U6nTU3zus7lvqw0ltnEDAGmzyl7IPVK\\nzr3mqVs8tz626NW6HWS9rDNbDaq8wG8i0tx3X2jWU1o8sjorV5DLdx0bFOyJoj9cLqVs0qtU\\nxpRdSkFiat6v1KovtpaVrqK6PKqzS4hLS1Bou6S521LWqJKpyg0xxZG91Mo0y6ejN5hLbpyO\\n\\/erp6Y+RnMIrMmgfJ0VCnEghPks8txIJ3jdPom1KSDxAUCR+FredFdVLyftg9XKlDDFZw86s\\n3U7RqzPLQDYAFLVQmKjLt20slmTQi4vluSDO6ftxxtKZUu1FudQkABM9ISboFiD6Tsu3LTCz\\nvF1uLOU2FrC0oC1OUG0M7xUymk6QFlySnlpCRdiazY6UKU4GgHl3nS6CywlLm5Tri0tBv9c6\\n\\/k5LkZT2Ljdalwlr9TXFu3q2pQ2jH3DX7TaipWaHHytr5gqr5IDYedJQPqBSvqhUQrpzA5s5\\nqp1wrSOZuckUrz\\/+7sTDfON+Uudx5tU63y83g1dbGZl3aVPJzzAamnWVkZHcpEzLsoSRkeDq\\nhv8ArRX9T8j3Z1UErRRtoNakEqHoorlMkKolJG7P2SaChdr2NinT6pA3TOT8oeo+iKhRaTMi\\n4ziWenJC4sAQDMefgKOt1WUNd2ms+6nY24s0vVMrflfd2ZSR84voq4OWrlrfO7M8HB5uatpr\\n62XDzlA\\/cU\\/Slxbk9TymfotVyA1vL6LLtlWQQCo\\/Na6bvVlmdQoHnq1R9TVgA0S7NJywMl2t\\nfmLdsFoEpFp37cUpkAHCQG6FWslgpccSW0hSXA4tOqsOOIV21RtPbTksnVLGNt\\/p2RUc7spN\\nGugDzXUKLn3ZUCsBeqHnCNqFZKDS8tdhrZVxVfIKmJrP9EYnwDVyfqLnqXMUtxd7WCnJFmsr\\nRzJSXDvtexiTyu3jDb4T59huaaJPpGTmJGeIBy\\/VLgkSo7\\/ROQbtd9p68jph3c3kaladuTR3\\nZ+QzFTp+sd5Or5RMVLLM6mWWuU5K+sVDV+vk9MmnqyFQsWdlzvzVJ19mbJIAAVqPUmSKdZes\\nCnNeqN+srhEFy3+V30xqMtpdRq2Ht2pbUlSmrgsWVlUPAOIcKHfuUnbZXqrSlTStk42rUWrU\\nWl0NOo7ponLZ42MFv7pMH8LatkWdr8xzV22\\/tEhS9sEeXVi5tmXAUBlSg7sCFqUh4qShutKr\\n5AWOGirsKDhyokHRVKxRNSoOotkRUjTU6gXGZA1Mb2X2vbPJgAvN1SSJNrPyKiU95EnMzKSO\\n4Enutvmyyml1h69umqNd0orWVkUydImmgkJBBUU1pt7WUrWTqpYUMxvXxKfppXSfwlmMg9Va\\ntI57MfrqiT68gs+dn5Eic\\/YeLmWeY3tbSIaFG5cSTWhtFwaOE2y4nZB2Zo2KDU0l3NZDzjcj\\nPWJKKY1GykttqqExtV5pW62nzh2pReWywGe2YuDCfF6mZ7TafMqbOrgQeDIbE7ctvBYcHnOF\\nQb2ZzShL2etFd1DyG9pUqFFWBa+kDQGnYgoFQuBqChLM\\/OLNwbgFIIvYpzGw2rO0LZtMkBvE\\nCWlGxs9K1KXCSbaFb8ihvQ8cxA1NyBeJfctpBYQTQSWb2lE6y9X9c06uSfnZbyozVMZCU8PP\\nUEo4+dwjmpfGTC6YSC3f1tJzVqDyiqMyiicgcymZUyoJ3\\/shyQD+FvMRMabyxeiPPJR5VK4s\\n0cqYbeIqVl0t1SXFBJMso0i6KonboJUF6ilS6tRWzmF+brdg0zlWtCOfIE3idWaIFS4e1qlh\\nzf7oS4SgGUV8zW7V1F4BaySlJlsml5TSvow7DJ3yPdokrm\\/+TNo4sdeyor1RN9P3hT1XvuFh\\nc8NxjZtYowE+oJaxXSkk2A7eelmBrbeXg0m99503A7olTNYi2BM64l76s58oA1tlc9Fd1db6\\nusUTqtXMjtgnaxYVelEs1GqWjWpEuB5DE7O0apSanWtdAeQ3MOOsqdbBdQHUgKRmpPOc4xcn\\nylehFPNNOs480lCH1FKBO2piFT3B9IWyXWp60ZV6XQVJzKn20BSMnEqDagpX1ctp86G82+2w\\nzpCYepddOSVTU7OyLIUE5naTU7Iy8qzkBxeeSCfNHnqCYjjvkvY+lFBZw9tDk1NkqzO4NrTa\\n28ls5BMuyUlN9TcZePOMkVTCDwyIxVh9wKsnL9K0twHNYJBHnRvfhvvyMSMJuyMIK1KJl6ha\\nOG9VknNR5LE3QLYnpRxSRmh5Lb8o60rU3hC9XdwB3xxrODGA8wpSJfCjCN9aU6yks2JZzqkp\\n4ayg3SlEDPpyiP6nTX0RnFIbGkbhCFKUlKSq9KO0jNRGRU67MpbaQSclOLKUJT5ylJTH0X9l\\nhor\\/AJSuj\\/8Anlw8\\/pFGMrYTtGlEhtM1juVSslSEKw9XWkn6oJyiabCiBlBItw3aCPQxhR8l\\nSarQXikAFQdprtgdRch\\/TcbDQb7XuY30\\/qGYJf4HcLPzfWl\\/8Ig\\/UMwS\\/wADuFn5vrS\\/+ERo\\nX\\/sstFj8pbAD882Hv9Ior\\/ZZ6LP5S2j+f\\/PJh38LhENHYntJH\\/8AlcbfyFXhy\\/8Ar\\/D1AR75\\nhhf9\\/UH2U\\/u\\/7bw90b33sFsCpfVExhLhKwV56oesOzmtbLjq7SlJ1sics4fU+wsHaKy61TLK\\nwzpMutZefRT7cteQZU4lOqXXUy0ky2VpQlILqxraoG\\/LhoT\\/ALLPRX\\/KWwA\\/PHh3\\/SOOCmNN\\njRIl33WHdI3B5TjSy2pTF9UGbYUpJ37KZlZx6XebJ3h1l1xsj6ilCFp2F7R5pJaM1juZGilI\\nTh+uuptcWUpHnblrXFiQY8LGFGLLXVKAySbBRcpzfiAS8N\\/EA6++JEchP4f2+y+KVPWbRZZx\\nQemRT5miU1hxxPmpdfTLLZbWpKTqhbgOWZJzz3KPYh2FLpSX74tCXSs6qS7ctFbSpX4oK51I\\nUd2\\/Lee2I3s5p76G8i+WH9IfDpbgSlZVKVJ+oy\\/n8AJmnys1LFX4yEuFaPw0pyj5ed5SbQik\\nfKdvj3QXPJdfamTtu+6jrlGet5N83WnM+V55Zo8l221\\/vWvnD7XkxY\\/nFdp+D20OcUvKoraw\\ndWnFLCgkJVm83eK7mwSddLAawn6TwewMqsVYfaCbpyGq0xsJtYFIBmhlI1PDXfcxJUmcXcMp\\nbX2l+WwrZ5BXk9WlZviQPo\\/JlvbUZneW9cZc0cLM4+4SSusXb0kl7LV1vJpCszp84jV1fI6c\\n\\/tMgrz9TX1D9bLVMRk6hyrGg9JONplsV6rVQsFSnKfhxiO0hrI5BC01W1qa4VKGSk7JDqCn6\\n7iVHVjr+ocsbogySUGVRitVioOFSKdZUi2psthJSlRq1yU1BL2Z2ZQpaElKw8ttAQpchkvJA\\n2jTVicFbSNf69Qpim79dfPpBNvqnfzSTvRnx3cT4CYNnMV0lVv6xPysxuy7ix2ydb\\/G1yFES\\njZnSZwnYJ2VaqU7qqyzlqHU0BW766fLWJM6vMAdVef4OXH5ya0tMPWQRLUm75teSSFGSpTDR\\nzPnArXWS6FAcMmFJO7zuOUU2s8tvo\\/sj\\/cDCjGGqENIUn55ZsqhpU\\/tCHGleQ3ZcRQ0loJUl\\n8JUtbilN7BCUB1fWVY5cyjNh5Nv6N9TnCS4lh6s4oytNCRqfRPPSslYtV2mq7kXJZM03rIT5\\nk0hROrM6d5Du06aylGBMROAm16hX6BT9BluVB+ekSnQ6+iCNbC+ka93aBs1lyUuYhS4U6\\/k5\\nSozAO63pSsgtBueRsQRciJbE3pf01skyNkVCZG7VM3XJaSJ88kghmmz+XmEKOWv5\\/mZ8XI+T\\nndLq5nARTbUoUocsx5dM1CfAVqkZqDDlNzBVqkjWTkjzNY\\/WiHjXeW+xlmNr9zODGGNIBCgy\\nK7UrquLUXsAEKd+b6ha+2CZnWdIQllRZVsNZCkmaV0xcPLDaYta2hps3hnaQUVEC3rGM0Gws\\ntlKWzdVYuY6rYQsNhZWrJ9wL11JbU3YVK8gHHr5QX8P4epyja6qril+ZSi9rBSacupoJ11yN\\nqHInhqX9ruzqXBLSKpOEG1mJFQKtd487flkW8cpO4iJpM9pQYpTh\\/W8xQaZmScpGkJdySTmE\\np+c5ioHJPDNWtv3x8VUMbcVqnn5Te1Xa1h53kHklJ\\/i\\/NUtJav8AxMucxB4uTlHNNe69c1HH\\ny55FC0qQlFs0u1bSDaFhxOq25a9ApDwWhLqtR5TpmApLbm12jbak9BXRpA473sXBd+NWK9zN\\nuhYWxXsQ7sqksG1mY1mWpWcqr0szL\\/rqaQiXaaQyhEw8202hta0xaNG\\/9n3Vm8hqVdwPTiLZ\\nlU6lT9ZcRe1wlc7K0lSzr+mnNbfoI0kztzw61m+j8NTz9rZDNuSUmSLDVRa8\\/KeBASXPdE5+\\n9sZKPQkbTEjFWmUZt1KXC5e18StOQtKy4lKyuvVRkLS4pxxKTnktSlZ\\/W3Yp3XygGhrZu1+d\\n9IjDucDIGt9yk\\/N32CAjX+jFjSVwl46o3pZ1zr+Z9fNMQuUMT1QdcW0xNzrzjiluKQ27Murd\\ncOupSylK1rccUoqKlZqUTnu5ualbOuibALNCqOqeCn5dUqDuBCkma2IUkhXmqB1Vf8VUWpS\\/\\nIdwdIJQmu49q0wlNs6KVTaVQU6WPoedvVsJuLWJSrXUg7ojs5t\\/qtiJCgUqTFxlE5NTM5lHG\\n\\/YfRwJPAjKAOB3xKOu7lldEW3xMN0FjFC\\/XWypEu7QLQlaXJPq2YKVLeu+tW5OMMFZ1VKNPd\\nfSQtSZRSdUrxUvHlznClxiwNHttC882aneN9qdSRv3OUOiW8web6yLiOX4pjR5LYW3Y\\/kXWJ\\nKTzOWUzOtqKRmRmfJBNDLIA7tY6p+rrDVH0Mtg\\/NHUM7XJZrhtESsq5M55cUoW67LZbs0pWp\\ns5HztQ\\/VixaV5MOwGjZVTdPn8QON2KV1SvVF26kgC6maKabLLBO9C2FNEn6mkQ6f2141mgoI\\nqspIJVcFMhISxNlcEuTDc28m3BSHEqHFRjPC9eWK0wboUsW9O4eYctecGza1lMVOZShSQlG1\\nevmdu+Xccb1dcOIk2G1rICmSnVbTh3e2mBpQYipW1eGPWKVSk3CpTlMlbtqlEozqlHW1naLQ\\nX6ZSVlvPJrWkTsElSWtRClJU1lMJ7eZOtNTNRnFAZFBdZYazzG\\/Jpna59jxGRO7nT9LK2Pak\\nin6OjSThG8qnA5OkkccxNreSN\\/EBIHQAnOLNpGEtlWGChVAwHh6Ueby5JtmhU\\/zu6bWKqhMt\\nrn1WuSCp1ViSQRqTCKjjfEFTzCfrtZnEqvdpyemBLjMAFAMdqllAIAuENAG2ojGBTk1UZha1\\neVTs28pTri1ByZmXlqO9xas1uLWokKK1Z5nIbhHPSVm3PP5FiizqEqP15pCZFGRJ87OcWzrJ\\nyzJ1AVE7k6+YjKFpMrKJKJVhlpOf1WGkMozGeROohIPFRTkD17otU4pXPkOgbvX0xK3MTukB\\nLEm02AAAXFlwWAAtlQGrbtwUQOfCI0qeUfqtgd6lE6+q3xjoqUwtrC987PSMmM8tVvaTb4HF\\nRKUpZZGWe7J46xzPmc\\/1ElhfRWdUzs1OzyhlrISW5ZhfDPzEBb3HhqzG7j50dkkgbzw9\\/ZCZ\\nX0es93f6o1ztaqb9wH+zSeDSEt28F2Ln\\/nhhU0+r8\\/KOSQB77ZvfHCyVsW\\/TtVUtSZNCkbku\\nutCYdB6Q7MbVwK38QoExzWvkAlAyAAAyGQAG4ZAbhlze6EySeMWFYHDf46f0xgKU44czzi3V\\nc3FqWfaok\\/PlDBUpRupRUeZJJ9pi8niT6YsKwOG8+z7YTKiePDo5vVCS3Eo3cT0Dm7ej39UA\\nF9AI8AJ3QoSSd+\\/4dg\\/RCK3gNyfOPsHf6PXHY+GWDOMWN9dbtjBzCzELFO4FrQn5mw8s64Lw\\nnmkrITtZmXoFPn3JaXQFaz0xNBqWl283nnW20qVG4\\/AL5OryiOMCpKoX5b1h6PNuTKWn3JvF\\nC7ZWfuNcoteooyln2C3dlRZqCACv5uueZtZZSPpJholCV7mnUCr1VQFPp05OAm2dphZYSb2O\\nd9QDKACd63EjnGUxKPvmzTLjpG\\/IhSgN31iBYbxvIGo11jRApSlHMkn3DsHNDiRkp6qTkrTa\\nVIzdTqU683KyUhISz05Ozcw8rUaYlpWXbdfmX3FEJaaabW64ojVB3ROg0ffkxGiTYnkdT0g8\\nVMTsf6sy4y47RKIljCCwphtJDkxKTlPok5cN9TAURskzcjiBRVlguK8kamFtqlt5+Amh1ota\\nMEkiSwBwFwxwucDZYmKxbdsSCLrn2lJWkoq95zzc5d1aRqqWlHztWpwoaOzR5h3WHS9lNZmM\\nqqnMytNQbEtpPnkwkaXBQ0pEuN4FxMqA1JFhru5fD825YvKbl08RcOrHglBybubg4Dw8+nRz\\n5EPlH9JJ2nzdOwIqWElqTqpQrvPHqZVhhTpWWnCSxOi2alLTWI1SkyykzHlFDsmqNbEtKKz5\\nRKB\\/f9o2fJc8FraTIVvSpx2u\\/FGqJbS\\/M2RhTIS+HtnMTIdGvJzt0VhFfuy46ephJPlFNk7C\\nnkvOJCSlDBM3KwgixqXs3w3T8q32Xam8m3pzq7sg31yyzQbaKSNMrwetzMblihSTVi4FzCh\\/\\nXFFKL8LIRlvppZZWCbm262LWjzoV6J+ilINSOj1gFhvhg+1KOSTlw0egNzt71CUdyC2KziFX\\nV1a+a80ctyKzcM+AMgCMyIylggicssMSzaWZdlphpAshpltDTaRyShASlI8AI26G0NpCG0Ib\\nQNyUJCEjholIAGgA3cIIIIIdhcEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\\nEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\\nEEEcPV6NSrgpk5Rq5SadWqRUWDLVCl1eQlqnTJ+XUQpUvOSE809LTTClDNTTzS2yQDlnkTzE\\nEeEA6EAggggi9wd4N+B4jjAQCCCAQRYg6gg79ONxobxqzx05Gfk5se1Ts7XNHG18P7gnQFi5\\nMF35rCmbYe1QhcyKFarkpZM5NPkpXMvVa1ag5MTJXNPlyZWt5enbG35LxbswqfqGjppP1ilH\\naOKptp4y2fK1ttSVb0NTV92U7RXZdLJIQFow8nFvJzUShSMnpasERepYKwtVsypyiyfaL1U\\/\\nLoVJvlV75lOyimFrVfi4V33KBBIOufpNPmLlcs2lR1ztAtKv+kezKQo96grhe9hHnaY1cg5y\\nkmDnzhNSOEFIxjoNPWUmu4MXfSLnVNI1QpDklaVaNsYhzQWMxqMWe4tCkELCddgu6scQcKcU\\ncJKw7buKeHF+4aV9hamnaLfto1+z6q2tOtrJVT7gp9Pm0lORJBZ3Z7+iPWZj5y5bVti86PN2\\n5eNuUG66BUEas7QrlpEhXqPOpAJCZul1RiakpkA55JeYcA5gBuEDqOxqkvZlUyqTsko3siZb\\nanWQdLJBT5q6AddVLdPsAOofwwyq5YmXEHU5XkJdSf4oKezKRusbKItc5jHkma6uo9o7sovD\\ng5wfHqj0lMYeRx5N7Gwz0xcGi\\/ZNp1mdDikVrCZ+sYTzEnMuJyVOtUqw6lQ7Xm5g\\/WWmrW\\/U\\npZx1wvuy7rwDkat8WvkwGj\\/XXH5rBPSOxWw5cc13G6diDbdsYpUxteaimXlnqM5hhU5aUUS0\\n0lc3NVaZaGu8t2a3IEFn9kGJpa6pNVPqSN6QzMGXeItfVE0lpkE2AsJhQud43xqXsNz6L9ml\\nl8E6dm6EG1wNQ6GwCBrYEjkSd0LUKSefv9Ryi4EjgSOw5RIQxV+TW6ddmbWaw5uzBHGGQBcD\\nEpS7rq9l3K7qHcX6beVAp1uMJcCk7It3jNHX2qXUtJS267rVxU5MPlBMFhOO39olYzsyVPK0\\nz1WtO2HMSqBJoSSlUxNXDhs9dtCZlMwEibcqHkpWUJD5U63nC57CGJKcT53Rak0hN8zqZVx9\\nkWAJJflw6zYb759QCRuNtU9T5xi5dln0AW9ItKKOH9UAy8Tx3CMHA6sc+fbvi\\/bnnSPQSO+F\\nKpTKvQp+ZpVbplQpFUk3FMzdMqsjM0+flXknJTUzJzbTEyw6k7ih1tCknm54YbTpHtiPKbWk\\nlJBCkkhSSLFKhoQQbEEG4IOumoEYmVXCx5EEd3Hr5vg+nnBHti8OIP4Q9O73xx+unrHaO7OL\\ntZPSPXCLHkfZzjyxG8H2RyGYPAg+mLsz0n1mOOzI4HKK6yhwUR6THkeRyOsrp90V11dUcftF\\nj8I+w+8Rdtl9XqjzKOQ9kEWzFMpM4CJylU2bCswRMyMs9nmN4UHWl55jLcd4y5o4GYsWzZkK\\n2luU5OYyPk7apQ5EK+qZVbJSfOPDL8HI+aNX6Lbq50j2j4mKh\\/pT6j3w83MTDVuymH2rbuze\\ndRbwyqELC1ptlWpNt2VShb2GPgX8KLJdz1JCblc8\\/wBgqM0rLPLh5Ut\\/6uRyzz4nPW83V4Z\\/\\nBe2l6xYqNaYJzIDjkk+hOZBASPI2llKd6ci4pZy+scxrdsbcfin1iDbj8U+sRmIq9URbLPzO\\nn6bhc9va57w4mZmBudX61A8v0r9X746TfwQlVZmWuKYaGeeT1Naf3ZHIEtzsv52fPlwzyRzx\\nxbmCU+AdjXpNZy3BySfaBO\\/JOaXnvN3DNW8j8VUZA7dHQr1Dvg26OhXqHfGSjEVYR\\/1vNbdn\\nYlz7w0Cee+HBOzIIPaXtzQj\\/ANIMY3O4L3Gk5s1Giup1SfPenmlEjMagSJB1BzASQorRvV52\\nqMlQxXg\\/dyMsjSnM88widcGW4ZE7SXb457ss+EZP7dHQr1Dvim3H4p9Yh9OJ6onephf9syP\\/\\nANVJ91oUJ+Y5oPikD4Edd0YsKwnvNJKRJyiwDuUmoSwSdw3gLUlXPlmUjfDU4X3wCoCipUAS\\nApNSpOqoA5BSdaeSoBXEAgKyy10pjLHbj8U+sRQv9CfWe6HRiupDe1Jq0tq099j4+XdCvpF\\/\\nilo7tSF6buS+vhiUvDS928tahOEqzy1J6mOZZZbjs51eXHdnlnzcDCf6nF7f\\/MF\\/\\/OZD\\/rUZ\\ncbc\\/ij1mLdsvqHo7yYV+FlQ4sSd+5Dw93bnrXx9+kXv0GvUFjl\\/H8fXr44k\\/qcXt\\/wDMF\\/8A\\nzmQ\\/61CiMM73cz1aE4Mv98nqY0TnnlltJ1Gtw36pOUZYl1Z58uzdFpWo8VH1wHFlQ4MSfrQ+\\nf\\/8AuO\\/refSL36Df+Kru\\/j+OnhrGKgwvvglINFSjMgFSqlSckgnIqITPKUUpGSjkCrVzKUqE\\nOBhXeBISqVk0DnUahLlI47yEKWrq3JJ4boyhzJ4nOKaw6R64ScVVI7mpMeDTx+L5jz6QfO5D\\nf+Kr1fn\\/ADjGdGE11rz1jTGwMstecWdbdzbOWXwI362X1t2tvh41g7caiNtP0ZsFOZ1Xp11a\\nTuIBSZFtPUSHCPxdaMiitPWfR35RTadA9sIOJasrd2CfBn\\/1rVHnnsydwQP+78yet0dCNYMz\\n5y21bk0Zg57OUfdyPNlrOs5g85OWXQY5BnBdof8AhFwuLzAOqzTEtZE71DWXOu6w5gdROXHI\\n55R3SVq6h6O\\/OKZk8ST6YaVX6woW86SgfxWGL+Fy2T7D8THnnU0f6oE+CEX4cct9PH43jqhv\\nB2gJy29Vqzh357JUm12blSj+XXxzP4sco1hdaDf1paemDv3vTzqc8xln9AGTuO\\/m4x2CSBxI\\nHbFNdPb6O\\/KGjVaovfOzHL0FBsf5sJ95jzt3zveX6iE8v0QP1H1x8qxYtoy+WyoUodXht1TE\\n0eOt5xmnnirf05jLzQNXIDl5ehUWUAErSKZL5b82ZGWbUTkBmVJaClKyAzUSVHIZmOQKzzDL\\n2xaVE8TDCn5tz9smX1339o84u\\/f6Sjf1mElazvWs+KlH4nuhQaiAEp1UpG4BIAAHQANwihX0\\nD1+O6EC4lPFQz6BvOfo4enKElP8A4qfSruHfDWQDU3J7\\/j1f1wmHJUTx9XNCZcSnioZ9A3nP\\n0cPTlDQrWrio5dHAekDLOLCQOMLAtoBBDhT5O5Iy6zvPq4D2wkpSlcST2nd6BwEJFY5gT7B3\\n+PWtKys7UJliRkJWYnp2acDUtJybDsxMzDquDLMuylTzziuZDaVKPMOhxLalEDW5IAAFySTa\\nwA1vyHHdvghMqSOPqHjdzZZ9ucJlZ5t3v7vfGaWFfJxaeONSZZ\\/DjRLx0rFNnEhUpXapYdXt\\nG2ZoZjPye6rxYt+3HiN2tsqmrVz35Djstwo+TbcoZfamH7\\/cwZwPkyGVTUveN\\/G7a6lDhydT\\nJU\\/DClXpRJmZlxvcbmrop0uvIbKbUTu30jhav1DKZOjVF9KrZXTKutsHke3dS2yAe9zdv0jJ\\nakpt+3ZSzywfzg2rLqLi6yAkXGoudeER\\/Secn0mLCsDhv90TQ8IPktGENNckpvHjSkxDvUbM\\nuTlEwqs63sOmETOWaGG7guqaxKenJQKCUvOCg0mamWgpLKZFzVfTtLwZ5EDk0MFzIzUlo30X\\nEityDjTqqzjPWq5iYJ5TIyQJ61q5PLw+cbKs1ust2cw07rkPsrbQ0hqYyGyrE81lMz5jTkGx\\nIfmO2dAI4NyiX0EjcQp1FtdY2bOHqi7bOlpgH+uOAqtpuS0HNTfQEpNwQbaX85izrGvrEets\\nW1h9Zt133cU2pKJW37Mtyr3PWplS1aqUy9KocnPTz6lK3JDcupRO7LMxs8wT5DzlL8b\\/ACWb\\nlNHaqYYUOZW2hyu42VilYZ+Rl3eFTNrViYViEpCUDWdMrZszs8tVX0pQ2r0Y7Jw+sDDOis27\\nhvY1n2BbzASWqFZVsUW1KO3qpIRsqZQpKQkU6usQNRkFIJyO\\/f8AaxNKfsgprRCqlVZubIsS\\n3KNNSbdxY5VKcM0tQ3XKezJ7jrG0Zwy2NZiZWu+9LKEtjhpmX2hOo35UkjSwOsQ6MD\\/ksdYd\\nXLT2krpTU+TbQUCctXA20ZmoLeSSnamWxAv4UsSqhkptoO4ZzSXAoPKLez2Lu5PAjkKOTSwL\\nNPnU4DtYwXDTnAv7ocd63PYiidKcskT9mOCm4XTTaSFFSVWEkrBIdK0pTq7hIInNPwXhimZT\\nLUiVU4nc7NJM45m\\/SSZouhCv7mlAHKNuxSafL2ySyFKFjmdu6bi1jZZKARYEFKUkHUa3j5a0\\n7MtGw6HK21Ylq21ZduSAV5DQLVodNt6iSQUlIUJWlUiVlJBkHVAVspdJOqM8yY+pggiTpSlI\\nCUgJSAAAAAAALAADQAAAADSNgAAAAAABYACwA5ADQCCCCCPY9ggggggggggggggggggggggg\\ngggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg\\ngggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg\\ngjr2+8KcL8UpFNMxNw2sPEWmI3op192fb92yKCNfLVlbgp9QlwfpXN+yyOsrmJjAPEnkbeTS\\nxSXOPVvRRsO3pubMw6mbw2nLowtTJvPqBU7J0zD+vW5Q0hg+dLyrlJep7IyaRKFklpWz6CMC\\nbpdNnxaep8lOAggialGJga2B\\/bW177eO6xFoZdlpZ79ul2XTzcaQs6aDVSTqOB398RxcQ\\/kz\\nehPcSXpjD7FDSAw4nln6KVertnXpbzCMjuTIVSz5CurVnkNZd0qSAMtnnm5GCeIXyW\\/EiSJc\\nwq0trIuQLBUmTxAwyrtklg+fk0alblz3\\/wCVjLZnbilyROuoCXyZzdmTQRGJvZ1g2cuV0Vhl\\nRN80o7MygHgiXebb3cCgjja8a9yh0xz\\/AKtkNrXbccRYXvokLyX7yg6abo8\\/u\\/vk6\\/KSWc6+\\nm3LcwixVQzrllyxMVKZTfKilsrCWU4nU\\/DlTa1qyYBfDLYdORd2Gb8YbXzyUPKQYdzExLV7Q\\n7xsqDkqt1Dhsa2xigwVMuLaVsJvDObu2VmkqUgllcq88h5BQ8yXGXG1q9M2CI5M7HcNO3MvN\\n1WVJvZIfl3mxxHouS3aabv20XFxv1jCcwzJquW3phBJ3KLbiQNNAMiVcN6lq4co8nK8sG8Yc\\nOFvN4hYU4lWI5LkiYbvSxbotdbBSclB5NcpUipog7iFgZZ9Mdb656B7e+PXVjpK8NHDR3xFc\\nffxBwGwYvl2aWVTTl44XWRc65ha\\/KEuF9dboc8p5SxNzQcK1LzEy+VZB93OPzGxNJN5XEHP0\\nJinX10t+UbnBwAB\\/JcORtGGvCx\\/qc2g3O5bBRYafnJcXc\\/8AdHz8pjadXtg2nV7fsj0xbv5K\\nDk4r3W6us6HWCUkp0vrX9yFsnD5CdulkubFuwpu222QnYIDIYS2mW1nzLhoTEwHMbLs5Afkw\\nbmU8un4I3NZD8xtVLmLSxdxQyDrj4fW8zJ3VdV0U9jIBUs3Ly8k3JNML1WZVpSW3GtI\\/sYr6\\nLmXqFIfAO5bk4wrhw81dTfXcVjTW9zaMReGJ0XyLllgaizjqVEX5FopH+Pv0vxjzztcdB9nf\\nBrjoPs74nY3F8mj0BasXHKPfek3ajyxOKl2aZftgVGRadeSDKh9ivYU1aemJaTUkFLLdUlX3\\n0LdQ9OFSmHmehbh+S54JTRdNqaVeKdFSQzsU3BYtoXOpCgoB8vGm1G0Q4l0ZhoJDRlyM1mY4\\nHUu7JcXNmyJeSmBp6TU+0kHQH+rhkjfbUDW9tLGMdWHqkncwlf8AavtA6W351IGuu48eHCGR\\nrjoPs74NcdB9nfEtev8AyWOotpcctbTYk5paphOxkrgwBfkUNyhSsrW5VKdjDUlTD6VagShN\\nHYaWFqzcbLX0nUdY+S86RbCpsUDSZwVqYbP+55q9u31Q1TSAtHnTfkUlcKZJWoVkpYXUciEp\\nCvOKka9zZnjNskGiOKtxbnac4Du1GSbJ15EA67hpZhVDqSN8o5w+otpfK+qFK1HEfC8RhNcd\\nB9nfBrjoPs74kd1H5MVpvNLbFJxo0Vp1soUXVVG6MXKWttQO4NtSuDVYDqCN+up1kgkp2ast\\naPgZ75Nlyh0pOPy0vW9HSptMuajdQkcSbpblJpII+ml01PDmnTyUHmE1Jyz3Psow14Bxc2SF\\nYfqBINjkQh0XsDoWlrBHeCRckXvuQaRPpFzJzB14IKjwO5NyBw1A490aAtcdB9nfFNp1e2N4\\n8z8ne5SpiYfYas7CmcbaedZbm5bFigpYmktrUkTMuicYlJpLD4AdZE1Ky0wG1gTEuw6Ftp4i\\npfJ7+U2kWEPS2GOH1YcU6lpUrTcX7EQ+2haFqEwpVWqdKlyykoDaktzK5jWdRqsqa2i22fwJ\\nxUL\\/APy9Vjbf+xHTy5J19XM+pv6NnR\\/1GcP\\/APrvHlyR69O\\/ujSftOr2\\/ZFNc9A9vfG5j\\/uA\\nXKjf4C7Y\\/PPhF\\/TGKHkAuVH5sC7X9OM+ER\\/\\/AOyEAwVir+DtW9ck\\/wB38XrXvg+jpz94zn\\/h\\nZj\\/0Rpn11dPsHdFNZXSfXG6+m\\/J8OU6n23VTOFtgUUtuJQlqpYv2E8t4FOsXG\\/merVZtKU7k\\nnbuNOZnJLZ4nlG\\/k7\\/KXrcQhVmYWMpWtIW85izbxbaSSEqcc2LbzxSj6ytk085q7w2onVhQw\\nViveMPVQXtvk3RvtzSLa8+XhChT53S0jN915V4H3ouPXGjuKEgcSB2xv3Y+Ta8oi88wy5VNH\\niVbeeaaXNTGJdxLl5ZDiglUw8mWw\\/mZlTLKfpXRLyz7+zGbLLq\\/MjsGQ+TEacbj+rVMZtFGT\\nlS2SHpC7MX6k\\/tsxqI8nmcFKS3s1J1ipwTeaClOTa9bzchGBMWuEAUKfBJA9JtLY1tqS4tAT\\nv1JNhxMOppdRIuJN8W4FBT7AqxPqERxtZI5\\/j7optBzA+7viTvR\\/ku+kq+Jf5\\/0lcDqZrzKE\\nTfzPRL+rmwky4kLflzO0m3vKplLWutMo55I2t1KWjNoSsuo7dofyWGtOpUu5tNmlSCkTDeUt\\nQ8AJurB+UGqXVeWVDGKiGVmCraNJT5BONNjUfUpzzmBmt7N8ZOWtRHRe37ZOU5sDjc55tO7x\\nPIXOkLRR6mv6so5fkpTaPV6a0j374iUlZ5t3t8eqLdZR5z7vdEzehfJbsHJZTRujSyxNq6A8\\nsvot\\/Dq1LaWuXLeq2005Uq5daWHkPDXcmFNzKHG\\/o0sNK+ljvS3vky2gdTGmVV\\/EvSfuec1G\\n0zG3vbDikU115DmspctJUvClqelkvJybU07V5xYQFKbdQ4RlsmdlWLVkBUrJMd7s8yoDQH+o\\n9srjwHxuXk0GpqvmYS33LeaN\\/DItfjrb4RBSKkp4kDtMJl5A4ZnsGXvy+MehpanyfXkvrcKT\\nVcGryvkhp5CTdeMWJ0tk4p9DzcwtFmXLaDZdl0JMs2hSDLLYeWZiXfmdm+jJK0eSN5Neyn2Z\\nijaHOD845LupcbTd1KqOIEssomUzQD8vfdVuWWmkF1CULammnWly+vJrQZRxcudqxsexAvV+\\nfpLI00Q5NvK4XuDKNp0vp6ZvY7rRkIw3PqsVOSyAd4K3CoepLRSf8f1x5mhfUeAA9p+A9kfc\\n2jhfidiE4hmxMO78vd11RS23aNoXBcq1qSXdZLbdGp86VFOwe1gkf3l0\\/wB7Xn6mNo6K+jFY\\nCkfcJo4YDWSppOohVo4Q4f20UI1HEFtJo1uyRSgtvuN6gOqUvupGYWqMgI3MvsYVvmq+BoLo\\nl6fc30Js67NiwGoH5K50JtaxykYYWdXJxCddyGVLuPEuIt7DxjzC7K5LHlF8QFsooGhpj5J7\\ncpS25eNiVLDuXUSh5wLMziELYlktFMu5qvLcSydZgBWc1K7fNCw\\/k7fKZXhMMMXBYmF2FrTp\\nQHZy\\/MW7YqEtKBa0pUqYGGH6o82oNhRUsSsrNHVQvVCl6qVehJBG\\/ltkOHWrGZnKpNKFtO1l\\nmG7ggn0W5Yua2sB2uiSQNdRlt4alE6uPzC9RoktoSRyUMilEHTcpJiFth78lpxlqLjRxY0sM\\nMrRaCW1ONYeWBdOIjizmsusNvXJVsMNjrJDQbmlS7oSXlqVJK2IS\\/nXhz8mE0OaChl\\/EvGjS\\nAxFqDKmlOs0SdsewLfmyhSi83MU1NrXVXkofyQlJlbsl3WUB36Ra3G1y8l6CJFKbPcIShBRR\\n2nlA\\/WmnpmZvYW1bdeUyf8nbmOMZrdDpjdv2P2hH5zjjir+KcwR7EiNUGGnIkcmPheiTVI6L\\n1t3dUJUKLtVxKuS9cQXJ9ZUVByco9zXHP2unVSW20tSdvyktqoSosGYcede2EYd4H4L4RMrl\\nsJsIcL8L5Ysplyxh5YNp2UwqXQEBtgtW1Saa2WUBKEpbKShOoOPAdrwRJZSlUyQAEjT5KUsA\\nAZaVYYNhuuWkIJNtLkk773ub57UrLM27GXZaItqhpCVaC1yoJBJtxJJPEwQQQRnw\\/BBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBE\\nR35RfXa3SMc9HhqlVqrUxp3Ce4nHW6dUZuSbecTeDw2jiZZ5sOKyATrLzOQA3RHV+7e8f\\/K2\\n5v8A0\\/U\\/+uRIZ+Ug\\/wBvfRz\\/AIJLi\\/1xfiOFHC21iamW9oWJEImJhCEvyWVCHnEJTemSKjZK\\nVAC5udBvN98U\\/iDWsz\\/92H+rb+QjZtyTV03PP8ohowyc7cdenJV+77gS7LTdXqMxLvD7gLtU\\nA8w7MKbdSFBKiFpI1hlE\\/qPPq5I\\/9sY0XP343B\\/qBd0egrF6bAHXXsJ1VTrjjihiF9IU4tS1\\nBIplLNgVEkC5JAGgJPOJhgz9z5r+\\/D\\/qGYIIIIvWJhBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\\nBBBBBBBGtvlcpqbkOTp0m5yRmZmTm2LbtBbM1KPOy8wypWJdkpKmn2ShxtRQtxOaFbkqy3gx\\nskjWxyv37W\\/pQ\\/vYtH+c2yI0WJyRhrEKgSCKHViCCQQRIPkEEHQgi4O8HcRGBVf3LqX94Tn+\\nzuRAa+7e8f8Aytub\\/wBP1P8A65B9294\\/+Vtzf+n6n\\/1yPm4I+d3n05++prh\\/1h7u\\/j93VhFK\\n2HIdfqHsj6T7t7x\\/8rbm\\/wDT9T\\/65B9294\\/+Vtzf+n6n\\/wBcj5uCDz6c\\/fU1w\\/6w93fx+7qw\\ngsOQ6\\/UPZH0n3b3j\\/wCVtzf+n6n\\/ANchWXvy+ZR9qalb0uuWmZdxLrMwxcNXafZdSrNLjLrU\\n4lxpxJ+otCwsHhw3\\/LQR6J6cG6bmhu3TDvC38bTdw58hHu7dp19w9kd72xpU6T1kPIfs7SMx\\n0tZaFqWfmDFm\\/KS2vWLRcQ8zJV5hp9p8ssh5l5DjbyG0odbeQBlmdhfyzHKGYYuSzYxxXiFS\\nmFIK6JihbNuXa3NBOruma+afIXrqlILagxdEuVBWtudIcjV1BGzkcUYkpiguQr1XlCCDlYqM\\n22hRHBbYd7NwW\\/NWkg8RvvktTk2wQWJqYaI3dm84jx0SoAg2FwRY7iDErbR6+UY21Un5CjaU\\nGCM1bS3Vpamb7wdnnqzSGluhCA9NWDdE43WKfJS60uOzExI3jcc8WVhMvS3nWcpiQNgbpH4G\\n6SlpovbA7Ey2MRKBkx5YaHO6tXoj74UpmUuS3ZtuVr9tTy0IUoSVfplOmVN5uobUzk5Hmhx2\\nVhDjPingJfNIxKwdvi4MP70ozmcpXLfnVS7jrCnG3H6bU5NwOSFZo87sm01CiVaUnqVUGkli\\nekn0EiLawtt3xDTnWmMRst1yRulLkw22zKVNlFwCtCmktysyUJ3NvNNOOqACppJJJkchi2el\\n1BE4EzjWgKiEtvoAsLpWkBC7DWziSpR07RO+PTmgjR5yZfLA2dpcmkYMY2opGHukWiXSxR3Z\\nUqlLQxcMswtx9+20vlaKFdqGW1TE9aMxMPNz4S5P20++0qaotE3hx1PQa\\/ScS05qq0abbm5R\\n0lJKbpdZdSAVsTLKrLYfbzDM2sAlKkuJKm1oWqwZKelqgwmYlXAttWhG5bawAS24nelabi41\\nBBCklSSlRIIII3MZcEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\\nEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\\nEEEEEEEEEEEEEEEEERDPlIP9vfRz\\/gkuL\\/XF+I4USPflIP8Ab30c\\/wCCS4v9cX4jhRwdtc\\/6\\nRMS\\/3eR\\/3VIRT+IP3Zn\\/AO7D\\/VojY3yR\\/wC2MaLn78bg\\/wBQLuj0FY8+rkj\\/ANsY0XP343B\\/\\nqBd0egrF8eT3\\/SjVv\\/uOY\\/3ZSomGDP3Pmv78P+oZgggiMDylvLgPWvVK9gVoVVmQmqpILm6R\\neuPaWJapSUhOtlcvO0bCyXmm35GoTMovXlpu+pxmcp6XA8q1JaZAkrlbtbE+KqNhGmqqVZmO\\nybJLcvLtAOTc4\\/a4ZlWbp7RVtVrUpDTSSFOuISbxIajUpWmMdtNLte4baTYuuqG9LaSRe1xm\\nUSEJuMyhcX3r6RWmbozaKNN8vx1xdtezJ56VVOUy0kzTtbvqtNarwacpNlUNqoXHNSjz7SpY\\nVRVOZo0tNONJnqjKkhY0g4yfKO8PaXMT1OwF0ernu9tBLUndGJ1y0+y5RTiUDWmk2tbspdk7\\nOyansw01MXFRJtcv9K81KOkyzcUy5rnuS9K\\/VrqvCv1u6bnrs45Ua3cVxVSdrdcrE88Rtp6p\\nVWpPTE9PTTmSNaYmX3XFJTmTrEGOHjl3EG3jFFQdcRQmZWhSlyltZbbn59SebjsyhUqkqFjl\\nblLtk2Dq7BRgM5i6ovqIlQ3JtXOXKlLrxH8ZbiSkabsjaSDeyidY3mXh8oM04q++v7m6DgbY\\nUoCkMtUiyq9WpwJSokmYmrpu+tS7zrpVqKUxTpNvUDZbZS9tXXepHeXJ5Rxbq3EYuWswlxxx\\nxLDWE+GymmUqJUGmi\\/bbruzaBDaNs667qg7R1xXnRqOgiBO7R8dvLK14prAKjchubUwm5NyA\\nhgNoSL7kpSABoLCNKusVVZuajOg\\/xJl1sf4qFJT7o3RW3y+HKAUN6XdqdYwkvFDAa2svcmGs\\nvLMzeo+l1flH3IVa1X07dsGXc8kdlvoXHCzsZnZvt5m4W\\/KRLwl3JaWxr0araq7SwkTdZwuv\\nGqW44xmRrvS9sXZK3SJwqTmEMO3bJZHjMHhEZCCMuS2p4+kXEraxJPPAZbonRLzyFAWukibZ\\neKQq2pQUq5KB1h1qu1dkgon5hVuDyg+D4h4OX+PEax6AmjTysehLpQTcjQrXxPbw+vmohpqW\\nsPF+XlrHr03MvKabakqTUn56cs+v1F193ZMUqgXPUas\\/s3HUSAa+ljZZHlnxua5PzlkMbdFO\\npULD7F6oVzGfR+S5J05dIq0+ufvrDynJLcuiasOvVF4vTdMpsulJRZFamVUdctLNyVCm7XW4\\n7Mu3Lg7b01NPNSGL5RmTLiktoq8iFiVSpRCQZ2UcU440jiuYYddSCbmXbbClpk9NxhmWlqpt\\npQDYedMhQCTuu616Rsd5U2dODVtROWgjq\\/CPFzDjHfDy2cVsJ7rpt5WJd0kJ+i1ymuLCFpCl\\nNTMjPSjzbM5S6rTplDsjVKRUZWWqVLn2HpOelmJlpxuO0I6OZeamGm32HG3mXkIdZeaWlxp1\\npxIW2424klC0LSoKQtJUlSSCCQYnKFpcSlaFJWhaQpC0kKSpKhdKkqFwQQQQQbEaiNaHKLco\\ntSOT3pGFdWq2FdSxRRijUrup7DFPu6WtRVHVaktb804665NW\\/XjOonTXkoSltMqGBK\\/34veZ\\nq8++T7N\\/JKub88NK\\/wBnkHyk\\/wD8TdEr982MP+isPIigxzDtN2nYww1jCoUikVBiXkZdiQW2\\n0uQkn1BT8kw86S48ytwhTi1EAqNr2GgFq9rtdqsnVZuWlpvsmGixkR2Esu2eWYcV6TjK1m61\\nqOqja9hYAWmMaPvL52rj3jhhPgtKaM1w21M4pX9bVjMXDMYo02qsURy46nL01FRdpzdjSK51\\nuUL+2XLtzkst4JLYfZ1s4kMR5zfJ2f3d2iN\\/lAYY\\/wCtFPj0ZIsbY\\/iyt4uolUna7MtzMxLV\\nUyrKm5diWSlkSks7lKGG20qOdxRzEE2IG4RvMMVGcqLE0uce7ZTTraUK7NpuySgkizSGwdRx\\nBI3DSCCCCLciUQQQQQQRj\\/pPY5S2jTgFifjvPW6\\/dsthnbaridtyVqTdGmKuhM7JSQlGqm9J\\nVJuSJM4HNquRmhm3q7Lzs40G\\/fJ9m\\/klXN+eGlf7PI24cqn+16aVX8Gq\\/wDT9Ejz0Y572wY\\/\\nxPhGtUqToU61LS81TDMvIck5WZKnvO32swXMNOKSMiEpypITpe1zeIRier1GnzrDUnMdi2uV\\nS4pPYsOXWXXU3u60tQ9FCRYEDebXN4lfffJ9m\\/klXN+eGlf7PIkO4J4ks4zYNYR4wS1Jft6V\\nxXwysLElihPzqag9RGL6tSk3Q3SXqg3LSbc85TUVRMmudblJVubXL7YS7IdDQ8ySPSJ0F\\/7i\\nXQ6\\/yWNHz+aW0Ye2O48xLi+pVmXrs41NNScjLvS6W5OVlilxx8trJVLtNqUCkDRRIB1AhzC9\\nWqFQmJpucmO2S2yhSB2TDeVRWATdppsm45kjlHT3KGaeVK0AsN7HxFquGlQxNavW+FWW3Sad\\nc0varlPdFAqtcM+5NzFEraJlsppapcS6Zdles9tw8dmG16lfvk+zfySrm\\/PDSv8AZ5HZ3yjr\\n+5nwG\\/h2c\\/m+uyIecaDajtLxfhjFszSaPPsy8i1KSLyG3JGTmFBb7AW4S48ytw3Vc2KiBewt\\npGDiCuVSSqb0vKzXZMoQyUoDEsuxW2lSjmcZWrUk6ZrAGwA0iV418pNslTrYe0TLpbaLjYfc\\naxcpDzjbYVm4tpo2Awl11KRmhtT7KFqzSXWydaJCOBWOeGmkfhdamMGEtwS1x2Xd1Pbm5KYQ\\ntoT1Mm9RAqFAr0k088aTcVFmlrkKxSXnFOys224G1PMFl9\\/zMo2ccmVyjF36CmKSZWsrqVza\\nP991CTl8TLJaededpC3HGJYYh2fJqcEuzdlGk0BE5JEsyt10dlVGnnmJpqiVii63BG3Cr\\/TL\\ncrjGYYfpc5lZE63KMSy6a8VWQ+4JdtAdlVkhMyFJUtoBDzZAQ426zScVTaJoIqb3bSztkFzs\\nmUKl1X0csy2jOjg4CCoD0kbihc\\/iCPjLFvm0sTbPtjECwrgp91WXeNGp9xWzcFLcU5I1aj1N\\nluYlZtkrQ08ypTKtV6VmWWZuUmA9KTjLEyw8039nHVqFocQlxtaVtrSlaFoUFIWhQCkrQpJK\\nVJUkgpUkkEG4MWMlSVJStKgpKgFJUkgpUkgEKBBIIIIII0I1BgggghUex1VjZiSzgzg1i5jB\\nM0l+4ZXCjDK\\/cSX6ExOpp71bYsW1KtdDlJZqDktONyLlSRS1SaJ1yUmm5RcxtjLvBotGPF98\\nn2b+SVc354aV\\/s8jeXp0f3EumL\\/ksaQf80t3R5u0UDtix5ibCFSo0vQp1qVanJGYfmEuScrM\\nlTjcwltJCphpxSAE6FKSAd9r6xDMUVWoU5+VRJzHYocaWpaeyYcuoLABu604RppYED12Ilff\\nfJ9m\\/klXN+eGlf7PI3waJmkFK6VWjzhpj\\/I2xM2VK4k02r1Fm2JqqNVyYpPzTctZtwtO1VmQ\\npjc4ZhdGXNBbcixskzAYAUWtsvzYY9Ankgf2t\\/Re\\/exd385t7xj7H8f4oxdXKnJV2damZeVp\\nRmmUNycpLFL3nks1mK5dptShkWsFJJTre1wLM4ZrNSqFQdYnJntm0ybjqU9iw3ZxL0sgKu00\\n2o+i4rQm2t7XAtsngggjoaJzBGtjlfv2t\\/Sh\\/exaP85tkRsnjWxyv37W\\/pQ\\/vYtH+c2yI0WK\\nP6WcRf4Cq\\/8Au+YjAqv7l1L+8Jz\\/AGdyPP2gggj5yRS0T8tDfQ30Qrn0Q9FO5rm0VNG64biu\\nLRuwNrlwXBXcDcMKtXK7XKrhha89VavV6rPWvMT9VqtUn5h+dqFQnX5idnZyYemH3XXXXHIy\\nX\\/sF9CX8jvRY\\/wDofMJf6IwaC\\/8AcS6HX+Sxo+fzS2jGU8fRKjUakKpFKUqlU1SlU2QKlGRl\\nSpRMq0SVKLRKiTckkkm+tzrF0ysrLGVliZdgksMkktNkkltBuTl1PfGLH9gvoS\\/kd6LH\\/wBD\\n5hL\\/AERhnNaB+hHNsPSzuh7owIamG1NOKlcCML5CYSFghS2JuRthiblnSkjUdlnmHmzvQ6nc\\nRlnBGyNEopFjSKYQd4MhKWPj+S+7nD\\/mkr+9pf8AyLf\\/AKe4eyNa19ckVyd1\\/wAu+3UNGy1r\\nfmHdZTc\\/Y1Zu2xpmVd1Uth2Xl7YuCm0tSkpGrsJumzUoV5uLli4I1d6Qfyc+x6lLT9W0Yca6\\n7bNVS2t2UszGGVl7hoE4+oDVlWL0tiQplZoUoAPNVN2tdswtR+lfG90SbYI0FW2eYLrTa253\\nDtMSpQ\\/oiTl0SE0DwUJmSDDpy6WStSkcFIUk2jCmaHSZpJDkiwkkfXYQJdYPA5mQjMR\\/GzA8\\nQRcHzVtJHRRx80S7zTY+O+H1Vs2ozKXX6JVlFmpWtdEmwpKVz1sXPT1zNHq7LQcaM1KsTQqN\\nMU8yxVpCnTLhlxjxHpkY6YC4U6SeG9fwoxktCnXjZ1eYLbsrONpTP0ioJQtMlXrdqaf15Q7h\\npqnVu0+rSC2JplSltrW5LPPS78BvlA9B+89BPHSew3rUzM3FYtwy79xYV327LeTouq1TMFlc\\ntPBoCVl7nt19bdMuORYKUIeVJVSWZapdaphXy3tK2VTODAKrTHnqhQHXUtKceCPO6c64bNNT\\nXZpQh1l0+izNIQ2O0IYdbQtTKn6\\/rmH3KUQ+ypT0mtWULUB2jKjuS7lASQrclwBIJ9EpSSnN\\nhNSqpUqHUqdWaNPztJrFInpSqUqqU6Zekp+mVKQmG5yRn5Gdl1NzEpOyc000\\/LTDC0PsvttO\\ntubRAidnySnKEf2bOCr1vYgTkqjSAwjl6ZSsQUNJblvu2ob6TL0PEmRk2whhp2qlhchdcnKJ\\n8kkLjl3JyXlqZSq9RKexBBjMbQD0oqpog6VOGGMTMy83bLNWRa2Jcg2tepVsNboel5G6WXWW\\nsjMv0lryW6KTLrybVcFBo7jo2aXI02zHGj+D8RSynXimjVJ1qUq7KlHsktLVlangm+jsktRd\\nUpIKly5fZAu4LY1Dqi6ZOoWVESzyktzKPzSgmwctwU0SVgjUpzI3LMejVGkfTk5Zq3NCnH2q\\n4E1LACs4gzNLty27hVcsjiFIW7LvpuSSVOIlE0t+0KytC5RKS2t4zq9tx2TW6N1UnOS0\\/LSs\\n7JTTE3KTbDMzKTcs82\\/Kzkq+2h5iYl32VrZeYeZWh1l5pa23G1hSSQd8HLl5f2wm8P4NMMP9\\nALjqTaviWrYWwqmq0SYRLzhqcpLdothmYSWXm5hSx2byFo1LaCFZb2GhsTefYlnpqQp7b8m9\\n2TipltsryNOXQpp1RGVxDidSlJBAB037xGyn75Ps38kq5vzw0r\\/Z5B98n2b+SVc354aV\\/s8i\\nKDBHNX469of9lpX+Sqb\\/ADbq57rQT8Jq5+\\/j\\/wCGk\\/5v1c91pX33yfZv5JVzfnhpX+zyD75P\\ns38kq5vzw0r\\/AGeRFBgg\\/HXtD\\/stK\\/yVTf5t1c91j8Jq5+\\/j\\/wCGk\\/5v1c91pX33yfZv5JVz\\nfnhpX+zyD75Ps38kq5vzw0r\\/AGeRFBgg\\/HXtD\\/stK\\/yVTf5t1c91j8Jq5+\\/j\\/wCGk\\/5v1c91\\npX33yfZv5JVzfnhpX+zyD75Ps38kq5vzw0r\\/AGeRFBgg\\/HXtD\\/stK\\/yVTf5t1c91j8Jq5+\\/j\\n\\/wCGk\\/5v1c91p+XJycpPRuUL\\/Vk+acJaphd+pF+p75R85XhK3Ya793\\/3cbLYGVt6g+QClmyn\\ndoHPKjMioI1dh5MS7k3pkaSclohaN+I2kRULSmb5lMPDZ+1tWSrLdBmar91d92vY7ezqz9Nq\\njUqZFy5UVJRXIP7dEoqXBZLweZ0FfJpf\\/q0\\/\\/wAXL\\/8AXxG0rlqv2srSX\\/8AM7\\/6wGFcdG4d\\nxRWahsoexTNTDa60ih4nnUzIl2UNiYpj9Vbk1mXSgMENplWQpJRlcykrBzKvOZGem3sNrn3H\\nc02mUqDoeyND8owqZDSuzSgNeiG0aZMqrekDc31t\\/fJ9m\\/klXN+eGlf7PIPvk+zfySrm\\/PDS\\nv9nkRQYI5y\\/HXtD\\/ALLSv8lU3+bdXPdaDfhNXP38f\\/DSf836ue60r775Ps38kq5vzw0r\\/Z5B\\n98n2b+SVc354aV\\/s8iKDBB+OvaH\\/AGWlf5Kpv826ue6x+E1c\\/fx\\/8NJ\\/zfq57rSvvvk+zfyS\\nrm\\/PDSv9nkH3yfZv5JVzfnhpX+zyIoMEH469of8AZaV\\/kqm\\/zbq57rH4TVz9\\/H\\/w0n\\/N+rnu\\ntK+++T7N\\/JKub88NK\\/2eQffJ9m\\/klXN+eGlf7PIigwQfjr2h\\/wBlpX+Sqb\\/NurnusfhNXP38\\nf\\/DSf836ue60sukfKPrQrFXpdJRooXKwuqVCRp6H1YvUt0MmemmZYOqbGHqNoltT2tqayCoJ\\nIzy4SZY8vSyf\\/HK1P3z0H\\/ScnHqFxfGxzGVfxfLV52vTTU0uRfp6JYtSsvLBCZhqaU6CJdtv\\nOVFpFiu9sulrm8uwtU56o+feev8Ab9j5r2f5JlvL2nnGf9pbbvm7NP1r2tpa5voM0ruXPtnR\\nc0g8TcAp7Ryr94zmG9XkKU9csriXTqJL1Zc9QaTXA81S3rLqjsollNUEsELnZgqLJdzG12Se\\ngPvk+zfySrm\\/PDSv9nkaXOVw\\/bGNKP8Afjb\\/APqBaMa5IqDEe1\\/HdOxDXqfKVOWblZGs1OTl\\nkGmSCymXlZ59hlKlrlypZS22lJWolSrXUSdYjU5iOstTc003OlLbcy+hCfN5RWVCHVJSm6mC\\no2SkC5JJ3kkxK+++T7N\\/JKub88NK\\/wBnkH3yfZv5JVzfnhpX+zyIoMEab8de0P8AstK\\/yVTf\\n5t1c91sb8Jq5+\\/j\\/AOGk\\/wCb9XPdaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/2eRFBgg\\/\\nHXtD\\/stK\\/wAlU3+bdXPdY\\/Caufv4\\/wDhpP8Am\\/Vz3WlfffJ9m\\/klXN+eGlf7PI+1sv5R3gFU\\nZ1lrEHR7xbtSTcWpDs7atetG+lsJIIbeVKVN+w1Kaz1Q+G3HHW2i4WmppxKWXYhkELb23bQU\\nKClVKTdAIJQulyISq1rgltltdjrfKtJ10I0hScT1sEEzgWB+aqWlQDu3lDKFcOChvPdb0T9G\\nvlEtD\\/SvelqVhFjFRJi8n0BX6nl1tTVm34pzVU47LyFBuJmSNxGWaTrzUzaUxcEjLgpLs4Fb\\nhnDHlpS0zMyUzLzklMvyk5KPszUpNyrzjEzKzLDgdZmJZ9pSXWX2XUpdadaUhxtxBW2NaJV3\\nI+8rhdN93TbmidpS3K7cFfraWaPg3i3W31rrtarCAUymH9+1F5SvniqVVrVZtW55woq1TqbY\\notYmKvV6vTJoXDgLbYxX52Xo2I5Vim1CaWlmUnpVTgp8zMLIS3LutPKcdk3nVEIaUXnmXXSE\\nXZUpAXJ6RisTTrcrPtoZdcUEtPtkhpazYBDiFFRbUogALCikqVYpQADEn+NcnKJ8oLSuT\\/tD\\nDi7athfUcTkYiXJWLeZkqfdcvai6Uuj0xmpLmnX5qg14TaJhL+wS22yxsyC5tlA6sbG4jYfK\\nR\\/7T2jN\\/CXev+rFNizse1aeoWEa3Vqa6lmekpdlyXdU228lClTcu0olt1K21gocULKSbXuLE\\nAjeVyZfk6XNTMuvs3mw1kXlQvKVvtNq9FxKkG6VEapO+4sbEfOffJ9m\\/klXN+eGlf7PIPvk+\\nzfySrm\\/PDSv9nkRQYI5N\\/HXtD\\/stK\\/yVTf5t1c91q6\\/Caufv4\\/8AhpP+b9XPdaV998n2b+SV\\nc354aV\\/s8g++T7N\\/JKub88NK\\/wBnkRQYIPx17Q\\/7LSv8lU3+bdXPdY\\/Caufv4\\/8AhpP+b9XP\\ndaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/wBnkRQYIPx17Q\\/7LSv8lU3+bdXPdY\\/Caufv\\n4\\/8AhpP+b9XPdaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/wBnkRQYIPx17Q\\/7LSv8lU3+\\nbdXPdY\\/Caufv4\\/8AhpP+b9XPdaV998n2b+SVc354aV\\/s8giKDBB+OvaH\\/ZaV\\/kqm\\/wA26ue6\\nx+E1c\\/fx\\/wDDSf8AN+rnut6mEEEEdwxbcEEEEEEEEEEEERDPlIP9vfRz\\/gkuL\\/XF+I4USPfl\\nIP8Ab30c\\/wCCS4v9cX4jhRwdtc\\/6RMS\\/3eR\\/3VIRT+IP3Zn\\/AO7D\\/VojY3yR\\/wC2MaLn78bg\\n\\/wBQLuj0FY8+rkj\\/ANsY0XP343B\\/qBd0T+67W6XbVFq9x1ucap1FoNNqFarFQf1thIUqlSb8\\n\\/Pzr2yC3NlKybDz7uzbWooQchnmYvfyfVBOEKuVEADEUySomwSBTKVck7gANbnSwJJA1iYYN\\nIFOmySABNqJJNgAGGbm500Gp7gTEfbl0uUCqWDNlyWibhJX3abiTifRFVTFKv0mdCJ60cM5\\/\\nyiSYtlh6XO2kK7f62pgTSi4zOSFoyj6TLrbu2mz0rDyjvTSexyr2kppA4s45XEp0zuI15VSt\\nyco+sLVSLdbc8gtS3kKBIUzbtsSdIobCyVLcap4cdU66tbsdFxzztCxbMYwxJOVBTqjT2HHJ\\nWksZjkZkWllKHAi5CXpqwmHyL3WsNhRQ0gJhVXqK6nPOzBJ7IEty6DuQyknJpwUv66765lEb\\ngACM2NFDk8tKrTLmBM4OYerTZjM0qUqGJ15TKrXw6p7zToZmG01x+XmZuvTUm6UonKbaNMuK\\nrSQOtNSDbQ1oyn5Izk6ZfTXxTqt6YmS06nR8wmnZBd2Mykw5Iv35dUwkTtLsCVnGVImZenKl\\nE\\/OV3ztPW1PSlIckqfKzEhP16SqUnOOty3LetCgUe1bToVItm2rfp0rSKHb9Ap8lSaNRaXIs\\npZkqbSqZIMy8lISUoyhDLEqww0yy2kNtIG\\/Od7NNkJxVKortdffk6M4tQk5aXAbnKh2S8q3u\\n1cStMvKBaVNpWlC3nylZbLKQhxe3oWHFVJAm5pa2ZQqIbSiwdfKSQopUoEIbCgU5sqiohSQE\\n2zRGawu+TeUFqVl5rGvSWq83POJBnKHhdZknTJWUWG1DZy1z3bPVR6fSXShQectGnDUQUbDX\\nd2jWUsr8ni0HJaUflnb10kp951Than5y+8P2puW2jQbSJdElhRJSJSytJeb28lMHarVtS80W\\n2kb44I6Gk9luAJJsNt4ZkHbJylU2ZidWq4sVFU288cx1IIsU39HLE0bw9Rmk5RItrva6nFOO\\nKJFtbqWQL21CQE\\/xYjiXz8nC0f6gy4nDbSHxhtKZLRDTt80SysQWW3yE6rq2KDIYYuOshe8s\\nJmGlqSdXbp3E6hdKHkT9MrRzp1Quq3qNR8erEpzb0zN1jCkVOcuekyLAcUqarVg1GUl6+Qhp\\ntb8wu11XZJSUv9NOzzDe1Dc7WCNRWNjGBaowpEvTnKPM2PZzdNmHklKvzc0s+t6VWkKsSA0h\\nZF0pcRe4xprC1JmEkNtKlXDucZcWQDwu24pbZHMJCCQT6QNiPLNIIUoKRkpJIIIyOY3FKswC\\nDnuyPN1bzdEt\\/lqeTEta6bLu7TIwIt1ih4gWoy5X8a7QosilimX1bLWsusYgycjKNBEreNAb\\nJql0PNoRK3JQmajW5xSa\\/TXXK\\/EgjkvGmDqlgqsLpU+UvtrR28jPNpKGZ2VKikOpQSotOoUC\\n2+wpSi04NFuNKbdcrqp01+lzSpZ+ytAtp1OiXWySAsC5KTcFKknVKgRcpyqVuR5HflBqtom4\\n207Cm\\/q6+dHrGSuSVKr8vPTDi5DD69Z1SJChX\\/T23DspCTmJhcnRr32Pk7c3QVy1YnDNTFr0\\n1hc5+PLPj0D+Sk0jZvSZ0IcI7urs45P3rZUpNYTX1NOu+UTE5cFgCWkZKpzbxccdmKlXrTft\\ni4ao68lpaqlVZsoa2OxddvjYJi9+aancIzzqnfMmTUKQpxRUpEr2iG5uTBP9Taddafl0alId\\nmACG0ISmW4PqS1drTXVEhCC\\/LXP1UhQDzQudxKg4lI3HtTuIA1XfKT\\/\\/ABN0Sv3zYw\\/6Kw8i\\nKDEr75Sf\\/wCJuiV++bGH\\/RWHkRQYrDbX\\/wBIdX\\/valf7tloj+Jv3cn\\/GW\\/2KWjMzk7P7u7RG\\n\\/wAoDDH\\/AFop8ejJHnN8nZ\\/d3aI3+UBhj\\/rRT49GSLi8nr+lmt\\/4dP8Au+TiTYK\\/oae\\/u7X+\\nrMEEEEX\\/ABNYIIIIII1+8qn+16aVX8Gq\\/wDT9Ejz0Y9C7lU\\/2vTSq\\/g1X\\/p+iR56MckeUN\\/T\\nHQv8CK\\/2+ZitsZ\\/ujLf3kj\\/XvwR6ROgv\\/cS6HX+Sxo+fzS2jHm7R6ROgv\\/cS6HX+Sxo+fzS2\\njGR5O\\/7s4j\\/wZKf7UqHcF\\/0XO\\/3uj\\/WRqC+Udf3M+A38Ozn8312RDziYZ8o6\\/uZ8Bv4dnP5v\\nrsiHnEU24\\/8ASBO\\/4Ppn+zCNbir92pj+5y\\/+pRBBDyk0ufrdUptGpUsudqtYn5Ol02Ta1Q7O\\nT9QmG5SSlmlOFDYdmJh5plGutKSpY1lb91atSapQKrUqHXKdO0etUWoTtJrFKqcq9JVKlVSm\\nzDsnP06oSUyhqYk56SnGXZeblZltp6XmGnGXWkOoIipOzXk7UIWW83Z9pkVkLgAUWwv6pXlI\\nVlBzZSCQBrEesd\\/Ddfhr4fDfG5zkkOU9n9D+8WcGcX6jO1HRrvmsBan1EzEzhHddUelWVXfT\\nUqJeXaE6Ef8AfnQmN7RIuejMmpy9VptyTcaXVKbWqbTq1RajI1akVaRlKnSqrTJuXn6ZVKZP\\ny7U1I1GnT0q67KzkhOSrrMzKzUs85LzMu4y608ptQMeXLEivkauVQOENRoeifpF3IUYUVidb\\nkMJcQK1NOrThrWZ59tEvZlbmndYMWBWJt3WpdSfcbZs6qPFqbULYn3Zm2+iNj208U9cvhPED\\n9pB1aWaPUHl6STqzZEhMLUdJNxRtLOk2lVkNL\\/Y60ql5lhqv+bKRT51z9jKIEu6s2DCidGlq\\nJFmVH6pJs0reQ2SUTBYIII6tixYxY06P7iXTF\\/yWNIP+aW7o83aPSJ06P7iXTF\\/yWNIP+aW7\\no83aOUPKI\\/dnDn+DJv8A2pMV5jX+iZH+4O\\/6wQR6BPJA\\/tb+i9+9i7v5zb3jz9o9Ankgf2t\\/\\nRe\\/exd385t7xi+T1\\/TNW\\/wDAR\\/3hJxjYN\\/dV\\/wDwe9\\/tMnGyeCCCOuYsyCNbHK\\/ftb+lD+9i\\n0f5zbIjZPGtjlfv2t\\/Sh\\/exaP85tkRosUf0s4i\\/wFV\\/93zEYFV\\/cupf3hOf7O5Hn7QQQR85I\\npaPSJ0F\\/7iXQ6\\/yWNHz+aW0YynjFjQX\\/ALiXQ6\\/yWNHz+aW0Yynj6S0X9xqT\\/gyQ\\/wBlai8J\\nT+hJX+92f9WmCCCCNnGRBBBBBBBGp7lktGOQ0i9CnEGrydP8pv7AqUncYrKnG20+WJlLclFu\\nX3RQoIU+\\/KVeyk1Z9NPZIVN16k26+G3nZNlo7YY4ms0im3DSKpQqzKM1CkVqmz1Iq0hMAql5\\n6m1KWdkqhJvJQQtTMzLPusO6qkENuHVVujV1qly9bpFSpE0kLYqMnMSqwoXyl1tSUOJ5LZcK\\nXW1DVDiErSQpIMY05LInJWYlXLZX2lt3P5qiPQXx1QsJWk2NikR5csEc7dtCctW67mtd5e0e\\nty4azQXnCQdo7SKlM05xQKTqnWVL55o832mOCj5vONracW0sWW2tTaxpotBKVC4uDZQIuDrv\\nikN2+PQd5KrGJzG\\/QH0drnnZsTVbt2zzhlXtoVLmUz2GFRnLKknZ1xRUX5yqUCjUetPzAcWq\\nYNUDrpRMF1pqLvy8v7YTeH8GmGH+gFxuf+Tt3Q9VdDjEu2pkvLVaukJcipJSstg3Ta7YmH08\\niVaOuTrt1NqrTLx1Et\\/rtnV1nC7lpg5eX9sJvD+DTDD\\/AEAuOocf1BdU2K4ZnnVFbzy6El5Z\\nvdbzEpNS7yzcnVbrK1HXW99L2id1h4v4VpbqjdRclkKVe5Upph9oqP8AGUUEq4XJsBaNNUZY\\n6F2h\\/fGm5jE7gvh9c1qWnX2bPrd5Gq3kqropHkFCm6TJzEqDRaXVp3yt5yrsrYylSyUtu7R5\\nJ1NfE6N4Pyfn+70nf4CsRP8ATVlRQWC6bJ1jFdBpc+2XZKfqLEtMtpWttS2lk5glxtSVoJt9\\nZKgRERpzDc1Pyku7ctvTDbawk5VZVKANjwNuMdq\\/e5GlR\\/hu0f8A\\/PMR\\/wCgkH3uRpUf4btH\\n\\/wDzzEf+gkTGoI65\\/Eps8\\/sTNfyrUv5z1c91rF\\/BKkfozH+XP\\/piHL97kaVH+G7R\\/wD88xH\\/\\nAKCQfe5GlR\\/hu0f\\/APPMR\\/6CRMagg\\/Eps8\\/sTNfyrUv5z1c91j8EqR+jMf5c\\/wDpiHL97kaV\\nH+G7R\\/8A88xH\\/oJB97kaVH+G7R\\/\\/AM8xH\\/oJExqCD8Smzz+xM1\\/KtS\\/nPVz3WPwSpH6Mx\\/lz\\n\\/wCmNNvJMcnJinyf\\/wCr9+qXfGH95nFr9Ss0T7hXLicFO+4E4jipfOnz\\/Q6J\\/wCF\\/dlIeRCT\\n8pzEtOeUBghkPdictV+1laS\\/\\/md\\/9YDCuNp0aseWq\\/aytJf\\/AMzv\\/rAYVxu6zRKdhzZ3iKjU\\nllTEhJ4YxL2DS3XH1J84k56adu66pbiszzzihmUbAhIsABGbMyjMjQ56VlwoNNSE\\/kC1Zlem\\n2+4q6rC\\/pLVbkLCIDsEEEcCRUEb4MN+QB0lsS8PLDxHpWMmBkhSr\\/sy1r3pcjUpm\\/wAVCUp1\\n2UORr8jKT3k1lzEuJyWlqg01Mhh99kPtuhl51sa0fbfe5GlR\\/hu0f\\/8APMR\\/6CRKZ0TP7lbR\\nn\\/yfsGv5ubbjIGO2ZXYvs+dlZZxdKmVLcYZWs\\/SlQF1LbQpRsJgAXJOgsBc2AizJfCtJcYYc\\nUmYzOMtrVZ4gZlISo2GXQXO6Icv3uRpUf4btH\\/8AzzEf+gkH3uRpUf4btH\\/\\/ADzEf+gkTGoI\\nf\\/Eps8\\/sTNfyrUv5z1c91nvwSpH6Mx\\/lz\\/6Yhy\\/e5GlR\\/hu0f\\/8APMR\\/6CQfe5GlR\\/hu0f8A\\n\\/PMR\\/wCgkTGoIPxKbPP7EzX8q1L+c9XPdY\\/BKkfozH+XP\\/piHxQfk7WlHSK9RKq9jXgE83TK\\nxTag801M4hh11qSnGZlxDYVY6U7RSWylJUtKdYg7zuiYPBBEvwxgygYPRON0GVdlkT62VzIc\\nmn5nOqXS4lopL7iyiwdWCEkBVwTqI2dOpMnS+280Dg7fs+07Rwrv2WfJa4Frdoq\\/PTlHn1cr\\nh+2MaUf78bf\\/ANQLRjXJGxvlcP2xjSj\\/AH42\\/wD6gWjGuSOE8Y\\/03Yp\\/+465\\/vOaipZ\\/+jp3\\n++5n\\/XLjPTQT5PnE3T6rOI1Ew1vOxLOmMNqZbtVqrt8LuFtifZuWbq0pKIp\\/zDRKysvMLpDy\\npjylDCNm62Wi5k5q7IvvcjSo\\/wAN2j\\/\\/AJ5iP\\/QSO0fk2f8AbA0rf3nYV\\/6bvSJZMdBbNdmG\\nDsSYNpVYq1PfmJ+aXUEvOon51hKhL1KblmrNMvIbTlZZQk5Ui9io+kSYmFDw\\/TqhTWZmYS8X\\nVreSoodKUkIdUlNk5TbQC+uu+Icv3uRpUf4btH\\/\\/ADzEf+gkH3uRpUf4btH\\/APzzEf8AoJEx\\nqCJ3+JTZ5\\/Yma\\/lWpfznq57rbf8ABKkfozH+XP8A6Yhy\\/e5GlR\\/hu0f\\/APPMR\\/6CRrm0veTL\\n0rtCqmS10YrWtRK7h7OT7VKbxJw6rD1zWdL1J9QRLSVWM5TaLcNvqnjqJpz1w2\\/SZOovOCTk\\nJqYnEPSzPoZx0zpA2DbOKWB2LuHd5ykvPWzd+Hd30SrtTaCptEvNUObDc81qtvPNTdNmUsVG\\nRmZdtc3KTkpLzUoC+y1GprewzB8xTpkUhucplQQy6qWf89fmWS8EgtpmWppT12SU2X2SmnAF\\nFQUbBMY83hGnGXdMsp9p9KFKbUpwOIKkgkJWlSdUq3EpII36gFJ8zWHVLqdRolSp9ZpE7M0y\\nrUielKpS6nJPOy87IVGQmG5uSnZSYaUHWJqUmWWpiXfbWHGnWkOoO6GsEcbJUpCgpKilSSFJ\\nUklKkqSQQpJBBBBAII1B1GtorXduj0jNC\\/HdWkzor4G44zJbXVr9sSmzNzCXZQxKpvWjOTNt\\nXuiTZQEoZk27wolabk2hls5ZDSeoaVPlI\\/8Aae0Zv4S71\\/1YpsZZcg1UpyocntacpNvqcYou\\nJ2J9NpyDwlpFyuIrC2AeGqqo1afmMs9ypg7t+UYm\\/KR\\/7T2jN\\/CXev8AqxTY7XxVUHqtsZeq\\ncwbzE9hujTUwrQ5n3nKet5WgA9J0rUO48N0WbU31zOEy+4SXHJWRU4T+cvt5YKV\\/3lAnjv8A\\nWYj0fWYe2bP4jX9ZGHtLmpSSql93fbNm06dny95DKT9z1qRoknNTpl2n3\\/I5eYnm3pksMPPB\\nhDmyadc80\\/Jx3povf3TGjr\\/DthF\\/ODb0cZ09pD8\\/JMOglt6blmVgEpJQ48hChcWIulRFwQRv\\nBBitW0hTiEncpaUnwKgDG6L73I0qP8N2j\\/8A55iP\\/QSD73I0qP8ADdo\\/\\/wCeYj\\/0EiY1BHan\\n4lNnn9iZr+Val\\/OernutZ\\/4JUj9GY\\/y5\\/wDTEOX73I0qP8N2j\\/8A55iP\\/QSD73I0qP8ADdo\\/\\n\\/wCeYj\\/0EiY1BB+JTZ5\\/Yma\\/lWpfznq57rH4JUj9GY\\/y5\\/8ATEOX73I0qP8ADdo\\/\\/wCeYj\\/0\\nEg+9yNKj\\/Ddo\\/wD+eYj\\/ANBImNQQfiU2ef2Jmv5VqX856ue6x+CVI\\/RmP8uf\\/TEOX73I0qP8\\nN2j\\/AP55iP8A0EgiY1BB+JTZ5\\/Yma\\/lWpfznq57rH4JUj9GY\\/wAuf\\/TBBBBFsRJoIIIIIIII\\nIIIIiGfKQf7e+jn\\/AASXF\\/ri\\/EcKJHvykH+3vo5\\/wSXF\\/ri\\/EcKODtrn\\/SJiX+7yP+6pCKfx\\nB+7M\\/wD3Yf6tEbG+SP8A2xjRc\\/fjcH+oF3RMT5Ui\\/pvDXk\\/NKe5ZCY8mmZrDV2y0TGakqbTi\\nZWqPhu5slpKVtzCmbqdSw4lQU08tl0jMCIdnJFMvP8o1ovIYZdfWm7LofUhptTqgzLYdXlMz\\nLxSlJIbYYZcmHl7ktstuuryQiJTvLkzE2zyceLzcs++2zN3RhNLz6GVFKJiUGJdsTSWn8vrM\\nJn5WSeAV5vlDTBPnhJNq7K5hyT2TY8m2jZyXcxA62QSLON4dklINwQdFAEkEG31SDrEhoKy3\\nhytLSSCPOspG8K8zQAf+6SD6ogjwQQRzHEGj0IeSvwUpuBWgfo+UCXlGJar3lZdOxauuYbSU\\nzE9cOJsszdQVPkqJXOUqhT1DtsqSEpTL0OWZG9srOw+On9H3U\\/UFwR2Wps\\/1IcNtjq6upqfc\\nbRMtXV3aurlq5c3VHcEfSajSbNPpNMkZdISxJ0+TlmkgAWbYl2203AAFyEgk8Sb8Yu6SbSzJ\\nyrSAAluXZSABbc2nXxJ1J3kkkkkwQQQRsoyoIIIIII4uoSEjVpCepdTk2J+l1OUmZCoSE20i\\nYlJ2SnGVsTcnNyzgU29LzLDrjL7K0KQ404pKsxnHmtaUuEzeBWkjjlg\\/LFaqfh3iletr0Z1w\\nkuv29T69Ot27MO7TftJqhqp0w6M1+e6fPcPnR6XMefVyuH7YxpR\\/vxt\\/\\/UC0Y598oaUZVh6h\\nT5SPOJetKlG12FwzNyMy88m++xckWDbd6MQrGjaTLST1hnQ+tsG2uVxvMR7Wk8DrrprfXJEr\\nH5Nvfr8za2lNhfMTCzL0ev4Z37SZU7ZTe2uOnXXb1xTKckeTsrQ3alsNua7qX5kLZLbbqJR4\\nsRToke\\/Jv3XRjjpHsJdcSyvCi133GUrUGXHmLvCWXVtnNKnWkPvobWoFTaH3QgZuril9jsw4\\nxtEoAQdH\\/pGXcH6Ta6XOKt6loQvhqgbxcGL4cWW61IkfnLcQRfeFsOp152uFAcwDwjIH5Sf\\/\\nAOJuiV++bGH\\/AEVh5EUGJX3yk\\/8A8TdEr982MP8AorDyIoMZO2v\\/AKQ6v\\/e1K\\/3bLQrE37uT\\n\\/jLf7FLR3Fo64u\\/qB474R42fc991n6leIFsX19zXzt8xfP33N1RipfNYrXzZWfmvy0sbAz3z\\nVUPJgrb+SPZFoyNvvlr\\/AIFn\\/ON\\/7B4izwRFsPY8xXhSVfk6BVfMJaYf85eb8xps1nf7NDWf\\nPOycw4n8m2hOVK0o0zZcxUThyVWqFOQtEnMdilxQUsdky5dQFgbutrI000IB4xKY++Wv+BZ\\/\\nzjf+weD75a\\/4Fn\\/ON\\/7B4izwRIPxybSP4R\\/6HoP\\/ACuM38J65+\\/v\\/wAaT\\/m8SmPvlr\\/gWf8A\\nON\\/7B4Pvlr\\/gWf8AON\\/7B4izwQfjk2kfwj\\/0PQf+VwfhPXP39\\/8AjSf83iQrpU8vL\\/ZM6PeK\\nuAw0VRZX6ptsKt37qv1cPuk+ZQqekp3yz5jGD1A+cwPI9n5OKxIAlwK2w1dVUeqCCIjiLFVe\\nxXMsTdfn\\/P5iWYMsw55rJSuRkuKdyZZKXlkK9NalZlpUrW2awAGtnZ+bqLiXpx3tnEIDaVZG\\n27IClKCbNIQk2KlG5BOtr2AAI9InQX\\/uJdDr\\/JY0fP5pbRjzdo9InQX\\/ALiXQ6\\/yWNHz+aW0\\nYunyd\\/3ZxH\\/gyU\\/2pUSjBf8ARc7\\/AHuj\\/WRqC+Udf3M+A38Ozn8312RDziYZ8o6\\/uZ8Bv4dn\\nP5vrsiHnEU24\\/wDSBO\\/4Ppn+zCNbir92pj+5y\\/8AqUR2Vgx\\/bjwl\\/hMsT\\/WelxK15ZfkszjJ\\nTK1pX6O9tKdxcokl5XivYFElCuYxRoci202q67fkJdBU\\/f1AkkFVVkWmy\\/d1Dl0+R69zU2Wk\\n7milYMf248Jf4TLE\\/wBZ6XHpzRK9jeG6ZivC+MaPVGgth+cpqmnkhPbycymXmwzNyy1A5Hmi\\no20KXEKW04FNOLQrPwzIMVKTqstMJulSpQoWLZ2nAJnK4gncpN7EblJKkqulREeWfBEl\\/loe\\nSyNnzVx6YejnbRNqVCYfq2OOHVBkipNqzzxU9O4l23TZOXCW7YnnQuYveRQT8wVF9y5WB8xT\\nlW+56NBFOYswrU8H1h+kVJFyn8pKzSEkMT0qokNzLBJOirFLjZJUy6lTaiSAoxuoSExTZlct\\nMJspOqFj6jrZJyuIPFKrajelQKFAKSQJXHIv8qd90jFt6HOkZcafuhk2WKLgXiLXJ1tHz7JS\\n7aWZDDC5ajOTGs5XZVtLclYk8vM1mWSzbD3+60tRk1iTxHloy8y\\/KTDE1KvOy01LPNzMtMy7\\njjMxLzDLgcafYdbKXWXWXQlbTra0ONrTro3iJoXI+cqQ3pOW\\/T9HTHeutjSGtWlKRa1zVKYI\\nexmtmlS7z78w65sG2lX5btPl9eusqeXN3JTmXrmZL0yxcKpPofY\\/tQE+iXwniGZPn6AGqNUH\\n1389bSLIkJl1RuZxtItLOK\\/olADKj5wlvziZ4Zr\\/AGnZ02dX6YARKPKP1wLBLDh\\/T4MqP17d\\nmfTydptF06P7iXTF\\/wAljSD\\/AJpbujzdo9InTo\\/uJdMX\\/JY0g\\/5pbujzdojflEfuzhz\\/AAZN\\n\\/wC1JjExr\\/RMj\\/cHf9YII9Ankgf2t\\/Re\\/exd385t7x5+0egTyQP7W\\/ovfvYu7+c294xfJ6\\/p\\nmrf+Aj\\/vCTjGwb+6r\\/8Ag97\\/AGmTjZPBBBHXMWZBGtjlfv2t\\/Sh\\/exaP85tkRsnjWxyv37W\\/\\npQ\\/vYtH+c2yI0WKP6WcRf4Cq\\/wDu+YjAqv7l1L+8Jz\\/Z3I8\\/aCCCPnJFLR6ROgv\\/AHEuh1\\/k\\nsaPn80toxlPGLGgv\\/cS6HX+Sxo+fzS2jGU8fSWi\\/uNSf8GSH+ytReEp\\/Qkr\\/AHuz\\/q0wQQQR\\ns4yIIIIIIIIII6R0jcWKfgTgJjFjFUZmXlWsOcObtuqUVMFGpM1al0aadoVNQlxJbdmatWxT\\n6ZJsKSrbTc20yctqdVp99qWYemHlBtmXacfecUQEoaaQXHFKJ3BKElRO4AG8IcWlptbqzZDa\\nFLWeSUJKlH1AEx5v2MMwxN4tYpTUs6iYlpnEa95iXeaKVtPMO3NU3GX21DcppxtSFIVx1D07\\nx19A666+64++644444p5155RcdeddUpTjjjilKUt1a1ay3FZrUo5nfBHzTmXRMTD74TlDz7r\\noTe+XtFleXxGaxtpyAiiybknmSfbEvf5OFLTaNHzSEnnJtS5CZxkpEtLSO8plpyTsqlvTs0E\\nq+jznGZ6QaJR5\\/6wG1yGyjU7y8v7YTeH8GmGH+gFxvn5A3D+bsvQFkbhmmlNfqq4vYh37JF1\\nBQtyRkUUDDZsgqVmphUzh\\/OLbGQQSsqSDrF1ehjl5f2wm8P4NMMP9ALjpDF8s5K7CsKNOAhS\\nnqTMAG\\/1Jxufm2t\\/\\/ZvI04bgALCJrUmy3hKlpIIJfaXrydRNOg25ELBHMEWtGmqM3eT80zDo\\nK49PY3HDj9VPa2JcVlfcz92H3Eanz\\/PUWb+c\\/no2teGsJUUctGT+agXw\\/tDNM7Itu4RQRzrT\\najO0iflanTnvN56SeTMSr\\/ZtO9k8jVK+zfbdZXb9FxtaTxSYhzLzku82+yrI60tLja7JVlWk\\n3ScqwpJseCgQeIiUx98tf8Cz\\/nG\\/9g8H3y1\\/wLP+cb\\/2DxFngiwfxybSP4R\\/6HoP\\/K43P4T1\\nz9\\/f\\/jSf83iUx98tf8Cz\\/nG\\/9g8H3y1\\/wLP+cb\\/2DxFngg\\/HJtI\\/hH\\/oeg\\/8rg\\/Ceufv7\\/8A\\nGk\\/5vEqai\\/KRjWK1SaSNDIS\\/zrVJGm+Uf2RG22AnptmW2oZ\\/ULYDpZ2mvqbRBWAUbVG4iUVH\\nl6WT\\/wCOVqfvnoP+k5OPULi\\/djGLsRYsla+5iCo\\/SC5J+nIlVeaSMp2SZhqaU6LSUtLBeYto\\n1cCynL6JSCQZbhapz1S8+89f7bsfNez\\/ACTLeXtPOM\\/7U23mzdmj617W0tc3I1Y8tV+1laS\\/\\n\\/md\\/9YDCuNp0aseWq\\/aytJf\\/AMzv\\/rAYVxY2Nf6T8Wf\\/AGxX\\/wDdczG+qv7l1L+8Jz\\/Z3IgO\\nwQQR87opaJKeE\\/yh84XYWYaYaf2IBrn6neH9m2L89\\/2QHzZ88fclbtNoBqnzcME5\\/wAgFQ+b\\nxO+Q+XzoldrsPLJjZKed7F++Wv8AgWf843\\/sHiLPBFmI2w7Rm0IbRiLKhtKUIH0RQjZKQEpF\\nzTCTYAC5JJ4kmN4jElabQlCJ2yUJShI83lDZKQAkXLBJsABckk8TEpj75a\\/4Fn\\/ON\\/7B4Pvl\\nr\\/gWf843\\/sHiLPBCvxybSP4R\\/wCh6D\\/yuFfhPXP39\\/8AjSf83iUx98tf8Cz\\/AJxv\\/YPG4Lk4\\n9Pj\\/ALoFhlfmI36lBwl+4q+02V8zC+vu9+cyq36XXfnP5wFn2YZID50Mp5H5DNjKXL5mvpdk\\n358sTDPk4v8Acz48\\/wAOzf8AN9acWNsr2jYyxJjCVpdarPnsg5Jzzq2Po+lS2ZxlgrbV2spI\\nsPDKrWwcCTuUCNI3WH63VJ6ptS81Ndqypt5SkdhLouUNqUn0m2ULFlAHRQvaxuCYkSQQQR1J\\nFgR59XK4ftjGlH+\\/G3\\/9QLRjXJGxvlcP2xjSj\\/fjb\\/8AqBaMa5I+dWMf6bsU\\/wD3HXP95zUU\\nlP8A9HTv99zP+uXG+zkJtJzATRqvLSMqGOuJ1t4aSV12zh1J26\\/cSp1LdWmqVVbrmKgzKCTl\\nJtWco1PSjjxWGgA+3v3kRJC\\/7qnyen5VWGv8evf\\/AASPPRgieYU2x1rCdCk6DJ0qlzMvJKmV\\nIemTN9sszM09NLzBp9CPRW8pKcqR6IF7m5jb0\\/Es7TpVuUZZlVttlZCnUulZ7RZWQSh5CdCo\\n29Hda97a+hd\\/3VPk9PyqsNf49e\\/+CQf91T5PT8qrDX+PXv8A4JHnowRIv\\/eGxH\\/YOie2f\\/nM\\nZn4Z1L97SP8AiP8A848ehr6Ez3Kqcnqy246vSpw4Uhppx1SWhcMw6pLY1lIaYYoTjrzikjJD\\nbTa3XCdVptShkdUXKMct9gpV8IL6wT0SajWb9urEKg1Kzq3ik9QqrbdqWrb1blXaZcS7fl7l\\nkKZcVbuOZpz89S6fNoo1NpNMVMpr0hWKi\\/KSks9E2gjVVnbtiuqU+YkJeTpdL86aWy7NyiJp\\nc0hpxOVYYU9MrbZWpBKe17JbiAczSm3AlYYmcWVOZYcYCJZgOoKFrZQ4HMqhZQSXHXAm4JFw\\nnODYpUCLwQQRsv5MHQAunTexxpYrFLqElgFh\\/VZCrYu3bsnmpSoS0u43Oy2HlEnAWg\\/ct2BK\\nJV\\/yZ4u27QHp64H0qfbpchVano1Hnq\\/U5OkU1lT85PPJZaQASlOY+m86oA9mwyjM6+6r0W2k\\nLWdBEelpd6bfbl2EFbrqwhCRzJ3qP5qUi6lKOiUgk6CJanJF4ST+DfJ+aP1ErUkJKvXdRKvi\\nfVWlMpYd1MRa\\/Ubot1Uw1qIdEwzZ89bUq+JguTCHmFNHZNNtyzGt35SP\\/ae0Zv4S71\\/1YpsS\\nPpKSlKdKSkhISjEjIyDDEnIyUmw1LSclKSzSWJeWlpZhKGJeWlmUNsy8u0222022G2wEgARw\\nflI\\/9p7Rm\\/hLvX\\/Vimx2lj2nNUjZVVKUwSWabRqZItk71IlX5BhKjqTdQRmUSSSonUxZ1bl0\\nyuGnpZJuGGJNoG1irs35dOcjmsgqPeTER6Pt8Lb1\\/U1xNw6xFFN+exYN92jepo5nfm351+5a\\n4KfXBTPnDySf8g8u8g8k8s8gnPJtrt\\/JHw0GXPiII4dZdcYdafaVldZcQ62qyVZXG1BaFWUF\\nJNlJBspJBtYggkRVgJSQoGxSQQeRBuDrpv5xKY++Wv8AgWf843\\/sHg++Wv8AgWf843\\/sHiLP\\nBFlfjk2kfwj\\/AND0H\\/lcb38J65+\\/v\\/xpP+bxKY++Wv8AgWf843\\/sHg++Wv8AgWf843\\/sHiLP\\nBB+OTaR\\/CP8A0PQf+VwfhPXP39\\/+NJ\\/zeJTH3y1\\/wLP+cb\\/2DxIA0Q9IU6VujhhdpBfcf9wY\\nxJptZqP3JfP5ug0QUq563bYZ+f1UW3fnDygUbywufM1P2XlJl9m7si875s8egTyQP7W\\/ovfv\\nYu7+c294t\\/Y3jvFeK65VJOv1Xz+WlqSZllvzGmyuR\\/zyWaz55KTl1q\\/JuLTlWpSNb5bgESHD\\nNZqVQqDrE5Mds0mTcdCOxYbs4l+WQFZmmkKNkuLFs1tbkXAI2TwQQR0XE5gggggggggggggg\\ngjqPGzGvDTR5w0ufFzFy55G07ItORcnZ+oTrjflM5MhtSpOjUaTUpL9Xr9XfQmSo1GkkLnKj\\nOOMy8u1mVKQ0++zLMuzEw62www2t1551aW2mmmwVOOOOKIShCEgqUpRAABN9IStaG0KccUlC\\nEJKlrUQlKUpFypROgAGpJ3REU+UN3zKXBpk2HaEm+t42BgXbctVWi+S3KVy5bpu+vuMJlwpT\\nbTi6E9bsyt8Bt2YbmWm3EFqWZcc0LRkBpWaQNwaUukNirj1cbC5KbxDul+oU2lKeS\\/8AMNsS\\nDEvRbQt8OpAbfXQrXplJpTsyhDYnH5V6dLTRmCgY\\/wAfPTGlZbxBiqu1dglUvOVB4yy1Cyly\\njITLyqiLDKVS7LaiCLgqsbkXNLVKZTOT83Mo+o8+4tFxY9nmIbJHAlASSOBuI2vciJR5qpcp\\nPgTOy6fobdpOLtZnjsyoJlX8Hb6t9KlEEBpPltdlAHFnV\\/vQ+ldQDLF5Vmw5zEfk89Ki3ZFC\\n3H5HD2WvkttDNzyfC+6LfxMnTlroBSmUtGZU4cyQ2CA26Ds1R\\/Pk5+FL9f0i8asYJiTLtKw5\\nwqlLPlZlaihuWuTEi45SblHWBmjbPooFjXFLOghxqXaqILrW2dlXRLyuK36Tddv12167Jtz9\\nCuSj1Kg1mQdJDc\\/SKxJP0+oyTobKVBuZk33mHNUpOos8SI6c2P0TznZhPybwyIxG\\/XBmUCoF\\nqYlW6OV5T+aPNFCw0Va\\/50TvDUoXaBNMqOUTy5xKTyS4yiWJvxsptW69iCN4jy7YI7s0lcD7\\nh0bMesVcDbmTMGpYcXjVqBLzswytk1qipeE1bNxMoW0yTK3JbsxTK7JqLaNaWqDStVOYMdJx\\nyHNyr8jNTMnNNqamZR92WmGlCym3mHFNOtqB4oWlST3iK5WhTa1IWkpWhSkLSd6VJJSpJ7wQ\\nQY9C7kvsYadjboH6N9yykyw9Urbw8o+F1xMtulyYlLgwtZRY8184I11qZnKrJ0WQuLUWEBcr\\nWJWaabRLvMpGwKIP3I1cotS9ELEmr4Q4v1VUjgDi7U5Oberb5dMnhniClpmmyl2vobCtS3a\\/\\nIMylDvBeopUmiRoFcDzElRamifm10uqU2tU2nVqi1GRq1Iq0jKVOlVWmTcvP0yqUyfl2pqRq\\nNOnpV12VnJCclXWZmVmpZ5yXmZdxl1p5TagY7v2aYslMVYXp7iHkGo0+Wl5GqyxUO2amWGg0\\nHygkq7GcS327LmqSVONZi4y4lNt0CotT9PYAWDMS7aGH2zYKCkJCQ5a49BxICwoDLmzIGqSB\\ny0EEEWDG7gggggghjOTktIS01Ozs0xKSkow9Mzc3MvNsSsnKsNrefmJh95aGWWGWULdeedWh\\ntttBUogDd5rWlhixL466TWPGL8hmKViDirety0FKgErbtubr04LZae3DWfZoCKa1MOaqNq8h\\n14tNawbiU3y03KVWxhRhvdWiZg3cMnWMYcRaVNW7idVaLOpfbwusepILFZoszNSqlNs3td0i\\np+jGklZnKFb03P1GdakZyct5x+HPHJ23nFknUZyn4ZkHkTApLrs3U1tqCm0Ty20ssyoUn0S7\\nLMl8zASVBCn0tEpdbcQiuMXVFqYfZkmVhYlStTykkFPbLskN3F7qaSFZ7GwUvKfSQQCJUnyb\\nawX2qTpTYovsPCWnqjhnYNGmdmnYKfpUrdVxXIztMitTjbdZtJ3UQUIbQ79Kh4vNeTxW49An\\nkntG+c0ZdCLCi1K9T102975ancWb9lHUbOYlrhvsS81TqfOS6m0OS1RollydqUCqy7hdW1Uq\\nTNJ1tmUNtx\\/YVR3KhjVNSyEy9DkZqZccscgmJxpcjLNEg2zrQ9MOoBuLS6yNUgxiYTllPVZD\\nwHoSjbjqiRcZlpLKE+JLhWn+0J4WOrT5Sf8A+JuiV++bGH\\/RWHkRQYlffKT\\/APxN0Sv3zYw\\/\\n6Kw8iKDGv21\\/9IdX\\/valf7tloxsTfu5P+Mt\\/sUtHamBOE1Sx4xnwvwYo1WkaDVcUb4t2x6bW\\nakzMP0+mTdxVJimy87OsywMw5LMOTAcebl0l1SAdUKOQO+n72+x3\\/KMwk\\/5O3j\\/0EajuTs\\/u\\n7tEb\\/KAwx\\/1op8ejJEw2PYBwti2h1Odrsg5NzEtVTKsrROzksEsiTlncpRLPNJUe0cWrMoFW\\ntr2EbLDVHkamzNLm0LUpp1CEZHFIACkEm4Tv1iIZ97fY7\\/lGYSf8nbx\\/6CD72+x3\\/KMwk\\/5O\\n3j\\/0ES84Itz8Suzv+wz\\/APK1V\\/nkSX8FKN\\/Wnv8ALufOIhn3t9jv+UZhJ\\/ydvH\\/oIPvb7Hf8\\nozCT\\/k7eP\\/QRLzgg\\/Ers7\\/sM\\/wDytVf55B+ClG\\/rT3+Xc+cQmtJHkLsX9G3A3EnHS4MccN7i\\no+GtvLuCeoVHoVzy1SqbSZyUkxLyb08hEs06XJtK9o6oJCUKO\\/n0aR6F3Kp\\/temlV\\/Bqv\\/T9\\nEjz0Y562xYUoeEqzSpOhSq5SXmaWZl5C5mZmSt7zt9rMFTLrqkjIhIypITe5tcxDMSU6Vps4\\nyzKpUltcsl1QUsrOcuuovc6gZUJ053PGCPSJ0F\\/7iXQ6\\/wAljR8\\/mltGPN2j0idBf+4l0Ov8\\nljR8\\/mltGJX5O\\/7s4j\\/wZKf7UqNngv8Aoud\\/vdH+sjUF8o6\\/uZ8Bv4dnP5vrsiHnEwz5R1\\/c\\nz4Dfw7OfzfXZEPOIptx\\/6QJ3\\/B9M\\/wBmEa3FX7tTH9zl\\/wDUojsrBj+3HhL\\/AAmWJ\\/rPS49O\\naPMZwY\\/tx4S\\/wmWJ\\/rPS49OaLL8nX9zsUf37Tf8AUTUbzBP1Kl\\/bSnwmI46dkpSoyk3IT8ox\\nPSM+w\\/Jz0lOMNTMnOyky0piYlpmWfStiYlpllbjMxLutuNutuFtwFJIMKjle+S9nNFS657Hz\\nBSivzOjletZJqtGk2VPrwcumrTLrgo0w2xLJblbAqs06GLPqLqimlTK27WqTzcyqgzVcm0R8\\nleVm2viHa1xWPfFBpt02hdVJnaFcVv1qXbnaXWKTUGly85JTkq4gpcbcbX5qhk40tKX2VNvI\\naWLaxxgqn42o7lPmghmdZC3aZUMmZySmSlI1sQpcs9lCJlm9loCVAh1ppaZJV6SzVpYtLsh5\\nu6pd62rayNQriW12AcT3BSbKSkjy\\/I5i2rkuCzbiod22nWalbtzW1U5Kt2\\/XaPOPyNUo9Xpk\\nw3N0+o0+clloel5qUmWmnmXmlgocQCN8bK+U85OO6dBbFAVK3kVK4dHnECoza8MrvmAqamqJ\\nNIaTOTWH14vttJal7hpLSnVUefcDbF2UOXNVkkpqMjcVLouryOE6vSaphqrTFMqDa5Oo094A\\nlClCyklLjMxLupylTbicjrDyCCUlKhlOgqSYl35N9yXfQpp5lVlJPAjVKknilQspChopJCgb\\nERMYwV5Syg6cHJyaYln35N0yiaSdgaI+Par2oTKJemyd9UhGFV3yzOIFoyAeOsw5lLN3dS5J\\ntLNv1yYaW1LylGrFGREOeOUodw122ZyYqFAq9Ros9M0ev29MzdLm3pKYmKHdVDqFsXLSXnpd\\naFu06vW9VqnQ6pJr+gnaXPzklMpcYfcbPFxu8V4yn8Xy9CNUTnqFIk35F6cBFp5CnUOMzDiR\\noiYy3RMWGVxaQ6MpcKEZc\\/U3qi3KCY9J2VbW0XbkqdSVJKVrv+fYEKVc5iMxsSYI9Ankgf2t\\n\\/Re\\/exd385t7x5+0egTyQP7W\\/ovfvYu7+c294s3yev6Zq3\\/gI\\/7wk43WDf3Vf\\/we9\\/tMnGye\\nCCCOuYsyCNbHK\\/ftb+lD+9i0f5zbIjZPGtjlfv2t\\/Sh\\/exaP85tkRosUf0s4i\\/wFV\\/8Ad8xG\\nBVf3LqX94Tn+zuR5+0EEEfOSKWj0idBf+4l0Ov8AJY0fP5pbRjKeMWNBf+4l0Ov8ljR8\\/mlt\\nGMp4+ktF\\/cak\\/wCDJD\\/ZWovCU\\/oSV\\/vdn\\/VpggggjZxkQQQRxVRqdOo0lO1Wrz8lS6XTJV+d\\nqFTqM0xJU+QkpVtT0zNzk7NONS8rKy7CFuTEy+6hlptsOOqSAFR4SBqSAACSToABvJO7220u\\neEBIAJJsBqSdwHMxysRgPlAWmzTZW3aPoT2BW25qs1Weot6Y5mSf1\\/mqjSBl6zYtiT5QpTJm\\n6vUTIXxUZNwIm5OUpNpzIOwrKge6eUH5cXC\\/Caj3BhZokVemYp4tTDM7SZrFGSDNRwzw8fJf\\nlXp2izziHZPEW4pTVD9LFNRN2Sy45Lzk3V62JWbt6Yh+XJclwXhcFauq66zU7kua5KnPVmvV\\n6szz9Rq1Yq1Rfcmp6o1GemluzE3OTcw64++++4tbjiySd2\\/nLa9tQp6adNYUw9NNzk3OpVLV\\nadllhyXlJU6PyTLyCW3pmZF2JgtqcbYZLzSj26rNQbElfZUy5TpFwOqdGWZfQoFtDd\\/SZbUN\\nFqXucKSUpRdHpKUez4iOWty363d1xUG07bp01WLiuetUu3qBSZFpT87VK1Wp1imUunybKPOe\\nmZ6emmJaXaSM1uvJA4gniYkEcg3oRTmK+Mb2lfflIcGG+Cc+uVw+TOy58muvFl2WzanpTaJU\\nH5LDqnzTdYeeyRs7on7YclX31U2qMM88YTw7N4qr9OokqlX7KfSZl5IuJWSbIXNzSiQUgNMh\\nRQFWDjpbZF1OJBhchJuT82xKtA5nVgKUBcNtjVxw9yEXV3kBIuSAZWOjVg1T9HvADB\\/BSmlp\\nbOGtgW5bE3Nsk6lSrMlTmjcVYBUlBzrdfdqdXcybQnaTrmqyykhkQ2+Xl\\/bCbw\\/g0ww\\/0AuJ\\nzcQZOXl\\/bCbw\\/g0ww\\/0AuOptuLDUrs+lpZhAbYl6rSmGWxuQ0zLTTbaByCUJSkeET\\/FraGqN\\nLtIAShqal20AcEIYfSkeoACNNUZfaEOh5dOnDjS9gtaN30GyaqzZdcvM1m5JSoTtOMrQpyjy\\nj8mGaWFTPlD5rDS23NVTSEsuZlI3xiDG8H5Pz\\/d6Tv8AAViJ\\/pqyo5ewVTZOsYroNLqDRekp\\n6osS8y0lxxkraWSFAONKQ4g8ihSVDnECprDczPycu6CW3phttYBKSUqUAQCNQbcRHfn3t9jv\\n+UZhJ\\/ydvH\\/oIPvb7Hf8ozCT\\/k7eP\\/QRLzgjrv8AErs7\\/sM\\/\\/K1V\\/nkWP+ClG\\/rT3+Xc+cRD\\nPvb7Hf8AKMwk\\/wCTt4\\/9BB97fY7\\/AJRmEn\\/J28f+giXnBB+JXZ3\\/AGGf\\/laq\\/wA8g\\/BSjf1p\\n7\\/LufOIjtC+ToY50it0Wqu6RGE7jVMq1OqLjTdu3elx1EnNszKm2\\/odXXcDeqnWIGZ3nMRLi\\nggiW4Zwbh\\/CCJxugyjkoieWy5Mhc1MzWdTAcS0QZl10oyh1YISQFX9K5AjZU+lSdM7bzRC0d\\nv2faZ3FLv2WfJbMTa3aKvbffuEEaseWq\\/aytJf8A8zv\\/AKwGFcbTo1Y8tV+1laS\\/\\/md\\/9YDC\\nuPca\\/wBJ+LP\\/ALYr\\/wDuuZhdV\\/cupf3hOf7O5EB2CCCPndFLRIBwy+T8Y14nYcYf4kU\\/H7C6\\nmU\\/EKyLTviRps7b92PTchKXXQqfX5aRm3GGlMOzMoxUES77jBLSnWyWyUEGPvPvb7Hf8ozCT\\n\\/k7eP\\/QRJy0TP7lbRn\\/yfsGv5ubbjIGO25XYzs9dlpd1dHfUtxhlxR+laoLqW2lR0E2ANSd0\\nWdL4XpDjDDimnsy2Wlqs+4AVKQkk2vpck6boiGfe32O\\/5RmEn\\/J28f8AoIPvb7Hf8ozCT\\/k7\\neP8A0ES84IyPxK7O\\/wCwz\\/8AK1V\\/nkPfgpRv609\\/l3PnEQz72+x3\\/KMwk\\/5O3j\\/0EbtuS70E\\nrv0CsKcQ8PLyvm278n7yxDTeUrULYkarISsnKC26PQ\\/IplFVbQ6uYU9TXXittOz2TjXn6xIG\\nz2CNzQNmuD8M1JurUamuy08006yh1c\\/PTCQh9ORwdnMTDjZJToCU3G8WMZUlQKbITCJmXbcS\\n6gKCSp1axZaSlV0k2NwSO6CCCCJ5G6jz6uVw\\/bGNKP8Afjb\\/APqBaMa5I2N8rh+2MaUf78bf\\n\\/wBQLRjXJHzqxj\\/Tdin\\/AO465\\/vOaikp\\/wDo6d\\/vuZ\\/1y47Kw2wVxkxmmKrJ4P4SYm4rTVBZ\\nlJiuS2GthXVfMzRpefXMMyD9VYtelVR2mszrstMtyjs4GETC2H0tFwtOgdtf2DOmz+R7pUf\\/\\nAEPeLX9D43h\\/Js\\/7YGlb+87Cv\\/Td6RLJi38C7G6Zi3C9Or0zWZ6TenVTqVS7DEuttHms9MSi\\nSlbhzHOlhKyDuUpQGloktIwyxUpFqbXMvNKWp1JQhCCkdm4pAIJ11Aue8x5uf9gzps\\/ke6VH\\n\\/wBD3i1\\/Q+Ogr1sW98NbkqFm4i2ddVgXdSfJTVLVvW36ta1yUwTsoxPyJn6FXJOQqkn5ZIzU\\ntOSvlMs15RJzDEwzrsvNLPqExpM5Yjk5GdLXC9eMuFdES5pD4T0OYVJS0i1qzmJtiyPlFRnb\\nIdSnfNV6lrdnKtZTnnuvzkxP0HJxFZlX5DPxNsEFNo03PUGqTlSn5RHnAkH5dpBmmWwS8iXL\\nN1GZCPTZRYh0pLQstaSHqhhEy8q4\\/JvuzDrQCyypCQVtj6+TLqVj6wSfrAFIuopvCCiraC44\\n23tGmwtxDanHiQ03rEDaOlIUUtpz11gJUdT1RR1p1h1xh9pxtxtxTLrLyS26y60pSXG3G1JS\\npDqFp1VtqyWlQyO+COb\\/AKqtRqk6pNxuO48RxB3ERCYkr6IPyfitXg1bGImk5i5brVjVeSpt\\nw0qysFKq3ck7dFHn22p6nuzuIr8mm3qbTKhKrYmEO2rJXV850qcbcp9epEwUusyiMJMHcNMB\\n7BoWGGEdn0exbGtyXDNMoVGl1oa2nmJmJ+oTbq3p+r1afWgPVGs1aZnKpUZjOYnJ2YdO0iMj\\nyGXKOqolRpOhLjVXs6PVZpTWj3dFUmEg0qszb7r81hROzb58+Srky8ucsTbOJXK1hc7arDk0\\nmr23T6fK\\/juLZRJYLVh9irYWp6JaZfQJeqLfdM1UmZtsIW9KPzKwFBrMUOtJZQyw80pp7sUr\\nUUptXDbNLMmiZkWsryh2cypxXaTCHEhJU2VkABB9FSA2lCFJyqKAq4BEbD5SP\\/ae0Zv4S71\\/\\n1YpsST4jYfKR\\/wC09ozfwl3r\\/qxTY2m1X\\/o\\/xL\\/ekv8A7fKQ9iX9xJ7wl\\/8AamIiPR9fhzZk\\n3iPiJYmHkjOsU6dvy9LXsySqE2h12UkJq6K3I0SWnZllnN9xiUen0Pvts\\/SKbbyaGvuj5CO9\\nNF7+6Y0df4dsIv5wbejhSntIfn5JhwZm35uWZcTcjMhx9tKhcEEXSSLggi+mtiKnbAU4hKhc\\nKWkEXtoVAHXwvG8n72+x3\\/KMwk\\/5O3j\\/ANBB97fY7\\/lGYSf8nbx\\/6CJecEdr\\/iV2d\\/2Gf\\/la\\nq\\/zyLR\\/BSjf1p7\\/LufOIhn3t9jv+UZhJ\\/wAnbx\\/6CD72+x3\\/ACjMJP8Ak7eP\\/QRLzgg\\/Ers7\\n\\/sM\\/\\/K1V\\/nkH4KUb+tPf5dz5xEM+9vsd\\/wAozCT\\/AJO3j\\/0ESRdCjR\\/rei1ouYSYB3HX6ZdF\\nZw5pVbp0\\/X6LLTUrS59VUu2vXC25KS88lM42hqXq7cu5tkozdZcUMkEZ5XQRIsN4AwvhKbfn\\naFIOSkxMy5lXlrnZyZC2S629lCZl91KTnbScyQFWuL2MZshRKfTXlPyrbiXFtKZJW6pYyKWh\\nZACjYEqbSb79O8wQQQRM428QKsGOWq5QDB1mQp81inTcXaHIABukYx27K3XMvo1s1icvCnPW\\n\\/iBP7TcNeoXbMqaG5kpBOexyw\\/lJNyMMNy+J+ixRKrMZN7Wq2HiZULfl0aqcnS3b9w2nci3Q\\n45mtsquZoNIzaIfJLpjEQRwJTNp+O6SlCJXEc862i1m5\\/saknKNyAqfamHUotpZDibJCQkjK\\nm1OMVyrSwCWp9\\/KBYJdKX0gWAslL6XAAABYAADhaJfdO+UeaO7sulVV0fsaJKbClZsU+pWLU\\n5fUGezWJp+s0l5SlAnWb8jAb4h5znYVr5SBgWwnO3tHHFmprEu6cqzcln0FCplIOwZK5Fy5F\\nBh05FyY2anGPwJV8kERE4I35237QMthUJEH9IUyTvuHAtlI3H822u6Mw4prRFvOUA23iXYv4\\n6tkX9Vu6JJOJ\\/wAo9xdqzE1K4PaOdg2Q4428yxVb\\/u6u4hzKFKzQ1Os02iU\\/DuUln20HaNy0\\nzM1WWQ\\/q7YTbGsy5pH0j9L3SM0s7hauDHnFCv3t5E847RbeWuXpNnW4XUbBaqBaFIZkbfpj6\\n2cmJiosSAqtQQhBqM9OOZuRjdBERruPMXYkbLNYrc3NSxIJlEBqUlFFJzJzy0m2wy6Un6qnU\\nLUN+a+sa2bqlQnhlmpt11F79ncIaJFrEtNhDZIsCCU6G5FiTci0AlSQlGalEAADM5ncEpyBJ\\nOe7Ic3VvCkvLPzcwxKyrLszNTLzctLS0u249MTEw84G2mGGmwp15150pQ002hbji1aiN5iUn\\nySvI71+k163dJ\\/S6tR6jTNCmpWt4T4KXBK7OqCqy5RNSF7Yj0p9JdpnzW8WZm3bNnWm6maoy\\n3Urkl5FmSl6VVGsJYQq+Mao1TqYyrswpKp2fWhRlZCXKgFPPrFgV2v2LCVdq+v0UAJC1o8p1\\nOmalMJYl0E6jtXSD2bKCdXHDuAAvlF7rUMqAVaRtW5JDRKqOiTog2rRrtpSqVijijUHcUcR5\\nOZYDVRo09W5OTlbdtWdKyp5l627ZkqazP09RQ3IXFOXAhtsKddde2iwQR39SKXKUSlyFIkUF\\nEpTpVmVZBtmUlpASXHCAAp11WZ11dhncWpR1MXFKyzcnLMyrQs2w2ltN96rD0lq\\/jLVdaraZ\\nlGwA0iOxy6fJ+VLGOzZPS0wjoL1SxGwzoxpeKdvUqTXM1G78NZEuTMrc0qzLgvTlaw\\/Lk0qo\\ns+TuzE9aM3MPmZbRaclJz0PaPUtWhDqFIWlK0rSpJCk6ySlW4gg8UnnHBQ6REW3lMuRDnqrV\\nLjx50KqJLOO1B2arV66P0r5PJJTNOkvT1WwjBSxKNtPqK5uYw\\/mXWgw8JlNnTLjTlMtKV5\\/2\\nv7LZqpTL2KsNy6piacSFVimMJBffU2kJE9JtJALrxQAmZYRdx0pDzYW6p0KhuJcPuOuLqMi2\\nVqULzUugXWVCw7dpI1WVD9tQkZs35RIVmWUxZI2GaIHKg6WGhkzKW7YN3S14YYMvrcXhPiMx\\nOXBaMqH3lOTRtp5mcka7aDry3ZmaDVvVeTo8xUX3J+p0iqOKdS5gHWqLWrbq1QoNw0mqUCuU\\niadkarRq1ITdKqtNnWFFL0nP02eZYnJKZZUCl2WmGWnm+C0xx8c102q1agzonKZOTdMnWVFB\\ncYcWy4MqhnZdTuWjMkBxl5CkKtZaDuiDsPvyrodl3XGHU3AW2ooVbik2Iuk29JJuDuIMS6cK\\n\\/lHGCVVl5VnGfADEux6iEMtvzmHVXtrESkLmAEoem1t19\\/DupSEotWbwlWU1qYlm1eTh6cU1\\n5Q7ksxy+egE6yy4ufxflVuNNOLlnsNlF2XUpKVKYdMvXJhgvNE7N0sTLzKlpOyccaJdEICCL\\nRlNuuO5ZoNuuUmeUAB201TsrqrAC6hJPyjVza6rNDebWFrb5vFdYQmynWXSPzlsICvX2YQD7\\nPG8TML8+URaIdCln02HhtjhftVS6RLpm6NadnUJ1CdokLcqs5ddVrDKlkNqbQm1ns2nFl4tO\\nt7B3UVpScu\\/pX45U+oWrhNIUfRus2fbfl5h60KhMXFiXNyj6Q25Ku4h1CTpiKWgZJWxNWjbN\\nr1lpZeQusvsu7KNIkEais7XsdVplcuuqpp0u4CHGqUwmSUsKFinzoFydSm1wUomUhQUoKzCw\\nGPNYiq80ktrmi0hQspLCEMkjUG60DtbEGxGfKRvB1hWbm5uozc1PT01Mz09PTL03Ozs2+5MT\\nc3NzDinpiamph5TjsxMTDri3XnnVqedeUpxxWtxSgjb7yfPJC42aYNRoN+4gydXwi0dnXGp6\\nYvOpSYlLqvynpKFqk8NaJUGFqmmZ1Ci0m8qnJi2ZRBfekfuinZNykuQyiUKsYmqDdNo8m9Oz\\nbpzKyA9m0gqSFzE0+qzbDKSbreeUkXISCpakpOrlZWYnHksSzSnXVnRKRoBcAqWo+ihAv6S1\\nEJHEw+5HbQBqOlnjlIYpX3RHzo94M1uUqtxTM4wtNPvy+Kf5NU6Bh3JuuJLU2w267IV29G0b\\nZLFupl6XMplXrpps0idLHVuEWEWHWAuHVr4U4UWvT7QsW0Ke3TqLRqe2SkJJL0zPz8w8VTdT\\nrFTm1uz9Wq0+8\\/P1Kffem5t5191ax2lHcuAMFSuCKGinoWiYn5lSZmqTiUkB+ayBIbazDOJa\\nWTdthKrE3ceUhDj7iYtii0lFJlOyuFvukLmXRuUsCwQi4B7NsEhF7EkqWQkrKRGN+Un\\/APib\\nolfvmxh\\/0Vh5EUGJX3yk\\/wD8TdEr982MP+isPIigxyvtr\\/6Q6v8A3tSv92y0V5ib93J\\/xlv9\\nilozM5Oz+7u0Rv8AKAwx\\/wBaKfHoyR5zfJ2f3d2iN\\/lAYY\\/60U+PRki4vJ6\\/pZrf+HT\\/ALvk\\n4k2Cv6Gnv7u1\\/qzBBBBF\\/wATWCCCCCCNfvKp\\/temlV\\/Bqv8A0\\/RI89GPQu5VP9r00qv4NV\\/6\\nfokeejHJHlDf0x0L\\/Aiv9vmYrbGf7oy395I\\/178EekToL\\/3Euh1\\/ksaPn80tox5u0ekToL\\/3\\nEuh1\\/ksaPn80toxkeTv+7OI\\/8GSn+1Kh3Bf9Fzv97o\\/1kagvlHX9zPgN\\/Ds5\\/N9dkQ84mGfK\\nOv7mfAb+HZz+b67Ih5xFNuP\\/AEgTv+D6Z\\/swjW4q\\/dqY\\/ucv\\/qUR2Vgx\\/bjwl\\/hMsT\\/Welx6\\nc0eYzgx\\/bjwl\\/hMsT\\/Welx6c0WX5Ov7nYo\\/v2m\\/6iajeYJ+pUv7aU+ExBBBBHR8TqOn8ccEs\\nOdIvC+7sHsWLfZuSyLypy5CpSSwGpySfQrbU+t0WdKFrptdos8hmp0ipNJU7JT0u05quIC2X\\nIAmnfoQYkaDGNE9h1d6Xa1ZtaM7V8LMRGpYy9Pve1W5lTKVuIQtxmnXPSNdqTuigLdLtOnXG\\nZyWVN0WpUepz\\/otxirpfaJeGGmdgvX8HcTpQttzJVVbRuyUYQ\\/WrDvKWlplmkXRRCtyXDrko\\nZl6WqNNcmGZWt0l+dpU2623N+UM1htK2eSuNab2sulpivyLZNPmyMiX0A5jT5pQveXdVcsrV\\nmMq+rtEjs1vocj9eojdVY7RsJROspPYr0AdSNewcO7KTcoUf2tZJuEqWD5vMEd\\/6UGjNifol\\nYyXRgtitSvI69QnhM0qqywK6Ld1sTbrwot2W\\/NaxD9Jq7DSlpbUryymzjU5SKkzLVOQnZRno\\nCOH5yTmafNTElOsOS03KvOMTEu6kpcZeaVlWhQ5gg6glJFlJJBEVU42tpa23EqQ42pSFoUCF\\nJUkkKSoHUEEEEQR6BPJA\\/tb+i9+9i7v5zb3jz9o9Ankgf2t\\/Re\\/exd385t7xe3k9f0zVv\\/AR\\n\\/wB4ScSnBv7qv\\/4Pe\\/2mTjZPBBBHXMWZBGtjlfv2t\\/Sh\\/exaP85tkRsnjWxyv37W\\/pQ\\/vYtH\\n+c2yI0WKP6WcRf4Cq\\/8Au+YjAqv7l1L+8Jz\\/AGdyPP2gggj5yRS0b8cHOX3xnwbwiwqwhpWA\\nmF9ZpmFWG9j4b06rVCvXYzP1WQse16Xa8nUp5iWdEu1NzzFLbmppqXSGUvOqS0EtBIHZn3yD\\njv8Ak54Sf8orx\\/6eI4UEWEztW2gS7LUuziJ5tlhtDLSBJUw5G2kJbbTdUkVEJQkAEkqNtSTG\\n3TXquhKUJnnUpSkJSAG7BKQAAPQ4AARI9++Qcd\\/yc8JP+UV4\\/wDTwgv5R\\/j1s3A1o64RJWUq\\nLanbgvNxKXMs0qW0maZLqAfrIDyCv\\/fU7yY5MEO\\/jb2ifwlf\\/wDA0r+Yx79P1n9\\/vf8Ak\\/8A\\nRG8q\\/PlBmnJdEu5KWrRMD8NEqSrYVC3LHrdbrSCtpga63b4u656I6ph5DrssE28ylDbxamG5\\nsMpcTrJxz0ydKXSVW4nHDHG\\/r9prk0qdFtztXNKs2Xm1KURNSlkW+1SbPkn0khLLspRGFNNg\\nMtBDSQmMa4Ij9VxpiutoU1VMQVSbYXm7SWVNuNSq8xBIVKsluWUNBYKaITqAADaMSYqM\\/Ngp\\nmJuYdQbXQp1fZ6CwPZghF9L3y3vrBBH01l2Le2I9xU+0MPrRuW+bqqjgbp1t2jQ6ncVcnlqU\\nhGUtSqTLTk695zqAtTbJSgq+k4xIR0K+QFxKvaco996YtUVhlZ2s1OIwktipSVSxHrrQycZY\\nuKvSK56gWTITKSy48xITFeuZTKpinzUpa1SQJlow3g\\/EOK5lMvRac9MIzBLs4tJakJa5FzMT\\nawGkEAlQaSVPLAIaacUCkElTpyoOBuUYW5qApdrNN34uOGyE2GticxH1UqOkay+T85PbFTTt\\nxMlqTRJaetrB+26jJfqpYpOy6BI0KnrCn1US3hM\\/Q1q86rLsrZplNl25lmmF5mq14S9LSBMz\\n3cIsJrDwLw2s7CXDGhS9t2LY1Hl6LQaYx56kNM6635ydmSA9O1WpTbr9SqtRmFLmahU5qanJ\\nha3phZLrDDCzDvBexqBhthTZ9DsOxbZlBJUS3LfkxKSMo2pZW\\/MOr1nJmfqc8+tybqtZqL83\\nVKxPvPT9TnJudmX5h7saOzNnuz2n4GkFhK0ztZnEI+kajkygpT6SJSUSr0mpRs6m\\/wCUmHB2\\nrpTlaaZs+i0RmktFRIdm3UgPPW9EAWPZNXFw2FWJJ9JxQClAAIQgiDJy8v7YTeH8GmGH+gFx\\nObiDJy8v7YTeH8GmGH+gFxG9vP8ASKn\\/AA3T\\/wDUzkYGMf3Ka\\/v1n\\/UzEaaozN0D9MaqaDWO\\nL2NlHsOn4hzj1kV+y\\/ueqdembelgzXZyjTi54z8rTaq8XZZVHS2iX8lKHNvrF1stDWwygjj2\\nm1GcpE9K1Knvebzsm6l+WfCGnS06g3Svs3kONKseC0KHdFbMvOMOtvMqKHWlhbawASlSTcGy\\ngQbHgQR3RJn++TMQPyUrO\\/OpW\\/6FwffJmIH5KVnfnUrf9C4jMQRPfxv7Rv4SOfybRv8Al0bb\\n8Iq1+\\/3P8mx\\/wu748zEmf75MxA\\/JSs786lb\\/AKFwffJmIH5KVnfnUrf9C4jMQQfjf2jfwkc\\/\\nk2jf8ug\\/CKtfv9z\\/ACbH\\/C7vjzMSZ\\/vkzED8lKzvzqVv+hcH3yZiB+SlZ351K3\\/QuIzEEH43\\n9o38JHP5No3\\/AC6D8Iq1+\\/3P8mx\\/wu748zE8bkvOUkr\\/AChf6uPz7hRRsMf1IU4ZiW+abqnr\\nlNb+7\\/8AVA24e8rotH8hFMNlM7PZ+U+U+XvBWzLA2nOctV+1laS\\/\\/md\\/9YDCuNWvyaX\\/AOrT\\n\\/wDxcv8A9fEbSuWq\\/aytJf8A8zv\\/AKwGFcdGUisVGv7GKjVqtMmbqE3hjGPnEwWmWS52C6xL\\nNfk5dtplORhlpv0G03y5lXWVKM4lpl+bws\\/MTDhdeckKnnWQkFWQzSE3CQlOiEpGgF7XNzcx\\nAdgggjimKtiRThb8oTvnDDDLDrDWW0Y7UrDGHlh2hYzFVmMTaxKO1Ri07ep9BaqDsoiz30Sz\\ns8mQTMOS7bzyGVOloOuFO1j7775MxA\\/JSs786lb\\/AKFxGYgiyEbXNobaENoxG4lCEJQhP0dR\\nzZKEhIFzTydABvJPMk6xuU4grCEpQmdWEoSEpAbYsEpACR+1X0AtqT8byZ\\/vkzED8lKzvzqV\\nv+hcH3yZiB+SlZ351K3\\/AELiMxBCvxv7Rv4SOfybRv8Al0e\\/hFWv3+5\\/k2P+F3fHmYkz\\/fJm\\nIH5KVnfnUrf9C4PvkzED8lKzvzqVv+hcRmIIPxv7Rv4SOfybRv8Al0H4RVr9\\/uf5Nj\\/hd3x5\\nmJO9D+UdX7V63SKSvRWtFlNUqlPpxeTinWlqaTOzbMqXQ2bLAUWg7r6pUnPVyzIGUSuY8vSy\\nf\\/HK1P3z0H\\/ScnHqFxf+xbFmIcVS2IHK\\/UVVBck\\/TkSylS8pL9kl9qbU6AJSXYCs5bQSVhRG\\nX0bAkRMMK1KdqHn\\/AJ4+p7sfNezzJbTl7TzjPbs0IvmyJ33tbTjfz6uVw\\/bGNKP9+Nv\\/AOoF\\noxrkjY3yuH7YxpR\\/vxt\\/\\/UC0Y1yRyzjH+m7FP\\/3HXP8Aec1EAn\\/6Onf77mf9cuJM\\/wAmz\\/tg\\naVv7zsK\\/9N3pEsmIm3ybP+2BpW\\/vOwr\\/ANN3pEsmOw9jH\\/RzQf7pVv8AfM\\/Fl4V\\/cWX\\/ALpM\\nf65cEEEEWlEiiIny43Jw\\/qf1+oaZWCluluxbqqDZxxtqkymTFoXdUphLUviHKy0snZytvXfO\\nPMy1yZoQim3c+1UQ8+3dSmqXG7j1Drmtqg3nbdftC6aPT6\\/bF0UepW\\/cFCqjDc5S6xRKzKO0\\n+qUqoSrms3MSU\\/JTD8vMMqyQ406pB4+bAU5TbQEuDQWxzmKXSmahVMD8QHahXMILqmQ4+43T\\n2nm1VKxa7N6qUquez1TLEs5MBSvnuizFIryUy8xPz9NpfJW2nZ39FTLmLaOxamzro+lpZpHo\\nSM66rSbQlIsiVnFk9rfRqcWLEpmUIbrfFFF81dNQlkWlnlfl0JGjLyj9Ycm3if7VDl0iwWhI\\n1vy0zMyUzLzklMvyk5KPszUpNyrzjEzKzLDgdZmJZ9pSXWX2XUpdadaUhxtxBW2NaJ0nJFco\\njLaZeEX3AYjVVn+yJwnpkpK3aH1obmMQLYbDMnTMRpJnNJdnHHSxTbwZYRqSddUxUdWXk7gk\\nZRiCxHbuAWOmIejbi5ZONOF1XVSLwsirt1CULm2MhVZFYMvV7drcs06yqdoVw0x2ZpNXlEuN\\nLdkZp1Uu\\/LzSGZlqvNnWOJnBFcTNHtHaROltirSaCLrYCiUTLKSQkzUoSpbd7dqhTsuVID2d\\nOlo1UcpU2HRdTDlkTLQP1276KSDp2jZJUg7\\/AKyLhK1R6acRsPlI\\/wDae0Zv4S71\\/wBWKbG6\\nvRC0q8OtMnA21sa8OnwyzU0fNl22y9MJeqtjXtT5eVXcFp1VSUtlT0i5NMTNOndgwmsUOdpV\\nbYZal6k0hOlT5SP\\/AGntGb+Eu9f9WKbHV20mclqhs1r07JvNzMpNU6TmJaYaVmbeZdnJNbbi\\nFDQhSTu3g6EA3EWDiB1t\\/D808ytLjTrcstC07lJVMsEEXsR3ggEG4IBERHo+0w0vR3DbEjD\\/\\nABFYkGqs9YV8WpejFLemDKM1N21q9IV1qQcm0NPKlm51cj5Ot9DDy2Uu7XZuEbOPi4I4VZdc\\nYdbeaVldZcQ62qwOVbagtCrKBBspINiCDaxBFxFUglJCgbFJBB5EG4PqMSZ\\/vkzED8lKzvzq\\nVv8AoXB98mYgfkpWd+dSt\\/0LiMxBFjfjf2jfwkc\\/k2jf8ujc\\/hFWv3+5\\/k2P+F3fHmYkz\\/fJ\\nmIH5KVnfnUrf9C4PvkzED8lKzvzqVv8AoXEZiCD8b+0b+Ejn8m0b\\/l0H4RVr9\\/uf5Nj\\/AIXd\\n8eZiTP8AfJmIH5KVnfnUrf8AQuD75MxA\\/JSs786lb\\/oXEZiCD8b+0b+Ejn8m0b\\/l0H4RVr9\\/\\nuf5Nj\\/hd3x5mJM\\/3yZiB+SlZ351K3\\/QuCIzEEH439o38JHP5No3\\/AC6D8Iq1+\\/3P8mx\\/wu74\\n8zEkC\\/fk3+Nkg+9+phpHYWXVL5qMsb8tm7bAfP1iUPC304ltpKCnUDzZVtctqWmsy0NV2M\\/J\\n441YGTs3I3bdGF1Qdk1NNurt2tXZOIUXZqalE6iqnZNIWobWUdKtZKCEFtSc1KUhJBE7x3gf\\nC1Gmi3TaX5sjKTl89qLwuFKH9Xm3TwGm7ujLrdPk5MrEuz2eVagPyjq7ABNh+UWrmYwbqtPf\\npVSn6XMqaW\\/TZ+cp8wphS1Mrfk31S7qmVLbbWppS0EoUtpC1IUVFDavNhpBBHP7yQl1aUiwS\\ntYA32AWoDU6mwAFzrEbP2D3gRl9gVoTYq6QU3SpKzLgw+pjtYYkn5dVz1W45JCG56nTNVZD5\\npVp1pSVJl5V1LgQh0B5SEJWttanEbrcJ\\/k396zD7ExjlpIWvRpZpTRmaLhPa1WuZ+bASlUyy\\nxc94KtJunavnoYmHLRqu0Oq65Kt72oII6C2aYJwvXJj\\/AOK0tM4EtNuhK5ufbQV5Aq6kMzTa\\nVgnehYUgjQptpEnw7TpOeeQmaZ7UFSgR2jqLgAkfta0cvXxvG8PRV5M\\/RC0Q3pes4YYcprV\\/\\nSrakDFDEWaZvC+0axGa6bOPSUnRLZdKUhtbto0G31PNKcRMbYOLCtgUEEdR06m0+lSrcnTJK\\nVkJVsDJLyjDbDQJABVkbSkFarXUs3Uo6qJJJiymJdiVbDUuy2w2NcjaEoBOgKjYDMo2F1G6j\\nxJggggjOh6CCCCCCMNdJvQN0VNLmXWvGrCii1i5hKiUk8QaJtLZxCkGmw23KoRddGVLT9Slp\\nIIHkdLr\\/AM8UWXBcCaYQ88F6K8Zvk37ipmbntHrSLaTKOOPqkrYxktxYelm8gqXTM3xZTS0z\\na\\/O2bqm8P5QAfSgOHJoEEQTFmCMKV1iYnKpRJN+cQ0pXnbfayk0spKcvbTMm5LvPgcEvLcSL\\nmw1N9HVaTTphl6YdlGi+E5u1TmaWpVwLrU0pBcNtLrzcOQjR\\/pJaCGLui3WKzRL\\/ALjw4rE3\\nRF1Ruacs+r3NUJZZo6spjyddatC33VhZ\\/YNo0zr\\/AN9DcYWwQRxHiSRlZCe7GUa7JvKo5c7i\\n9yiBq4tat3frvOsVTMIS2+6hAslK1BIuTYA6C5JJ9ZjtzCPBS6sZqs3RrXqFAkJpycMklyvz\\ndSlJfaiUenSpSqfSqq4EFphxOsloq2hQNTVKlDeTgt8ncxnvKWpNdxT0gMMLOtypSzFRbRh\\/\\nRbqv6tuSb7aXWWVt3HI4dSEjMuZqaccS\\/UWpUEPIbnDmzBBFk7MMJ4fxDMyqKxTxOJWFKUkz\\nU6yFFLuUXEtMM6ZQARuI3gxuKDJS07MhuZa7VBWgWzuI0JAIu2tB4843W6MnI4aE+jZMyNwL\\nsecxnvyQUxMM3bjG9I3NLyE6g7RUxRbNlpCnWZJFp8Iep8zPUSq1unqZZLNbLwdfe2stoShK\\nEISlLYGolCRkEpSCEpCR5qQAAAEgAAADdBBHXVJo1JocqmUpFOk6dL2BLcow2yFqAtndUkBb\\nzhG911S3FcVGLSlpSVk0dnKsNMI3kNoCSo81q+ss96yo98KwQQRtIyI1U8p7ydVe5QWjYQUi\\nh4pUnDNeF1UvKpTL9WteduVNYTdcpbcq00wiTrNHMouSNBWta3FPh5MyhCUt7JSndRf3tliD\\n+VdZv5qq3\\/TWCCK1xHs\\/wjX6tMVOrUjzuddQwhx\\/z+py+ZLLDbTY7OVnWWRlQlKbpbBNrqJJ\\nJMbqFIp01Nuvvy\\/aOr7POvtn03yNIQn0UOpSLJSkaAbrnW5juvRs5A69sBsf8HcaJ3STta5J\\nPC3ES1r6maBK4cVamzNYZt2rS1Tcp7FQduybbk3ptLJZTMOS0w20pWsplxPmxJfggiQYTw3R\\ncMykzKUOS8yl5iZEy635zNzOd4tIaK882\\/MLT6DaE5UqSjS+W5JOfSpGVkm3UyrXZBxaSsZ3\\nF3KU2Bu4tZFhppbvggggiVRtYIIIIIIxu0tMDZ3SX0ccWsCqdcUtaU5iZarlvy9xTlPdq0tS\\nXPL5CeE09TmJqSdm0DyXZ7JE2wo6+e08wAxxvvbLEH8q6zfzVVv+msEEQPFmCsM4mnJaarlN\\n8+flpbzdlfntQlsjJdW4UZZSbl0K9NSjmWlS9bZrAAaGqUySnX0OTLHarSyEJV2jyLJC1qtZ\\ntxAOqibkE677Wg+9ssQfyrrN\\/NVW\\/wCmsSacBMNZjBnAzBfB6cq7Nem8KcJ8OMM5quy0ouQl\\n6y\\/Y9oUi13arLyLkxMuSTFRcpK5tuVcmX3JZt8MqedUlTiiCFYTwZhrDEzNzFDpvmL00yhl9\\nfnlQme0bQ5nSnLNzUwlNla3QlJO4kjSF0qnSci46qVZ7JTiAlZ7R1dwFXAs4tYFieFjGGfKY\\n6B1a0\\/MLcP8ADuh4kUvDV+y7\\/XebtTq1tzdysT7X3OVmiGQblpWsUpyXd16kJjyhTrqChktb\\nHNQWnTF97ZYg\\/lXWb+aqt\\/01ggjBxJgDCWIKq7UqvSfO51xplpb\\/AJ9Upe6GmwhtPZys4w0M\\nqRa4bBO8knWGKjSafNzS35iX7R1SUBSu1fRcJSEp9FDiUiwAGg146x9LY\\/ydW+7RvSz7re0o\\n7SnWrXum37gdkmsL6wy5Nt0SrylSclW3V3i6htb6ZVTKHltrCNdKltrAKTKlggjc4SwtQcLt\\nTrVCkfMUTbjK5hPnU5M9oppLiWzecmJgoyhaxZspBvdQJAtl0qQlJFL\\/AJq12XalvP8AlHV5\\nsgXl\\/bFrtbMrda99b2FiCCCJfG3ggggggjADlA9AbDfTzwnatK4Zpq0sR7Vcfn8M8TmqcqpT\\nlrT0wqWVVKZP09qcpxrNtXBLyzcrVKc5NtFiYRKViSynqc0h7Rp97ZYg\\/lXWb+aqt\\/01ggiv\\ncUYBwjiGoJqNXozUzOrZS05MImp6UW6hq4b7YSU1LoeWhJCEuupW4G0obz5EISnQVOkU6afD\\n78slby0hKlhx1sqCNElQbcQlSgPRzEFWUJSTlSkA+9ssQfyrrN\\/NVW\\/6axIm0M9Hyd0V9GbC\\njAGpXPK3lPYc0ys06ZuaSpj1GlKoqr3RXbiS6zTH52oOyyWG6u3KFC5x0rVLqeCkhaW0EEO4\\nUwVhnDM9MTdDpnmMxMSpl3nPPKhM52e2acyZJybmEJ9NCVZkpSrS2axIPtLpkjJTC3ZZjs3F\\nMqbKu0dcuguNrKbOOLSLqQk3Avpa9iQcpIIIInsb6CMW9MzR8ndKjRmxXwBptzytmz2I1Mo1\\nOlrmnaY9WZSlqpF0UK4lOvUxidp7syl9ukOSgQicaKFTCXipQQptZBGJPy7M3IzkrMI7RiZl\\nX5d9vMtGdl9tTTqMzakrTmQpScyFJWm90qB1hmYbQ7LvtODM26y62tNyMyFoUlQukhQukkXB\\nBG8EGI7P3tliD+VdZv5qq3\\/TWD72yxB\\/Kus381Vb\\/prBBFSfil2ffwf\\/ANK1v\\/mURX6ApP70\\n\\/wA\\/M\\/8AGg+9ssQfyrrN\\/NVW\\/wCmsH3tliD+VdZv5qq3\\/TWCCD8Uuz7+D\\/8ApWt\\/8yg+gKT+\\n9P8APzP\\/ABoPvbLEH8q6zfzVVv8AprAPk2V\\/gjX0rrPCMwFFOFNaUpIzAJSk3sgFWXAa6Bnv\\nzggg\\/FLs+\\/g\\/\\/pWt\\/wDMoPoCk\\/vT\\/PzP\\/GjtG3vk2Nnyr2vdeltctblgoLLVu4O0u13tiQnN\\nG3qWIt3o2uZX9LsNXz0\\/RHZna5m4WcgtoE2A\\/Jz10UrE7GGbYDSnGMQb6VI0dybDY1nE0zDy\\nl2MtUpt1bVuRqE7UmwlKGJpycaDofIIlUlsywFTlIXLYYpylIKcpnA\\/UQDmBuRUHppJVcCyi\\nCRuvaNu1h+jMqzIkGlG4P5VTr6dP4r63E25i1jxEbUcKMDcGsDaILdwcwusTDSkKbCZiVs22\\nKRQV1BTISlL9VnJCVanaxN5nNU7VJmcm3T57r61+dHbcEEThllmXaQyw02wy2kJbaZQltptI\\n3JQ2gJSlI4BIAHARt0IQ2kIbQltCdEoQkJSByCUgAeoQQQQQ5CoI0F8oHyNF16a2kbWsdqRj\\nxb1gSVStW1aALdqVi1OvzTK7cp65NyZNQlrlpbTiJs5uttCVQpnckuOfWggiO4ooNJxHTBTq\\nzK+eSfnLUx2PbzMv+VaS4EL7SUeYd9ELV6OfKb3KSQLa2qSkvOSwamW+0bDyFhOdaLKAUkG7\\nakq+qtQte2t7XAthT97ZYg\\/lXWb+aqt\\/01g+9ssQfyrrN\\/NVW\\/6awQRXf4pdn38H\\/wDStb\\/5\\nlGh+gKT+9P8APzP\\/ABoPvbLEH8q6zfzVVv8AprB97ZYg\\/lXWb+aqt\\/01ggg\\/FLs+\\/g\\/\\/AKVr\\nf\\/MoPoCk\\/vT\\/AD8z\\/wAaD72yxB\\/Kus381Vb\\/AKawfe2WIP5V1m\\/mqrf9NYIIPxS7Pv4P\\/wCl\\na3\\/zKD6ApP70\\/wA\\/M\\/8AGg+9ssQfyrrN\\/NVW\\/wCmsH3tliD+VdZv5qq3\\/TWCCD8Uuz7+D\\/8A\\npWt\\/8yg+gKT+9P8APzP\\/ABo2wcl7ybFwcnsMcTXcVqNiccXzhmZX5ptWdtn5k+4A3+H9v5ZW\\nawZz5zN7MlrZeT+TinuhzbeUoLOWWnHo21DS80W8T9Hel3bKWRPYhGyhL3RUKU9W5SmfcriJ\\naV8OB6mS87TnpkTrVsuU5GrON+TuTTUwQ6hlbLpBE\\/kMPUeSwurDkrJ9lRVydSk1SXnE05eX\\nn1Ta5tvzhx9c2O1VMPHMHwtvPZpSAlATv5eTl26WuTQ3llixMI7PO4fReU52gzlRc9LOrXNc\\nX9EiwtHt+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf9NYIIgH4pdn38H\\/APStb\\/5lGg+gKT+9\\nP8\\/M\\/wDGg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf8ATWCCD8Uuz7+D\\/wDpWt\\/8yg+gKT+9\\nP8\\/M\\/wDGg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf8ATWCCD8Uuz7+D\\/wDpWt\\/8yg+gKT+9\\nP8\\/M\\/wDGg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf8ATWCCD8Uuz7+D\\/wDpWt\\/8yg+gKT+9\\nP8\\/M\\/wDGjkaH8nFv2k1uj1ZWlRaD6KZVJCorYThbWmy8mQnGplTSVG9FhtTgZKErIUEk6xSd\\n4iVzBBE2wlhWg4XRPN0KQ8xROKl1zI86nZntFMpeS2bzkxMFGVLixZspBv6QJAtt6TISkj5z\\n5q12XaFrP+UdXmyBzL+2LXa2dW61763sLRytMfkMrx0otJjFXHum6Q9s2fJYlVmm1eWtuew9\\nqtYmqUmQt6iUIsv1Ji6ZBqZU65TFTIcblGQlLwbKFFBWrGr72yxB\\/Kus381Vb\\/prBBETn9mG\\nBp6fnp2aofazM3NzE1MO\\/SVYR2j8w4p15eRuoIbRncWpWVCEoTeyUpSAI1r9Dpbj7zi5W61u\\nuLUe3mBdSllSjYPAC5JNgABwAEbRuTD5MS4uT8uLF2uVvF2jYmN4m0e0aRLy1KtGetpVJVbM\\n\\/XZxx592crtXE2maTV0toQ2hgtbAqUtzaJDe4SCCLBw7SKdQqTLUulS\\/msjLKfLLHbPv5C8+\\n4+5+VmXXnlZnXFq9NxWW+VNkhKRvadLsysm0ywjs2k5yE5lqsVLUpRzLUpWpJOp04WEEEEEb\\nuM6CMXtL7RYw70xcC7twSxEl0sy1ZaFTta5mJduYqtkXnT2nvufuykBwtkv09512XqEml9hF\\nZok5VaJMPtytTfUCCMaclJaelJmSnGG5mVmmHWJhh1IW28y6gocbWk6EKSSOY3gg6w2602+0\\n4y8gONOpKFoVuUlQsQeI7iCCDqCCAYjrfe2WIP5V1m\\/mqrf9NYPvbLEH8q6zfzVVv+msEEVF\\n+KXZ9\\/B\\/\\/Stb\\/wCZRE\\/oCk\\/vT\\/PzP\\/GjYNydvJb48aA+K1Suim6TNs3thneVPVSsRcNfuArV\\nHarjkoxNOW5cFKn3LrqMvS7it6feVsJ1ynzaJyjT1Zo7qWlT0vUJDILlOOT6rnKA2VhdalEx\\nOpWGb2Hdz1y4ZidqlszdyN1Vus0mWpiJZpmTrFIVKOMKZ263VuPBeeqlKSM4IIl8thOgM4Xn\\nMNIknPoR5RC5Fc\\/UXUhK3WnlIafdm1zTDZeQHezZfbR2hWsJzOOFWzbp8ommPyQaPmqlpUWi\\n68QD2jbnorLhcQM6QrKlQTmzG11Kvp3+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf9NYIIiH4\\npdn38H\\/9K1v\\/AJlGs+gKT+9P8\\/M\\/8aD72yxB\\/Kus381Vb\\/prB97ZYg\\/lXWb+aqt\\/01ggg\\/FL\\ns+\\/g\\/wD6Vrf\\/ADKD6ApP70\\/z8z\\/xoPvbLEH8q6zfzVVv+msH3tliD+VdZv5qq3\\/TWCCD8Uuz\\n7+D\\/APpWt\\/8AMoPoCk\\/vT\\/PzP\\/Gg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf9NYIIPxS7Pv\\n4P8A+la3\\/wAyg+gKT+9P8\\/M\\/8aD72yxB\\/Kus381Vb\\/prBBBB+KXZ9\\/B\\/\\/Stb\\/wCZQfQFJ\\/en\\n+fmf+NH\\/2Q==\\n--------------030503000903030801000206--","headers":{"Received":["from mout.gmx.net (mout.gmx.net [212.227.17.20]) by ip-10-246-30-150 (Postfix) with ESMTP id 8FF124A85D1 for ; Fri, 20 Dec 2013 15:35:45 +0000 (UTC)","from [192.168.1.2] ([109.193.141.200]) by mail.gmx.com (mrgmx001) with ESMTPSA (Nemesis) id 0Lu7a2-1VT7Xf1Llu-011VKV for ; Fri, 20 Dec 2013 16:35:44 +0100"],"Message-Id":"<52B463C8.1050305@gmx.ch>","Date":"Fri, 20 Dec 2013 16:35:36 +0100","From":"S\\u00e9bastien Fauvel ","User-Agent":"Mozilla\\/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko\\/20100101 Thunderbird\\/24.2.0","Mime-Version":"1.0","To":"info@i-pricing.com","Subject":"T\\u00e4st html","Content-Type":"multipart\\/mixed; boundary=\\"------------030503000903030801000206\\"","X-Provags-Id":"V03:K0:Zltmfhaftibnf1sBCmiQxKk3ZnXy0nx6ak5vzohG81fRwilXnUR wvkN9f2AOHZ7gjmHvTvn1csqspqOKbNS+1klVbnZaJUbnrT9J+WFv4clIFAfRawYCvy8GGE JhRt1h81gOGQ761rx4+rUbUcYfh+2XcD0w4Us6yrCsF\\/Gw6nv5z5puhgW9j1Ad5WWaKkd\\/f m\\/nL5VYAUoqLjvBs+Jbgg=="},"text":"T\\u00e4st\\n\\n * abc\\n * *def*\\n * *\\/ghi\\/*\\n\\nschlu\\u00df*\\/\\n\\nDiscountify\\nend\\n\\/*\\n\\n","text_flowed":true,"html":"\\n \\n\\n \\n <\\/head>\\n \\n Täst
    \\n
      \\n
    • abc<\\/li>\\n
    • def<\\/b><\\/li>\\n
    • ghi<\\/i><\\/b><\\/li>\\n <\\/ul>\\n schluß
      \\n
      \\n \\"Discountify\\"
      \\n end
      \\n <\\/i><\\/b>\\n <\\/body>\\n<\\/html>\\n\\n","attachments":{"john-deere-logo.jpg":{"name":"john-deere-logo.jpg","type":"image\\/jpeg","content":"\\/9j\\/4AAQSkZJRgABAQEAYABgAAD\\/4RUhRXhpZgAASUkqAAgAAAADABoBBQABAAAAMgAAABsBBQABAAAAOgAAACgBAwABAAAAAgAAAEIAAAAAACwBAAABAAAALAEAAAEAAwADAQMAAQAAAAYAAAABAgQAAQAAAGwAAAACAgQAAQAAAK0UAAAAAAAA\\/9j\\/4AAQSkZJRgABAgEASABIAAD\\/7gAOQWRvYmUAZIAAAAAB\\/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz\\/wAARCABwAGMDASIAAhEBAxEB\\/90ABAAH\\/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14\\/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH\\/9oADAMBAAIRAxEAPwD1VDyMjHxaXX5NrKKWCX2WODGgfynvhrUPqGdT0\\/AyM6+fSxa3WvA5IYN+1s\\/nu\\/MXkjaqsjHr619Yr8nKyMl9leNRVs9W01EPyLG5OS70sPp9Fz7MfZRUz3\\/zCjyZRBjyZOGgBZonU8EYxj+lKT23Uv8AGT0TGPp4TLM60\\/QIHpVkzG31Lv0r\\/wCvRj3sWbb9Y\\/r31Bj7MPCGBjghzbHMFZDT9H9Y6o+mm7+vVirnW9dzqWur6aynpFLhDm4TAbnN8MjqWU2zJyHN\\/wBJ6dKourZbb61w9a483Wk22H43Xmyz\\/pKtLNM9THy\\/l\\/3bTyc2NuOUvDEPbj\\/4ZPin\\/wAx3cjI6mbi\\/P8ArTTW789mNk3Wvae7DjdOroq3N\\/kqtazpdpl\\/XsrInn9TyD\\/0snIVNtF32d17Wn0K3Bj3j6LS76At2\\/ze\\/wDwb7P0dn\\/GKbMR9uPbdWd7seXX1R7m1CP1pv8ApKq3u2ZX5+N7Lv0lPqejFKRO569P\\/Q+Ni94y0GIysGVZJ5JcQH6UaljSjF6IPodTyqyPzvsR\\/wDReQ1yOx2Oxm3F+tF9T\\/3bKszGb\\/25XdbX\\/wBFZhaokEcJA0bBLHHmYjbFGP8Acllif+m9HiZX11qaxvTOrUdUZMFleRReZ\\/ds+3txsr\\/wZXWf4w+r9OeK+v8ASnVjdDrWNfQQP5FWVvou\\/rNzti4qxjHfSaHfESrGF1TqnTYHT8u3FY36NbHTUJ1\\/o1vqY\\/8A4GpI5Zjr+yP\\/AKkZ4c2O84fUZh\\/z+D\\/pvqHR\\/rh0DrG1mPkirIfxi3xXaSZ\\/m2uOy\\/6P\\/aZ9zFtLxqzN6JnNI6tgjGsOrs7pwDB\\/Wyel278W36XqX20frL\\/8Guk+pOVk9E+sWR9Vsq\\/1cdzN2H9LZuDW5TXYtbt\\/o15eJa+6yn1PSqvxbtn56nx5+IgHQtzHm4q1EgdOKP739aEvlfQUkklOzP8A\\/9Do\\/wDGf1H7P0WnDaRuy7d72kTNeOPtDv8A2ZGIuO68BX1IYDCDV0rGowWEcF4Y3Ly7oHt323X1er\\/wlK6D66E5\\/wBc+mdOMWVMbQHV9v0tzrMkH+tj4tS5B15yrbcsgA5V1uQQOP01tl3\\/AFL1RzSJykdIj\\/pf+iTaHNzqM\\/60o4\\/8GH6yX\\/SgyaruBRddcRVinNge6rc5gA\\/f+0MdWzG49t1\\/6D\\/SV2qm1WMbEtzr68WmoX3PJNNbto9waXPc115bUx3pt+luUR8Whj+eOhlr8o\\/S8P0nTo\\/YWBmeq7rNb9ri30KaH5hfQ4N9XFzn4Rsxtz278e9tbLsf\\/tQz\\/uPTqdCwOjMtt6riZ7cnptdd7LaSxzX0sOvoXG6x1zvRxmvZ+tVU3W\\/zqji\\/VDIAac\\/L9MA6047S7SOPtF\\/p1t\\/sY1ysdT\\/Z3ROltxRivza8630ra7LtrrBsdbY++72foqqMfb6FdbKv8F\\/h7VRzc1jMhjxZuLLOUfRj4Zx0PqlGXphCXD\\/rv\\/QNjl8Uojjy4I4cWPiyAymeKEjH1f4Dx9U+lW15HqbGlzZ14G7RJwWj1Dqt2YXMZVXhYZduZh0NY2T+bbmPpDWZF\\/7lbP1ej\\/u1b+nWe7lXYmwDRjfQ7j\\/F4ouNkjCMqhP3AN5AcMeL+r\\/V\\/rInBCciuQ3J4QEZj4q\\/k51uPV0HrQJe\\/AacZzGiB\\/k671q2b\\/8Auz0\\/N2f9beqDloU\\/p\\/qr1GomG4GdiZnxGSH9Ksb\\/ANLenR+Yfy8f+lwtvlifUP6vEP72P1h9i+0Uf6Rn0PU+kPof6T\\/i\\/wCWkvJ\\/2i\\/7B9sjT\\/mz+zok\\/T+2fsnf\\/wB\\/SV3j\\/wCjxOnxj\\/m8X0f\\/0bmTbs\\/xl5OVMtxd1p+FWE2R\\/nuXI4ojHpHhWz\\/qQuizCf8AnV9YT+d9mz9vx+zMhc9WRsZ\\/Vb+QKhLWUpdzw\\/4vq\\/8AUjmc38o8Z5Jf9z\\/3KdqnDXNLXgPa4Q5rhII\\/lAoQOkpxfUPz2kjsDKZXZpU9d9TsN1WPbk77G0uPo0UGyx1QDYdbbXRZY+ln6T9Ez02ez07EH64PBzcJg5roud\\/24+ln\\/R+zLc6PW2npGFW0QPQY8\\/1rB61n\\/TsS6l0zE6nUxmTuaaiTVbWQHs3R6kb22VuZbsZ6lb2LncfNYx8RlmynhgDOIlV8Pp9qPFGP7z0c+WnPkRhieKcoxNyN8Rvjl6pPCEhQcfFdUPqdh98y8\\/Cuof8AkkOz6l0uP6PqFjP69DH\\/APUXUrXHP8oTXvR\\/5w\\/7lyP9F80P0L\\/wouB+zrrenv6hjn1aqNMysfTp\\/wCGc3\\/C4j2+\\/wBdv8x7\\/X\\/R1eus9y7XpHScjoGVk5tmSy3EFBJfUyz1Q5jm2Ne\\/Ea25ztrPV\\/mbb1x2W\\/Efk2vwWPqxHvL8euwBrmMd7m1ljXP2trnZT7v5j0\\/z1Nh5iGWUxCpRhw1kieKE+OPFV\\/vw\\/SirmeV9rHjmRwTlcZ476x\\/Tj\\/VmgcrvSh6mH16g\\/Rd0m2\\/+1jWVW1\\/9KxUHLQ6If0fXZ\\/8AKTO\\/Ljqc\\/LLwjI\\/81XKD9dAd\\/wCCP7T\\/AJJ9Lt6O35ftL7TtSVCX\\/ZfL0\\/8A3Y\\/8kkn8R\\/YzcZ\\/8ap\\/\\/0rOVUH\\/4ysvDGjcrfUZ\\/4bBZ\\/wB\\/XIYzt2PS7xrZ\\/wBS1dn9cz+z\\/r703O\\/m67RjPfYeJZc\\/HyP8zHtpXHuodi2WYj9H41llDvjVY+g\\/+e1RyaTkOmh+3ic\\/mo+k+GSX\\/PjGQen+qbuiXzh34lNnU3bnVPyGixtrB7wyht3q1U3Uf4VldHq+j+sfpv03p36Prwxjvs2bh5WE+p5qtbSa8iuss9jxtxX13+xw\\/wAHjLiw6PvB5ggjVrmub7mPa76D2e+talmXjdWLft1rMPOYxrB1B8+hfHsrZ1LZ7sTJb+Zns\\/V7P+2MVUM\\/K8cyZyySxT6RnP8Ao8v3oQ+X28n6X6v9X\\/suP25eX5uQxjHjEI5Y6Dijpmj24vT+s\\/6b2+F1Pp\\/UGh+FlVZE8ta4bwf3bKX7b67P5Fle9Wdln7rvuK806jg34uQcTqFLfUa1rgH7bGuYZ9O2p\\/ubZU7a7b\\/3yxV9lYbsAIrAgMD7A0fCsWen\\/wBFUpfA4nWGY8J2uHH6f78Zw4v8Vn\\/0vwkxyYTGQ0IB6\\/4XC+pulgl8MB\\/eIb\\/1SiHtcDtc10c7XB0f5pcvLG4+K36FFTfMMbP3xuRsW+zEyGZOMRTfWZZY0DSdHNc3T1arPo20\\/n\\/8b6VtYPwLQ1nuXS8fCP8A0pNUfjMTIA4iI3qeK6\\/weF9O3HkGD2IXn31kxGYfWsmupuym3ZkVsGgAtG6xrP8Ag\\/tLb9n7i6Ppn1q6flsZXmPbg5Z0LLCRU4+OPlvHpe\\/82m91WR\\/Is\\/nFH6zdDyOqV0ZWHsN9LXshzg1ttbj6rK68ifQbbTd6nper6dVn2i39PVsTPhvHyvMyxZ\\/1QyChx+mEskflIn8n7\\/qZ+dhHmeXEsREzE8Q4d\\/F4hxV3pNnpYnXrz9BvSLqT\\/WyLKaqx\\/wCBqjkMuoufRfW+m+uPUqtaWPbOrd9b4d7vzXK5Q40\\/VXqVpEs6hnYeE3y+zB\\/Urnf5li3yNCD19B\\/6p6P+6crlgY5LOnADL\\/FY+gf2V6vb0p+X7R+zJK59iv8A2Z9jkbv+bX7Uny\\/aH7W2\\/wDbftSVj2vPa9v+a2va8P8AJ8P1f\\/\\/T2\\/8AGz0439Ixc9rS44trqbCOBXkt9Pc7\\/wBCq8Ri4zrzm2dSGczb6fVKKc5obpDnsGNlsd\\/wjcrFfZZ\\/x69g6z0yrq3Ssvptp2sy6nV743bXEfo7Wt\\/eps22sXjOJm4NuEzo\\/WfXw8rEssfRc1m80ets+2Y2V09\\/pZFlPrVer+h\\/S+p\\/4JV5kESjMAkaiVerQ\\/pcP+BFgzQEhIaDjAonQccPH+tFAHKQcRwju6J1L0\\/WxG19SxwAfWwHi8Dd2fjjbm1v\\/f8A1f2fvqj6zGv9N52WDQsd7XA\\/1H7XKGMozvhIlW\\/Drw\\/3v3WhPDOPzRIbXrP9BmPuPo1Fzqq\\/zWGyPV9If4Jtu1rrGM\\/R7\\/0n0025B3J96VLCCTZN9NUkpiUPemL0aQIpC7nz0ITUZV+HYbMO2zFsMFzqHmvdH+kaz9Hb\\/wBdZYgPsDRLiGjxJgKeJi5ue4NwMe3LJIE0sc5oJ\\/euj0a\\/+uWJEDhPFXB+lxfJ\\/hMmMTBuF8X9V6Jl9n1q6S7Es9\\/W+mh12KZawXVuLfVrZWxoY11rGspfWxtf69Xg3+yrJvWNl4tt+J0Po1YNeRnh+TucRtLuo3DDwnbW\\/wCjwMf1X\\/8AGItGHjdJyGZPVOojFyaHeo3BwduTl6Ese261pd0\\/D31u\\/wAO7Irux7Peui+otd\\/1i+uOV9Z7a3NxsYEUu3Fw9RzBiU0+qdzMh9OH9otyfTs9l2VUmcvG5iMNcMbnGQvhjfp9qH6E8XqlOHB6Mf8AN\\/uOjRkAcgrMQIz\\/AK0R6uOf9b9B9E\\/ZfT\\/9A3+Y+yf9Y\\/0H9RJWklo0OzK\\/\\/9T1VU+pdI6X1aj7P1LFqyqxO0WNBLSRtL6n\\/Tps\\/wCEqd6iuJJKfP8Aqn+KXFfYb+kZrqHglzKslvqgGZrbVk1mnLp2f6Sx+VasnL6N\\/jHwKnUXVu6piNO5zXGrOrd\\/1vNFXUXL1ZJQ5OXxZK44iVfLxDi4f7vEt4APlJj\\/AHTp\\/i\\/K+IXZdOPY49V+rjKnkTtr+2dPie\\/o7bqlVHUPqy536THzcefzasvHsA\\/9i6mWf5y95SUf3KHSUx\\/1TKR\\/iyn7f\\/MW+3Z14Zf3oR\\/7jgfCHZv1RA9p6kT4G\\/CH4hpTU9T+rwdtZ0m7LB+ibs9wP\\/bfTqV7wkl9yjVGeT\\/HyQ\\/HFPGr2x0jCPlD\\/vuJ8Xwm\\/WLI2N6L9XqcYuM0ZTcJ9jx2\\/wCUerurpWwz6hfXXrvv69niil53OpusN5a5ulZGBhnG6a3\\/ALfsXqCSdDlMMZCXCDMfpy9WT\\/wyXrXcJ2MiR2+WP2Q4XlOjf4tfqz01rDfT+0bm67smDWCRtdswmBmJt\\/OZ6lVt3\\/DLqgABA0ATpKcADZIAGwpSSSSKX\\/\\/V9F6\\/1U9H6Nl9UFX2g4lZs9Lds3R+b6m2zb\\/mIXUfrN0PpNdR6pmVYtlrWvbSXbrCHT7m01h1zq\\/a79J6a5361\\/Wzo3Vfq\\/n9L6Yb8zPyajVXjV494fucQ33B9LduxSxc7D+rv1p61kdbqfR9vfW\\/E6n6T31upDGM+yetWx\\/pei5v0f8A329SMz10Irv0C0yHQjz6B6M\\/WPoI6cOqfb6DgFzWfaGvBYHujbW4t+jZ7voO+grOf1LA6dUy7OvZj12WNqY55gF79GM\\/tLzfq7W5GH9Zur4uFbR0\\/qN+AzFc6o1m6yq3dkZTaSG3NY\\/f\\/Oen+m9f\\/uR9orr0vrR0v6yYuHiWdR6yeqUHNxmjHbh10w42Dbb6uOXv9iByGpabUgzOuj2uH1Tp2fZkVYeQy+zDsNOSxhl1bwS0ssb9JvuY9Cs6xinAzszDc3KPT\\/WZaxrtsW0AmzHe7a703bh+4uIwei9Ttt6t17ozzV1jp3Vs5jKnCGZWMXstswbZ27tz932d\\/wBD1P8AR\\/ocrE0vq7a\\/I+qv1gyHVPqdk5PULhS9rg9vqN9T0ixwa7fW53p\\/R+miZmvHX8FcR7Vv+DYx\\/rZ9Z7sOrqDfqy9+FbW29tlOXVY81uaLGvqxtjLrHbHfzW31Fo1fXH6uu6didSuzGYlGc17qRkfo3TU4VZFbp9u+i13pv93\\/ABe9ZXQfrd0bB+r3T8Sz7TZl42HSx+PViZDnGxlbQ6qt\\/o+g52727\\/V9L\\/hFzmTjdRwruk9Sufb0fJ6hldU6g94oOU7EGR9nbVW\\/FY1zrn2U7K376q31PyPfUz0UuIgWDe30UZULB4nvKvrd9WbqrrqepY9leMGG57Xghosd6NRdH71rtiWJ9bfqzm5NeJidTx7si47a6mPBc4wXQP8ANXJdW6k7O+pnVMOzqNvW8ttmPZudhWYRFb78euuhrDWxtn6Su79J9P8A7bWl9XetWu6m2jL+sF3VBkMdVTiu6ZZiD1f50W\\/afSa32U1Xex7tiPHrVj+X+EkS1rwGrrN+u\\/1RcWj9r4oL4jdYG\\/S43bo2\\/wBpHzfrT9Xen3\\/Z83qOPRbta\\/Y94B2v+g7+1C8\\/xGfWin6hY12JeX9IvZbTl4teOH5FNLrLa8jIbve1+U1\\/6V2z9X9Guz6fp78qm\\/fkHp\\/UWV9N6xd0zCb0zp9eNkDAdmG+lgyfR3BlP6DY12\\/6Ffqet\\/wKb7h06bfy+ZAnpqK0B+16r\\/nx9UP\\/AC3xf+3Akuf\\/AOcF3obP+c+R6v2f0vV\\/Y9v8\\/wCt63230\\/Q2\\/wBE\\/Uvs381\\/2p\\/nEk7i8R\\/L\\/CTxDu\\/\\/2f\\/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf\\/bAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf\\/AABEIA7YDRgMBIgACEQEDEQH\\/xAAfAAABAwQDAQAAAAAAAAAAAAAAAwQKAQIICQUHCwb\\/xACBEAABAgQCBQcHBQcMCwkLABsBAgMABAUGBxEIEhMhMQlBUWFx0fAUIoGRobHBChUjMuEWGkJSWJfxFyQzOWJ2d5Kit9biGDc4Q1dyeJS1ttclU2iClqjT1OcZJjQ2VoeVuMLS1TVEVWSYJ0hUY3ODhIWIsrPExyhFR4akp7TDxv\\/EAB0BAAEEAwEBAAAAAAAAAAAAAAACAwYHBAUIAQn\\/xABlEQABAgQDBQMIBAYIEgcIAgMBAgMABAURBhIhBzFBUfATYXEIFCKBkaGx0RUyweEWFyNCUvEkMzVUVmKV1DQ2Q1NVcnN0dZKTo6WztLXT1TdEY4KUotIJGCUmZHakwoOyRYTD\\/9oADAMBAAIRAxEAPwCfRBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDOYmWJNl+amn2ZeWl2XX5iYfcS0wyw0lbjrzzrig22y22kuOuOENtNg5qSBuxbv\\/Tj0P8AC\\/XbvXSPwjpk4ylZepcheVKuSusbMgHbUG13a1W2lKUv6MOyKQ9s3Q0HNi6U4c5UJGnt9tPzspItE27WcmWJZu\\/LO84hN+4HhDL0xLy6cz77LCbXzPOoaTYaE3WpItcj2xlhBGmu\\/eXL0IrS8obtZ\\/FLFB5KXEyzlp2KujyDziVENl2YxAqdmzzDLu5wOJpcy8hvjLl0FkYS378oTqSy5L4XaNckwAhexq9\\/X+\\/OlSiohra2\\/b9vU\\/UASnaOFF0ObVbmyAaDW1egNS2v7N6WD5xiymvqAFk03t6rmJNrJXTWZpo95KwBxIuL6WYxRQpe4VUGnFDcmXS5MXtyU0hTY37ysA62N4k3QRDJvflxNOa6lv8A3O1HC\\/DNpe2TLi0cPpaqPS6VILbRL2IFRvVt6YayDu0MsiXXMD\\/wUMZSoxBvTlBtNm\\/\\/AClNxaTeLrbM2HBMSttXTN2PIPNPM7B6Xdp9k\\/c7IqlnmvMclPJ\\/J3AXM2fpXSYDUfKVwPK5kyNPr9TWM2VSZWVlJdRG4FyYnA+AeYlVEDUi+kah\\/HdLb0Zlpx88ylppBGhBBLql+otiJ8NQqVOpEq5P1WoSNLkWMg9OVCal5OVa1jqpLsxMOtNN6xIA1nAM+YbzGO13aZWiZYSHk3bpJ4JUp+XSVOU39Uq0p6slIS6slNFp1Vm6w6M2nUZsyS9dwpZyLzrbaoAVw3ZdN3Tvzhddy1+56gVOK8tuGs1GtThW8UbZflNSmJp\\/We2Te1O088tt55kAxwEQef8AKjf9JNMwgw3uDbs\\/V3HrghObNLy8jL5ddLJmSLAKv6RSNU7j+YV\\/Q9NaRbcXX1u+BIQ2yB3jMd1rxODuvle+T8tQutpxyNyzjRd\\/Wdp2HiJVy7qiZGs1UlWvKUBxJeY2SMqtm55RLzGr5I6ZoY6XNy9Wh9SddqgWVjtdj6V5NPS9rWhSKa4EuJSpS5ir30xUUazYLrI+aXAvINvbEkkRB4Ih075SuPZjMmWlMPSCSRkUzITbzqQCDqqbqD7SzoRfsE9wG+Ne5jWtuXyiSYG6zbClEd\\/5V1259gvwtoZOVw\\/KF7dZS4m1dFyt1FagUsu1\\/FaRoyG1KZUNq7LU6xa8Xg1MapLCJyXLzBJ8pZcybjouv\\/KB8eJlbn3L4D4TUZB2mx+fqreVyLbJaAaLi6dUrWS5s3AtboQ21tGvohsVJU85oBioSo8Ek9gJiLzW3fahNFX\\/AMyGXQoW7OVplIZA0sSF+YKeubby6bH6towHMT19wAKqS06\\/1NiWb320uhlJOvMm943K17l0tN6sLUuQlcF7WSXW3Q1QrCqz6W0ttBtbCfumu+4Xdk84PKHStan0v5Bh5lj6COoKzywvKFVZpbDeOctRmXGHGXk0bDPClh1wObtqmbmbKnJ2WeSDk27JTMuUdO0GcazNk4fwfaB7zFdivq9cR2Y2o7QpoFLuMcQgK39hVJmVO8GwMqtkgG1ikaEaEW0jCXWqu4bqq09re4RNPNgg2uMra0pHs0F+F4zeq\\/KT6d1bLxndJzEpnbNhpz5pnabQNVII85kUKnU0S73S+wGnl7\\/pSOPXtT02dMirrU5O6VekPk4z5O4zKYx4gU2Uca84KSuTp1flZRwLStaXFqYLjiCUukjdGMmwX0p9Z7oNgvpT6z3Rp38Y4rmRlmcS4hmEk3KX61UXhccbOTChfU62vqeZjFVPTizdc\\/NKPEqmHlEg20OZw8dTfvvuMdsVDSAx8qzSZeq434u1KXQ6H0y8\\/iVec4yh8JcbS8GpisutB0NuOo2gyWEOOdMfKT+ImIdVcbeqd+XnUnkI2Tbs\\/c9cnHG2gSdRtb866pKNYrOonzdYk5CPktgvpT6z3RTYr6vXGtXWaq59eoz69315yYVe39s4fffhyjHUtS\\/rvLV\\/bKUTpa28ndfq2juoVesVctLqtUqNTMuFJYNQnpmdLIcILgaMy67swvUSV6mQVqjPmMcfF+zX+KfZFpSocQR2giMNyYcdWXHVrcWq2Zbi1LWbAAXUokmwAAuTYAcBaE5Qfzr630txt46nd7NOdIIIIR2g4g\\/H5QdmeB698EO5Cp1SkuOTFKqU\\/TX3Ww049Tpt+SedbKgdmtxh1tS29YJWUKVqkpByG\\/NpBDrbym1pcacU2tJulaVFCkndopJBG+xsdYTlUOF\\/DX5\\/D2iPrZLELECmv+UU6+LxkHyhTZfkrmrco\\/siQVN7ZmeQ4UKIRrJ19QhAA6I+qp+P2O9IQ63SsbMXaWh5QW83TMSbzkUvKAKQt0S9aZS4oDdrrBI3gnfHVEEZ6KvVEWKKlPoOtiicmE77cnLagd19L3j1LjiPqOLTb9FSh8DGSdM009MajGWNN0qtIltuSZDErKvYzYgzcixLoaDTbDdOnbgmZENMtjZsIMvkxqDZamQMdgUnlKNO+hGXMnpPYoP+S7XZfPFTk7hCtuHdczAr8jUhOEB5zYGb2+w+i2OxLTWywsgjZS+L8VSoCZbEuIJdINwlis1FkZrJGazcwkX9Ea79B+iIyUVCdQbpm5lJG4pmHUkbuIXfS2nfrGySj8sJyhtGbaaVj0iry7LTjaGK1hphPPKCluKc2rk81Y8vVH3kZlLZfn3UbJersyAyGu26Fy6OnRR1oXPu4QXSlC2FFquYfTUulxLR+kaWbauO3XNWa3eUFpxpxP8A8rOS3GNPSmUn6pKeriPbv9sIKQpPEbukcI3cttMx9LAJaxliIgG4D9Umpo8BYGZceOXQAJvYW0EZrdcqySMtTnxbQBU08tNuACVrUn1Wjfpb\\/wAoP0hpXY\\/dRgbgzWQksmY+YJq+La2oDhMwGvnGv3WGC6zk2xtBMeTrzddE0M2Y72tr5RDSXEtt3hor1KUKQnbTttYtytSS8rVdLq26ZVMP6VsACmXS22urTO02jylPJLTTbsZEgHiPTzwmpBHDePHj4CJFKbb9p0oUWxKp9CAE9nNU2kvpWAmwzrVIB8kGxzB4KJHpKUCQc1vE9db+rUHDzDjUu7\\/rGlW9Vj3iJelrcv7okVRKG7ow5x4tWbURtHGaBZVwUltJQylQE5KXzKVIqDy5g6oohQWGEvbUPP8AkrWSFqcslye9zhtD+NFRtObdP\\/gV1YdYiSihmlajtZ+l2xV6G0E5ZEPVVvaKISztMyYg8QRJ5Pyjsey+QTMvQKgkEFZmJCZacUkEXAVJz0uhJ00UWlAE3KVDSM9vGtabN1eaPf3Rgp15\\/kXGteOmndaPQjtDTh0Ob82SbX0nMDpyafKQxTZvEq1qLWHVKGqEt0et1KnVRe9RSSmU8xee\\/hnkjR67RbjkWapb9Xpdcpr4GxqFIqErU5B1Km0OILM5JPOsOBTLqHEFLhKm3G3ctVQjzSVJB6j44w+o1er1tTqajb1Zq9BqAQW0z1FqU5S5sJORKBNST7D4Sct6dpluAy3RL6f5Ts0MqalhKXd9L03JGquyxAsLZWX5Oazm4OhfQCNNANdi1jyYH7fTmXNBq0+trxNltvcOF9+8x6YkEeezZunvpqWAWxbGlBjU0yx+wyFavut3ZSmc3Q9qs0q7JmuUxpK3Rrrbbk0tu67pdz2roXl9ZHLi6fNprZ+fLow5xJS0kJU1e+HFIkkvBKgpBeXh67YcwVJA2RUh5vWRlrnagPCb0\\/yj8GTISmeptdp7hAKlBiUm2EkkCwcam0Pq0N7+agaEb8ubas45pq7B+VnGSbapDTqBcakntG12HCzaiRrYHSJtEERZ7D+US3ZLLaZxP0Z7dqra1na1Kwb+qFvuMI8zNTdFuCgXKmbUSHPMVX5MHWB2mbeTubeHnL26Fl0iUZvOj4vYYTi9VM5MVu0afcdDlnCVAmXnrNrtcrM5LoSEKW45bcq6VHzJZWQWZ3Ttr2zmplIYxRIsKJIy1FEzTAmwB1cn2Jdm2uhDhSdQFFQIjbMYnocxYCeQ2o70vodZtc21W4gNn1LNhqdxjd7BGGGHXKFaEmKqmGLO0m8J3ZycTrSlNuW427Dq81rZkNS1Fvxq2aq\\/MpAU4ZVqRVMBvN0shkawy+p9Rp9YkZepUmfkqlTZtsPSk\\/ITLM7JzbQzSHJaalnXWHmyoZBxpxSdxAJJzieSVRp9Sb7anT8lPtf12SmmJpu9gfrsLcTuIO\\/cQeIjcszMtMDNLzDL6bXzMutui3O6FKFu+ORgggjNh6CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOErtfoVsUqbrdy1mlW9RZBG0nqvW6jKUqlyDRyb2k3Pz77EpLtlSsto86hGahmSRGuvGLlcNBLB0zcm9jFL4k1uVzzoeEFNmb8MwQMlCXueVVKWEpQP4Dt4NOa2WQyzMamq12i0Nnt6zVqdS2iCQufnJeVC7WBDfbuILirkAJQFKUdAknSMaZnZSTTmmpliXBFx2zqUFXchJIUs79EgnQxsvgiL\\/i78oWrj\\/lEjgLo\\/UynjJfkty4t3HM1Va0qOqjbWZZ5pKZdbSUlZUm+psOrcKAygMkv6u8WeVQ06sX1TLNUx4uGzqTMawTRcLWZHDqVl21gh1luq24zJ3VMtLGYPznX55aUFTeezMVJW\\/KCwBS86JF6oV55NwBTpRTLAWOC5moKkxkvoVsImN90pUL2jU3jOkMXSx284oXsWm+zbuOBW8W1W5FDawbaaEEzf79xTwxwqporGJmIlj4e0tSVrRP3tdVDtaVcS3nrbB+tT8miYV9YKbZLi1OZJAzyEa68T+Wa0DsNzMS9OxFuLFSpyxUh6mYX2dVKn5wIIUxXbnVaVpTjbn1UuSdxzCTkM9UbzCgrFardyVGZrNxViq12rTqi5N1Ws1CbqdSnFndrzE7OuvzLy+OanXVEjgY4+KirPlM158rRQcP02mtm4D1RfmKm+BawUhDP0ey2rcQlYfSk3Bz3uI9M46nnNJWUlpcfpOlcw5w1BHYo4WIU2oWOmupkrYm\\/KFZ5ZmZTBvRzlJdIUryWu4m3k9OFxIKQ2p+1LWp8kWVHLNwovOYGeQGRQC7r0xK5Y\\/T2xGVMtSWJ1Hw0pkyNVdLwzs6iUgMpzJHk1crrNyXdK6uf1mbiQSMwonPdq6QyTvVuHRznuhyAAMgMhFVVja\\/tErOZMziioS7av6lS1NUlCRocoXTm5d5Y9EX7R1ZIJBJClCI3NYjrMzcOVCYsd6WVCXRa1rES4bChbeDe\\/Ekx2NiBjPjFizMuTeKWKuImIkw4vXJvS9LhuZtGqsutIZarFRm2pdhk7pdhhtphhH0bLTTeQjrqCCK6mpuanXVPzky\\/NPq+s9MvOPuq1J1cdUpZFyTqTqSTqY0i1rcUVrUpalG5UolRPDUkknQDeYIIIIxCsDdr1z\\/XAEE93j18bQQRclClcAe3m9fCFksfjH0Dv7oQVqPG3h1eFWSnfqfb7tw9cN4vDazwSfTu9+UOwhKeAA6+f1nf7YvAJ4AwmAr5DTv+7dDUMHnUPQM\\/acvdCgaQOYntPdkIcBB58h7T49MXBA58z7PHrhJWkcb+HVoQVKPE\\/D4QiEpHAAdgAisLaqRzD07\\/AHxdCe0HAde+PIQyPQfUYrqK6PaO+FgDzAn1mLtVR5vh748znkIIb6iuj2jvg1FdHtHfDjUV0e0d8c\\/S7Pu2tol10W2bhrCZwlEoql0WpT6JtTbi21pl1Sks9tlJdbdbUGyvJbSt3GHmW35hRQw0t5YF8rTa3FWJCQcqAVWzKAvawJA3kQcbcTuHEx8xqK6PaO+DUV0e0d8dwU\\/AHHarNuOUrBbFmpttKS085TsOrvnUNLUCQlwy1HdCFEAkA5Hhuj6+W0QNLWdl2puS0XtIiclX0hbEzK4KYkzDDyPxmnWbbU06kngUKyz54zk0isL1RS6gsa6pkZo7iBwbPEnu01NjeH0Ssy59SXfXpf0GXFac9EnSMb8j0H1GKRlu1oI6ZzzbbqNF7HIJdQhxIdw5uVlwB0ZpDjT0g28y4Ac1tONocaI+lA5+WkOT402akHTL6MeLjYaUkK8vteYpRIXraobTVFSanh5vn7HaamX0hAzMZ6cK4pVbLhuvLuLjLR6ibjTUWlzcWudO6HBITxNhJTZJ3ASzxP8A\\/SMMSlJ4gHtAMJlpB5iOw9+YjOL\\/ALnHpwn\\/AOpmxL\\/9GSY909Fp5OHTi5tGjE0f\\/g2TP\\/6d8YV+CWK\\/4MYh\\/kSp93\\/0vf1YwsU6pDdITv8A4V\\/\\/AIcYNlg8yh6Rl7Rn7oTLaxxSfRv92cZrz\\/J4ablPZS+\\/oy4sONqdDITIW45U3tcha98vTnJx5DWTZyeW0lpC9k3tdo81nxX9gTpp\\/kv43\\/m+r\\/8A1KBWE8UJNjhyvA8QaNUgR6jLX74PMqgnRUlNj+2lngbetHv1jDqCMmXtDjS5YQ4\\/MaK+keyy02px157A\\/E5ptpttKlOuOuqthIabbSkrcUtQQlAUenL4uo6PWPNKZTM1LBLFymy63Qyh+o4bXnJMl1SXHAyl2ZorTZdLbbi9mPOKG3NxjDNHq6BdVNqSOPpSM0BwudWhpwHO0IXLzKR+UlX0C17racSN43EoHMXNxyPf01BH1VVsm8qEXxW7UuakGTQHZsVShVWniUQ4hDjapjyuVZLIW2424C4U6yXEDnzj5WMV5t6XUEPsutKIvZ1tTSiBpcJWASLgi+guCN4IjHyXvplI4G\\/s3C1vWefeQQQQgEHcYSQRvEIrZBzKdx6Ob7IbKSUnIjL49kP4oQCMiAR0QtKiO8fDwj1KiO8fDwjjikHqPV7zCRBSd\\/2GHq2SN6d46Ocd8Iw6CDuPq6\\/VDoIO6G8UIB3GFFIy3jePbFkex7CKkkb+b2+nx6oSWgLHQRwPjmh3Cakc6R2ju7vAdSu+h9vzgjjVJKDkfXzHshFSM949Xjx8eSUkKGR9fOOyGi0FB6QeB8c8OAkG4ghpH3dj4pYm4YzfzhhviNfeH1Q2wfE7Y93XBaU2HwEpD3lNBqEg9tgEIAc19fzeIyEfEqRnmRx9\\/wBvjrhKMuXmXpdwPSzzsu8nQOMuLacT3BaClQB7j6oUlSkKCkqKVDUKSSkgjUEEa6GNmmG3LB8oDhrsGEY2O35TGC0TS8S7at27duGuIfrz0hK3asOgajurcIWv6+53J2NimGHyii95Yy8tjRo5WpXELUgTVXwwu2rWqqWG\\/ausW5dcteInSU\\/sbC7qp5QeM0oHViNvFik57xx5x0+PHXOqRtX2gUcpTK4nqTqEkfkqi4iqtqF7lBFRbmVISd35NTagNEqTZNtxK1+rSxAan5iwsEpdX26Lcgh8OJT\\/AN0DusYm1YVcuLoH4iGTlrlua+cHalMpSgy2ItlzzkgmZ8wLaRWrFfvKmtSyla5Ynaq9S21NJzmW5R5ewjZThnj7gfjNLiZwlxdw1xHb2KX3G7LvO3rinJVvJK\\/1\\/IUufmZ+nutg5OsTssw9LrzS802dx82YgEZGL5ScnaZNsT0hNzMjPSjqX5Wckn3ZWal3kHNDzEwwpDzTiTmUONrStPTmItSjeUfiFjIitUSmVNCSkKdk3H6bMLFkgqVn8+YUs2UohDLKSSEjIBeJDLY1n27CZlpeZSN5QVsOHxUC437Gh4X1Hp7QR59WEHKaadOCJl5ez9Im+atR5dLbSLfxBmJbEujiWayIkZZm+pauzVJlgMglFDm6Y4lGQaeQDkdp2DvyiXE2kiWksd8BbSvNlCENP1\\/DKu1OyqmjUV\\/4W9QLgTd1NqUytsHasS1Vt6WU6dszsmR5NFsUXb5gipZET\\/0jQ3lZQozsqZmWC1FIARMSBmVlPpX7R6XYSkJJXlGsSCVxjS3rCYS\\/KKO8rR2rY8FM5lnvu0PXraWPBGpXBjlqtAnF9UvI1PEStYO1uY1Aik4v269QZTXUBtSu66E\\/ctlyrKFHJC6lcVOU6jJexTk5s9ntnX1ZOIlEYuTD68bWvi3JrJMrX7QuGlXLRJkhII8lq1Fm52RfyBBOzeVnmOA42vSsQUOut9rR6tT6kjKFHzObZfWgH+utIWXWlDil1CFA6EAxI5aekpwXlZph\\/S5S24hSx\\/bIBzo\\/7yQd2msfWwQQRt4yoIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+DvvEnD7C2gTF0Yl3xadhW3LBXlFdvGvUy3aWhaEaxbRO1eZlZdT68gWpZpTsw6rJpppS8gNP2PvLuaJWGJn6XhJTrux9uNkFDMxQpRdnWJ5QlKwtqYum5pVNYeKHtmEvUa0axIvo27rNQIDO3j9cxVhzDTXa12syFNBGZDcw+nzl1INiWZRGeafsb3DLLhFiTuNsGcqUhIC85NssG1whS7uqG+6Wk5nVf91B3jmI3ex1jiVjBhVg5RjceK+I9k4b0QhZbqF63NSbeZmlNlILMiKpNy7lQmlKW2luUk25iZdW4hpphTridaHDjpy2emvi95ZT7Pr1u4EW1MnZtyGGtKC7kclt+qmcvW5F1asMzYUrWVOWyi2PNQ2jYgbUPaqrpvC779rk1cl8XTcd5XFOnOeuC7K3Urirc4c1rHlNVrE1Oz0worcdX9NMKJWtZO85xRmIvKQoUn2jOG6RN1d0Zkpm55Ypslm0CXENZXpx9Gtyh1uRXawzJvcRKdxzKozJkJVx9Q3OvqDLd+YQnO4sdxLR48NZhON\\/LsaIeHLlQpuF1OvjHivy+aZeaoFOVZtkuvoADrL9z3YxL1sISrJtuapFmVqTfKFOsPuMFp53UFjVy6mmJiL5ZIYZy9kYF0OYCmmHLco7N33ehh0FLzb9x3gzP0svqQQhudpFqUSblv2aVdZmgy6NLYSAAkDd0dPfnCyU5bzx5h0ePHVReIdt20CudohNWTRZVy4ErRGvMiARYWnVKdqNwN5E2lN9QgEJtE5zFFanLgzRlmz\\/AFOUHYAa7u0BL5HCxdItw1N+yMScZsXcZaoKzi1ibfWI9SbWtcu\\/el01m4vItoAlSaczU5yYl6cyAA2liQZYYQjJtLIGUddQQAZ5ADqAEVNNTczOvLmZyYemZhwlTj8w84864o71LcdUpajzJUT7I0ClKWorWpS1KN1KUSpRPMkkknxMEKpRlx49HN6esb+mKpTq9vT0dkKoQVnoA4nxzxjX47h+r2crb\\/Awg6a7otSkqOQGZ8bz1Q6Q0E7zvV08w7O+L0pCBkPXznti6GlKJ3aD4+PyhpSid2g+Pj8oIIIIQVAb\\/ZHgST4cTBBH1tpWNet+1EUexrQui9KuSkCl2pb9WuKoku57PKSpErNzWa9k7qfRgnUPCM4sOOSw068SUNTEhgJXrWkHNUuT2I1Qodg+TpVnqqco9zVKQuVY5lCXob7jeY2wGbcbOQoFcrBSKXSalUAo6GUkZh9A9LKSpxttTaQkghSlrSlJBzFIuRly0nNzRtKykxNG9vyDLrxBFtbNtqsBpcnURrzShSuA3dJ4QullIyJ84+z1c8b77A5AvHSrFDmJWNeGNjsuAEtWlSblxBqDSTxS8xUGbAkdsnM+YxVJhrofzIjNqw+QZ0aKJs3r\\/wATMW78mkbPNimzNt2ZRXclazhdlGaNXqwNrkhLWwuFotJLwIdd2LjU5puxrH9QyqVSmac2vLZ2oz0s1a97lTLDkxNIy6FQVLhViMqVWVbfMYQxFM2PmPm6D+dMPMtW5XRnU9x\\/rdudraRPAOYD0CL2Zd591tlpC1uuuIbZZaSp1151xQS2022nMrdcUdVCEaxWv2TjrH5LvQSsEMLpej3a9bmWVEqm72qlyX35U7s9kXZiQuus1akDWAH0DFMYlUOZuolw9vjKu3rFwWwjYCLUs7C7DOWYYSkJt+3rUsphEu0yptKSKbK01tDTbDqgE56qGVqSMm3FAS5rYHOyrCpmv4so1JYaAU88207MMtDeorfnHaW2hITrnVoCDoQCY3sns2qcwtKHJ2XStR0RKMvzjhFtLJKZfMq+hANuSjEEGzNFfSTxC2ZsjAHGK52HQkpn6XhzdkxSkh0FTanasKSmmS6HAg7Nx6bbDm7LMxlTaPJK6et3IafGCRtmTcIAm7vvWxKIps5MqO1pa7jfr7eTbwWs\\/NGX0bzOt5Q1sTMUqWNuFtKSozF5Ut4p3AU0TdXKlcyQaXLzScjkrNZIR+MvLh8JUtKHDeTzTJs3DVjmQDK02XYa3HVClLqE9JuhKwkLSNkpe9KVoRksiMVFPk04VzfhRtww0p9n0nJOTxTh1cyEmyQldNp\\/0pUtVBR9AJJtYEZVETmnbCq1OZSKbiSZCtzjdOMiyo8w7NMuN5bb\\/wApfv1ERwLU5B\\/SoqoQ7dWIuClpMLHnMsVi8LiqjJ1c\\/pJaWs+SpZHSW624cwdwyG1yQtn5P3KJ2b156Tz73np2kjbWFjUtqthQzKKtVb5nM1OJ3JHzKkNrzUC7+xxt3qGlvKpyTSrKmHuP0s\\/Wm5cp81AP0EtTpnXzGsD+uUfVSveFlKfi5\\/Ssvd46tOoVtSSSBvfaqU88B5p8wpn5NobgpKtZlZ1V+aUKTrxB57yhvImw9dKK9U8TzDBAKJCkYzfzqJScodmpakUp5IBvdDqm7AHMVjSdSHk31ZzKXaDkSQLLn6yyki3FTclNFwEnelTQ\\/tQLRh9bfIPaK1ObbXc2I2ONyTYQEuCVrdlUGmLXsUJcWmUbsioVBB26XHmkGrKS22tLL222Jee74t\\/kddAqhlKp7C64bqWNYoFfxKv1pIUXGnULKLcr1vtu7NLZaDTjbjLjTz22aeJa2POTukZirOAhutSdOCjkryKjUzMApKSkKnpedcQDra2slSVhWRStO4R8rN4w4nz2sl69q6gKSoEyc2KccjqA6iqe3LKR9XJJQUaua9X66hESnfLm8l+lBbdF2VYpq60C6HZ3D2GGpd1dvRAen8QT02hNwMxVJgjXKgnUzCS8myZTlLzWGGBpcLM3PLSNL3S7Jdmo77flTfieEd8UTk4tB2390lo04bTGqHED55lKlcgCHXAtWZuKo1XWKVZ7NxYLjLY2TKm280jtymaL2i7a+q7SNHnAa31B5pxL1Pwnw+pbgfZCi06HpegMKXMIQlSku621GRGZjXDcmL5pGsbvxQNMzAUo3JeqpIqEyohKj851JoKDymiBvAcWhWrzg9GV3So0bqUp5+u6Q+DEq+hK3HETeKllLn3UMgoWESprbk9MrSRqFtlp10r8wI1+GsT\\/AO0GpbhSvB\\/k4VGoqzANupq0vKEJKbApTS8H1QrJsEhtLiAUqJz6BJ3A2G0GnXTP4ow7TMgupApsm1YJtv7eflcth+cUHLy1jeZTafhPaSmDR5HDu2jLqeMqqmytt0Yy6nApEzsDKoldkVh51MwUZa21O0z1zDl3E\\/DhnLWvu0la5Vqhq4KXMZZZbzsZpwp+tuC9UqGeqDkqI7VW0\\/8AQ2opd8r0grFf2WyC\\/mp2qV4KS7kUhs0KmVDbZZ5L2JXsd+1DeqoR8FUeVD0Hqcl8DGk1F9jVylqdh9ifMqeKtTNLE0uy2acvVCioq8tQkBCkhRdGoXHPLm27zwQKB5M1TbbNgC9KYvqaCCWrHPK0CmNhIBOZSvRAWgm2U51JwLsykwUze1CgN5QSUN1OgSxGUG9m1VB5RIAACQMxKSka6CSe7jHheyCV3tRFJQQDsXXX1ZghOSEsNuKcBUrMqSkp1c1bkErjj5jHrCWWCCu8pZWsTkZemVqb+rvOsJSmPlvcSQV5E8BnkCIxc9yt+hpJupbl7kvipoLeuZiQsOrttIUpS0lkipGnvlxIAWopZU1quJKHlLC0J+Te5ZLRLaDpbo2MkyWy4UbC0LeBfKArVLXlF6S6U7YgFG2LISCnaBog6rC\\/K98ryaQTT9gFElllKMhqFAxesJJWCStCsQ0xSroGUJzoKVnOolJDcNGibFGlWf2kIcFzfzepU1W4J3KbkZhPEHiFagagmJSD2kRhGjIoud97ziSGaDcA1Much6lsgZ8ABrcBnl50Jf2R2E3\\/AM35v\\/0JV\\/8AqcRXf+7U6LP\\/AJA4\\/wD\\/ACWw6\\/2qx849y2GAgdcDOFGLrjIWrZOOostp1bYUdmpbSLneS24pGRUhL7qW1eaHVgBYxh5T3lwPrJRsbwS0AE+gcP1xpA+qn0TM4\\/zKJtqApVieAygJXKbBmQM+PJteY2uiabdN9PrBihqy7wASBfW2oNpYLmkhhQhGsmtVF0jfqNUWqBZGY35vS7Schxz1geOQ3xRrSRwpcCiqsVBkpJOTtEqZ1ubP6Bl8EZ79ZRSrpyzOcT7\\/ALtngR\\/glxb9dnf0jg\\/7tngR\\/glxb9dnf0jj3\\/3lPLmzhX4pME5AP2r6FnuzJtvucelwHW9gsDu0MICNgVrfhxPE\\/pdo7m4afuFl48U8+RiWN\\/ZHYTf\\/ADfm\\/wD0JV\\/+pxe1pE4RulQXcr0vqjMKeoVfIJ6BsaY6rMZfhJAyIzzO4RNv+7Z4Ef4JcW\\/XZ39I4+k\\/7tTos\\/8AkDj\\/AP8AJbDr\\/arAfKd8uGXUhS9jmCXQb+gmgVt1JsB9fzbH+dAubi6k5tQL5VWWiU2DPBQRjycRbLquabaOu63b0NIVuN8oOW+ttIlaMY94STSlJbvFlGonWImKXXpRJB3eYqbpbKVHPilOsvn6DHJN4z4XPN5pvWjjeU5POPMLOR\\/FeYQvLMjI5FJ3b9wiKZL8stonOtNuLoGNMqtYKlS79oWsXWid2o4qWvp9gkcRsn1p4DWzEfWSfK56G80620\\/Xr9pyFpUpUxPWJUXGWiBrBK005+oTGus+aNmw4nWy1ylPnh9vyuvK\\/lUD6Q2BUGaUkLKjT6Bi5AJSRlKUIxJU16DTRau0P7XYXTChRdijygGNo6WwSkDt6jTgPS5qXIS48TYZPzolONYo4cvZhN92klQTrZOV6msJGWWZCnplpBUd2SQrW35gEZGG1Rawru3XVV2sP7lExLIacNSTblZ20mCVNtrM0mZDkuFK1kIVmySsZZkxGgp3KkaDtRS0XsZJilvOvlkS1Sw7xOQtJKghDjsxKWfOSDLSiQdo5OANDznktJSTH3tK5QbQyrBSJTSBspkre2AFURW6ElLgSlesV1ykU9LbIC06sw4US5XrILuslwIyGvLk29yOf6e8mapONgnWXksYU1sAHU9pM0OqNLSR9VQFtFG5B0dOB9mE6kJldqNBXmsQhyqUF862sC2mfZUFam6VJSQNCN4O+mqaNGjFdSnF1vR\\/wGuQuOtPPOVLCnD2sla229iw44qboMyS4hlOo0pRKkt5to8wx1FXuTk0G7jK\\/nDRkwul9oCCKDRn7WAzdDqtn9zU5SNkrPMJ2Yb1WwWctkA0NX9F0sNGSsBl+j6ROCzzxCnmWkYo2ZK1BrYOlBfXJzFZYn5fVdGshxxlrWCkuJKkLQs9425jJJVhSG7PxVlao4pSkNotu+Wp9eulszSkoRS6s6oqDQ8pWkb0oBePm+dCFf8AtBpNvMrF\\/k31CQKLhx5VYamtEkZs6Kpg6nFvLf0kl9YuLkpzEQk7D8PVDKJDFeHakXCChBp0i7mzgEFJZqMyV57gpIQM1xa++O47i5HPQBrwdVJYRVm15h1Trq3rbxKxGB2j7qXlFqUrtyV2nMBAC22mJeTal22nFJaYJ2BZ6JuXkGdEeqhblv31jpbEwSottt3JZtZpjaS64vJUvUbF+cnFBJQ03\\/uugBpvN3auFbo7lk8XcTZEAMXvcK8iQPLKg7UTvVrDNU+JlRGv+MfqgtjzPMj6mR0icWZPIOXAxPoSBkieo1IXqkax+vLScrMK18wcluqUnVGrqc+xkfLs8meplDdb2TYppS3LF12RoOFZllpZAJJfla9Tp1SL5gFNyqlrUQVNAXUnUznk2PqzKZRhh4bgAJuSWobtEsyakBXMlwc8xMa67m+T30d1LjtmaUFSk3BkWZO5cK5WpJeOTSVJdqVLvilKlylflDgWmkzGaVMtBobJyZXjTdfIGaT1PDj1pYp4I3MhveGalUL1tqoTHnNpyZZTZ9bkNbWU6VmYqkujZtg66nHAzG9eQ0qr7YVq1Gj2xPtBIzLcrUJKYUfMOZcRUX2UDVCvNEp5ritYeYgoP2tO0tmyoJq1kqCQkaz1PriXFZgoGqJaZpyMs8lkEznEIQAfOWJfIeUf5FeICA9WarheYeISBP0bGLAQQE2zLkGKzTWQbWKlrS3bVRBIVEQn\\/JvqzVyzQkuAAkqkK00b8bhE7NJUSOCUt\\/8AdOsRVLu5HvT9tRLrzGDcjdsmxntJq0L\\/ALDqCyCGlJLNLn7gpNdmCS4pGqxSnXAph7bajQbcdxQvXQ80qsPis3ho540UOXSSTUH8OLsmKP5rhZ1UVmRpkzSHFa4HmNzq16rjLu9p5ouzkadpS4ezQCZ+RuWlrAGanpKUmWSSkjzVyk868dQjLz5ZsDXQPOOvs\\/uabjjhXVCAxeEhLqyyKKnLz1LyVlwW5UJaWaUd4GaFrRxGeaFZTqmzvky4qKfwa23YaZfeylqTn8UUGWmNLZkop1WRS6iomxVY5lAXVqgpEQio7C63KBRNLxGwBe6zIefMpO8XclGUoy621c13ZjrHnVTUpMSb7srOSz8nNMLLbsvMsuMPsuDeUutPAONqAIOSk+iG8ejXW7ewexYlkSty0PDXEuUKNRuUrlNte8ZYNpUpWqlioMVFrUClqWEhsgKcOfXixffJiaB2IPlBrWjbYdKefDhD1jfPeHIZWolQcZYsOrW3IpLTm9tpUq5LEEMuMrZGyiWnYa7Py6ZvDuLqPV5Z1JWy8WlIYWFBKm8szIv1JtaSFC60gC3pJQQbCDzmzipSy1NonGc6TYom2H5NY4G6QJggg6WO\\/jaIG6k57xx5x0\\/b7+3ikpIIKSN3R0d2US+b\\/wCQT0TrjExMWJfGMGHU64o7GVFYoN22\\/LawBSnyCsUFmvu6pGYLl1HME8d2zwdxE+T34t09U07hXpAYe3agKLkrK31bVxWHMbLerYOTNBcxAZcmGwUNNvFiUYmF5OralE5NJjU7sex3IZslOl6ihNznkJ2XX6IF7pamVSswq+4JSyVXFraiNBMYPxBL3Ikg+kfnS7zLl9+5BWl089G\\/HXSI7i0FB6uY+OeEVJz3jj7\\/ALY2cYjckVp8YdCafdwSfvelsa5FTw7uW2rsL5QMz5NQpeqS12rIBBTnbqAr6jesd0YE3zhXibhjOmnYkYeXzYM8l5TCpO9bTrtrTXlA1iprYVyRkXS8A24rUSPqoKohk\\/h+u0gk1OkVOQCb+nNSMwy0rLlzZXVoS0tIzJupKynXQ6XjRTEjOyhtNSkzL7gO2YcbBvusVpAN+BBIPCOuIIUUniR2nv8AHv4pxqSM4uN46t8oxYSWnLeOHOOj7ISUnMZcCPGUOu2EVJyO7gfGUeoV36jd39fD1w6hV9Dv+I+fXOGpHEHsMIEEH3Hph4pOe8cff9sIqSDu9RjKSbjv4wuGa05HMDcePV9kfXWLiRiLhdWW7kwzvu8MPbgZLZTWrKuas2vVMmV7VptU\\/RJySmVtoVmQ0txTe8+aczHyxHEHsIhBQyOXq7Iy5aYeYcQ6w64y82czbrS1tuIPNK0KSpJ3i4INjHqVFJCkkhSSCCCQQRqCCLEEcwQY3B4IcuVpy4TmSp933BaWOdvypbaVJ4l2+21X0Soe2rolbvtJ63qq\\/PrSVttz9yC5w2hWqZZ1LTKG9xeBPyg3RjvcyFMxxsO\\/MD6w+tlmZrEghGJlhSw8xDk1MT9FlKbecukrJe8klrGqYZZ3mdfcT9LDqUnI7uB9kJLGYz5x7osyhbYMeUIoSmsKqksi37FrKPpBKrZQAZlakz4ACbAInEpFzpcC28k8R1aUKUom1vNjKA3M\\/l02FgBmWe0SOFkOJsN24R6VGD2klgFpAyCqlgri9h\\/iSy2x5TNSlr3JTp6s01slsj54t5LzdeorgS62NjWKfJvDaNHZ5LGfeceXjSaxV6BUpSs0CrVGiVmnPJmadVqRPTdNqcjMAFKX5OekXWJuVeAKgHWXW16p4xs\\/wC5ZrTuwMMlT57EtjGe1pTZNqt7GiRdu2bUy2kNuhq9Zabpd\\/eULZ1UsrnrmqMoy8ht3yB0F9qYuvD\\/lD0uYyM4jo0zT3CQlU3TVpnZa5AJW5LulmZZRe4ytqnFaDfc2lcnjRpYSmelFNnS7ssoOJuQLktOFKkgdy3FW3A6CJ58ER7tHz5Qho4XwmQo+kDYF44IV15xhh+46LniNh8nWcLT09Mv0yVkLzpjSvon0yMvalwhhvatOVJ0y7Tk3uwwkx5wXx6oQubBnFGx8S6OlLRmJi0Lip1XmKYt0BSZetU2XeVUqFOFJTryFXk5KcbzycYSMgbsoeLsNYkQldErMlPKKQsy6HeznEJIBu7JPhubbGu9bKRcEX0MSmUqkhPAeazTTiiL9nmyOjndpeVyw55bciRHcMEEESOM+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOo8W8cMIcBrZXd+MeI9o4dW8kuoYnrqrUpTl1F9gNqdlKNILc+ca5UQlbbnzdR5WfnlBSS3L6uRLTz7Ms04\\/MOtMMNJK3XnnENNNoG9bjjhShCRvKlKAEJWtDaVOOLS22kXWtaglKRxKlKISB3kgR25DV55Euhbzy0NNNIU4444pLaEIbSSpa1EpSlKQkkknJPZmYjoaSnygrDW21z1A0WsNZ7EqqNqdZYxBxJRP2pZSXG1q2U3TrSlXGL0uGRfaAzbqs7YM42Vb23SFZ6BdIvT50sdKZyZlsXMXrhnbXmF5ow\\/ttwWlYTTaSvZNv2tQhJSVZdYDjrbE\\/cZrNVQhxxry8tnKKZxRt2wZQStimuO4knUnKEU0hEglV7WcqTiSytBG5cm3OJJtu1Ii8\\/i+mSuZEtnnnRcfkvQYBFrAvrBvfm024m19b6RL40jOVv0KtHhdQpLuI7eLF6SKXWxZ2D6Ja73G5tLeXk9RutuclrJpamX8mKhLO3A5WJIl5Jo7rrDzB0R6Q\\/L1aTGI3zhRcC7YtjAa3Xy+01WVBq\\/cRHpdaXWNp88VqRl7YpJmGVIeDVPtJ6o02ZCfJbgeLIfc0SJGQ6zx7oujnTEu3XHGIFOMSUy3h6RWCkM0nMiaKDb9sqTmabC+GaUVJpVpdHOET+LKrOFSEOiUaNwESpLaiOGZ7V4kcci20nflGlvvsRMUsSsXLhfurFO\\/rwxDuR8ulVZvK4arcU8226sOmWlXqpMzCpOSTkAxJSmwk5ZpDTUuy0yy02PhEJ5z6PHjvolOseocYWAzyAHUAIp+ZmX5l1x+YedmJh1WZ195xbrziiAMy3FlS1qIGqlKJ08IjSlKWoqUSpSjcqJJUSeJJ1JMXJSVnIenqHTDxKQgZD09Z6YohAQOknifHNC6E8FH0D493jPEJsL9GExVKct548w6O3x9l8EAGeQA6gBDJN9T+qCADPIAdQAhZKQB1858c0chSaPVa5UJWkUWmVCsVaec2MjTKVJTNQqE46QpWxlJOUadmX3CErXs2W1ryRnvAMbEMGuSi04cZhKzkthDNYdUGZU0Pn7FydasNloO7Ipdct2dbmb5eYDTm0MxI2pMtaiShLhfIYVsqZRKxWXC1SaZP1FQOVXmkq8+lBsCe0cQgttgZk3UtSUgEEkXAjIlpObnF9nKSr8yvS4ZaW4U33FWRKsotc5jZIsbkC5GuVtsr3ncnp6ez4w7AAGQ3ARJqwi5AG2ZQy0\\/jvjzWawv6NU1beFlClKFLNrABLaLuupNcfnGHHCEeZZ1LeDafonmnX9oztJwk5NbQnwZ8lftrAW0a7WZZA\\/74MQ2n8Raqt8K1xONovF2q0qmTSdXJt2i0ulpbyJabQpbxXZlJ2IYvqBQuouSFFZOpS+8JyaCSQLpZku1ZJt6VnJpojQGxKgmSymBa5NWVMCXkUGxs+52jtjbc2wHNeYcW2RY3tEKLDXAfGrGOZErhXhRiHiEvabJ1607RrlbkJUhWqVz1SkpJ2nU9pKskrmJ6aYYbX5q3QeOyLCrkTtNS\\/wDyeau6mWJg9THQl1a73uxiqVgy68svJ6NYzN1lM0EHXMpWJ2jrQAUvOMvJ2US46jf+G9lSzdPmbht+ksU9ltiXo9NUy65Jy8unUalWKPSm3nWGkJSG2WkyrTaUIISMkb+o67pT2lJ7RFCotYrbqc0pdmSxSJNauYocWZycI5iFyKDuAGe8jArp8nfZtmO0LaxSFzsv+30mUqUu5PAotnCqFRE1avAkoWgFISTcoALgBFm0HYbVap2am5Cs1AKtZ1EumnSS78POJr8mRqD6Myk\\/nHQ2jU5hfyA+EVGMrNYv4233ez6Al2Ypdj0Wi2JTVO5pPk7k5VVXpUpqUSSptbzJpMw+PpkeR\\/VGxDDHky9BzCgy71C0frQuGos7NSqpiKajiRMvPt\\/VmvIrznazRJOYBCHAKXSZBlp1O1ZZQ6d7CtaT1\\/VHWRSJai2+yoHUcalV1GdSVpy1g9UFuSi9TdqDyFPOVlYyEdJXZixcjslNVO8b8nJKlMJUubfqdbTSKLLoJyKn0F+TpjCd4AWUI3ZJz3ZGo6x5bPk5YSX5vgLZ3XMYzyFJTLzbtNlaZKPE5EI7Ko112frqVr0NvoZKiVAm6iQLjo3k6vS6Q9ON0OlNoTnWt8uVSbZAAUpZLgLKQkXJUmcFtRdKbRswbqmGOGtNaoknM2VZNMlAoMUOmJpNElmSrVK\\/JqNTksBOZA1y1KZ7hmMgMvgqxpKYY0vaIlJuq11balI1aVTHUNrXnqq1ZiqLpza0BQzLiC4hSDrtB0FBVoiv7lAtDnDZTzNdx5supTjOsDI2U5P4gvl5OsDLKdsqRrkpLPhaNRaJ2blUy6\\/NmlskExhHfnLZYGUcPs4e4W4kXvMtFYbdrszQrHo8ysK81TM63NXbVwwsb9eYoDL43pMsBviMzXldeVNjYFvZzsTkMNyLwAl56syFVn1pQpFkKl6rV38MUNzKSTnXT3W02QChKfr7x3D2x\\/DQy4gx5LzTrAsuVp0zLqKSgpuhUjS2qnPNngEdogkXte1xJoq2lm7rKRQ7PQhIGYfqtV11HozlJOVBQEneT5asqyO5OrrR1hU9JDFGohQlp+l0VKs9b5rpUstWod2oldVVU3EjnCg4Hc+CwMhERe9+Wp0hqyXWLHw\\/wwseUd19nMT0rXburUv\\/AL3s52Yq1Io6igZ65ftx4LUUlIbIUlWIl3coFpqYjuhicx0vuTUrXDUrYTNPsVxCFk+YlyxabQ554ozAQ\\/MPzD6f99194jU7TPLdx0FLxNtfZwdKLCs8rRaizQ5lhC8l20HBNKlkuJQEJSVPVgrylZ7RedZVqHtqWw+hC1JwrUK66nKUvTEmlyWWUnVS1VucLrdwcwCJEjd6KSNJp9zYrXUqUfqF03\\/VJWly7ec0\\/UbgXTKSwjNWbj6VTMrItZEj6VYB1dUZZZRiJemmboq2Kp5V0aQOF7c0hbvlMpS7sp901VpxIKnPKaZbLtaqjTpO8Jelgt05pQlSt0Q7qlScYL\\/m0T9yLvG4p0ghM9d1XnZiZCSolShMXDO7YJJKlDzjtAdZGtrb+SkcELrmNVU3N0mQSrihUw\\/MPpOY\\/AYl1MHdnmfKd54dKYk95K8pVH0zu0TbRX8TTRUVuhAL00gmwWEztWqddeUVkek4qVRewui6bxoZzyo\\/M0Kaw7g2iUtsCyfOJ1cwnS1iqWp0rTCkW\\/MDyrcFm2WJLl28rnoa22txuk3Bfd+FkE69pWLUZZDyw3tNm0u9X7OCiHB5OVK1GFr89twy5DxxoujlwLElVOJsrAK7a4jNQaeua9aNaiuLZStxilUa8wTvdJQH92ohIc+lUtrTXJYCSacjUbimnuOaJKRalchkQAHH35zPI+drbJOsPNyTxj6yTwYseV1dtLVCoav\\/ANeVB5Gtu4qEgJFPXkAB6CREip\\/k6bAKSEiZk8S4lKQLmfq82znKRvP0WigpuTqQnKm9tBreBVLym9oU2VGWqFMpnpFQTTqMw4E3N8qTVjUCbXsCok6m6tNM3bl5bPHmdLqbSwpwooDTiSltVcN23NNS4IWNoh2Tr1ryy3Uazamy5JLZ1kHXZcQrUT0DX+Vd02K+4tNNxAt+1UvkpTLW5h7aD2qlRcGyZcuSk3FNo81YShSH9ukNoUl3XClq+Lk7Ds6Ty8mtqkKKd4XMSbc4pKgUkKSucD60qBAIUFAjdqnzjH00tISsojUlZaWlU5ZBEuw2ykDccghpKBlmBmCeiJnJYF2L0i30fsqw9MZbBKqtLM1JRy2sVGqJqhUdLkkkk21vrEFnttO0SoX7TFmIUg6nzSoKpY1sd1NEum2twANNQALmOsappdacN5KWt3GvG\\/J05lVt1mt2wyM1Nr81VrIpDLKc2kAahQkJK2xkl11CutqpM6R94qLtw3TiTX1n8O5r5qs2s5LW+nW+eq4pw6rj7iwMs9ot0pG0LmeUQQOff7PHriuqkcw9O\\/3xK5SpUamW+hsIYYpQTbJ5pS5VjKBbd5ozKgbuAFhpuiHzmLsQVC\\/ntTqE4DYkTtRnZu50uT2rxBJtqeO7vjDuXwWvZ7LaN0uUzz\\/8In9YjJRG\\/wAlZmebzt2fmj8bdHNsYD3ArIzFYo7XDMS6J2ZGetwG0l5YqyTv\\/BzO7L8KMq4rkeg+oxmrxhWV\\/VVLNf2jAP8ArFORpzUJo\\/noGvBHeLfWKuXtMY1tYAKzBmLn3b80MUYgkcxDjlTPA8QWz+LrDLOOUZwEo6cvKK3VHd28ssyrGas96slomDkd\\/m5nI\\/hxkBkeg+oxXUV0e0d8Yi8UVtehnyP7RmWRy4pZB48+PhCDPTR3vHlolA5DgkH179fCOkGsDLTbyK5u4Hjq5EKmpFCdbdmoBumpUCMjkNdQAPnayglUPW8F7JbCddipu6pGZcqC07QBWeqrZNsjIgZHUCDlvSrW86O4cj0H1GDI9B9RjHVXqwvfUprn6LpR\\/wD0y84bMzM\\/vh0aj863Efo28Lbu6OqkYRWElQKqQ84Mj5i6nUwnPmJLc22vpy87Lm6iunCiwEKChb6SRvGtUqwtJPWhdRUgjqUCOEdmxbqpPN8PdDRq9VO+pz\\/LSbmAPYHAIQXpn98veHauC\\/jZWunHodefqYWH\\/wCTssP\\/AL5n\\/jNGLThfYvNb8t6Zie9\\/lXwjsQoHMcvbFuoR1+\\/t5hCRVamP\\/wDIz3rm3+7\\/ALTuH2Qnt5of1Z0\\/\\/wAizy779GOujhjYw427Lf5xPf8AW4p+plYv\\/k9Lf5xPf9ajsMgjiMvHN0xQpB4j088KFWqXGfnvVNv93\\/ad3uEAmn\\/znXfU4v4FUdbKwpsJWavmEZqO8Cp1kDMnMgJTUQAOgZAA8BDdWEdiKUSKS8gE7kpqVSKU7huzXNLUeH4SjvPr7OKOg+v7IsII4iHU1ep8KlPcrGbfPuLh9ohYmXjufd8O0Xfh334bxHUy8GbLWCEoqbRzz1kTxJGXEAOsuJyPWknryjj3sELWVrKZnq60TuSkTMi42nLnKV04uKB5xtBvO7zY7ogh9Ncq6d1QmT\\/bOFf\\/APa\\/XiYcE3Mj+ruetRI0tz0+evfHQjuBtJVrbGu1FvMZJ2svLPZEHfmEeT5g5bgNXLpMcU\\/gU4MzL3Kle\\/6r1JKCE7\\/w0VFesc\\/\\/ALGN3QMs8jlJB6j09\\/TCRSR2cxjIRiWtI\\/66pQ5LZl1e9TRPvhYnppO50+tKDutzTfhHR9JtnGG11IXaeKFaoamtUNqpV0XRQVNDYlgpbNNdzQEy6iwMuLBU2cknI9pUnHjTotZSF0vSExOqAby1U1LESrXG0AFtOAFi7JidZLYLKM0Kb1EoUtoJ2TryV82Ug9R8cYSIIORjEm5qSql\\/pWhYdq1xZQqVEkJu4Nrj8o1qD0Oe1ksU4gp39A1Wek9b2lZuZlhcAAH8g83qANDvjsGjcohyhtshtE5ektczDAASxWbHw9qKlJ1NyHJqg0iQqUwfO19o7OOPhYCVLKUqbHclD5Y3SloYbReeDuHFZZa3rmJah3vbM6+2FKUVLmHLgq8gFgJUErYpzbYQkeYspUpWKTjWe9O49HMe4+yG5BB38efPj6Yic\\/gHZZVf3Q2YYOBJJUql04URaid6s9LMsvMd5VmuSb3vrEyp+2PaTIW7DGFdWAAAiaqMxPJSE2sEpqC5xISLWsE2tpbhGym2eXAtl4ts3to+V+kKR5kxM2xfchXVLUlKApxun1a3LbLGa9sBLLqDykBKAZhaiooyVtXlgtD64VtorM1iTYm0KA47dFkmeaZ1nS2pSvuJqt3vrbQkbc6jKlqY+qgzP62GjeYkpObGU3KS00Mssphhp4apz3ZOoVu847uG89MfPzVkWlOZ7agU1JPEy7Akyc8sznJlg5nLjnnmSfwlZwuoeTxsQqYPZYexBQSoG6qNiOZmSlRIOZCa4mpITY6gFOXcLWAib07ymdpckU+dTkhVAnKcs\\/S5IXAIuCqnJpi1A21ObPxzjWJQtoacmiLfBbFC0hMNGlupCm2LkrqbKmHCpZbS03KXm3QZhb6lJ82XQyZhQ1F6mqpK15hWji3V5uVaqlk4jzVTpoWQiboF0mqUpw6mqQfI5yZkH8k79VYWAUo83dEJOawltGYz2LdQkM9bLyWeUsDMkj\\/w1E2SADlkVcBznzo4uTw1q9uTianaN7Vy355ojYzci7MyM4g+cBlPUydkn0eapQBSlXPuTrebFE+TDR6XMKnMDbV8X4SnAptbTsxJqcfztEqaC56hT1GcQUKOZDiWV5CSoN3JMTqS8qt6ZSlrEeDaPUW1ApWmWmH5RHpaEpanGKuki1roU6M1gM6dxnu0rSLxSphCXqxJ1hCdyW6tTJNW7d9Z6nop8yeBOup9ShrZAjzcuzaTpZVBAbTXbPk5jMJDz9Jqb0lqk\\/WLcpOS89rAk+YhU4nIH65yyiCZaukvpzYcFtVraQ94VZmXRsmZW6K0m92UsgAJaEniFT6\\/JNoShIQyhK8mE+a0pCRuyXtHlaNMO0NgxfmHdg4hSjeqZqbTQqhRK2+EpyURULWqztCYCx5y1C2nEjikIG6JXT5LyxsF5FYR25y2K5dq3ZSdcq6avOuISb9kqXxxTJ9htKgMgLdSS4gEJStoJQqJFLbXthteIRV8JzlFdXcqdlpVlDCSQPSz0idl5lSgSbgyJBIBOa5ETa6RpN4a1AAVH57oLmWSlztOVNspUAclNrpTs++tIz4qlmlHIkNkkKjsdq7sM76knqOqt2lcUnPthmaotRep80idaK0qDczSKkdaYa1w2Sh2VcbCxrblZZw9rK5bXCyaW3L4m4K4g2bMeahxdrVaiXnLoVwLzjVXFizjLRWCpSWmpx1tO5HlChGadgcpBoY4hGXakca6DbVQfCNpIX\\/J1Wxkyql79SYq9xSEjbZUnLJbktWphhJz+lyyiaSXlYeVnghARtA2NUzFUkyAX52j02oMTK2wLuLeqeHp3EFEaQoZcixSm20kKzBd0pTu2aNsZxJ+4OO2pB526W5aozTLCVFVglKJSrsU6bdUbkFAfWpQ3WFydy+J\\/JvaDuLiZg3To34cSM5MoOtVLEpz2G1UDytYonVzlgTNtKnJlC1JcK6imdaf1AzNsvsZsxrixS+T8aPdwh+awlxhxMw1nn1qWmSuaRoeI9vy\\/HVak5VAsquIa3fXnbjqThzzBB+iPeti4uTU7T2axhziMmqUXIJZnbWuZqsUV3NKVpQlVOnJumvAoWhaUK1gAUlPNn33Q9JfEellpFSNJuFpJyWahIJlZpaMyQBMU1Uk2lxO5JW5KvqWAVr11+eZNR\\/Ll2BYmcErtE2Z17CNQWQiZmZeRkazLMKJCVpeqFOVR69dKnHFhKKQtXoEgJdUhs6qr+TyuaR28gugVdpxOZDjYXTZl4EXSpDjPaMKBAAzKnRYmwJTcxHmxY5CDTHsnyibw7qOGuMlORrqlZWh3GbPuZ1Kc\\/8Awil3uxR6Cwte7ZtS12z3nZgndmvWPivotaRuB23Vi5gliXYckw4W1VquWnVmrbcWFBChK3SxLP25O6qlJBMnVH962d+ToidhRNKy35nUauC3KrSlE5KmKbMMVWWHOXFtvJpsw2jh5raJlxPDz8847kouLGG10tpl5G6KQpybBaVIVVwU197XSpKpcytTRLl85FSS3L7ZDgB2alo43FQKx5Nu0jsxgXavR5Wfft2FLn6imRnFKUUhCGaJiVulVp9QUtCDkWsC4BNyFGoK9sOrFLzLcplZkUpuS6llNUkkAHQl6WK0pFgfrzN8uukebWRkcoRWnLeOB98egpi7yemhbjn5TM35o+4euVGdZXr3HadOcsK4HXHgpaJ16t2NMUCcqUw2pQW2qpPVBleQQ+y80CydVGMfyezCispmpzArG+8rHnChx5mgYi0imXzRHX\\/P1ZRis0UWnWKTJk7PKYmpS5ppsod3Oh9Ox31T2K4okruU2Yp9ZatdKWnfM5lQ3g9lNESwukgjLOLNzlF95rObwRWJcFTHm86kcGnOydsN90PhCb7yEpcWTaw1IBieLGe8cR7vshFQ1hlzjh3enxnG2DGfkZdO3CFM5PU\\/DqlYw0GUJJq+EVeauGbcaVqlrUtKsS9AveaeIOTrdOtuossLafBe2Iaed1i3VZ922LWpm3L1ta4rPuCS\\/wDDKFdVEqVArUnmSMpil1eVk55je2tOTrKc9QjKK6qVBrVFXlqtMnqeb2SuYlnUMuHT9qfy9i6NQLtrWm+hIMRmZkpySVlm5V+XN7DtmlthW\\/6qlABQNjYpJBAJBj5EjMEEdRhAjLcYeLHP6\\/Hj2wgtOYz5x7o14NxfoRjd3s8fv+wQ0UnI9R4QitP4XoPw8d0OyMwR0wgRxB7DCgbEH2+EOpNx3jrr2w1UMx1jf9kfQWpeF22JXZK6LHui47MualuF2mXHalcqdu12nu5EbSRrFHmZSflHMhkVS8y1u4GOCUMiR6uyEFjI7uB8EePRGU06tpaHWlLbcQQtC0KKFoUDcKSpNlJUDqFJIIOt4UCQQQSCCCCDYgjUEEbiDxEbqtHPl3dMvBpUjSsTn7e0irRllNtrlr5YRQL4Zk0L1ltU\\/EC3pRDz8y79IFT93UG8ZlIcAB2LLTY36aN3LfaFOOnzfR7xuSpaPl6TIaaco+KjbLFqPTbiloUmmYi0zbW2iTZBb15u6hZz7m1yZlHEtOEQX4ItfDu2LGlCDbbk+K1Jpygy1YzTLiUjeG51KkToVbRPavvNJFrNHjvpLElVksqe385aTp2czd3TQWS5cOpsNEgLyj9EgWj1FqRWqPcdJka5b9WptcotVlWpyl1mjz8pVKVUpN0a7M3JVCTcflZyVeR5zUzLuracSBqqjmo81vALS+0l9F2pIqeBWMN4WI15V5ZN27KzyapZlVfzyWusWRW2qjatUdWjzBMzlIdmmk57F9l36QSANGP5RaP9zrd0t8IzvWhh7EzBw7g2UIaRMVnDyv1DNSg8nyioz9Duo\\/QuO\\/Ntrl1lqWmL8w3tywrWOzYq6X8PTa7C80fOacpVhoieZQlTYNySqal5dpKQPypMS+RxbITACJpC5JzQFRu6wSbAWcSM6bnU52wlN9VkC4lSQRjdgBpZ6OWlLRfnvAfF20cQENy7c1UKLT53yG7qG04U6puCyqw3Trroba3NdpDlTo0ozMrQ4JV54JJjJGLjlpqWnWW5mTmGJqWdTmamJZ1t9lxPNDrSlIWO9KiIlDbrTyEuMuIdbVqlba0rQocwpJKT6jBBBBD8LgggggggggggggggggggggggggggggggggggggggggggggggggggggggggjXHpYcqRojaJLVUpN1X41f2JUgt+XThXhm5JXNdLFQaStJlbmm25tm37P2LxaTNtXFVZOrol3dtTqJU3GS0NfU6tTKLKLnqtPytOlG75pibeQy3msSEIK1AuOKAORpsKcWRZCSbAsTE1LyjZdmXm2Gx+c4oJueSRvUo8EpBUToAY2ORhnpMae+ivolykwMYMU6PK3U2wp6Vw5tlabnxEn1Flt9hr7lqWtcxR0TjbqFylRuZ+g0V5JIFUSRuioaVvLc6WGP4qlt4YzjWjnhzPIclfm6xqg7NYgz8moq\\/wDktiS7LSNVk3lA5n7jZG0yG\\/1tMPT7Rdcd08Tc5O1Kcm6pU5ybqFRn5h6cnp6dmHpudnJqYcLz81Nzcwp1+YmH3lKdefecU646vXcVnHPmK\\/KEp8qXJXCNPNSeF0pqdSS5LySVa+kzJpKJuYTYaKeXJWP5jibXhVRxq2nM3TGC4dR5xMApb8UMghahxBcU2QRq2REgfSg5frGu\\/jU7a0ZLNkMFrZeccYl73uVMhd2Jc5K5OI8pl6e+y\\/ZtpuTDTqQ9KIlrunJN5pLshcLK8wnRhf8AiTiFivc07eWJ17XTf111FRM5cF3VyoV2qOIU444JdE1Un33GJNkuqTKyLBalJJv6KWYZZGzHwqBz+rx454XQMzmeA9\\/j4c0c1YkxriXFbpdrtWmptsKK25QKDMiyb+j2MkyG5dBSPRDnZl5SQntHVkXMJnalPVBeecmXHrElKCcrSL\\/oNJytpNtCQnMRa5MXpGQ6zv8AsMLITzn0d8WAZkD19kL8Ihq1H1n3DrT7Y1y1WFhvPugioGZyHPFIVQMhnzn3QkegnvPDrlx7\\/GGouAyGXgw7aRqjWPE8OofbzxfIyc1UJtiTkpV+dm5p5tiVlJVl2YmpqYcUltlhhhkOPPPOLUlLbTaFLWrpGUbM9H7kkdNHHkSNScw+RhHaM4thX3T4vvTVpurlXNVS35G0Uyk7es6pcsoPyLjtvydMnS4yfnZpl3atbCm0WrVl\\/wA3pVPm6g7pm83YWtDd7HM87bsmU6j03loTcgE3IvkyslNzznZSks\\/Muaeiy2py1zYFZSCEJ\\/jKISOJA1jWilOZ38B7+jx8Y+ltWz7svqtylt2Pa9x3lcU6QmToNrUOpXDWpsgpSBKUykS03PTHnOtoAaYWddaRvJAiWFgJyEOjfYgp9Wxvu27cb66yUuTFFlnHMP7BU4pOapddOoc6\\/d0+Jd4+ZMm8JFidS0DN0dhp92UG22x8M8DNHi3l0vD+y8OsJrfATt0UCkUS2BUFtgJS7PzUuzLzdYnlDVzmJ5+cnHVrzUtxYBNn0\\/Y5UG5dyo4rrNNw7TmGu2mVLeafXLtJCVLVMzC3GafKoSN7pmn0JsbpKRE2pez2rTzjaZhaJcuEBMuykzk2tRt6CW2j2VzewKXVqBBJbNrGI9gfyLumbiwmVqF3UG3cD7efzc8sxHq2tcTrGQ86Us+3G6xV5eaLhyErcq7ZWUIdc2mRYD24PBDkJtGOxRKVDGG671xtrLWSpmniYOHlkukAEtikW9OTV0q1VgoUtV77B9BH6zZ3xs1uXSUsukbZmhSs\\/c0ygrTrtD5tpqlJOqQZuaaXMqTmCULZkHmXE70OnIR0HcmkRiBWi41TXpS2pQq3IpjCXJtSBuKXahN+UOa2tn58oxJ5HIZEa+0rvEe3fyU9lxdaTVXdo9bllEGVobQxE0V2G+eWqQwipGdNldnNvzDdzdtQAEXlhnyfqnNdm67SSwhVj51X3eyG9JNqe2gu2N7pDsoQR6Jc+sYycw9wZwD0eKKZbDjD3DjCmlpZ2E1OUajUWgTU8hGStarV1TbdTrD4AJ29VnpuaXqjN4gGGtwaROHdF125GbnbimkZgN0qVUJULyGWtOzplpdbYG5Tkr5YQTqoQrflqmxi0kcJ8LAuq41Yv2xbM2tlc00xdl0MOXDUGcwSqm0NcxMXBVwScy1TJCaUQScst41dYs8tJo92mJuSwos69MWai0t1EvUZppNg2nMgD6N9uerEtO3QrNWStlM2fJrUgAF1ClZJquc8sLbnj9HmGxLY9L0SlquzL1urMv1VDaQSkOMzTiaFhiQdBsoMTKqm2kIVqsnMLJdwbs0wUgJxfjCUQ6yATSpBTUs4kEA5fMJQTlTcRvAW01L3O8J3GRbcGlFdc6HG7fpFLobR1gl+aK6vPJT+CtKlCUkmyRnrIclHtXcCvPOMfb1xarjtOnqtfl+LkaFLtqVUZmsVmWolvSzaiElc2hTkhRpdBJCFLcaQklWzzI3REjxV5X3Szv4zEpZ85aOEVIcC2kN2hQm6pXVMOKOQmq9dhrakzQSdQTlGkKGsDz0Ntr86MALpvXGLGmqCp3pdd\\/YlVNK1qROXLWq1cglNYBBQy9UpmYYp7IQAhDTRlmEJ1WkJQkJREJqOyzykNqAU9tc20TVMpj\\/pTNEps4+7KZCU5mn6LSDQcMtqIBSl1C50JCipSV3UhWim9t2zbDIUjB2DFz8w3oioVAMyKL29FxE1Mio1NxKTYqQ4iVKiCApOixLQxO5SnQ1wuE1LzeLdNvSsSpIFGw1k5u9lzK8s1pYrlMR9yKVIJ1VJm7jllA6yfrpVq69MSuXEpzZmJXB3AucmCSoSdexKuGXktRIJCfKLTtZuoFxSgdYlq9Gg3qlJDuuFt6SaVgzdM5qrqLsjSGjkVJde8smgkniGZXXYO4kkKm2iNyTzlPZdKwStyVCV1OcqFVWMs0BSZCWX\\/wDcmNeYTmecTm4fxoz6J5N+w\\/DQQ5VV1fGE2iylCdn3W5RTgy6tS9HTTmS3cXDM1NzYNyFqcG6sq\\/5SmOaiVokZunUNlVwEUqRRMPlGosuaqJnBnIOrkumWOgKAjW\\/dWJHKm6ZuIiphpjEWQw7pkwV50rDe3abQgyFBQSJau1IVu72EtpUpKA3cg+sFr13UNqRh\\/XKljFivPiq3XWb+v2fWpTgq121mtVtYU5mpZFSr82+lO0J1iA\\/5wV0Zxk9S7TtujanzZRKdLOIy1XhLIdmgBwzm3w5NK5zmp4nPM9UfTJRlvPH3fb464talOYRwsgN4QwXQqJlTkD8tT5OUmFiwF3nJVlMw8ojRS3Ztxaha6jFNVrHWIa+sqq1WqtVJVmAqVQmZltBvcBthbimmkgk5UtBCU\\/mgRifTMEbqmwlVQfptKQQCpDjy5yZSegNyiVy6st+f68Tv1ctbztX7+nYE0NgpVU6vUqgpORKJZuXp7KjwyUFJnXtUfuH0Kz87PmV3pBD8ximtTFwJkS6T+bLtoR7FqC3R6nO\\/fEYXPzS72cyC+5CQPYTdX\\/mtePh6dhtZFM1Szb8m+4nLNyf2lRKiPwiidcfZBPQhtCeqPspaUlZRGyk5ZiVaHBqWZbYQOOWSG0pSBluO45Z88OQgnju98KAAbhGimJ2ZmDd+ZemFXvd11xwX\\/wC+o+oDdGEt5a\\/rOLcVzUpSuX6RO\\/kDpFgR0+r7YUi4IJ47u3j6v0QqEgcOPTz+uMQknfCMqlaqNu7rd69YSCCert7oUCAOvt7oUCSerti8IA47+3u\\/TCCoDf7OMKCQOFz9\\/s+3lCQB5h6hF+orqHjqzhWCEFw8APXr8o9JA3kd0WbMc5Pu74u1UjmHv98VghJUo8T8PhCStPefV87QQQQR5Hnad3v9sEEVyPQfUYMj0H1GCPO0PIddHoa0giuR6D6jFII97Q8uur9bzIHiM4pqpPMPd7orBBcjcSIO0HEH4\\/KLNmOYn390WlBHDI+Ovd7YVghQWod\\/jCgoHcfV17NIbkHnHrEWlAPV2d0OosKBzbvbCwscdPh11ePSAd4B8YaFBHX2d0W5A8RnDopI6+yLCkHjx6ef1wsG+oMJKOINuue\\/4w0Ujo9X2xYQRxEOSgjhv9\\/q\\/TFhAO4wsLI36j39eMeZlJ0UPn6juMIQRepBHDePbFkOAgi4hYIIBG7l1yhIoy+rw6O6EyAdxHeIcxapIO\\/gfHGPY9hmpJT2dPf0QitsL38Fcx74eEZbj+n7ISUnLeOHu8eOt1K76Hfw7\\/vgBtqI40ggkKGR58\\/G\\/wBEUh6tAWOvmPjmhmpJSSDDgJB+I5w7cLFjoetfDu\\/XFICM9xggh4EEXENkEGxhm43qHMfVPDq6vthFSc+0eMo5EgEZHeDDNaCg9IPA+OeHkKvod\\/DvhxCr6Hfw7446ZlZWbRs5qXYmWx\\/e5hlt5Ge7PzHUqA6zlvPs+VnrBtOe1tpR5eXWreFySnZMpJ50ty7iGDx3BTSkjmGUfaLTzj0+PHenGSzMzLBBZfeZI\\/rbi0XOh\\/NKQRz0sfdDqVrR9Vak\\/wBqoj4GOuKbZVTtSoprFiXrdVnVVrezUqPUpqRnmSMzqtTtImKZONp5wdsojrjKKx9NzTvwu2SKbjEvESlMlBXSsQZWm3Y7Nho+aJis12VbudvMFSFiVutgvJOTi1KQ0pHUZGYy6e\\/j6OMIkEbj+nrhiqSlKxE12OI6HQsRNhOUJrdIkKipA0sWnX2C+yob0rbdQpB1QpKtY39IxZiSgudpRq3U6au+YmRnZmUzHjn83da7QEeipK8yVJJBBBjZhYfLSXnSA1K43aPLD6AU+U3BhzWp6lsMjg4Ze3rkZrbEyVZ5oBvOWS3kEq2oc2iM8sMeVL0NMSthLv4hTuG1UmnEIbpWJtCmLeCCvIa79fp663Zsq2gq1FrmLma1SFrI2Sdcx0nUap1hwJ9R9EfO1C26HUgpU5SpJ1Zz1nQyGX1c5JmGNm8SOP7J64qKu+Txsir2dTFGquFplZKu3w7VnXGC4dxNOrKalLoauNWpZcqCLhKkE5ouGg+UntFpJQiemJGusJsMlTkmw5k4gTEiZGYUvW6XH3XyDa4UkZYmxYeYwCoU1iuYX4kylZoK1rSzUbPueTrtBecOTqk69LnZ2lTGYcDgQ4HQkrDhAKgDkfQNJy+KaEt1yTpdxsAJCnFtGlz6sswf1xIpVIoz4qHzao555jMZHz\\/KFQqzZdVauDDi97ww\\/rzCkql6tbNbqFLnGC2SUFmcpkzT6gnI55frw7ubcSczcOeUV04sLFyzM7eNu4zUKWAbFKv+kS0xUSwElCya\\/Sl27cj81kdo27UK5VztW0azLyStp3TUrZntw2bFLmx\\/bhPtSbAC2qBWJidpsnZKUpQ0mlTpruFpt1KUpQlcyzJt5RYBCQlJtCS2\\/wCzrE1m8aYLMo+5ZK5+RDE6QTbM4t+1OqEu3qSUsOzaxYfXJ9GdPb+ktYNW2bVXRVLbmFEJKpyW8tkApRVlqTVPDr+QI891+Sl2k6wIVqBa0fX3VZOCOPtC+ab2tLDTF638lE065qFbt5SUqt3IFbctVJWfMhNp3lC0NsTTS0BaFNusjOJLhpy0eGc4uVp+OOEV74bT7hQyqtWy4xelu62f0k3MMTSLerklL6u8MU+SuJ5J8wLXnrDZtg5pZYAYyTEq9g\\/jNaVfrLiS9LUqRrDtAvFtsjNTqbWrKKPdcslBJ13HKa0lJ81Z1gM7KkPK88ojZ2gS+2LZPJYrorYyTNdpLK6WVtEpC3X6pS0VzC7voXWmXTJU0OJCkLW16S0SdjDGyrGqbYRxjLMzD4GSlzy0OrUokZW0U+o+ZVJQvopYVMpGihmBTn7Vxz5CnQ2xMROz+GpvPAa4ZgOusLtSrP3TaPlLyf2WetS8H6hNmWQfPbkqFc9tS7WWzaDbWqgaZ8eeQe0vsMfLKphTP2bj\\/bsuHHGWrenW7Mvcy7JOu9M2pdc23SlOKZycZk6JeFfn317VlqWce2HlEiW3MfcR7fKG3qm1cEokozlq8z5W4EgnW1aiyuXqBcUncC\\/MPoSsBws\\/XC+\\/ba0obXnw0xc1Jn6A8QAqblcqtTxkM9dZbSzUG8xvDbclNFOWRJzCjbGGfKR8lbaYptmoTc1s2rUxZOSuS30LKhy6UrUKrIrn8MJReyw9UVybi0nMptKu0SiA4k8n+py\\/aOs0tqbQNfOKC8A6BvSDTnUIUVH85LMq7Y6BZuDHnu4j4VYmYRV9y18U8P7yw7uBsu\\/7j3pbVXtuoOJaKEuOyzFWk5RU1KnWbWzNyoelZhp5p5p11l5pSuvVjn6ePwj0sa3SMHsd7Xmrduei2Jijas4P17btzUikXPTVHVKAubotZlZoSswhDig2p6Vbeb1wUKTmBGqLSB5CbQ7xWE3U8LXLr0fLmmC84lVqzjl1WS7NOKBcenLNuiddmWW0ZZy8nbVz2xJM63\\/g+9OpbEzsmXUZNqrYNxDS8SUyZQHZV1qYYUh9uwF5aflHJinzYJtZztZZFtCbp9Kjans\\/qsg642wrtHGiQuVmm1SU2g\\/oFDv5PMBa5Wpm51yxCkWMxnzj3QioZgj1ePZG47SF5EbTSwWRO1izKDR8frUlQt4T2GMw8u6m5VAcIM1YNYRJVyanDswBI2qu61kvNaql5PbLUdcVt3DaNaqFu3VQqzbNwUp4y1ToVw0ydotZpswkDWl5+mVFmWnZJ9I+s1MsNuAZgjprip0Gs0NzsatTZuRVmKUKfaIZcI1IamEFbD3E3adWLa3iHzUnNySw3Nyz0uo3y9qgpSu1j6C7ZHBr9ZClDQ6x83BF6xkc+nx9vpiyNcg2NuB3eMY0EMnE6qyOY7x2H7c4ewk8nWRmOKd\\/Xlz\\/AAJ7IdhSTY+OkObfuW5LNrlOue0bgrdq3HSJhE7Sbgtuq1ChVqlzbZGpNU6q0uYlp+RmknLVflX2nATmDnvjdnot8vjpX4L\\/ADbb+N8pTNJGxpZbDLk1cDzVtYnSMmkto1pS9aZIvyldW0navuKu2hVmq1F9SGl3HJNALRo1cTrJI5+I7Rw9fCGUSSgYpr+G3u3otUmpFRUlTrTbmaVfI3ecSjgXLP6XA7VpZSCcpSbGMuWnZuQcC5WYcZJ35Feiq36bZuhduAWlQ3er0LtFLlVdDXS4NMo1l4kNWRiNUVssIwsxR8ls+75iefSNnJ0B5+dmbcu59xxLgalrXrlWqQbb205TpLaNJjZFHlU+che4lKkncQSCCOBBBz6++NpeiXyw+mZop\\/NtARegxlwzkGmZJGHuLb9QuBun06X81DFrXYJpF1275MwSxT5MVGo25JN7EKtx9tptpPQ2F9vDTvZy2Kqf2KjYfSdMSpbWthmmJFxSnUD85a5Z125NkSqEiJlIYu+qioM34ecS49hWyTrzUptY\\/itcI9AuCNPGiRy12h1pPOUm2bmuB3R+xSqCWmfuPxRnJKWtuoVB0EeTWviSlMpbdUStamWJOXrzdpVypzToZkaDMEb9wiFodQlaFJWhaUrCkKCklKhmCCNxSRwPBQ6QYvqk1qlVyWE5SJ+Wn5c2BXLupWW1EBWR5vRxhwA6tPIbcTxSImMtNy0432sq828jS5QdUk7gtBsttRt9VaUq7ovgggjaRkQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRH65ejS9uTBvCfD3AXDS7qta97YvT9Qr921K3KtUKPW5HDO3m1U9VMXOU56UmWJW9a\\/PCUdDcwpE5TLartNm2SxN74d6c1KUpSipRJJKjmVKO8lRJJJ5+PPGdXKU6SX9lPpi4uYj0+d8ts6kVb9T7DpTa1LlfuHsdx+k06ekipx0ol7kqSatd+zzCUTFxTGTTIOxGDCRkO3fHz72pYoXirGNUmm3lOU6SeVTqYgLKmhLylmVvti9gJx9Dk1mABKXEJJOQRTFdqBqNSmXQsqZQstS4vdIabskKTroHCFOnvXuG4XpGscubn9HEfAw4AzIHTFiBkO33c3fC6BxPT49\\/uitVG57hu+2NNF4HADsELpGQHw6emLEDfmewe72cP0Qu2hS1pSlJUSQAAMySdwAAG8k7ukwyrU21038dSQLeP3iDr2xcgZDPp3+jm8dcXxsw0aeSc0v9I75trH3EqwisGeLLwvXFZqdtwzEi4naomaHaRl13bWkTDGTlOnE0mSoVQLjI+fWGFF5qQTo38inom4MeRVnEqWqOkLeUuEuLfviXRTrDlpkKaUHJDD+nzD8pNtFCVMuMXXVrplng8t0S7JDGxmdC2dYkrikPCWFOlFgKE1UQqXCkEA5mmMqphy6TmQrskNK0PapBjfU3ClaqpS43LebS67HzibuygggWKEEF50EHRSGy2SLFabxFNwI0VNITSXqvzXgrhTdl7oQ+GZ2uykiKfaNJd3Et1m76u5T7YpTobO1blp2qtTbzYIlZZ48N7ejxyAUw4uRrmk\\/i0hhv6F53D\\/CJJcmXFEhwS9Sv24qfsWClSUy8\\/KUi1ZlTgW75BcDP0T5kQTtzYd4Y0mUoqHaFbdOpcsiWpds0OSlpVMpKIzLLEhQqWyhMnLaxOz2cuzKIJJJTvjoa6dJSbd2kvaVGRKNb0pqVY1XpnLNWS2qew4JdlWQARt5iaSrWyUz5sO4nxLsG2PBf4dYtlq1XWQFDD8iTP1EujVKF0WmuOrlO01CV1uaYk12N1psYujCexKdqnZupkZmoIOX9lTd5Clp1FygqIcmMqj6SWnHyob2QLg\\/QYH6IWjBouU1tzCfCmzLNm5SW2c3es\\/LJq15TCA0EvuT173A7PV4MTCto47KM1OXpja3XfJ5JlrNmPs7mx+sS3ypmQmXrlnEZhKKQhJk0Hzz59RfLcsts5Z60p5afOb8wDaamvzFDGSm0SlP3Xi5iPSbet+SWC9VryuGn2\\/QJRxQOybaVUJmQpUu88fqNS6UOOuZpQlahGoPHDlmtHHD7yyl4S0W4sbK+yVttT0q29ZtjodSChwOV2tyTldm1tPAkGmWtN0+cbStTVaQhTTq6OqPlcbT8bldD2AbLRS6e2ssorlWlW5xTAWQUK7BlUphmjPC4Jbnp6rNK9OyTYGLq\\/AbAWBpZtzGmJJGTASFopMhlli4ABfs5ZlDtTnEaWK5aVYIunMoEi+\\/m5tIe+K2XGaQZS2ZNas8pJPlVQUklQKXJ+aaKQQSCHJOVlHARkFERhPjTpNYNYPNrrON2L9s2zOusmZTLXFXFVC6qiyXFEvU63JZVRuirNhwr1jTqbMpQVEq1d0RVcbuVQ0t8YzOU+RvJjCe2pkLb+Y8LZd+hTpYW2WgJi7X5ieu0vKbUrbmRrFNk3XFqWiQa1W0N4HS1Gu6856YqWwqtZnJ99b07Wak+68ZmYcObz83VJ9zOYmFHNTinHnH3CSUoUrKIPN7Ddqe0h5uq7c9qtQm2AsPfQ0nNmbYllL1UlhLqZTD1HdFyFCnUmbYVcAKsBEZqW3zCuHG3JXAOEmUkAt\\/SlVCZRtdrBKlMtLcn5xtVgQZmflHQBYoBOki3GrltcL6B5VS8CMNq7iDPNh1lu6L0e+5C2EOBeTU3J0ZhE9cdYlFpGsZefFpTKVKGeWpqq1S4xcprpgYxeVSkxiSvDmgzSiTb2FMs5ZrLSVILbjRr7U1O3pMMOIOq9LTVzvyiwVZS5354+0XBRxQQ7X6qGhuK5OmIK1kHfkqcmEhCVgbiESrqcydVe7zu16PY1rUPUVI0iWU+jIiam0+WTOsngtLsztNirPefJ0spO7zd0WDh7ZjsbwP2aqThaWrdRZsRUqygVWYLqLWdSufSZSWcFhlcp0kwBqRYqJNGYn2143xEXW5vEE2zLOXHmFHP0XJhB3trVLFD8y2SSSJp+aJ0BNkpAxflLZvO7JpyoeRVSovzrhffq1TW4BNOKy13nqhPuJM0sDipLjzquCQTkI7IpGCcyoocrlZbZTkCuWpjRdXv36vlUylttCk8DlKvJz+qVJA1shYqAScufhl19ETebxXUHE9nKpZkkABKQ0gOLSkWATmcBQAALDI0ggbjuirF1GYdJIs2k3JI9JRJNySpXvIA193xNHw4tGlFBZpTU5MJyPlFTJnlkgkheydzlUKTxCmpZsg\\/ugmOwGWUMoS22lKEpSEpShISlIAyCUpACUpAyyAAEVbQED90ePcOqF0pz3nh7\\/HjqjUxNzEyrPMvvPq4F1xThHcnMSAO4WAHdGvcdW4SVLUrXeoknhz4ch8hYSnPeeHv+yFQCeG8+N5gAzOXOfGZyhZKQn4mMIkk\\/AcobgSnLt5zF0EVAJ4CPI8vxuLdW1igGe4QqlGW87z7IuAAGQhRKc+O4e+GlLJ0Gg+MNlRVonQfZ38h1rFoBPDx2wqEgdZ8cIuA5gPQIVCBxPq6O3phskDfCwkDvPPrl7YTCSrs6+BhUJA6z093RF0ENFZO7T4+39UBUBv9kEEABO4DM9AhZLKjvUdXq4nuHt7ITDZWTu0+Pt\\/VCMXJQpXAHt5vXwh2ltCeAzPSd\\/2eqL8ieAzghMNgwedQHYCfflCgZQOOZ7T3ZQ41FdQ8dWcV2Y5yfd3wkqSOPsghEISOCR6ouhbVSOb4++K5AcAB6I87QcAevbBCEEOII87Tu9\\/3QQ3ghxFMgeIB9EHad3v+6CG2oj8VPqEWFlB4ZjsPfnDvVSeb4e6LS2OYn07+6PQscbiCGRYPMoHtBHuzhIoUnik+8esd8cjqK6j468osyI4jKFAg7iII4+CHqm0K4jI9I3fZ64QUyofVIV1cD7d3tj2PQSNx9XCEYtKQeo9Pf0xcQRuIyPQYIASN0LCxx05Hq8IFJT2dXARYUg9R8cYdRYUDiPV09nRDoWDv0Pu+6F6EcxDMgjjCakZ7xuPsh2RzEegwkpOXDePd2w4CQbiEFJTqnXu639eMNCMtxghcpB4+uESCOIh1KgfHl8o9CgrkFde7u\\/XFpAI9x6IRIIORheKEAjIwqFwzUnLeOHu+yEVoCx18x8c0PCCDkYQUnLfze77OvwXEqvod\\/A8\\/v8Aj47wG2ojjiCCQRvG7Lx08YpDxxGuN2WsOB+HphmcxmDzHeOsQ6k2Pdxh3RYtuI69h93sgi1SQsZH0HnBi6CHweI9UNag8iIYKSUkgwitORzHDmHR1RyDqNYZj6w9o6O6GZGYI6YeSbjvGh67\\/drDyTcd43\\/OEO2LVDMdY8ZReQQcvBHgRSFA2N+UKhsoBQKTz7vHZxhkpJSSD+kZ8fTlnHIrGRz5j7\\/Hxhs8jMaw4jj1j7PdnD4NwDzg6EceoZHqPjKLYXUMwfG+EOEOg5k2O8dA\\/P74ISeabdbUhxCHEKGSkLSlSFJzzIUlQKVDnyI4x8jPWVb86oOpk\\/IJgELbmKasyi21pOaVoQgGXCkkAhWwKgQd\\/MPs4RUMj1HhD0vMvsE9i840R+gtSb20soAgKHMKBvuIh9pxafqqUkjUFJI+HLrdHcGGOlppg4IJl5Sw8b6zXrfldk23aOJLTN50hMpLg7KnyT1eaqVQpEoOBaoE7QxkQkLSnPLY\\/hby0KZVUvT9InA+pUM5lMzd+FU2isUgKWkBCl2rcE63MyMuhY133W7yqsyWFK2UgtxoNvaeljfmOw+728P0wgsZjPj09nX46YhmI9mezzF4ccruEqSubdzFdUpbX0JVC6oAF1yapoZRNuAaA1CXnEHTMhVhFl4b2uY\\/wsWm6diGcdlGsoTI1FYqEmG0\\/wBSbanA6JZB4mVLC9bhYOsS48EtMHR2xyckXMIcYbaqlfdG0lrdVUHrZvhl0Ml14NWzXEUu4XRLIDiX5yRkpmSzSvUm1oyWc9rYx9xBt0Nszc81cck2AnYVptb0yG0gZ6lSYU1OqdUnJIXNvTiUnJwNqiABP2xRZ1aXzJol5ptaHUzUkoycwhxB1kuhcvq6ziDkpLi0qKCBnwEZUYQ6bWl5gSZaXtPFmZvy2JTZ6tlYuNv3hTNizqhuVlaw\\/MNXPTJdCNZtmUo9epEolKxmyCltTdXymxjHGAJxysbFNqdbw5MFfaqpNTmnpJqaKALNzU1TUOUqqBSQlKWKnRGJYFCSt0aZL0pXlFYdrzTcltCwjLui2Q1CmoS+lvNoVIlZxwTMsEm6luy9SW6QTkZuAFz4bX0kLLrGzYrrE7bE24UhS5hPl9LK1HIAT0o2H0JzO9UxIS7TeuCtzUDi4Xxb0e9HLSltxqn4uYbYf4tUYMOS8hVKjJSk3VaW24lZWLfuumOsXFb7q9utSnaFWKfMay1ZqCvOiLHg7yy+F9XXI0jSCw5uXCWpL2LD92W8Hr4sXaFbbbk3MtSbDVzUxlRcDiZOTp1zutISUqmluKGtt1wdx6sjECmIvHA\\/FCiXNTwGfKKhZtxMTS5Va0qW1KVqQl5jyqnzISta1U2tSbEwhClpeYSYtGkeV1tm2eBqlbdtm0viairUmXdxJSWWJF19BUAXFuyqZzCdWdKcpTJy4oirK\\/KqFgmJe1hHZxj1ha8E4llVOuozqo08fOLDT0VSc52VTZbB+s8tE42SLoun0oxZ0k\\/k8th11M7XNFjFao2PVCXHmbBxU21x2m64VEoladeVKlhc9ClGEbk\\/OtHvOZeX9ecZGRiP3pHaA+lhorPTbuMOD9x022ZdzVRiBQG03Xh9MNrcLcu6u7KCZ6nUtc5lrMU64F0isAZbamsndE3a1dJW4qfs5e6qZLV6XTqpM9JBFOqacgNdTjaEKkZok6uTYZkSVFai8c9nGSFsYnWFfbIk5OpypmZtlbD1BrLbcpOOodRqLlzKvky08lxLmotEq9NtqRrDP68X7hHH\\/k77Zg01hHFDeF8STJTlw9Vkoo0+p9eXKyzTJ53zCpKF83Z4eqLyBvURZYFRYr2KVKldo8qnvSzSbnz2m3nqeQBbO60LOyydwHaiVG+yVXBjzM4IneaTXI3aFukcKjWabZJwPv2cTMPC7cIWpKgU+ZnnPpEP1uxVyztnVFtcxtHqg\\/TqbRK3Ui68X6626Wnmo6uk\\/wAiBpgYD\\/OVfw6p0jpGWFKbR5FQw6ln5a\\/JaTSNzlVw1nXX6s\\/MlQATLWZUb0UlvJ95xgB5DO2r2zLE9FzutS6atKJufOKcFOOoSNQXpQgTCDYFRLSXmkgek6DpFM1DC9WkMy+x86YGvbSoU5Yc1tWDyLD6xyFCbH0yBeNL606qiOvd2c3shi6nVUeg7x8Y5+r0uoUiem6ZVqfO0yqU6ZdkqhTajKvyU9IzbCi29KzknMtsvyr7DiVNvMvNIdbWClSeaOHeTmnPnTv9HP8ACK\\/AKFWIIVcpUkghSSCAQQdQQdDfkeOg0BOZJ0N02++\\/shgsc\\/o7fHXDdY4H0ePbDsjMEdI\\/RDcjMEdPj2RlINxbl8OrwtBuPDT5dd0NVjdnzjj2fp98S9Pk6mlnUrzsnFHRQvavz9WrGHZlMSsLzVqnMz8y3YVSXJW7dltyCJt1S5WjWpcH3P1CRlJfXYS7ek9qNMNyzYdiHHeCOmMvtAPSUf0S9LjBfGt2afYtuhXSxRb\\/AGWddflWHd1trt28wqWRmJ16nUWozFcpko4NVVapdOeCmnmWnWp3s7xEcM4qpk+twtybryZKpDNZBkps9k444OIlVKRNgb8zAAPpERtaRPGQn5d8khsL7N\\/kWXCErJ55L9oN3pJTrHpRQQzl5hibYamZZ1p+XfaQ8w+ytLzTzTyUutOtOtKLbzbzZS4242opWkp87LIl5HeG\\/dFuwQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQRrq5U3SNVoy6FWLt302dEneN5yCMJ7AWFFL4ue\\/mJ2nvz8q4EqQiety1mbluqR2qFNOTNBaZdGTqhGxWIf\\/AMoR0iDeGOuHWjdRp7aUnB22xdt3y7ZyBv3EKWlZunyM0hSM1qotjy9FqUi6heoW7ynWdn9FvgG07Ef4L4LrFQbcLc4+z9G08pVlWJyfBZQ42bj8pLNF6bHIS6rXNknS4gnvMKVMug2cdSJZmxse0euCQf0kNhbg5lGul4j0JGZy9cOEjMgevshNAyGfT7ocIG7Pp4ePHCPnqo2BPs698Uz3da2hQDMgdJjl6VSqpXalTqJRKbP1es1aclabSaTSpR+oVKpVGdfQxJ0+nyEo29Nzk7OTDjcvLSsuy48+84hpltTiwI4tA4n0Dx4543QciDo7\\/qs6Vz2KtakXJm09H+gruhDq2i5Jv3\\/cYmqJZUi+rIJSuTlxcd0yjiHAtqftqngtFlxWWXR6a5V6nJ05olJmnkoWsDMW2Rdb7uUkBXZMpW5lJAUUgXF7xnU2RcqU\\/KSLWi5l5Dea18iN7jhA1IabC3CBqQk2jmNF7kQdJLF9MhcWNU3KaPtlPLQ4ZCtygreJtRlclkmWtGWmmJSgJcW2Zdxd11el1SUU4iZRb8+zudkV6MnJy6J+igiQqth4eydwX1TktvfqoYhmWuq9m5tlBznqXNzMqzSLUdKStKlWhSaEpxtWzmlzGWscmcR8RWrBkpNSZT5wqNRU8mTllP7BptLAb2szMEJWtTSFOthLSdVTq9ZCXE6q1ow5vbFO4q7KTk5ctwNUyhyjLs3ONB9FIoklKsI13X5xS3W0GXl0BxxT9QmnQykaynA0Dk5j3bPsr2IzrtDlaTPYpxxLoYcVIt9mDKuzLLcxK+fVZ9ky0gX2XG3EopknOTSUONl9hAcbWrqjA+xlE0w1UW22GJS5P0tUSmYfV2Ssrq5SWGVtsNrCwFnzbQKHbuZTGYF0Y2Wbbe1lmJo1+ooJSZWkKS4w26CAQ\\/UCoSiCnJWuJdUy6hSdVTKYxtunHC9Lj2kvJTCLdkHPNTLUla0zikFJGq9UlATKl+cokyokkniUZAxpM0iuVz0Y8GDUKJYU3M47XpLLcl\\/IbJmmZay5aabXqkVC\\/wCZZmabMskZrRMWnJXW0tYSy6qV1lON6ItITlO9KzH8T1IXeZwvsmdC2lWfhgqdt1MzKON7FUvWLl8qeuqsNTLOumoSblVl6JOqdcBozbS0st0lUcQ+U7twuhc0jZbg6ZOjEmZulTMxKqAB7RwXxFUVLaJBStymUmbBJCUj0RLqhirZPs\\/uhlSsY11rTJLlmbl2nkgfXfJFLl0pWkp\\/IicnmCAFpMSb9IHTu0ZNHNydlsSMTKfP3ext1O2Jaaxdt8OTLYSpUtP02nvql6DMPa+bTl2VChSz+qvZzBUhWppDx65bDFu6\\/LKNgDZVHwspCw40zddzJlryvZxJzDc3KU+YYFo0JakqIdk5qRu0hQCmqkkFSBplo9q3DcThckZJ5xtxWu5PzJLUsVlRDi1TLuQfWVZhaWA87nuKAY7ioWEVPYCHq7NuT7oyJlJUrl5Qb8ilb3mzTyTvyUgyqgPrDONhhvyf9luDSiaxAlWMqyghbi6olK5PtrhSiijsqVLFLm9SKo\\/P3VdQWLgRT2LfKAxhWe0l6fNN4akFAoTLUhSlT5RpYO1JYD6Fo1CXJNNPBTYKQTqfgr5xIxWxsuM1zEG8rzxIuN3aBmZuGq1OuvyzK3C4uVpzEw6+zS6ehxRKJKnsysjLDc0w2gRyVFwkrc6EPVZ9ikMK3loas3OkcQNm0sMNaw51zBcQfrs5+acgafS6dSmfJ6dJS0kzzolmktBZGeSnCkazq95zW4VKJOZVHIoGZ38B4A8emLUcxCWGG5OjyUtTJRhAaYbaaaSlptP1UssNoRLMoGtkJbWBwMUTN1eamnXHluOOPOqK3Zh9an33VnetbjhUVKJ3lRUTprHxdEw6tajJQ4JBNQmk5Hympas0rMZ70y5SmUbIJzSpLAcTkPPUpOcdgMtgBOQySgAISkZAZZAJAyAAHMBuTCSUlRAHP7OuHwAAAHARHJqZfmV55h5x5Zvq4tSsoPBIOiQbbk2A1FrGNS86tZ9NSlE8VEmw5DgAbbhp3axWCCCMNRsO\\/hDKRc29vhBDlpvLzjxPDqB+PwhNpGscz9Ue09HfDwAk5CGSd5PiYWs29Eev5fP9cVSnWPVz93phbsigAG4fp6zCyE5bzx9w7\\/HTDKlZj3DdDcVSnLt5zF0EVAzIHTCd0G6AAk5CFgABkIAABkIVSnnPoHRDKlZvAQ0SVmw0A66HjrAlHOfV3936IVAJ4RVKSo9XOfHPCoAAyENqVbTefh4\\/KHALCwigSB285i6CLkpKjkB78h29HphoknUwhS+CfWet8Wwshoq3q3Do5z3QqhoJ3nerp6Owd8LAE8PHbHkNxYlCU8B6ef1woEk83pMXhAHHf2936Yvhsr5a+MEWBAHHf7ovyA4DKCCEEk7zCCscBf3QQRdqqPN8PfFwb6T6oSVAbzCbrV3D2e\\/f7ITjLTBHQxxl0jMMr2xGwdRa94zlgVtqlV3DWSrzTOJrki\\/TmqixcVMt2aYZlZ6izKlTUhJatURUqlUadU5Ol06ddlHEjFHUT2+nuyjIfRf0jb20WMYLaxZsh0vKp7okLnt159xmn3daU64z88W3Ug2SnVmG2kTVNnFtvClViUkKq2y6\\/IoZjdYdcoQqsunEbc6ujO5mZx2nuBuclA8koROsBTbqXlyqyHVS621h5CVISCopjMkPNBNNJqPbGUcVkdUwsJdZCrJD6MyVhZZJCy3lPaJSUgpNlDoWrUmqUGpz1GrlMqFGq9MmXpOp0mrSkzTqnTpyXUW35OfkJppqak5plwbN2XmWmnm1bnE80cZExDE\\/AHRV5TDDGi31KNs23iBVrblKlbGIlFl5Rq76ew5Kp8mkq8w2tqVu6iyL36ynqTUnTPUd1mYkpSboU46\\/rRi9J7RTxb0Tb8csrE+jASc4Zh+07xpQcfti8qUy6E+XUedW2gtzTO0aTU6ROtsVWlOrZE3KiWmpGamt7XMItS9IlsWYWrEnjDBM+4tqVxDSrkSr7a+ycp9akyS\\/SalLPBUtNSs0ltyXmkqlZlEvOBcqiQ4owdVcNOgzDZeklpbcYnG0\\/k1tPpS4wtQSpaAh9tSXGHm3HZeYQpK2Xl3sMY4IcRTIdA9QiC9oOR66PR0ifZ9\\/uhCCFtRPZ6e\\/OLS30H1woLSe7xgyrG439fzhODIHiM4u1VDm+Pui2FA8j7IM6hvH2deyLCgHhu90JlJHH1wvBCgsjv8AH5woKB3ew74aqQlXEenn9cN1tFO9O8dHOO+H5QDw3eOj9EJkEcR6eaHAoHuPL5c4VHHQQ7W0FbxuV09PaO6GyklJyI9+R7\\/RCo9CiPDlCZSD28xhIgjjC8UIBGRhSVEb9R8PD5Q8CDu6664w0UjnHq7vHs4JEAjIw7UnLs5j3wipPOPSOmHgeI9UIUninfyH2d\\/W\\/e0IIORikLkAjIwiRkSOiHkqzeMKSrNw1HXQi0gEe49EIEZbj+n7IcRapOY3cR4yhUKhmpOqerm7vRDZ5GfnjiPrdY6fR7uyHxGYyP6D7IRIIORh5KrjvHv7+vtj0Gxv0Y46CFXUapzH1T7D0d0JQ6hVjbgfjC1AKGYb+tPVBDV5GR1hwPHqP28fXDqKKAUCk8+7x2cYeBsbwhJsb+3wjjlJzGY4j2+Pj6kYcqBSSk8x8H0jKEFDVO7n3jqPR6IeHPgd3XXyf3xYQCCDwhAjLcezfz9+cOITWOf1+PHshxBsbcD8evsgjj3U6qj0HeO70Q3WOf1+PHtjkHUayetO8fEen4QyIzBHTuh5JsQfb4R6efVxa\\/zhCLVDMdY4d0XcIIWrQhQ7uvWIAbEHlDYjMEdO6ECOIPWDDpQyJ9YhBYyOfT7\\/AB8YfbVw4EXHj+qHxqAecNCMiR0HKEFDIkersh2scD6D48c0ILG7Po4+PHGH0Gx8dPl13wQycSDrIKQpKhvSoZgg5g5jgR1ccuvdDWjGpWjXJW6rGuC4bCuiTJVJ3FZdZn7cq0qoqSpexmqY\\/LONpcKEFxKFJLuR2h4Q\\/WMxn0e7x8YQUMwfWIyAo5HGyAtt1JQ60sBbTqFCykOtquhxCgSFIWlSFDQgw8w+9LuIdYdcZcQtK0ONLKFoWkghaVJsQUkApIN0kAg777HsFuVf0mcMDKUvFSl2\\/j9azIQy5PTGxsvEViXTqtpU3WaXKPUGqiXa85SanQX6pU3UJ8orTDji5g7gsBuUh0VceHJSjyl6nDe9pghCrHxUTL2lVlvkpRsqZVnpqYtisLecKhJS0hW3aq+0kuOU2VJKExWCMwR0xx83Iyc8gtTssy+jeAHEBRRnkCW1ZayFZfhIUlX7rpqLFGwzZ5intH2qUnDdSXmPnuH0Ny0upatQp+jrSacpF7laZJFOeWfrTGgtduFNvWO8N9kxOTqcRU9FgZarlTsylAtm7GopInAqwCUecLmmWxuZ1N\\/QBtTGS+bSLTTNTNWpzeqFU2tlc8gNHiiXmitM5LFIz2aWpnYJUCpTKv2MZOWjpB2dXtlL1oPWxUFFKSZxQmaU45kTkipNpRsASjXV5bLyrSCttCXnSN\\/n7YGaYOkxo4uScrhviXPVe0pNxH\\/0tsRFTF2WUqXQUHyGnImX01q2ZZeoMzbVVpTi1FSlrUFqC9zuAvLA4K3oZCg4829VcD7ndLMt8\\/lUxdeGs\\/ML2TTbjdep8p8828Zp5S3TKVujrpdMlgDPXK+ErcOPQMR+U1sRLacO15vafg6WtlolUTNVR5iVRlSG2ZJ538IKcW2grsmaHUp2nMnKt9pywbi5qdjrZHtDyt1NpWDa67Ydo6tqVl3HlWuRUG2xT5gZiMzlQl5R5eqW1DUmRPpH6D+itpgUd1WL+GFu3FWJmTLFNxFoOrQr+pyUsttS0xI3lRtlPzrUklhgytNq66pQTskszFLmWNqyqN5pXfJ9MYbEFRunRVvOWxmtltUzMCwLucptq4l06XSlx1qWp1YU7K2febiGWxtpharLn3H3m5eRoc4Qt0bscNsW3006RufDS96fW7aqaTMyU9b9WkbgtertFZbW\\/Luyj85SZxBKC2mal1LW3qkJfQeGd2EeKLmIUtUZapSctIVikplnHkyrjipebYeDqRNS7Luu6wG3UajzRffSEqaUlw7TVT0ns12+7LNvVUlMK1\\/Dk9g\\/aDOJmEy8uoh5mdfk5dyZmWpKtsS7BdeZYlpl3zSt0+WsEKallTLxBMdxvseTJSrtWSqWqNOs2v6UkSmXnG0PrQhp15kFxt5C1ONhLqFzKbKC1BtGseahdlqXNYly12zLzoNXte67Yqk5RLht2vSExS6xRatIPqYnafUZCcbZmJWZl3EKQ4062CCDmNXdHyqhkT1743s\\/KH9H13BnSrs3SLo1PCbI0kLZEpc3k6EhMpifhvK0uh1aa2batnLmtWfM2fNpCmmvnOo064ZwrfmA+4nRProdbQ62oLQtKVoUOCkLSFJUM8jvBBEZWI6G9h2sTdOcKltNPKEu8q13WFBLjC1hOgcU0tsrSAEhRIBNjbmKoSLlNnn5Rwk9k4pCVkWzp0U2si5sVoUlVrkeloSDo2WMlHr3+PTCCxkeo7\\/Tzw6WN2fRx8eOMN18Ow\\/Z8Y0sY6TYjv09segFyMekx\\/ZIaCmGgqtQE7fODKncFLy2jifKXPuOlZNdm1NaFOLmX0VKwqhbSJiovJAnq5KVtttS1yrxjbDEJf5PRpJHDHStubAas1ES1s6Q1qKbpLL77bcu3iRh6zUK9b6kKmFBtlVUteZvOlltkofqNSXQ5bJ5bcu2mbRHdezSv\\/hDg+lzLi883JoNMniSSozEklDaHFkkkrflTLzCzuzOkAC1halAnPPKYwom7jA82dJJJKmgkJJJtcqbKFE\\/pFQubXggggiexuoIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+cuq5aLZls3JeNyzzdMt61KFV7lr9Re\\/YqfRaFTpiqVSedIBJalJGVmH3AneUNk9UebTj\\/i7W8fsbsU8Z7g2qKniXfVw3WZV1wOmmSFTqDzlHobS958loFHEjRpLerVlJBoFagnOJlPLhY\\/pwa0JLismmz4lbqx9rtNwzprTLy251u2ErNw31OpQkAOyLtDpiLVqIUrzU3dLZghZyg9IG\\/Po+Occk+UTiHzip0fDLK7tyEuqqTqQbgzU5mZlULTwcYlW3HEki+SdFiLm9bY1ne0mpaRQfRlm+2dA\\/rr1ggKFt6W0hQ5h7W8KgcAOwQ4A4AdkJIG\\/Po8d8LoGZz5h4Ec0LOoHL7YhEKgZADoibXyPOj+nA\\/Qzs+u1KQ8ku\\/G2bcxWry3mNnOCjVhhqTsaRU4tIeXJJtKTkK3LMLAZYm7gqK2R+uHHnoiOi5gpUNIrSDwkwYkEzOrfd40ynVl+UQpyYp1qyal1a8Ku0lAOa6Ra1Pq9STrlDetKEuust\\/TCf8AVmZp1iWW980ysrTqfb1Hl6bQ6fJpRLycmiXZbp1HkZWXSAhqWlimXZbYbRqtMNqSEEIBic4PclKPKVvFNRUGpKkyMwtx42\\/Isy7JnJ14X\\/OaYbRbmlxYJANjaey+iOVCovTiUZ1pU1TpMEGypqbUkLykblIbyIO\\/0Zg6E2jF3F2vi4L0nw24XJOj5UeUCVEozlFrM2tIAAzXOreGukfSNNtEr1EoiEJykGlve2POkHiXa9HvivqwVs243LTtO0ZOrzLVq1BdrbKmVO5n6ZKvNyNXma1cEnUqpTKlUGHpmWpMzJSzC20tFJlDaceOo0dtGDFzE9moKlbnat6Yt6yXA+hM4u+bsX8xW9NyyXVpdm3qROzxuOcaQsOqplHnXkeaypaYMUq09PzcvKMAuTE4+2w0CfrOvLDaAo5ncVqGZP1R52\\/cBzXsMpjuMMWY52tYglmnZmfqb7NNU+gPJlHphaZ6bMuXUnszT5P6OkZR5uy0S6nmsw9IG79vFd+iKVh3AlNmFttNSgn6oltZbLrLSVSsmh4oIzofdE7MvsruhS0sOlJshQ+wt2xq5cTaJpoNSlPWVAT0yf2QJWpC\\/J2UfSulCk6u8IaKgobbMHLuqgYc2\\/SlNuzDRq02kBSn55KVMJIzzLUmM2UpJyKQ\\/wCUuI+shxOWcfV0yRZplPk5BgANScu1LpOWRVs0BJWofjLUCtZzJKlKVrK4xzDKdVOfOrf6OaLkqFdnJtbiG3CxL5lBCGR2alovZJcWDnJUmxUkFKNSMto5AenHXSoBWRFzYJ0JF9LneTbU6gb9NwhRCEjVQlIQkAAJAASEgDIJAGQAAIATuEORuAHRCaBxPoHjxwhSI8s3Ph8ePXdGJBC6RkMvSe2E0DM59HvhwhOsoDm4nshsm1zyjwmwJ5QuynIax4nh2faYWgghkm5ueMMk3NzxgiqQVEAcSfB9EUh0yjIax4nh1D7YYUbnu4dd8OfUT3nr3db4USkJAA\\/Sen05Zw4SMh1nxlFiBmc+Ye+FgMyPGQ54ZWrh7fs6++GouQnM58w98KwAcw9EENwdddcIAM9whcAAZCLUJy3nifdCqU5nM8B7fHx9TS1XNhuHvho+kQkbhy+Pq4ffFyE859Hf3fohZKSo9XOfHPFAMzlCwAAyENKVbdvPuhwAAWEVAy3CCDsi9CCs9AHE\\/AdcMw2pV9Bu4nn93x8N4hBWegDifHPDtKQkZD1857YuAyyAHUAIVSjLeeMeEgD4DnCItSjPjw6OnuhYtuoS0VIWhLzZdZKkKSHWg84yXWzkQ4hLzTre0HmBxt1sb0GKRtW0NNOLDq37YoWjNpf4d2lido6tvzcrbNZqVqyFQuDCiZrc+9OztQllSsqKjPUVU\\/PTtQnpullu8qY9NzM5TJ+oNMtUc7nDtOpdYqHmNVrbdAQ80RKT8xKqmJBM2FJLbdQcRMMuSUq4nOlU6luYQysoLzaWip1vLkWJeamAxMTiZILSQ2+40pxkPFSQ2l9SFBbLShmzPJQ6EEJzoCCpxGqmCJAOlNyQ1Due2JXFnQJqsletLqEs7VXcMKtfdOmWKzITZknqWMML0rnk9OS4JR1575txEulhibbU1Mi8pXV8ie0G12Rqtp3hW8Pb0oFfsbEO2lJFw2DetFqFrXhR2l63k87NUCssStQdpE9qFylV6TTM0CsS+rNUiqT0otEydhiDAuIcOMszs1LNT1GmkNuyWIKO+ip0KdYdALT8vUJbM2G3b\\/kxMJYcWPSSgpIJyqxh2r0R1SKhKuISlWUPISpcuo2BAS4EjKSCPRcShYNrosbw0CDzn0Dx3xeABwEXhJPUOk\\/DphQIA47z45ohBUTv9kakADcPXxhIAngIuCDz7vb49cLAE5avoI4buvhF2zPOcuzf748gKgN5hEIHPmfZ3xXVSOb4++HAQnnBPpy8eqK6qegeqCE5xyPu+cbeuS+x9naTVKngxPVByVeYXMXnh5Mh1aXJebYKFXLQ2VAk7N9sorctLIDbQ2VxLeU+Zltsby7eqWDPKG6NVJomItFlp+kX5QmamyGnWmqrbl0SaH5Oan7eqKmlfNt1WpV0VKSceaaVLzrbMzLvS83Q6hOyDkPHDe+Knhpfdp39RVKFRtWuSFWbaCg2mbYl3QJ2nOqy3S9SkVzMhMgbzLzLwGW6NzXJS4wTKPu4wemZ51LkiWsRbPcS4ElhKnZOkXKww4VBSU7dVBnpaXZzSFv1WZ1UqU8pWhwXiCrbG8c4qxNTk\\/SOC8aooz2KsITCu0plSmmhUJGuzTcsvOzL1CZlHaY+idS2FOzAfRNB6WUto9dbJ5mT2hYAm8LVYNu1PCaksST7qQ44uh1ELVLMLB9J5mVmG5hhbZuhmW82Q3kXkMay9LnRTvvRHxXqGHt3ocqVDnNtVbDvNqXEvTrytovFlmotMpdmhI1WTcKZSuUh1516nzm5KpiQmqbPzuLOqk83w90TQNLrA6l6ZejJeNos0KRquLdq06euLDNbk9K0eYavqRknnKVJt1eabXLyNIu9DZoFXanNSnJD6ZiZMs9TadUZSGQpKkqeZfl5mUmpaZmZGekZyXekp+n1GQmHJSo0ypSb6G5mRqdMnmJiSqMjNNtzUlPS8xJzDbbzS0Jt\\/G+HaTJopGKcJzC57BOLZU1GgzKgSuTXmyzdFmyVKUibp7gU0W3VF4ZFsuKcfYfXHO2NsKzGEqu9KKbWJVxaywVEq7MixUwV29PKFJW0sk9owttdyrPZqUDmzHt7otKDzZH2Hx6YdlCeYEenPx6os2Z5jn27vdFfRDwtJ7vGGpBHEZRaQDxEOiCM9b0k8N\\/XwiwoB4bj45oASN0K0PeIalB4j1H7ePp9sJw6KSOsdI+PRFhAPEQ4F8\\/b93XhCCjiDY9buUIQRepBHDePbFkOA31BjwKKdFXt1x4wkpGXDh0dHfCSkhQyPr5x2Q6ixSM944w4lfA+35\\/P9cLBB3Rxq0FB6QeB8c8WQ\\/IBBBGY5wYZrQUHpB4H4HrhyFAkG4iwjPcYRUkjsPA+OeFooQCMjCkqt4cRDyTcd\\/GGi08SPT3+PdwSUMxl6odEZHKEFJy3jgfZDwO4jxEIUPzh4n52+P64akZbjBCq057xxHuhKH0m47+MKBuLjfpfr22\\/XCa0849PfCKhmOseModdsIqGR6ubx1R6DY35QqGakhQIP6D0+jPOGSgUkg8QfB9McksZHPmPvhs8jMawG8cenL7IfBuAecKQbG3A\\/HnDWCCCH0m47xp98CxY9xhF5OY1hxHHs+ww0UMwR6vHsjkTvBHTDJxOoojm4jsMPIPD1\\/D7dYUg8PXDSA7wR0xesZHPp9\\/j4xZDkOQ3IyJHRuhm6nVUeg7x3eiOQWOB9B8eOMNnk6yc+dO\\/0c8PpNwD7fGDn11x9scesb8+Y8e0fZ8YshcjMEerthCHR6SSOI3fZ8oItWMxnzjwYbqGYPrEOoQIyJEetq9oNx4Q6g3FuXw6+yGpGYI6YbkZgjph2oZE+sQ3WMjnzHwYywdxHjC4akcQeww3IyJHR4z9MO1jfn0+O6G6xvz6fhlD4NwDzEHQ93XqhsoZEwgsZHPp8fb6YcrHA+jx7YQWN2fR47oWk2I79IfSbge\\/xhqsb8+n4eBCS0haSlSQpKgQoKGskg55hSTmCDwIOQI64cKGYPVv9X2QjGQk2UPG3Xxj2Mw+T\\/xgnMD9JnDV8XRXaDh7dlyJti+LclKxMyloVRF0SU3b1JrFdo6300om3azUKbWk1MsoflGZB4JdLDkw25NAwluNNq31SJx1epJz7ho9QKjkkSlRUhtLq1DPVblppEpNr1QTqy5SRnHn9JUpCkrQpSXEqCkLSSlaVpPmqSrcUqSRmCPq9eYMTK9D7GFOPOjphhiJMzZma9N0Fqh3apTiVPi7rZcVRK8++nNxbBqs5JqrUsw6pTvzfU5Va1KCgo8+bYW5\\/CmLcDbVKKhAqNDqkkh1zRAdmabMGpU9MwtKSp1E00mek5lTmbNLJblzmbIQOrvJ6rrdVpeJ8BVJ5a2n5ddRkUrUVlDEwhEhUUNBRsjsXDIzDLaNO1cfdACsxOSXLR6Mp0nNAHF2m0yQM7e2ETDGOljBKUl75xw9lJ9+55JlvWbU+9VsPZ+8KZJyiXCZiqzNOdSzMTEuywrz+bQnvLaSJdas3ZFWwOZOZZIK5dR5gAnWaSOhnhwz9SXD+vN3jZFIqE1qTDr0iqQq7TqUupcnJZKpOdD7awUKTNpTty0rWbUzMDJJGZPm4aauj47of6buOmAyZZ6Utmi3pOzVjbZaHS9h7djbF24eOqmGipqZmpe2qvTaVPuII1KrLz7DzEvMMPS7P0Ax55jijDeHcbUchyRrVMkZ5h0WuWJuVTPyRWE3s4ZZ59txJ1SttDZJIAFQ7QKM7JTai6jK\\/LPOyMyLEgPyrigDfQnOkOgE\\/WS2ki43dFkZgjphA7wR0w6UMlH1+uGyhkSPGR3j2RTAO4+BitwdxHiI+7wjxMuPBjFPDvFu0nlMXNhveluXrRl7UtIcn7cqsrVGpWYOosGUnTLKk5xtbbrb0q+8062604puPTlwxxAt\\/FrDiwcUbTfMxbOI9nW1fNAeUQpa6PdNIk61Tw8ElSUvolZ1tt9v+9vhbKiFJyjy2FjJR69\\/j0xOE+T76Q4xY0M5\\/CGqVDyq6NHO8py2ky6ytcymwL4dnrtsqcffUTrN\\/Oyr2t6RZBHktOtuVaGTWyEdAbBq8ZesVLD7qsrVSlhOyqSRbzySv2iECwOZ6UWtxR1GWUTEvwlNdjNuyilejNNZ0A\\/11n0rAHippSyojUhsXuBpvigggjqiLBgggggggggggggggggggggggggggj5e8Lrodh2jdF83PNinW1Z1u1u7LhnlDXRI0S3abN1aqzakgjNMtISjzygPrBBAUN0JWtKEqWtQShCVLUpRslKUi6lKJ0AABJJ3AE8I8JCQVKICUgkkmwAAuSTwAGpMQ3OXzx7\\/AFS9LmjYP0yc29vaP9lSdImmETPlEsL7vxuTuq532S2SyhxqgGy6RNtEreYqFGnGXnQ6nyeX0cIGQHXv8eiOw8ZMS61jRi3iXi1cRUa1iTfV03vUGyorTKvXJWpyqiRZyzQmWp7UyiRk2W9VtiVl2mWghptIjr4DgB1AR83sY1xeJMT1utqJKJ+feXL3vdMm0QxJINyRduTaYQbW1SbgXijajNqnp6amlX\\/LvLWkHelvQNJ\\/7rSUJ56awqgZDt3+Pf6YcIG7Pp8d8JcIcDcAOiImTck84wokIcghgUmt4iYs6Q9WlFLlLGosrhzaDzzSiwu4rs1anc07LPA6onKLbtPp9OdQTqmUvFZLYyaWiQpjdWQGKVb7ThydWuqTiUKGezRry8mhSRxS4tc2tQVl57DSupGO\\/JnYFpwC0N8JLbmpUytyXjSRileKXEFqZNfvxiWqrErNtEZszdFtxNv27Mo\\/36jKzy4R9hfNXTVrkrNScfCZRhxxhl1xSUstykgksh0KUUoQ0tDa5kqO4B1W9KQAI\\/tqrysP7M26BL+hO4kfakXCldnPNQpM7Uj+bdOVLMg4LklqaIGl1Ds7YvhxMmxTlvICTKyqqnM3H\\/XZ0AspXycZaWADuBlRYnjGG5dvHFMxWcItHSkToUzSpaZxXvSXaWlxtVQn\\/LLbsiXeKEazMzISDd3Tj8sp3NctWqZMqaSkSy3NGeFdI8vuBdQWnWZpLBdBO8eVTGszL578gUt+UOAnPJTaVDpHYemFjY9pEaS2MGLQmVTFKuO7p2WtbMLQGrLoCWrds9AaWSGXXLdpdOmp4JAS5UH5uZKNd5alPMM6R822yw+tJExVXFT68wM9irJqVSDxKSwhLyRvyL6+aJLhmiJwRs4o1FDYZnXZRKp1IFlef1AmbqAUbBSuxLrkqhRsQ200myQkJjnfaTiU4jxPXqslwrYmpxUrI3Nx5hKAS0qUi5CO0l2Q8sJuO2eWq5UoqPYiE6ygnpPs4n2Q+A4Adghuwnir\\/i+4n4Q7QN+fR7+HujUE2BPKKx6660hQDIAdEVgi5IzI9ZhiCFEjIZek9sPGU5JKj+Fw7B3n3CGyQVEJHOfB9Azh+BluENrOgHPf14\\/CELOlue\\/rrdBBBBDCzYW59fd64QgXPhr8uu6L0J1lAc3E9kPeMJMpyTmRvVv9HNDlA5\\/V8fHbDJNheBRue4aDrrhF4GQA6IXQMh1mE0jM9nHu9MLQxCTp1z3QRegZnPmHvi0DM5DnhYDIZDmhC1WFhvPuhCjYWG88uvUPui4DMgeAOmFwOAA7ItSMh1nxlC6BuzPo6uv0wyTYXj1IsO874uAAHvPTFYIuSkqIA\\/QM+Pozzhgm+phK1cB6\\/lFUIKz0AcT454egZZADqAEWpSEDIenrPTC6E5bzx8eP0x4SAPgOcNwJTlvPH3ePHXfBAASchDJJJuYQpXAb+tB39b9wASchCqUgcd593Z3xUJA7\\/HNCiUk9nT3Qypd9B7YEptqdTv8AD5mNl+ghpw3bgLMzWHNWuKak7TqcvUVWlVph0zEvaVyuMTDslIzrEzryz1q1ieyS9KTLTsrTKrMipBEvLzVXeVuXq9p6LnKg4Yow\\/wBJ2yKbT8U7SbmPuYxCtGa+5XEKyJudb8mZurDC+Uibq9uh59TPzlQKiurWpU6jKyUtc9FrUkuRk3on4HMBGyvRHx4rVMmqY4mcU5dFnFpSUPuqyuC2lES7ktOKHnP6jRRIzrigt7NcnPBTk6HHkaaSxxi7Y5PzeJsJvmewtVZlCsY4FqSnJrDs6qYWUTFXk5FRKaVUJsrSmozkh2RmX0y8zOtTSfOw70vshr9LxdLfi6xWG1zgl1\\/gnV3QjzgJYbKl0GZcXfzmXS2lbtNbfzBlCX5VlaLSbacPNNvRC0heTZuOWdxrK8WdGiv1Rul2PpT2pRVyiKLMzkwlimWtj1acgJhFkXM7rtsyVy0xx+0rozaVTFs1IVyl0XpaTflJ2Wlp6SmWJ6Tm2WpiUnJR5uYlJmWeSHWX5d9lamn2XW1JcadbcU24hQcQohSVRNksLEbDvHDC963bzp1FxBwixIt+pW5WqRccjL1ilzNKmxM0av2zcNOnEvS89Iy8w1O0ipSb6HTKvMPNoUtpptAiNcpfyed38lLeDOL+DMrcuJHJ9YhVlpqcoyn52v3Low3LV5prYUyZq74mnqrh9W5iaUm0KvUpoPPzOpbFenU3GaVXL5v1FEwftaw5MY12WAyNQkcoxJgiYWhM3TJlxN\\/2Mj0Uhh7KtUk83lk5tCFNoRJzbMxLJh+0LZbOYdmHXZJo9iSpQbQD2TiQQFdkVek2tJNltK+pdA1QUuudExcEKPV2wzpFWpddpkjWqLPStTpNUlWZ2n1CSeQ\\/Kzcq+gLaeZdQSlaFpPTmlWaVAKCgOTCSeAimVpU2pSFpKFoUULQsFKkKScqkqSQClSSCCkgEEWNjFKEEEggggkEEWII0IIOoIOhB3Qlsxzk+7vi7UT0e0wrszzke\\/ui7UT1nx1ZQ2Vp7z6vnaPIRyHQPUIy00NsQF4e6Q2ElfL+zlJi55W06uVE+T\\/Nl1pctqYW+kEBbUi3VGKj+HqPSjbmqVIAOKWono9p7456hzkzITDM7KOKYmZCclp6VdRlrMzTatq06k5EBTa5dCgMgRllq7yI01dZTNU19sixtYHl2gLRPHcV3Gm8A7xF4+T1VVSO0aUkCohivUyqUt4X9E5JZVTaURuz9pTw2g2uO1UkaLVeaZadxOW5W5WfBUWCdhPNJ84vSbqgX8gDkpTQSl9sH++NAAZRHV5Y3R3lcDNKW3sYLakPJsMtLFipz8y7KhpNLoeP9rSKJy6ZFpLLTTUojFSykS99SEulTrk\\/dVqYo1yYe8oqzSI32UGqNV2hUausoCWa1SKdVGkZqzS1UZNmbbQddCF+al8fWQk5cRxy6I5SfBGZ0oeThxtt2iS7MxiZgrTE444UvubUzEvfODKHbzpUpIBkLJmbrtiXuXDnUWENvSdyzLMw4wy848ia+TfW04qpeLtjtVeCkVGSfxPg9x3U0\\/EFMQnz1hi4Kgmelcr620ZUhmUnR9aaWo3ltjwq1WKEubQ2kTMv6Cl2F0rQFKl3Cf4qgthWt1h5CScqYigFscxPp390WlCh19kcJZ9ySF6Wrbt20o50+46NTqzKpUdZbLc\\/LNzBl3Tqp+mllrVLvjVSUutOJKUkZR9EUkcRGodQtl1xh5JbeZcW062sWW242ooWhQ4KSoFJHMHlHDqkqQpSVApUklKgd4UDYg94IsYbRaUA8Nx8c0OSAeIiwo6D6\\/HfCY8BI3Q1KSOzqhJSAd43Hxxh4QRuMJqQDw3H2QQ4lfA+35wzII4wmpAO8bj74dkcxEIqSR2dPfHoJG7rxhZAI11ENSCDkYIWKQe\\/xzQiQQcjDqVBX2w2boOmo69\\/f94ixSc944+\\/x46kSAQQRu4EcIcxYtOe8cfHj9EOpVbQ7uB5fd8PDc4CCLiONWgoPSDwPjniyHykhYyPo6j0wzUkpJB\\/SM+Ppyzh2FA2N+jCahmOvmhEjiD2GHEWLG7Menr6\\/RC0K4H1fLrj4w8CCLjj16ujDMjI5eDCK05HPmPvh2oZjrHjKECMxkeeHkmxv7fCGz6CrjcfhxHy\\/XCEWqGY6+aLyMjkeaKQ\\/DsNiMwQf0GECOIPYYdrGRz5j7\\/HxhBY5\\/X8PHZC0GxtwPxgjjlp1VEc3EdkWQ7eTmnMDenf6OeGkPpNiPYYd+snvHxHz74IReTmNYcRx7PsMLQHeCOmHwbEHlDYNiDyjjVDMEekdsIw5UCklJ5j4PpGUIKGR7d8PDhx039fKH98WEZgjphAjiD2GHEJLG\\/Pp8d0OIOtvX6+vhBHHKGqojoPs5vZDdYyUevf49MPn08Ff8X3kfGGixuz6D7PGUPoNj46QQlCaxwPo8eOaFItUMwfX6oV9Ve7Q\\/ba\\/vhSTYjv09sNljdn0cfHjjDdY3Z9Hjuh0RmCOrd47YQO8EdMZKDpbkfd1eHoaLGY7N\\/j3+iEFjMHq3+PRDrjDcjiD1gxkIOhHL4dfGDrrdDYjMEdMIHeCOmHJGRI6IbqGRPbC4cQd49fXuhtwhAjIkdEOVjJR69\\/j0wgv63aPs+EPjUA8wIciyN6HIxYxBmq4o4DVSbyZqUvL4mWkw4pKGxOyXktAvFhsqQS5MTkm5asyzLpcBSxSqi+lCsn1o0Xx3\\/oqYvOYE6QmFuJqnlsUyhXPKS9y6pXquWnXUOUK6EqbRufW1Q6lPTUshQUkTrMrMHJaULRGsc0BOJsJ1il9mHX3JQzEkLDN59KETMqlJsSntXWhLrUAT2bq02IUQZps8xGcK4yoVZU4W5ZqdRLz5uQn6PnQZWcKhuV2TDqn0JOnatNqBCkgifVo6XBsn61azzvmPpbrUi2sjc62UStQSngkqW15E4lB84iXeWSsHzI3nym3RwMlV9H3S3t+mrQZ9mfwRxCqDDKG2kz9PM9eeGc1M7JIW7OTkq7f0i9PTAKhKUiiSIe2bMswjezYVdFvXVQK62+DKtTjPlDqFDUVTpxJlptYKVFK0+SPOOs5HJS0NuZ6uZP0PKc6On9lPoL6QmFMjIKqN0LsmZvawGmGg9OOX3h66zeVtyEgRmWpi4Jmim1nHWs8pGuTjZzS4oC0PJbr5xjsWqeDppXa1LBc69LSiFHO79Gzyl1WkqUokq1mhVKc2ACES0shAukWjofbNQgZ1+aaRdNUlEzbZA0M7JBKHkIsN7jaWSo29JUwsnfePOwk5tE\\/JSs6gACYZQtSQTklZGS0f8RwKQcyd6YvWOB9HV43x8fZM8HpGZkFKzVKuh5oZ5\\/Qv\\/XCR0IdSpSuO91MfZL+qer9HxjDmGSw+61bRCzkvr6BspGp3+iQD3xyctORakfok28Dqn\\/ykfrhqscD6PHtjdPyC+kGnBvToo1hVWeRK2tpC2rV8M5sPqcEqzdkl\\/312LOlLRzM9NVSjTdpSGsl1tLl3O66G8\\/KZfS0oZpPVv8AHoj6ewL4r2GV+WRiTa0yqSufD67rbve3ZtKlJMrXLVrElXaU+FJIUNnPSDCiU7wBn2bnC9XXQa9SqugkeYT0u84E3BXLheSaaBGv5WWW60ba2XGTKTKpSZlplN7sPJXYfnJSpJWk3IuFIzJtcaHeN8ep3BHXGEuI1v4w4X4dYtWqta7axKsi2L6oeu42683TLpospW5JiZLRUhM3LMTaZabb3FmaaeZWApspHY8fQZtxDraHW1JW24hLja0m6VoWkKSoEaEKSQQRcEEGLjSpK0pWkhSVpCkqG4pULgjuIIIgggghcKgggggggggggggggggggjUPy2eOq8G9BS+KDTp7yG48bq1RcIqVsyTMGk1YzNbvRWzGR8jmbQoVXoM08v6NCq7LMqJdfaCtvEQ\\/PlDWNxurSAwnwJp02XKbhNYc1ddcYQFICLuxKnGVplpoa+o+5IWpbdvTsksozl27hm0tO5vugV1tWrn0DgSuzCFFMzOS30VKkaK7WpKEs4pBBBC2ZVcxMJN9C1eNFiSb80pE0oGy30iVb5kvnKu3G4Z7VQtrdItbfEe1G89nv6\\/QYXQM1dm\\/4e8iEkDcT0\\/D9MLoG4nry9X6Y+fSvqnrfpFOQsgZq7N8ZI6JGDDmkJpJ4O4RBh16nXZelOTcmxVquM2fRi7XbxmW3PqodYtal1Z1hSiEmZDTefnjLHBA4n0ePZG\\/HkJMGxW8UcWcc6lKEyliWxI2JbTrycml3BecwZ+sTUqrPW8rpNBoTci\\/r+Z5PdIyCnSFMpaIStKlAFKSFKCvqkJIISrUaLNka\\/paAmwje4Ypf01XqXTikqbfmkGYAB\\/oVkF+Z8CWG3AknTMReJONyT6aHbs\\/MsajBZlPJpNDYShLbroEtLJbSjJKUsqXtAlBy1EqAO\\/dpi5SzGoYDaGuL1xyc75Lcd10f9TG0SHSxMKrd+h2jTExJOJUFJnqLba69cUsobwujZ9R2sYlTyizT6UhZ89a595IJz1UAsS+snnQpSpjq12knjwiccvljOJu68FNH2nzes1QaRU8VrpYae2jZn66\\/N2vaDD7aFhDE7TqfSbqmVNPgzHklfkn0JZYeSuZrCsMHHO1bDlHcZK6dQi2\\/Noz52vyQTU53Nu9CYDUjIrskELsCrTTtCtVH8FdnVeqSF5JypNKkpQgZV9pNnzFlSP40uhczOJJOoQTY6Ax8KRIO1eqSFNbz1pyaYlypIHmIW4A64cwdzTWu4rIHzUHzVRmgwy1Lssy7KEtssNNstNpGSUNtoShCE9SUgAZ8w6Yx1wipQm67M1NaM26VKkNkjhNToU02QTxyl0TQOrvGukf42SKBrKSOv2DefjFyYqmu0nGpUH0ZZvMof8AaPWUfGzYbtyzG28xw1UHMzqW76Ni5\\/tl2J\\/8oT7YdoTqoA4HLM9RPd8IcoGQ7d\\/dCI3kDphxwiJLOgHP7I18EKoG7Pp+HgwlC4GQA6PGfphvr2QQ4YTmSro3D08YcxY2nVQBz5ZntO+L4YUbkmGFG5Jgi5CdZQHXv7OeLYcMJ4q\\/4vuJ+EMKNzbgNPnDg9FF+O\\/22+z3w4A4AdghcDIAQmgb8+jx3wukZkeswws625anx6+MNQokZDrO8+PG\\/OLoIqBmQOmEbo8OmvAA3i9Cef1fHx9kLoGZz5h74s4QuBkAOB5+3nhgm5vCE+kq53Dd48B9v64vSMz1Dj46+2FotSMh1nj3Rd48euGFG57hu+2FFVhfnugh40jVTvHnHeeroHjnjsXCC+KNhtiLbV73Fh5aeKtEoj84ajYN8NTL1s3BLztNnaatqcEm828l+RM385Ux9QmmJWqykjNTMnPMtOyr26fCN\\/kgtK9MpQblwyq2i3idPhqVblGL4uaUt6emVkarVt3E7OVKy317Z0MMtV617cqs264JeVk51tpsiUUPDshWpZ9buLMN0GaZcVaWxFMzFMl3ZdKGz5wmpqlnaegla1N9g8+26OzK1AIUknYUulGrLEuxOybM4tzIzKTSn2lzBITlDDqWHGFOLUShLS3W1qUAEBV7RoaQnPfzc3f6PHPCsbp8WuRHxpl5eerujHjhg\\/jNJy2u59xt8t1jDKtsJShKm6dK3jbr2KVCqlWmm0rVLJrFv2VJF9LUtMzkqw4ufY0v45W5izop1qXoGldghilo9uz05820q57wocvXcLbinkspmjK21i1Y05dFgVZ9MspEw\\/LKrkpPSaVBE\\/JSrgQhWbUdmmM5KUaqSKQqp0x9pL0tUaJMSlZkn2FgFLzLtOfmCtpQOZLmQJUn0gbDTIqOF6\\/SytM5TZhotqyLKUh0IVpdKg2VFKgD9VQB0OmhhAAk5CFkjIe\\/x0QwpVTplakZep0ioyFWp80jXlZ+mzcvPST6M8tdialXHWHU7stZtxQ3ZZ7o5NKdbs8bor10KQpTa0qQpCilaVApUlSTYpUk2IKToQRcEWIFoj6UlJOYEKvYg6EHiCDuN73vr4aiKpTnvPD3+PHUsAVEADuA+AEABUQAO4D4AQsAAMhDUClZfEwAAD3npj6my7lnLQuWkXHJFRXTptK32QvVTNybn0U7KEnzcpmWU43mcwhwpdA1msx82lHAn1d\\/d+iFAOYeiGphhmZYelphCXGJhpxl5tWqVtOoUhxB7lIUQeI4EQ5JTs1Tp2VqEk8uXnJKZYm5WYbNlszEs6h5l1B3Zm3EJULgjTURu45NzHhDl5X\\/AIM1GdLlKuOo1m\\/rBU+pQUmcS+FV+ly7as3CahShK1xiWGyYl\\/mmsPHN+bOtu7ap1j4pWTdOBeMNu0i98MsQ6HULWrluXGx5TSajTKu0Zabo84gqS43LzWvryczLuMTdOn0sTkpMy8y2w\\/LQ9sEMQJnDHEvD+\\/5d9xBtK6KXPToZWsPTVHTMIZrEkAkhZaqNGfnaatAz12XVpAGtqxLTZfZfQ2\\/LuodZdQh1p1tYW242tOu260tJKVoWkhTS0qIIJ7RWlLxdW9kGO6ZibD7pHZ\\/kZ2SdWpMrWJBCm256nTqU+g4zNy\\/YuBRQpbEyW5tpIeYaUn6OS79P2g4RpFYcaR2VeprUw4lCc4k6i2ksTiGr3v5tNpeZNyA6lC0rBC1AwhtKnRou3kl9MSf0bbrn6hWtF7GKYnbw0a8RKw404uRo87PNszVvVucb1Zdur2vVZpu3LwbKJZDrjtvX0mSo9Jul2XT2JkTwGfjn6IlH8qfoYU\\/lJdAu\\/sPJClsT+PeEstMYkYJVEMsiquX1b1Nm1otlE4pvbinYnUJM\\/aM7KKfakvnx6iXBPIW7QJBTUMPRBxem8ScO3LcuRbwvjDx5q3683NpU1PTcigPNUeozTLw8pRN6ks7Tantc3jUKe\\/NOhszSG09f7T6NRsSUGi7WcHWXQ8SyzEzOtpCc0u88oMKXMJQVIbm5SdQ5S6khKzacbaJzOLfdVxLtGwo7QanMLDRRldyTCRfLqQEPpzC5SoFPpG5WhxhxXpOLMZYahPV7+3nEV2Y5yfd3wpBFBFaudvCKzi3UT0e098chIJCUvAZfWZzOWRGSXsgVc+7PduyBB35bmMcpT2nHCW2WluLfeabaQ2krW47kpKWkpRmtalKdSUpSCV6+4EgRhz6rSb9ydyND\\/dEcTyGvfaLV2Isuv7UsJobzDJMVB5ZTpZtikz7q8x4JUlJQb2BKgm91CJbGC7oODuEqlqWpasM7EWoq89ZUu16UVKUo71KUFZE8BnzZ7sosIp5tFbqNLcCVMVOmrOo4Apt52WcBCFoOaFpVLzMykhRy3b0gZx0FatITblr23b+aT8w0Cj0UKbSA0fmyny0kNmlKUpQ2NjuyASkbshmM+08P5sS140JQUr6SaXLK5ioTUu7Laqhl9XJ05nPzcknf9eK22MYjXQNr2z+qNOBCPwspcm8pJsUyVYmU0edtrreSn3wQd6SoAi4t3BiKWE3R6s0QTmlZh1AI3rYHbt7\\/AOOhPO2+IKNuWQMFcWtKTRlQViV0ctJTFnD22NdJQt2wDddTqFkTxCjrNiepjrr7bJKkMM7ENrUk6rfYRBHEZeObpjtzlIqI3YPLV6XtGl2jJ0\\/FrC7BTFKXlwSlh6dpOH9l2rPPoSpCFKemqomvz69TygF12dUHkfsCOq46i2vUtNF2hYhl20ZWJiaTPtAC1\\/PG0Ovq5G80ZjvIAJtuj5zYllUydbqDKRZHbKWmwIBzfXIB5uBZ52sTqYalIPNkeoeAfRCZSR1jpHx6IdlAPDd7vs8boTII4+g8x7IrlLnI37j18xGjhqQDxhJSSN\\/EeOMO1Iz3jcfZCRHEH0w6FBXjyghsQCPceiESCkkEdxHxBh2pHEj1d3d+iEiARkYVCkqtpvHw65QzUnLeOHu8eOtJQzHu8dEOyCkkEdxHxBhBScj1Hh3QA2N+UO6EcwYakcQfTBCqk57+ce2EofBuLw3qhXcer+I63wktOW\\/m5+qG7qNYZj6w4dfVD3jCBGRy8GHkKuLcR8IdjjoIWdRqnWHA8eo\\/b784RhcLQbG3P4wioap6uI8dUN1jI59O\\/wBPP464eKGY6xw7oQIzBHE83bzQ8k3HuMOKFxb2Q0Wnn9fw8fbCcOOMIEZEjoh9BuLcR8ISg3FuI+EWqGYI9XbDcjMEGHMIrGRz5j4ML3QuGpHEHsMMVp1VEdB3dnNHIrG\\/Pp8d0NH08FDsPw8ZQ+DcA8xCkGx8dPXDeCCCH0m4Hdp7IFCxPtENn05EK6dx7Rw9nuhqsbs+j4+BHIOJ1kEc43jtEMSMwR0+M\\/RD6DceHwhaDceHwhCLVjMdm\\/vi6A7wR0w4DYg8jC4aLTrII4nLMdZHf8YYkZgjp8Z+iORO4kdEMVjVUodfsO8fCHwdxHiIIawRcoZKPXv8emLYcXqAfb67QQgRkSOiEFfWPjjvhysb8+ke0fZCCxwPo8e2HmzqDzHv60h8G4B5iGqxkrt3w3WMldu\\/4e8GHSxwPo8e2G6xuB68vX+iMhBsfHSPYbL3Ht9\\/V6BCC9xB8bv0w5WNwPR8f0Q3WPN7Dn8PjD0KSbKHfp18YbLHA+jx7YQXwB6\\/HuhyoZpPr9UIK4Hs92+HUbvA\\/f8AbD0IePHqgggjIRu9fX2wRMS5PzFsY06KGFtfmpszFetuk\\/qeXQVOl+YFXsrZ0liYnHFElU5V6Cii12YKt5VVufm3j4Y1wV6yqLNLXtJqXlxTJ3M5q8op5EvtF7\\/2SYl0szK8uZ7gMwIh+cijiz5NceLmBs\\/MoSzWKdI4m220tezSJ6jvStuXS00FnVmJmdkqhbMyhlv6VEvRZx\\/JbaFqYlS6P9X2UxXLfccGT6G6tKJz1fpGlIlZ0AEkKWtDkmrdkcmVK89P1IvsGnjgPbtU6BYs0nGUvNSraSshgPrT9M0pQTf6zTyJylM3T9aaUM2oJ7Nl5\\/8ADDZRQ6upXaz9Hbal5skXcLkkr6OmlLNrXfaDE+uxtlINgfRHnxcoRgP\\/AGKfKA6QWE8tT26Va36oFQuKypWXBEkxYOJLbN7WfJSjikoDjNDkK5J0GYISUsz1InJdSithaox4IzBHSMokd\\/KesAVyFz6OGlJSJVexrNLrWB94zjUsltiWqFDfnL6w\\/U9NIIL89VZOq4gNAPpQ4iUtyXSy482NSXjcU2cE\\/ISk4CM5hltawMtzoBS6ncAPMdStO4ZbovLH1L+ja7NJQkBpbqlIt9UNu2mGQLb8qXFNk77tWJ3W5Ur0n5nUJhoCyQ4ootuDawHGhcaGyFhOgGqToDoFeMNiMwQecEQ6UMie32c0N1DJR7c\\/XviEX3dxv17I1KDqR6+uuETm+QAx8OK2g5LYcVSeVNXJo+3vXLEW2\\/rKmfuQrzpvO0JpThUsLlWTV69btPRk0tiWtpLGy2TTLr28yIR3ydvHQ4faYd34MT8+4xRsfMOZ9qmyIdKWJu+8NVTF3UVxxouJaUpmznMRGkKCVzAdfbQ1k0p6JuMdzbLax9M4KpDi1Zn5BtVKmLkqIVI5W2MxOpUqSMqtROpUo3vvNoYdmfOaVL3N1sZpZd+HZWLf+ZU38bWtBBBBFhRvIIIIIIIIIIIIIIIIIIII84TTTxpVpC6VuPeMTc2uepl4Yj11dtzK3g8pdl0N1FtWO2XddxCgxZ9FobADayyA0Nhk0GonRcoljIMBtCrSLxFl5nySrS2HdUte3H0LCXmbpv8AdlrEt2blkKIU49TqrccrVVNpCvoJF51YDTLxT54A3kDpjlryjq1f8HcPIVu85rM0i4vfWSkVEbxYfSI10NwUk2Nq9xvN3XJSQP1UrmnBfeVHsmSbcgl8c\\/S4D6y6eA7PfvhdIySB1QjxhwBwA7BHLDnD19e+IDCyRkkev1xM35KLCJGE+hfhxMTMoqVruKT1SxYrWuhKXHWrpUwxa7qVfWMu9Y9LtiabJ80uTDy0ZbTfEEwvsOq4o4j2DhtRc\\/nW\\/Lxtuz5FYSFpYmLgq0rS0TLusUoDEmJrymYddW20zLtOOvutNIUsT5KXTKTZ9rUyg0NhuTo1sUKQo1GkkHWRK06kSLNPpsqkk5lDMuxLsJz5kjn3RGa\\/U0yLbLVkrU7ncWnOApLTQ32sojMo+icpB7NQ4ERd2xWimcqVUqqkm0ow1Iy5KbpMxOrK3Ck6DM20wlKtdEzGoINx8Pc75nq1OupUChpYlmugIlwUKI47lO660nPcFbsyI8\\/\\/AE8sZTj1pdY64isTonqNNXxP25aj7S9aXdtGykNWhbUzKpPmtN1KlUaWqzqUgFUzPTLjgLri1Lmi6b+MLmAWihjtiqxNqlavQ7EqlOtuZQ6WH2rwuxTNp2nMNOBSHFKk7irlOnXEtkPGXl3dRSFfSIgDyEm7PzspIsjN2cmmJVvcSNd91DSSR0ArBPVBsZpZcncS4qmkFC3l+YsrWbhIcWJ6eANzZKAJIJA1CLgm1on+3erpaYw7hplYyMtrqkynUaIQZGSUeF9KhmzX3hQte5yfwupXzda0vMKSA7VHnJ9RIGYaVkzLJz50lllLyRwG2PPrR2awN6j0AD1n7I4+TlmpKUlpRgarMrLsy7KTlmGmW0ttg5ADMISkbhlu3RyjIyRn0kn4fCN3OTBmpqYmTf8ALOrWAd6UknIn\\/uoyp9UcmurLji1n85RI7hfQeoWHqhwgb8+j9EKxYgbien4fpi+MBZ9I92nXrhEXIGauzfDhA1lJHSd\\/YN59kIoHE+jx7IdsDeo9Ay9f6PbCFGwJ65ffHijYEw5gggjHJsCeUMjUgcyIIfITqpA6Bv7TvPtho2M1pHXn6t\\/wh8BmQOkwxC18B+ru+2FUDIDr3+PRC6Buz5zw7B9vwhLjC4GQA6IxybknnDcVhRA4n0d\\/whOFwMgB0QhZ0tzhCzpbn+uL0DM58w8CHCBmc+jxlCaBkM+c+BDhAyGfOfAhhRsCePCPQLADnYm\\/qv8AL2eMXQAZnIcTuEELMpzUVH8Hh2nuEMwhZubcuvu9UOEJ1UgdA39vPC6Rqjfz7z1Do9EJpGZy9cLw2s8Pb9kI3Rmno66ZOIeD1Yp8vVbhuGboTQYlZWrSNSm27mt2WaSllpElOpfQ9UaO2y2hp2izji20SrTLUgplpkyM3vgwI05bMxtk63gxpHUezsUbIvdTtOo9RuC36BVrXvKhzbjRlrbuy26nTl27U1LW0kyYn5FtM++BJz6E1ViWM9FNAzOQ547owkv922KqzSJ6ZcTRajMNpbcKj\\/uZUVrTsZttW8NsvOajU1kQlB2U0dXZOB3RytQxZs+m5nEmzatTtDmVZn6ph5lXnGHK0kKSp1+ZoL3aU9U+UJKFTLTDc06hbnZvNzKw6q\\/tmG0uVmHpTBu0AJqNEmi3JUquTSgahQHlnJLsrn1WecpK1lLamn3Fok7oVcSjam0bI9OD5P8A0aZlK7j7yVF2pwqvZKnarcWjLV6y\\/M4S3261LocelLPfuOYmTYtxTTjTyWKJcT0zarrs6iWolSw\\/kJJpL8fLDbHadqF5VzBjGO0anhFjtZ9WnrbuSxLikpukvqrtJW4zU5BiTqaWp+nVWUdZdL9CniuaQ3k9IzU+1tVNTGdAjSorGJVpT9OqVTJxEw5nG6PXlPKB+6e3XXH00KszLPmB915Eu7TaupGu6J+UFRU6yuqy6G+jeWe5LW2OUUwRm9IvAqitUHTRwVoKqlRV0RjyapYtUKhN\\/OT2GtYmZNLc7N3Ew00\\/O4UV87WYlq0DbEw5K06tzM\\/QegMFY2wZ5QbM7h+t0yUwhtXpko5MFuQv5nW2GG0rM9SC4Q9MsobKHpijTa3ZmXlVF2TmVoS++1JtpmyFunh2dk0FbAUQl9CEpdZURdCHkoypUkgWTYJQvVLaJd0pS5HwAAHvPTCqE85HZ3936I730AdAnT30qsMqZWLywQuPCR6mzLNHevDHGm1bDKTuqUMtLzEhdFMoVVpS7uqknNyj\\/wCvanRbYnaS9PMPuSUzlNMSTe7bDvkOLWprTFQxsx7n5hkFHlNIw9odPt9lsJGaw3dV2O1kvhQKfrWpJqbBJOtwbjzGx7H78xNt\\/Q3m8pJuuIdqk\\/NS1PppbbKgJlp+cdZW9LrCbpcZacKQU9olGtuepbB+Ipx8tMU51QzlAeWUMsrsbZ2lOqQXUG+nZJWrhlCgUiOuASchCqUhPWemJc9o8nzyeOGzTO0w\\/ZvqqMDI1G7rium7HJkpGattTpOdlbSPHLNujNBagOYDV7\\/oFv6L1iBtFj4BYd0JTCm1NzNGw1sajOLcZEvs5lc5LySZ1+ZT5M0pc5Mhcy48w06t5xQDka2cwzgGikt4o217Oqa6gkPStHn14mm2VWuEOy0gWnkq3ZkqSmxIAz3STOafsTxjOpSpbAZCgCLS8yoWNr3W+3KtEi9jkcWn+NyhYU1t4omFhtamkpaLrgSSlClFaG0qVlkku6yigHLWS3mnPfErjR3rqrkwFwerLq9pMTmHFnJnHNcObSelaHJSU+vW1lHNc1LPEpUratb0nzkqEZkVfE63qpRZq2ZqwaRU7bnpNchOUOqqkZmizck4FJfkZujrpT8jMybiFBLjDmsyoLIWzkIx3tW07csehSdq2jTzR7YpLk6mh0gzLs4mk06aqE5Oy9KZmnht35anCZMpKOzGvMKl5dgTD8w+XXlc3baXtnWSlrwPtBl8azPnDqKiynDVdoJk0hoBLzT1TaMrONOFCUK7KYDiFZVJbcbUS31jswoVWwthVjDVVacUJGbmZmUmyqWCFNTrqnnJfsGpiYcZLbyluBa1FLnaLJDakhKu5cNK4aRdUk2pzKWqoNNmAVZpJmFASqhrKy82b2IGZHmKd\\/GyVB85RTRPxA0P+WKxHXhlhpetVwb0jJum4jUn7kbPqtWotOlcYpyYNw08fMNKdpVIYt\\/GGkXGafT2ksvU+1W6ekIS1MBbs0Nt1TLjTrK1IcaWlxtxJGshbatZKk5jIaqwlQ3ZcB2dzDGyuebnSKTzA5qmxn079urLPfnlnmOIi0fJ\\/wBt+BcPbPMUbPNpdTnpGnzFRXN0F+Vps3VChiqyimqpLtplkOCXErNS7E+znCQuanHHG8ykrMajaRgCaxYppUihsFcutiaWpTaSMos2oJW43mUsOEAhV0mXbvYWCoWlTwixVoZdFcwzxAoxYLQf+dbOuOnFkvJbLKXRN05nZl5LiC1r5BwON6gj4Us5KIVmlSDkRlkQecEHrz5sjzcSInHtY3zyctrQJVzgfMqDzauIz89cu6nLn3JOrnnvO8\\/OXRUMEsUZZUniphHat2MPJSHBc9r23d7SVISAhxDlVkTMNqZASGH5dvyhnVQpvZFOcShiZ2AVhxLNI22NyEyq6UN4jwhXKdKrWbJb7SpOty8pKovo4txS8oOcpASRFAzvk+YmYQpbL5dCRdKOxlnPVdifcdJtppLrueOtjCTDKOs9p7soyJ0W7DViFj3hNahYU\\/Kv3ZT63VmMxqKo9u61x1dBWSUoRMUmkvMJzO9TwQMnlBKpCOJ\\/JU6H2MbE1O4U1OsYQXO6lbjaLbqExWaAZheSi7P2XdMw7OiWbGaUS9ArNvyyVfsZWFZHCfQI0ZrjwsxQxpr9\\/wAjLsVrDyvVXCGlLYD7klNVKQnWpm5qxSHZluWcepzko1Q26RPGXSuakqnOtuJlXEPMrh21jDU\\/gjDDVcRVKHiGhVdT8rSMQ4cqbNUpU3NhsBtgPslJQ+EO+cFpSbLQy6WnXOyWoTrYVgGoYexbW6pW0NNTFMo\\/m1PazLDi36i+lD0yhp1DT6BLMS5ZcK20A+fDJmIJTtdzT+L\\/ACjHPWu\\/srjt53P9jrlKUdQHelM+wSAMwfPSSk5kpPPmBu+fjmrZTtbjt9AIzXW6SgFR3DXnmEgngdwJPNlx5o5awjNOpxVhotJT2oxBRi1c\\/wBUFRlii2oG8i9yB3239LT6QZKbvu82fvck6dkq\\/PhfXdzHERWuXQlZS3eWpwTeln5kv37oWW7Nz7cwQ42ibk70x8kkMSmyZbUzLeRWVJzavK1zJVNKmyh5LTsuwxjFGSHL1VKRnuWz0Y5SUmEvPUbQ5pFMqjYSvOUnXbg0paw3LqKm0JUpVMq1PmzslOI1ZpCQsuJWhGPikJVxG\\/pHGPox5RgQ3tAaKR+20OUWo77rE\\/U2yTx+q2ka33G2mg+cuO0hOIHSkD0pdsm27N20wFfDdvB0NtAGUBGe4wottSN\\/EdI5u3v4QnFEA31BiGwipOW8cPdCakhXUemHUJKTlvHDnHR9nu7ODqF7gTrwPXR+JDUgg5GElp5wO3v7\\/wBMOlJ1h1jhCJHEH0xkpVcd43\\/OCGxAI9x6IQI4gw6UnLhw8boSWN2Y9PX1+iFQtCrGx3Hd49db4ZkEHIwitOW8cD74dqTmOse3q8fGECMxkeeFJNj3Hf8AOFqFx38IQixYzG7iPBHj0QoRkcjzRSHgbWIjxB3jl18fjDVadZJHSN3bzQxIyJB4jcY5FQyOXqho8nJQUPwuPaO8RkDUA84XCMIrGRz6fGULRasZjPnHgwpBsfHT1w8k3AO87jz4X+cM1jInr3wiscD6O74w6WMxnzjwYQIzBHTD6TYg+3whB9Fd+B8fX8\\/ZCEWrGY7N\\/fF0HGH4dhqsZg9W\\/wAeiG606ySOkbu0bx7YdkZEjohuRkSOgw4g7x64N0cdBF7gyWodefr3\\/GLIfQdSO68OL1SD1r0IIYrGqpQ6Du7DvHsh9DZ8b0npGXq\\/T7IyEHXxHX2x4g6+I6+2GSxkrt3xbCixwPo8e2E4dh2Eljfn0\\/ohm+N6T0gj1H7YfLG4Ho+P6IavDNGfQQfh8YeSbgd2ns+6CGCxwPo8e2E4WUM0n1+qEYeGqCOW74wRYsbuw+PhCC\\/qnq\\/R8YckZgjqhA7wR0wps6DuPyMOo3eBhqoZpPr9UN1DNJ7M\\/Vvh1xhuRxB7DGUDYg8jeF9dbobK4Hs92+G5GYI6RDnhDc7iR0RkQbvGG\\/GG\\/CHJGRI6DCCvrHxx3wtB1I7rxkb9eENjuJHQTFIuUPOPjiM4tjIRvPh18YIyd0LsWf1FNJ\\/Bu\\/X5tEhR5e75Og3NMPKylmbWu5Dtr3BNTKd6XGadTas\\/U0JVmUzMlLuI1VpQtE4uwKqqgXdRKgpxIY8sTKzSiDl5LPBUo+pW4FSWkuh4c5U0nhkY89eJueiBikrG3RnwaxIdmfKalWrLpsjcL7ju1ddui2y7bFzvLJUpaDM16j1CbQHSp0MPp11rzCzWeOkTNIrmF8YU5CvPaRPyy0LSSn8vT5pFRkQog6pUtEyHAbgo0sQSI6X2BVVualMUYRml\\/kZlkVJhs3PoPNinVEgHccpp+XKL3uTujtrlk8AxpC8nZpC0GTkkTly4eW6xjTaaljNyVqOFr5uSuJlEbi9PVKxWLuoUqynN156sJQyhTykIPnp2NOh2RmJFSs1Sj20b37wzMAnIdOTqHCVHhtBrZ7o9UChvSN5WZKpq0tLVORrlEdp1akptpEzKVBDzDlPq0pMsrGo\\/LzJEyy60tBS60soUDnHmE46YRzmjVpVY14ETynlow5xMvSxJKafCg5UaJS61Ni2KyUK87VrVEbpdSYKwHAzUU6+rkUjs\\/aE3L1ukUXEcie0lqjTmZhlwfnNOson5RWnolTku++NDrlAGYC8VvjunLlpkFaQl1tT0o+AAMr0o4R4kkKcQDa+VsA20EcOv63aPs+EN18fR3w5c5vT8O+G6+APjxuikeuuUV0g2V46R3TozYyTuj1pF4KY3yKnycMsSLSuuflpcqS7UaDTavLm5aRmnztlW7eXUqS\\/q5qLE66E8BHp1SM5J1KSk6jITTM5IT8rLTkhNy7iXmJqTmmkvy0yw4gqQ6y8wtDrLiDk404FA5KGXlQvjck8+\\/wBRyP6I9E\\/kmsbBjzyf2jpdMxPJna9a1nfqWXOkqSZqXq+F829ZcqZ\\/UzSZyq29SqDcBXrKW8xWGX3yiZdeaR0hsCrFn65Q1q0daYqssgmwCmViUmyOalpck9ALkNEm4GkzwhMZX5uTJuFtofRf9JshCwOZUHEG2uiNNxMbIIIII6YidwQQQQQQQQQQQQQQQQQRHM+UTYxmg4JYIYHyE1qTeJF\\/1a+602y6dsbfw4pCadKSM6yM0eR1GvXrJT7Jc1VOTdsnZKOweziOJ+sPHDfG5bl28Xf1RtOusWdKTYfpWClgWdYKEMuFct881SWmL\\/rj4PnAzaHLukqRO6mQQ5RW5dYDzDwjTUjiezx7o4D2v1g1jH9dWledmnutUlgXuEJp7aWZhI9JQsZ7ztdha2exGbNFN4jmfOqxOLBulpzzdHcJdKW1WNhoXAtQ3i6iQbGFkjNQ7c\\/VvhwkZqHbn6t8Io4ns+Ihwj63YPs+MVcs625Ro42mckLhi1fml9SLoqDTTlJwntG472dMygLlnKxOMt2jQpfNfmpnWpm43q3I55ZOUNbqPPZMSxK05nJhpCh9O4N4VmC2jJZGQzy8\\/U4AcD2HRnyLmHkvRMIsUcT5xLbU\\/fN6yNsyKnikPKoVkUszG3l9c5oYm6vdVTlH0tapddpCduF+TS5RupCRkDrA63nE7+J6hn45t+\\/mWvYs+ntpVUw\\/LMtPytFaEs7MtzF3GVyrLa5lDjKUqAKajNLlzdbZFgpRJsg9sbHcP\\/ReCKXOuAoeqr8xVVoUnQh1wMShCuKVSktLvJAFrrIFiSTHz5f3F77nsGcHcEpGaQidxFveo3rWmmHvpRbuH9PRJSUrOMpUNWUqdeuyTnZZS28n5q2VhpYMo6DGSwspnl91MzCk6zVLln51WeeqXSkSzCSfxg4\\/tkDMZlk8QClWyTlrMXf1S9OK6bbk5tE3R8G7StbDiSLJ\\/W\\/zl5K5d9yKyIH67lq1dEzRJ1Z87a0ZDWam2UKjB7Bumhmk1GprSAufnUS7ajx8nkUZhSeYBT0w8lQH1tknWy1Rl1bh+UTQMAyqAnI9PMGYX+kpdSXnF72IUiTKEnj+TvHPm1Ws\\/SmKa9MJUFNy76aVLWsQESQEs4UKG9K3kTDyTc37S4JFjHc3CHyBklI6hDNIzUkdY98PuMRmKi4e37PnCyRkkdmfr3xdBAN5A6Yx98ELJGSR6\\/XD1kZIz6ST8PhDThD5IySkdAHry3\\/GG1nQDnv9X6+fCELOgHP7P1xdBBBDCzpbnCUb\\/AQuwN6j1AevefcIeIG\\/PoHt8Zw3ZGSB1kn4e4Q6QN2fSfZ4zhhf1T1xhKjcmFUjMjq393tyhaE0c\\/o8e2FIZjyLkjMiFwMyB0wkgcT6PHshdG89nv6\\/QYaWdbcv1w2rVYHK3zPu+EKgZkDpOUOOEJIG\\/PoHt8ZwrGOs6gct\\/rtCybXPKCHradVIHPxPafVDVCdZYHEZ5nrA7\\/jD0DMgdPjP0QiGIVQMhn0+6L4BuAHRHMUKg1u56xTretukVOv16rzTUhSaJRpCaqVVqU48rVZlJCnyTL01NTLvBpllpxxQG4ZiG0IW84lDaFOOOLShttCVLWta1BKEISkFSlKUQlKQCpRIABJtHhBVZKbkkgAAXJJIAAA1vcjdrwji0DifQPHjnjtLCfBjFTHG52bOwlsS4b7uBZaU7KUKQLzFPadWW2put1R4sUqg08upLXznWp2nU9teaHJoEDLczopcjJXKxKSF\\/wClpXVWLbqUszyMMaDUJZNyzcsQl5CLvuVC3qdbbTgUEv0ujmo1hSFlp6oUGfQpobrbXmsIsCrZRY+BNg21alBlhkRS6a3TZF6YbBQZ2eeBFVuCoqG9ypVebcnHwSt2bmxvM5m8L4ewRTUYg2u4plcD015rt5OiaTeL6u2i9xJUdsPPSzZV6CpqaYW3LOW87aZbIcizcI7KcRYncbUZZ6UlbgqUpIS9ZWVXp57NS1xeweUXrC6JdwWvpi0ddBnS10UcTrMxLu+37fqtm16UVauILVnXRL1qp2\\/I3GhpEk\\/WZB1mRXNM0y5WaFNVSaoJrcrKSrT00qYRT2n5tvb7aV1zto1JU\\/KtomEOsOMTMmtZbbfQQS0SsJXqrYcAWhSUkhOu1uS6op+dr18TtbeL9Xq788oKUttlJzlmAcykMMNhMqjI5oKxks55OLXzdOX7jbhthfT\\/AJ4xFvqysPaR9IE1e\\/bvoNpU1WzTruZTVbn5KUOzRmVkTB1Up1lDPhw3jbbHg1raTTsS7HlYgoM1SnGPojtpqWrtcmJ+XeeWmYTT6XIzDMul1hzzd2mTDlUadY7Rt99cu6qWR3fIUeeTh+Xp2IXJecbl5JmSemXc0ulyXYaaaSubmZhxsOzKlJzrmm0SxU4oKQ2hQSo5T1bFa7qiFJYmmaUycwG6cwEOFJAGSph\\/bvJJyBzaUz5wHm5Zx8DNTs9POF2dm5qcd5nZt9yYcHPmHHluL49fDo59QOKXLV8nvhkJtia0iqHeFUl8wil4X25c9\\/eVFJUMpSv0ekzVobiAQXrkYStKklKlJJUdfWIvylTR3pi3mcNMEMa76W2ghL92VK0MPKe+8FkDYGnVW\\/J1UrstRYcmKbKP7RSm1yaUpS65tJ5nymtrzqZibwTtcxSh1wOS7uJ0P4eopzFCguSTiOaptMZYUQFDzWXaYSr6uosNQazgDDwKBW8PSqkiy009QqExcG2V009qZeU4NbhalLFtd8SeFuIbTrLWlKQM9ZSsk5dJUdwHWY4h24aCxufrtHaPnDVcqUmlXm8dxfSrMcMsszv480KzED5Rzjjcjzv3IaPmHVtya1EtSdyXjdN3pSgkea+5SZSxTNKy3aziEp1h5qE\\/VjGCv8u1pwVlevTZXBS0k67a9lb9gVaZQA2yttbQN1XdcrmzdcUJhwlZcS6hAadaaK21Sal+Sl5QlRQhU1hfC9AWoXLdUxfJzZbvlulxVFlqinPuvkU4gG4Di9DGrf2q4EYJyz1UncpsPNKWtvMOafPXpXTT88JVusN9p8q7ztVA1zXaaebJMwlaun6reur0gHo54YP4jWNKnUmbroku4RmEzE42woj8bUdKVaoG\\/PIjrjz45rlouUFmlzBRitbkq2+t1SWZTDDD1KJdtxeaWWHXbffmghsHUQt2YdmNVObr6nNZavm1crtp1rcLjuKFBeWpWspTmHNhKKzmPrrNACzmOKgQroVxiSseRptuJzTNS2bITlFktVjEK13ISdVqw6lItfWyVAnQEaE4X448EbvNMUb9\\/mVLsRccPpW+6+\\/l32j0TZW9LPniEyd2W5MrWQA3L1ymvuHNOtlqImVLSrVB80pz83pzj6ZC0OIStC0rQpOslaVBSVJ6QreCOkx551vctPpgUd1JqtOwhutrXVtUVmzavIubJSmiUtPW7dNEQ062htaWHHWZhKVPOLmGphKUJRkxhly6VyyFRlHb9w+ue3l7YeUV3C69XkJbYW4nXSxadVbpjSwhAKnUPXQtM5vQ8EfXXqql5KO2qmJW4KLR6u22FFRo1blXXSALnJLz4p77lrAFLaFukkZW1\\/m7KT2oYEnFJQqpz1OUrQfSFNdCMxIACnJJU2hAN9VLIQmxKlgWMTnII0FaNfLG2DiW1KytLvOmYhzhRrTNo1uUVaOIskyhKg5sW3GJeSqjcslBfmZuUl62hQKUuVJCleZuWwmxqsHGiirq9m1MuTErs01ahTyEylcorrxyQifk0rczYdCDsZ+VemqfMqSpDUzt2H2Jejq5hrEWGpl2Tr9GqFJmWFBDrE\\/KTEq6gk2SpTT7bbiW3LHsnSns3RYtrVcXnEu9LTssicp83K1CTc+pNST7cwzfS6VLQTkWm4C0LCVoPoqAIIjtxJKShxClNuIUFJWM0rSpJJSpKgAUKTkFIWCdTPMAnIhMNpD0y\\/qZvzb7k3NvEZuzU28Uh6amHckremXNVO0dWpa3EpB1jmSV4I0om3wwqVDzolnHUPOS4dWGHHmkONtPLZv2anWm3XUNuKSVIQ66lJCXFAqypzZsozZSnNYZspIJTfflJAJF7EgHeBBHHz1xPWhLKuaXYamHqItiel2Jjew5MMzLQbQ5kFlKQspSCnJQyKkKSsBwchHUGNVwN29ZC3nG1Oio1Sn04NpWlClFReqCsipJGYRIFRHma2\\/NXMWFT87Tx59TnXJeoSf7KkJhlWR5idlyHZV5pdxlcamEtrQq\\/oqAPA3daZRMOIYcSFtPKDbiCLhbazlcSRxCkFQPcYiKcpVivN438tzM12YbbkfuHwvtW3E05C0zKZJg4PVKtmVS6lKVDazF7qqBMyCsmaWEhLS2EN\\/ZRhR90oxY5UfSuvtLq5iUo1WveiS0wt3aoW3alWtrDamsocCwHGPm2jO+TLRry3k8ujZHVU05GbZRn9Xj0d0fQnGU9WJ9jAzuJZx2oYiOzrCLuIJ6YS2h6Zrc7JLqdTeWhhtppouTc86sNtNttNpKUNoQgJQn5t7TXZdWM6yJJAalG5ubblmgSoNywnptUugEklWVlaBdRKjrck3hOG7jX4SB2pHvA+HqhxBEIsUG41HW\\/wCfztEESrNpuPxjj4IcOt8Vj0j4ju9UN4cBuL9CF9dc4RUnLeOB9kJLTnvHEe6HZHEH0wgRkcvBh9Cj6x7x1v8A1wQ1IzHu6j0wiRkcjzQ5UMj1Hf8AZCKxwPo8eOeMkG4B5wQ1UMj1cRDdQyPUd47vRDxYzHZv74brGY6x493uj2Hkm48NDDVY4H0Hx45oThcjMEdMIHcSOiHkG48NPl13QlXoqCufR9sWLGYz6Pd4+MN3E6ySOfiO0euHZ3gjphuRkSOjxn6YfQdLcvh+uHI4+DjF606qyOAzzHUD3fCLIXDiDqRw3\\/CG5G8jjxEIEZEjoh0sb8+ke3xlDde49vv6vQIfGoB5gR6saX4jr5cBDZQyJi2FFjgfR49sJxkJNwPf4wpJuB7\\/ABhJe49vv6vQIbrG\\/PpHt8ZQ6WN2fQfZ4yhusbs+g+zxlC0mxHfpHsMXxvSeoj1bx7zCEO3hmg9RB+HuMNIfTvHjDgupBHqHqsfughJ4Zoz6CD8PjCsWqGaVDpB9eW74RkDQjxEIGhHiI49QzSfX6oRhxxhudxI6Ifh+LVDNJ7M\\/VvhusZpUOow6hvwhxB0I9fXXGAaERx\\/GG8OljJSh1n3w2UMlHtz9e+MhB1I9fXXCCKQgdxI6CYXhFf1j6PdAjQkdaH74WjeR3dfGGyvrHt9++G6hko9ufr3w5WPO7Rn8PhCC\\/rdo+z4Rlp3DwHwh2Gqhko9ufr3wgr6x8cd8OV8R2fEw3XxHZ498ZCdw8B8IPl4cvb0YbL+sev8AR8IQWN+fSPb4yhyviD48b4br4A+PG6FoNlDv0h5J9EeFvshu4N4PSPd+mE4VXwB6\\/HuhKMhB9Id+nXrhUESUuRHxRVXcKMVcH5yYQqZsK7qfdtHbeeVtjRL4kXZSalZZkq3ytOrNtTM2+poZNzFwp2xHlEvEa2Nm\\/JHYo\\/qe6Ydt2\\/NTOwpWK9tXJYE2XSQwmoCVTdVBWoZ5+UTNXttijyakBSi7WC2Slh51SNJimRE\\/Q55vLmWygTTdt4VLnOu3eWe1QLa+lpFgbLqwaLjmhPqVlZnJg0uYBNkqRUUmWazngluaXLvEkgDstSBeJt+C1TLtFqVJcUC5Tp5My0Dw8nnkHzE5gDJExLPOKCfqqfOt9ZIXCw+Ud4KuYY6dtu4x02XWimY94YW1cU1NlrZNrvfDhQsOtSrKkp1HUy9rUrD+dW7rF3b1N5t1oBtpx+YjhNUfILsbllLGyqkpMSZz3I2zaROMK3lI1spdbSBmBm9q8FGNOvylXBBd9aG2H2M8hKl6p4D4sSCKlMJRrNydlYpSSLYrDilJCtVT15yOHEuknZtOFzeC7sc772Y1AYk2NSss4Q5NYaemKe5mOobkXEzMvpvCUUicaZBub9mo20IFs7VqWEzM+4hNw6GKm2AL6n8jMm1rXuJhw+Ott8Q8W3UzEuzMNnNt9pp5BBBBQ62HEHMbt6VDtixYzHYc\\/h8Y+fs6c8roDCSrNcmtyVX2IIcaB6gw6hI3ZeaM8\\/Oj6FX1T44b4rp9osvOtG90LUgd4BIB8FCxHMGOcSnI4Ungq3v0PrGsNHvqdhHxES2Pk0uNJnbM0j9Hmemxnb1xWzjBbEovJTjjFz09VoXkpoqObctIv2xZZLSVBG3q7royW67rRKXd6FdnuIMbduQvxjGEvKH4ZUubnPI6LjJb13YRVck5tOPVqmpuW12FIO5Ts3etp23INH6zap3P6uvrz3ZdVfojGtDeUrK1NTX0a9c2CkVFBlUBX8VEw4w6SbWLYJ0uRtaNMea1aTcvZK3Usr5ZXwWddRokqC7nQZb2NrGfrBBBHc0WxBBBBBBBBBBBBBDOZmWJJiYm5uYZlpSWZcmJmZmHEMsS7DKFuvPvvOqDTbDTaVOOuuKS202kklITDyMJOUYxTODWg\\/pM32y+iVnW8La5a1HmCUpLFcxCVL4f0SYa1lJ135OrXPKzTTYK83GQrYugbNWHUJ1qnSE9UHzZmQk5mcd1A\\/JSrK33N5A+qg6k2HMQzMPCXl331fVZZcdV3htBWR\\/5YgQ6QmJ7+NePGMeLkw444cR8TL1vGW2iVoMvTq7cE9P0mSS259I21I012UkWGnPpGmJdppeernHUiOf0ePbCCB5vac\\/h8IcI4Ht+Aj5lzcy7OzUzOPnM\\/NvvTLytTmefcU66r0iT6S1KOpJ11JOsUQtSlrWpRzKUSpSjpcqNybd6ib+JMLt8\\/o+MOEc\\/o8eyEEcD2\\/AR2rgnYi8TsXMM8PUocU3ed9Wvb82pvMqYptSq8nL1WcOR1w3I01U1Nu6o1w0wvVOuI09QnJenSc7UJpfZyshKvzky4fzGJZlTzy94+q2hSvVDkrLOzk1LScunO\\/NPsyzKN2Z59xLTafWtYTEsHQ3w\\/Rhjox4K2nsgxN\\/cRS7gqrWz2bia1d4cuqrNP+aFrelZ6suyWa\\/wJdsbkpSkZkVKp061bcqNcrT7UhR7do87V6tOuFOxlKdSpJyeqM24QctmzLsPzCiPwQehIHzNJlW1TclKstNtttqbQhlpCW20MS+\\/ZoQjVS2hDTeolKSEgEZDLdGIvKlYqfqP6COkJXGphuXqd02iMMKM2op2s1M4mTsrZtSTKKI82Ykrbq1cq6HM0uMt0xx9hYmUNCOBvJipc1i7EWN8ZziXFTuJsRNU9DouopfqE45VqqkrKDmGeep6juSlKLqTYpt9I645LYUwzLSrZQJXD1CuhJ0zN02RS0wAnMDdYlylKc2ZSlZQoqNzBzxdxDqWLeKuJWKdYBRVMRr7uy+J5pSgoS8xdNdnq0uUbAybSxKeWmWl2mwllphpDbKENoQiMi7PpvzVbtGkSnVcakW3Hk8NWYmQZmYB3A+a++5vPHLtjEm26cKvX6RTinWRNT8uh5JGY8mSsOTRy59WXQ6rLgct2rGbCOJPjxuj6V4ucQyxISDQyIbR2mQXslCEoYYA1NwAHU91rR86azMLdcSXFFbjrjkw6tRupa1quVE8SpSlkkjfDhoZuJ6sz7D8coep+sO33b4aMDziehPvIh4ged2DP4fGIITYE93v4Ro4WiqRmodufq3xSLkDzuwZ\\/D4wx17YIXAzIHSQPWYfwza3uJ9PsBMPIaWdQO6\\/t\\/VDSzqB3X9v6oIIIuSM1JHWPfDDnD19e6PUWsT1aHoGQA6AB6hC6Rkkdmfr3wjxhxGO5w9fXvhuFkDJI698XRQbgB0ARWG4OuuvshZH1e39HwhdA3Z9J936YRAyAHQIcJ4Ds9++GCbknmYbTqonx+ItCyBuz6fHfF8UTwHZ798VjHUbknrlHqzpbn+uF2BvUeoD17z7hDxG89nv6\\/QYbsjJA6yT8PhGSuFVf0F8F7aaxx04MZFsW4xVZ2Qs3Ryw2pteuHFbE+qUlEo\\/MGtvUqWYpdjWgsTLTcvN1av0SYuMy9WYkatSDTmjP7Wi0ScxBPt02RyB5xKnFuOZyhlhuxddUhpDsw8UJPoy8oxMTb6iGpaXeeUhCn5CRfqU01KS5aDjpPpvuoYaQkaqW444QlKUjU2upX1UJUohJ7I0SNBXG7S8roNm0sW3h7T5zya5MUrklX2rXpSkFtczI0sJDb1z19tlaV\\/MdKcOwL0r87T1IlJlqbiSPghgfovaCltzSMPKZKXhiC1TZhd24s3K7ImpltlhTlSS7XFgSVs2+yhlx1yjUBLcsmXlga5Pzc80ag5E50m\\/lN+JFaoCcL9C\\/AG0cCcMKRIv0W25i7ky9VqkjSEpCJByQsi1naZalEnJVJdW5KVKrXvRHnnAtVPUUOKmNE+JmkXps6a1WdZxCxJxZxfZcnXJg281NzMnYFKmXil1brNqUNqk2DbvmpZG2TS6eClEu0XQNkiLOThDaFT5VbWAjh\\/Z3dvs5\\/arjuVlq9ihlpQsXcG4FbfNDocutOqKhiqtmsKbdW1OUGScQEM3phyn4DwchM9UkP4pqzYCylpX0bSZdd\\/TQZ59JmfR1BVKyo7QgqRPlpeQTpNJ7lstCzCmYnJe9dIag3xX5RtTkvY2C7T2I8ylwk68kKjbypmzKVPoIIcbuK66VOJB+kX5wB0Z45fKVaxNKnJHR10d5WWBU+JK7MbLjfqLq2iFoYL9hWTMSLUq8nJt5ZTiJPt62bGqpIMwvSpYmgTftYLU1fdxUiz5QlKnKfTx90VaAAzU0ssOy9HYK8yhLzVRqAQc1qZWkBLmYNkaGWB9ppZen6JOXnUGgCZu6p1czLlzWK1EUiRTI0lTeY1EtzUpOKS0Ehbq1LWtdNubEtgMjVH69tGxFjfbxi2YdExOz2I65OTFPcmhuWzK092lU8yqbZUSszO1dptFkISW0NoTtKxt6qzTXmlGVIUSUQChEtQZForCDrZc7N9r6ZP1nZZTJJG70jm6LxM5V7lJNImdVSpbG+\\/KBLuqc8mtjAmkpsF1kTJ1VMt1GyJNi9Z5tZAaQip3DUNUApaIW66V46yujBpO4p1V+4LpplXNQqCkKm7ixIuUqqkypRKtec8vm6ncTqk6xWtT0kvziQc1ZoG56jUOi0CVTIUGj0uiSLfnJkqRT5SmyiTlqjVl5JpllJCQAMkDIDVyyjmkjMgevx7In9Nx\\/QsHy6pLZzs7wfgyUCSj9gUuUYccTcHO4mmy9NQt1SrrUp9UyVOErWpaiSagq+0KuVdztJqYmZxYJIdqc7Mz7gJAF0do4A36ICQkZgEgAaAAauba5OurOBl28cSKdJqySZiStqizNSBJy1kM1OqzFKKAN+Ti6Ss5fWb5o72oGgNglTEINXmLxuV7MlwT1aYkJY7wAG2aNIU99tGQ4LnHlkqUdoE5BGbAGZA69\\/jshcbgB0RoqjtQxzPk56\\/My6VG4bkG5eRCRyC5Zpt8jvU6pWls0Rl6u1V4m82tAO5LIQ0B4FCQr1lRPfGPtH0VtH2ipSJTC+gP6oIBrDtTryj+yZlRrk\\/UNb9lVq57gA0EhOxZ1OxqZhFhVTdVNOw0sGQS24l4GTs+3pdW2QEhDuuzT0qLydRJDxUXPNSc898fecYeoTqpA5+J7YiM3iCuzd1Tdaq0ypW8zFRnHid2\\/tHlX3fCMBc3NuH8pMzDl+K3nF7ueZR9UfN\\/cTZn\\/kjbH\\/oClf8AVIRmMPrCnEBqbsi0JptKg4luZtqivthwJKQsIcklDXCVqSFAZgKUOClR9bCiBl53Pzd\\/j4xgpnp1AChOTQVoRaYdBFrbiF31Fr24cNIxVPu30cWLcQtXz69cdH1nRlwCr7S2qhhNZjKXUKSo0Slotp0JUgJJbetxVKeaUEgEONrSpKtZaVaxKjjvevJ44V1pp12ya7cdlz5SvYtTDyLlooWQCgLlp5UvVvrbioVpZSlWexKgCc\\/kp1j1DjCwGeQA6gBG8p2OMXUlaVyOIqq2Em4aem3JqW05ys2X5Y8jdo6aRlMVWpS5BanZgW3JU4pxvTm24VoPrTEf7FfRfxlwKeFxvyq6pQqdMImZW97PmJpxmmOMONqlpqeDaJeqUB9t1bQbmZhpEqmYKWpWoOup3bT+Tt5RXEqUuijWzW6y27iVbjflltXLOFed7UGQbbcq9tXIy060KjPeRMOTMxMfXqdNamZ19TFVpiahNZcKlWnW1tTDaHm3kKbdZcQlbTjawUrbcQsFLiFoJStCgUrSVJKVCNaeK+jB+pvjhhJi1hKwmk0Cp4q2RSLnoku2ryO25m4bkp1I+cZNlvVW1b1XE65Tp+RQ4jyGanW25Etys621TbEdxJRtsNHewbjSlyH4QuS74wzWm20NNuVQt3Ykng4omX8\\/WlLDzaV+aTefIGpd9Eqo2\\/sz2nTtAr0kX3SyxMPssT7aFKErPyqlZXEPM3UEzLaFLclXUg2eAQEhK1NOz3sKMRaPi5h3amItAzRT7ppLU6Zda0rdp0+2tcnVqS+sJ1Vv0mqS05T3HkICHXJQrSChSY7IjofAfRlvXRPtKpYW3ddFFvKSVcc9cdp12jNz0kFUaqSVNYmpCfpc7rqpk5L1eRqE1s5eenZV5meQ\\/wCUF4vNt945npPrMfNbGuG6hgvFddwvVZR2RnqNPLlnpV5bbjjIWlD7KVLaW404TLutKDjbi0OApWlRSoGO85eZlpxluak3kvyryc7LqQoBaCSL2UEqBBBSoKSFBQIIBFoXjAPTkxfpGGVvSszVmnX6fblt3XiBW0MuttLZp9Dp7jrK83vo8nWZSseespQjZDcrJWrnrmek+sxF35bPSMlaZYONtFknXUzlXfo2CVDfTMI1Vlx5Tl4y6kDJeqJKVvKX1ElSST56wFKTGXs+ws7jfF9Bw02y44iqVSnycwUKKS0xMzjDDzxUCFBLDbi31kXIbaWrcCIbqFRTR6XVauogfRlNnJxFwCFPNMr7BsAggqcdKUJBFiogGwN40t8nrKT1w1DGvE2sqW\\/UrjrtMlXZoJIbdqE2\\/WbgrygpanFKW4\\/UqY4Ua\\/0ScgsrWsFGy1ScuzmPfGKeg9ZyrX0eLYmXWg1N3dUa1d00gDIqTOzSabTnFE5axeo9IprySN2ottOeSdYZZEZZgjqIMdzbRqg3UsbYhdZyhiWnRTWEIt2aGqUy1TUhsAABsmVKk5bghVwTe8fLeuzBmavPOlRV+XLeYm9+xSlom\\/HMUFV+JJOpN4aqTrdvN48b4R7YdKTqnqPCEVjPzufn7\\/HwiGIV+adx3evh4GNTCcNHUapzH1Tw6ukfGHcDUs7NONSzDLjzzzjbLDLLZddeecUG2WmWmwXHXnXDqNtI85RPNzrQhRXlSCSqwSkAkqJNgABxvpu494h0KuB36eu45kb7+rjHHxYsZjPo93j4x2s3gjjI5QaldRwpxFZtKi0+Yq1auyasy4ZK1aLSpdpT0xVK1cs3T2KJSqZLtfSPVGoz8tKMtnWceSCBHVSVBSQpO9JAI60kbjvyO\\/rjNmJKckuyVNSszLB0EtGYYdYDoTYKLfaoTnAJAJTe1xe1xd5TTyEIccZdbQ5mDa1oUlLmUJK8ilABeXOnNlJy5k3tcQ3UMx2b4RO8EdMOSMiR0Q3UMiR6vHsj1s304b\\/hCIbEcQewwgoZEiHSxkc+nx9vphusbwend6vHshyFoOviOvthqRkSOiEFDJR69\\/j0w5WN4PT8IQWNwPo8eOeFoOviOvthSxp4QnCS9x7ff1egQr48e2LFjdn0fHwIfQbKHfp1649Sbgd2ns+6GL43hXTmD6OEIQ7eGaM+gg\\/D4w0h6Fp3jxixY3Z9Hjuhusbs+g+\\/Puh0rgez3b4bq4Hs92+HUbvAw8RcEc+fXXLm2X9U9X6PjCMLkZgjpEIRkI3Hx6+EJRuI77\\/D5RRQzB7PbzQ2UM0nsz9W+HUNzuJHRCwbEHkbwuGyhmCOkEesQwjkOEMFDJSh0Ej1GMjwhxB3j19e6KQQQQ+DcA8xeG90MCMiR0Ej1GG6hko9ufr3w7d3OK9HtAMNVjzu0Z\\/D4RkDWx7vjb5Q+NQPARbCCvrHt9++F4RWPO7Rn8PhDiN58PtEewxdGTiuvI+wfHOGy\\/rdo+z4Q7f+sP8AFHvMNXOIPTn49sZCPreI+\\/7IIThJfEHq8e+FYTc5vT8I9GiyOfyvCkH0vEW+37Ibr4g+PG+G7nN6fHthyvgD1+PdDdfAdvj3RlIPoju069UPQ2c5vT8Ibuc3p+EOV8B2\\/Aw3XwHb8DD6D6Pgbfb9sEN18Aeg+PdDdfAdvwMOFjzew5\\/D4wgvcD454cTvHiPjDqDp6\\/dpf2Xhuv6p6v0fGEYWV9U+OeEYyE7x4j4wuCPscNb5qWGOIth4j0gk1Sw7ytm8ZBKciHZi3KzJ1ZDC0uDZuMzJlQy807rNPNOLbeStpawfjosc+orsMPKSlaVIWApC0lKkncpKhZQ9YuDDjLjjLzTzS1NutOIcbWk2UhxCgpC0ngpKgCDwIj0IbRuKUmxbV20aYTOUucRSK\\/TZtlQLU7TZxqXnpZ5vMjWRNSjqFJO7XQ5mQY+008MF06RehhpKYPS0oupVK9MILsFrSrKNoqYvSiSCrnsQpQUqLupd9HojmqhO1WEZNKCiFRrw5N7EZWKGhdgbWXpoTNSty2nMPaqNxdl37AqM3atObml6y9Z+YoNMpFQLmsVutTzLzp26lIRuYsmfVUbWo0xrBTiJRMq7mQV7SSUuVzXvGRcDAWd3nbTW4ExKPJ7nPNKji\\/CkwVKbfZROspV6P9COrkJxQ0GYvNzcmTbUpbSrUC8dh4uLNew\\/Qq0kJ7KpSDaXMtjZFQk25hCDqbdmQ8kg7lEpUbi0eVRh9OFL9RkFHc6wiabSeGsyrZOAEZZlQdbJBzOSM05AKjss7wR0gx99pk4U\\/wBjtp06Q+ErUt5DSrSxpvSQt6W1Q2G7NuCrTFassqTvCQq1q1RXyAopzP4u8\\/BQ7X5RUpUnG1aKJKV8LONLLKxbgRkB46mOS5xpTMwtChZSVFKu5aFFCh6imGyhmlQ\\/cn3GPs8JsQqthHilhtipQStNcw1vy0r7pWovUUqoWlXpCvSjeZ4Bb8gltesNVSVqQrzePxhGYI6RDCNbKvLl3G3mlFLrLqHW1DehbakrQobxcKSDu4cIZUopKSDYggggkEEEG9x3gEWsbjfz9Vm3K9S7rt6h3TQ5lE5Rblo1Mr1InEhOpN0qsSbFQp0yjzlDVflZht4DPgrLzc9\\/PxrZ5JDFxeMvJ46MtwzM23MVW2LHVhbV0gFT0tMYU1SesGnCaISCubnLcoNEqi3dZa301Bt91xTzr2WyaPofS55FTptPqLduzn5KVnEWNwEzLDbwHqz29WusXJLPCYlmHxueZad8O0QlRFuBBNiN4IsYIIIIz4fgggggggjQD8oXxPFsaKeG+GUq8Gp7FHF2VnZpvaAGYtqwaFUKnUGw1xWlFxVi0Xg4DqNBreCXG8t\\/0Q7\\/AJRJif8AdHpMYPYVy82ZiTwzwmer83LpeJbkbixHuOb+cJcsnc1MuUCzrTm3XAM3mJmVB3MjKstsFU+i9n1eWlWV6ebYpbIvbP59MtNTCdx\\/6n5ySLXIFhYm8aDE8wJejTWtlPFphP8A33ElY3je0lzdfwMR9UfVHp95hwj6o9PvMIJ4DsHuhdH1R6feY4Einibknmbw4R9Uen3mNlXJVWKbs0rKTX1sh2Vw6s+6ruUXG9dnyydlWbNkUb0LRt0uXSudlUkBTapJcy0deXEa1UfVHp95jfhyNlkCXtfGjEp6XzXVK9btj0ybIUFNCgyEzXq3Ltq3AomTcVuuPoBUSZSX+pkSuk\\/KDrxw9shxvMpWUvT9OTQmUg2U4a5Ms0t9Kd3pIkpmaeNtcjSynUCLM2P0n6Z2j4XYUm7UpPfSrpIulIpLLk+0VC25czLsNi+hU4kHQxvgthguTjz2rrIZYyPU46ckdPFCXfZz5CNBfyh3FFVLwr0f8Gpd8By8L6uPESqy6Mi6iUsSiN2\\/S9sriJacmr8qDjTZBS8\\/SwvcqWTnILtJlYkZiYUk5vTGqlQB85tlCdXgk7g4t4E7+Bz4ZxDb5dvE5d6accxZbTn6zwewxsizywkkt\\/OtfYm8RJ6aPnH9cOyN4UiTdy1EhunMI2aVhxbmj8kPC4kMIYUdcQQ7NNVPEsyMtkqM4+tmRXqkE2kzTlAnin0VFOUR0\\/tsqvm2Hak2lWVc7MSVLbsdQAoTL6RqdFNSz6Df81Z3EiNXeEFP8qud6dUnNumU59xCsvqzE0pMq2M+lTDk30\\/VHCMn0c\\/o8e2Ol8F5DZ0WqVJSdVU9UESyCfwmZFgKCknnSXpp5HUptWfNl3Sjge34COksSvl+qTIvcMBpgG9\\/qJSpY05OLWD4X4xwzUF55pzkgJQPULn2KKodsfh\\/8X\\/2odo4k9Xj3Q1Y4K7R7odt8\\/o+MRtf1T6viIwiLewH2i8KRejiez4iLIUb5\\/R8YZghyyPP7Ek+4fGHcNmOKuwe+HMMr+sfV8BDK\\/rH1fAQQo1+yJ9PsBhOFWfrjsMY6\\/rHuj0GyFeNvbYQ8T9Ydvu3wuN5A6YRR9Yen3GF08R2j3wwvePDr4QiF4qN5A6SIpFU\\/WHb7t8I3QboXhxCCeI7R74cJ4jtHvjHhCNx8evjC8EEVG8gdJEY8eL4ev7IeoGSUjqEIz9Mp1WkXadVpCRqlPmUaszI1GVl52TfQd+o9KzLbrLqCfwXEKHGHEOOEJKlIUhSFKSpKgpKkkpUlSSCFJUNUkHUEag6w2CQQQSCDcEaEEbiDwIjHprRVwHZuBVxCwpFbyhrCluzdRct9D2tmX00Nc0qn7wNn5MpldPCTrCTS6SuO\\/6dTqfSZNiQpcjJ02Rl0hMvJU+VZk5RhHMhmWl0NstJAy81CEiFoXAyAHQMofqNXqtTSyio1Kfn0spCGUzk2\\/MJaSkWCW0urWE6crE8bwtczMTBHbvvOhAskOurcCdw9EKJtoOHthZHDtP2fCHKB5oPST7PAhukZJHZn698OU8B2RqoZWdAOZ+HQhZHA9vj3wugbyfR48c8JJ4Ds9++F0fV7f0fCELOluf64ahVA3k9Ay9f6IVixHDtP2fCL4xFfWMEKNJzWDzDefh7YeQgwNyj0kD1D7YXhk6rA4C3zMJJIBPs7tw++KpGZAhcDgB2CE0DifR49kLoG\\/Po+Pgx4s625QzCgAAAHp6z0w7aRqjWPE8OofbCLSdZQ6BvPw9sPIYWeHt664QQRlRoSYN07HbSjwhsKvUWWr1rpuiXu266dPywmabMUGyEOXVMM1FCgU+TT0zSZKnNlZAVNTkq02pK1hUYrxIq5IPAMYfYd3vpPXlICUmbyknrcsZb7RE01ZVFmzMV+qMJUhKks3JcMnJyUnkUuvItsPNhbE\\/LOOWFsroSK5jSluTTiJekUFf4S12dfKUS0lSaIpM9MOzTqiEtMurablVLUbJ7fObBClJkeEqS9WsQ02TabU4kTDcw8EgqPZMOIUU2Gt3l5JdFgbuOoHONiWM9RE5d6ZVCwpNMpkrLKCRmEvOqdnFnW46xamJcKST5oTuHnZnqOH1WqczWapP1SaIL89NvTTqQrWCFOuKUGwQEgpaTk2jMbglBIBzI4\\/z\\/ANz7Y4D2qY1TtA2j40xk2l0S2IMRVKfkEu5u0bpipgs0xpwKNw41T2pZC02ASUEBKQAkfTakSBptKp8gogrlZVpp0i2UvZUl5QtwU4pSteHPefhcTr7kcM8PLzv2paipW1LfqdYSy4pSUzs5Ly6k02nJUgkh2p1EytOa+qA7NJ1lITmoQGOUixQq+M2K+GmENHLk3WFz66zV0KUt5ybvC\\/qkxI0xqYKUArdl5Rtc7m2yBsq6tSyVea3PYxGwWoGPMtRLIv65Zq2sLWKuxcV9NUpx1NeutqkEuUOzqeWG5hclJT1WcarNYqwlnHZNmhMS0qWJupNz8h93Y2j1oEYN3XL33hjooYVSmIUpNys\\/KYkzGHlt1PECWnqe2hiRm5XEK52qxe8vNyrDTKGZhqptutJZYCVKLSNj075LUts+wag7ScfY9wjhlxXn7VCpk9Ukz+ICtLa6Y3UF4cp\\/b1FEilT1RDapluXcmnEMuS6VMjtxD9oaKvWKK9hqhyc27MTr0sqfmywoSbUqwrzhDAfUpttcwqYRLuKbS4UBkKS4tK1gRF4wk0VMcK5blt2zhlgvifctFoVIpVvU+fplk11yktS1KkGJGWM5WhIN0iUVsZdBWuYm2WiSekRmpZfJOaZl47Byp2ba+H8u+6EImb3vOjJyZJzMy9I2mbtqrDSCcih6QbmiQS3KLbLK1yNZ\\/HetvApp1GpsmSDqrmnX59SUjhkWxIoBzAOsptSCR9UjIR8ZPYp3zPkg1pcq2eCJKXlZcJ\\/GIdSyZhRIOSc3lAb9wOYiaVDaz5LtDddcVXNpe0KbcWpwuUWiSlCp7ziyFKW99PLp8+i6itRWjMbrT+SUAVCgKb5Nk86Qup1ApVfMsKmGWc6idSUS7M+TcncmYTvPp8I1XWbyH10vJafxGx7t2kJQAuakbMs+pV8LSMiUM1evVa2Ey6QlWsp96ivgapTsN+0RkhbXJG6GtoBp69b8v28ZxBZ28nU7xoNCp7pbBLqGafbtFk6y23Mf3wLrUypDeyDbrbhK3MkZysVaof8AyQqlRnQd367nZqaz4KH7M6s5BQzy58uaOO8\\/9z7YiM35WWz2mehhDYLSlrQbonsY4mnq6FrICCXaUJVLASUEKyongjMSoIQoZjYFO8nnC0plVNOJfVpmBaddKrZdSqZmXGr87SyRa9wd0I25opcn1YAaTRcD7Mrzstkda46XXb92y9ptFLd+7ycq0s+FKBVq5LYSj6BtKWPogYp6UWDGjdb6mMOMKrYpl2VKXLdCt+k0W3rVlksGYXtahVWrelNqzSmFF1SW0bNyoTqVysspnOdnpToDGfHyhYaSk1Tqc9KVS7EMqWuVccBp9Ca1dp5bW30rQG1JZ+lbkEuofW0W5iYVKSrjTz0SfTB078QNKXECqaP2jHctRnBVJlacV8dJWaeQymioWyxPyNpz8u4y7KUGW2hkJmpSSpVytKDNDtlLdIfXOVGS4A8oHb1tJqj0jg+m4C2eUOTY7asVuh4SlpWQodKAypmpqbqjlXstCUrEjLstpmJ15JblWglLjjEnqWDdmWzmkGv12VCWUJUqRpyVsSs1VX20pUW2USbMspqVSSjzmZWChtCkputxxpLuUml3yguKenjipP4VSN5vVbBbDqrpnMTpyhrdp1l1y5pN3WpeG1oybEy5L1Giy0ywZm8q1PKqkzW5WVRQ\\/nN2kTrjlX6qj4rDjDe3MKbLo9l2vL7Kn0ts7eZWlPldVqLwCp6qz60\\/sk3OPJ1lknVYaSzKMBMtLsNo+1jbVuopn5tRbnalU22ipJqtZmHJqr1d85RMVWpPOKURMzakJ7OXQQzISTcnTpcBiTbJ4lxvi6cxnW3am+0xKSrSfNaZTZRsMydOkUKUpuXlmRogFSlOOrN3XnVqdeW46pa1JL4g9Xj3wgscD6PHthyvh2H7PjCC\\/qnq\\/R8Y1zR3dxt16jEQhssbgeg+PhCCx5pPQR498OFDNJ7M\\/VvhBXA9hjJj1O8eI+MNV8Ow\\/Z8YQV9U+OG+HKuB7DDcjMEdIyj1O8eI+MPnUEc4Qi1QzSezP1b4ug4xkDQg8iIQjcR39fCGqxmlQ6jDGOQhgdxI6CYfhcUhvDiEFcT2n3w4g7x6+vdGRv8ACG0IHcSOgmHCuJ7T74bq+se3374fRvPh18YaRvPh18YpCCvrHt9++F4RX9Y+j3CHYdhsr6x7ffvhk7ucV6PaAYfL+sfR7hDJ7657BD6dw8B8IWjefD7RCUEEEZCdw8B8I8V9Yw0e+v2gfEQ1XxHZ8TDx\\/insPvho5zen4Q+k3SPC3s0hxJukeFvZpCcJL4g9Xj3wrCbnN6fhDiPrDvvCoZv\\/AIP\\/ABvh3wzc5vT49kPX+Ce0+6GbnD098Pp+sPH46QQlFi+A7fgYvi1f1T1fo+MKP1\\/WPeBHqd48YbL4Dt+BhBf1T1fo+MOF\\/VPo94huv6p9HvEZSNx8fsEPw3X9U9X6PjDdf1T6PeIcL+qfR7xDdf1T6PeIyEbj4\\/YIALkDmbQ3X9U+j3iEFcD2H3Q4VwPYfdDdXA9h90OJ3jxHxh1G4+P2CG6uB7D7oQhdXA9h90IRkJ3jxHxhcEWqGaVDpSR7IuiiuB7D7ofgiSTyFOIxqOHGN+E8w+kuWteNBv2msuOZvKlryoy6FUwwlWZ8mk5qy6c46lHmNP1QK1daaWpUmLCWdK6XUqepR1pSdRMtpO47Kba1NUJzyKEuSy1b8slLA3FaTEKrkY8RFWfpiy9qOupEninh7d1p7FxZQ1850duUvmQmUjMBcy3LWrUZFgKz8yov6iddaAZlGGM4qWr70soKSmeknkI6C8wpt5JI6mkTI9PSTknBs19C7TqRMXIZqZ8zdAsAoT8uqWbSNB\\/15DDljckjv06qwNNCs7LkMKVneo78xKkm9wJaYTOIFt9kyU0lpNvzUi2txEMf5SFhL9wWnnQcTpJCkymNuDtn3DOzmzSgKuyx5upYf1CXQUZl7yW2bfsmYU+7qrCpwsamzYaWvUFJzCZuUlJpGWrMy7L6RzDatpcy38MtbIhW8ZZGJXfynjCZVf0e9HbGyXYDkxhtivcFgz620fTIpOKdsirCZecBGcrL1XDOQlUawWWpmrJ2Ool97XiR2ZNeU0CWSVZrlXHpVXSAlZdQk84yZeaHZu6YtXHsqETy3wDZTqXBcWNphtKlqOm7tm1gDcL87gUJiuV83qs0ANFOh4HmJhCXVHedzhWD3gkACPojuJHQTHHncT2mOQVxPaffHHq4ntPviAN8fV9sRte5Ph8omNfJqcVzXMA9ITBeZc2j2HOKVBvynhxaddFKxPtpVLVKsIORVLy1Tw3nZpwjPZTNW84jbtAyXYg9\\/J0cT\\/uP03btw9mXSmRxawYuinSjAXq7S5LNrFDu6nPcVJWlm3ZG72y1qhecwl1LqUtuIenCR25smqBqGBqSFKzOSKpmnuG5Oku+tTA1J+rKOy4tewtpYWAs\\/Db\\/AG1JYBN1MKcZUTv0V2iBuG5txA77XOpggggiyI30EEEEEEEefXyrOIxxO5QTSbrYeDktQL8GHMo2lWbUunDGjUuwJthr8UqqtvVGZfQCR5U\\/MEcd0\\/uv1um23Q61cdXmEytKoFJqVbqk1uPk9OpUo9PTjpyIJDUsw44QCM9TLPnjzIL2uqfvq87tvaqjVqd43PX7rqQCtqBP3DVJqrzgDhSguATE459JqI1uOXMOcfKMqRao2HaSlVjOVOZn1pBUCUU6XSwM1hly5qleyt6kApBKFFMHxs\\/ZiRlhr2jrr5Fx\\/UUpbSd4IJ7dWXvB4iPnk8B2D3Quj6o9PvMIJ4DsHuhwngOwe6ORYreF0fVHp95iVdybNl\\/cXoiYbuOMlioXg\\/cV61BJH7L88VyclqQ\\/xzIdtynURY5t5yiKqw248ptllC3nXVJbZZbQtbrji1aiG0NozW4tayEpSlOspXtms4TWebIw7w2w+ZS2k2pZ9pWikoIKFO0WjSFJWo7PWCy47LKWpQ\\/ZFKK8zr5xxn5ZVUdThXCGGJYqL9exI7OhpH7Y+ikSZlwzl3qSqZrUsqygAXENkXOkdLeTPSw9iPENZWm6KZRmpQKI0bdqc2lxKweCuxpz6Bb8xa77xGVNBlthR6e2UqBVLtvKzSQQqYKnyCCNxG0A35EZHo1Y867TJxJTi9pXaRGI7U35ZIXRi9fc1RH9dK9a2ZS4Jyl2ugLT5q0s29I0tkKA1SGgrLjHoB6R+IwwZ0d8bcUWnUy7+HWE9+XXTStWyDlUoNr1Gco0s2ojc9OVRmSlGMwAp15BAz4ebZKy7tQnZaVSoqenZpiXSSNZRcmHUtJJH4R11jnzMdlbHsPtUGiNSaCAxR6TSaKyoJIHZSEohpduBGRlg31IFr7zGZttqfbOUiTvYrcn6i8k6\\/WLbTCue8zIOljw3GMxrBkBTrPoTBGSnZITq8xkSufWud87LfrJS+lGqd6QlKVHcY+0RwPb8BDZlpuXZaYaTqtstNstj8VDaQhA3ZcEpA8bnSPqj0+8xiTTxfdffVvfecdN+BcWV9\\/O0csOKzuLX+mtSvaSYeMfUP8AjH3CHTfP6PjDVj6h\\/wAY+4Q7RwPb8BGEv6p9XxEIi+FG+f0fGE4Ub5\\/R8YZgh4x+H\\/xf\\/ahxDdj8P\\/i\\/+1DiGV\\/WPq+Ahlf1j6vgIIWY+uf8U+8QjCzH1z\\/in3iMdf1j6vgIV\\/U+ucPUfW7B9nxhdH1h6fcYQRxPZ8RC6PrD0+4xjr+se6G4Wi5H1h6fcYti5H1h6fcYQrcfA\\/CEncr1\\/AQun6w7fdv9whyj6w9PuMN0fWHp9xhwj6w9PuMMR4jcfH7BC0XI+un\\/ABk+8RbFyPrp\\/wAZPvEY8JWdQO6\\/t\\/VD6HEIJ4jtHvheG3OHr+yEQQ4hBPEdo98LxjucPX9kNoGhPfb2frhxwhxDeHENwOcPX9kLgZADoGUOE8B2D3QhC6eA7B7obc4ev7IbhdP1R4474uiieA7B7o+itu1rnvGqsUG0bbr11VyaB8mo1t0ifrdVmQNUEtU2ly01NvD6RAOzaI3gccjDDTTsw4lpltbrrigENtIU44tR\\/NQhAUtR5AAwAKUQlIzKUQEpFySomwAABJJ4Aak8I4poZNp68z7T8MoUjY7hNyUumJiamVnKnZVKwroz+yc+ccS60zSpsNFX0oTbFIZrd0y8y22PMZqdGpjbrn0ZmG83HWtkWHPIuYOWi1LVTHTGevXS42Q69R7bl6bYVBWsKOtJzFQqTtfrNRYz1EockXqFNLcI1Ajcg2HS9kWOqgwuoTFJFBpbaC5MVTE0wzQpOWZBF3nhPLbmgyB6XaIlVpKBcE3TeR07B2JauUIlqXMIDhGVUwnzcKB3FKHLPOA8OyacJGu43iOMj6vb+j4RkLhhotaROMIZcw4wdvy5JGY2ZZrSKHMUy3DtgC1\\/3zVoU6329cZqSXKmPM+kG7fEo+xcGNCvAksrw3wbtKZrEmGxL12Yoi7qr7LqE73GrpvN6o1OW2hJLyqZNhondsihlsN9oVXHitvgt0elSFPRmQHZtbtQmNQZaigEqlWG1c6klt5HHPhmY5V6rsAwSVpxltkkq9PtqKV0PZtIO4idUtBsttFdCHaO04hd0FE15uRYj610otiheT1iio5Fz5VKtqsVAN+bix1BDk72b5Ft2WQc334a6McMuRi0h7jSxM4j3lYOGMk+EF6TYfmr4uSUIILm0kKSafbrpRrbthdrgcczyOzIcOclmckhomYfJbmMU78u\\/EGot5JmJKdrslZ1Fd1cwosUe3wLlQCcgr\\/vmmCAUZJBzW5k\\/VL8u+s63l9fqCkKzzl5Z0SUuQr8FTEmGWlhI3eelRGWeeeZHye0WSeBJ6h7N0VlU\\/Kw2SUEqbwDsWerkwLhus7R6z5xcp0SX8OU7zuQcCio37KoS5ASglKl\\/VuKi+TlQJPIuovImHE2zAh2azbiRmeLMtvG8yB1Kh9XQ\\/dWfh1oeYPBpWG+CVnIn5cJSxWEWlJ1OtNhsgoBue7BN3EElYSoKE24VrCXHElTaDH0V74pzt3SHzTL09NLkPKEuvDyszTs4Gcyyl3JllCEJcCHy0hKvpmmQV5N+f1HtF\\/jGDaL\\/GMU7jjyt9ruOKJUsLrnqHhbC9Xl3JOo0DB+HpCkyczJvAJdlFTT5n6shh1F2322qi2mYaWtl4LZWps21RNnmGKAtl2QkEh6XUlbLi1BIQ4j6qwxLtsS2ZJuUEskoNikgi5ewQy2i\\/xjHx1+3aLNtifr5bbmH5dUszJyrqlNJmZmZmG2ktlTadYBLanJhfDNthQz5jzkiYC1JQlKypRASLjiQOfDT2cLXibIZW4tKE2KlqCUi+9SiALk7hrv4R99BGH9I0rKXUXZqXFClZxyQfVL1AUm45abdk5htxxpxialPIAuWfQ6y62pqYfSpK21pKUrQsJ+3k9I2zX9UTUjcEkvPetUnIzDQ+r+GzPl45En+8cBxz80ZbjU00crks+lQtdNk3AICkm2cGxSQRpqLEaWjJ+jpsjMlrOnWym1ocBsbGxQpW43B5EEHWMiYI6fk8bcOZzVSLiEs4rL6Ocp1TY1c9VOSnVSapVPnK3\\/AE\\/MpROyBUWty43WXQZJL8lUW7hnHklUrIUpwLyIRmFTk0pCm5JvNQC9dLsyCfo5N3UdyZCnCrKGXweF0EX3bidNBztuHiGxJTRUE9g6FKNhdtYHrJSABzJIA4mO3ZqclpGWenJ6Zl5OUlm1uzE1Nuty8uwygZrW664UNNtpyGanCEjfmejX\\/pNab1hYS2fW6\\/MXbTLMtCkp2FUvysuLly666lxLVOten6q56dqc3s1IkUS8rM1SdWFt0ynFxKJqNXWnrywGGmEy6laMjPyuKuJEoX25bDq06i2LStOooS600\\/fVwMKmWmp2UeC9tR5cVC4krUWVy9ClppE2mP8A\\/c9pK8oHeTGJmOFyz1Bw6YfedoMtLSvzdRZKQmFI2tKw6tda1MMtusssszd01MTTs0G2pidnbgm2Fyw6j2VeTfWcSSjOLsfzTuCcCpyOpnZ9ARV602QFJYoVLdQXn1TCE3bnZhrzUpPbyjFSQ242KvxztXwxgRh9pp6WrddaukSzbmelyDw3CdfbJVNPtqB\\/YEpdzMlaH3Jc5Vx3TpDaZON2n9dVTwdwJp9VsfBNU0TdteqC3Waxc8g++sLqV+1WVW6mnUqd1XFSFk06ampirvB5+rTdUShEvRcjsG8F7NwStVFuWrLFyZmNjMV6vzaEGq1+oNNlHlM2tOeylmtZwSNOZPk0k244EByYempqY+usTD60cMrZlLUsujS1GpEmAooZBXMzsyUoS7P1KcWVPz09MagLsy+taiEoabDbLbbafrY6SqFWpMrR2cJYMpScOYOkHC43IoVnnqxNAICqrX5vMpc9POlCVpSta2pYBtpsqQy1k4OxrjyuY4qjtQqs48+FqAQhZSlKW0qu22hluzTDLdyW5dpIbSVKWouOqW4U3Rm2rqyPtHwzhnD1z6iuyGURlG4+P2CIdFqvqnxzwgrgew+6HCuB7D7obq4HsPujIbNhfkq\\/wghud4I6QYQhxDeMuCG53gjp+3vhvDiG8EZEN4Iqrie0++KRkQ0g6kd1\\/Z+uG8MV\\/XV\\/jK95h+rie0++GC\\/rq\\/xle8w+DcA8xeHYthFf1j6PcIWhFf1j6PcIcRvPh9oh4fm\\/2p\\/\\/AFhsrie0++EF\\/WPo9whwv6x9HuEN1\\/WPo9wjIRvPh9ohKfrq9fxEWwkviOz4mFYSXxHZ8TDsOQ2WPO7Rn8PhDN\\/64\\/xR7zD1fEdnxMMn\\/rj\\/ABR7zD6dw8B8IWjefD7RCMEEEPp+qOuMeL+sfV8BDd\\/8H\\/jfDvhm5zen4Q8f\\/A\\/43\\/swzc5vT8IyEfVHr+JhxH1R6\\/iYThNzm9PwhSE3Ob0\\/CHEfWHr+BhUNX\\/qD\\/GHuMMl8B2\\/Aw9f+oP8AGHuMMl8B2\\/Aw+nePEfGCEotX9U+j3iLotX9U+j3iFH6\\/rT9kep3jxHxhuv6p9HvEN1\\/VPo94hwv6p9HvEIK4HsPujKRuPj9gh+Gy\\/qn0e8Q3X9U+j3iHKuB7D7obq4HsPujIRuPj9gj0aWPf8LH7Ybq4HsPuhurgew+6HCuB7D7oQhYNiDyN4cRuPj9ghvDeHEN4yN0LggggjIgju7RTxCXhTpKYGYg7cy8rbeKFnzNWcByP3PTVZlqdcbO0yIbMxQZyoy+1IUGi6Vaq8wmJ99uTSpGu0mYAKQmeaQtR3lKJhSWXVZ5Dds3XOPPzbso85KJ\\/Ojzf7mKeBGDOJBfW\\/NXvhjY9zTzqiS4mq1W3qdN1dl1RKgXpaqOTTDxzILrS9Va0ZE6SqLclZylVNq4ckZpt1JTe+dh5qYZsdySFNqOhBN72NiR0JsSmw4xiSjOEZXm5WbbQeS0PSk0q178ZUcQNxtpf4PlnMKzi7ybGk9SmZLyuqWZadNxXpLyW3nHad+phcVIvKvTzKGUqIBs+lXLIzK3W1sMyk7MPrUzszMS\\/nq4dTesKnJqO8FmabGfHMLadOWWQyyYHXn0x6lV\\/WjS8WcLL1w\\/rStlRsS7AuSzqs5sw+W6beVvTtFn1bBa20uakrUnSloupCiAjWTnmPLGoMlPWvfNQtyqNmWqVPnKvb9TYOsAxP0x95mZaIWEKzRNSLjQK0pOtu1Unh0Fi0InpJuabKlpclUrSsg3yNlMw2bkn66VrsN5Gax1AEOx9KKbmZd0pAU5LuMqAsLrlXQpRtYG9nwLm90gAWAsO1VcT2n3wwX9dX+Mr3mH6uJ7T74YL+ur\\/ABle8xVaN58PtEVurcjw+wRm1yamJxwg0+dFO+FTS5KWRjHbNp1OcRnlLUTEdb2HNdfe1SFGWao11z65lKNZwywdDbTqvol+k5HlIUuqT1Eq1OrNLmXJKp0ioydUps2yrJ2Vn6fMNzcpMtHmcYmGW3UdCkDmEepphpe8hiXhzYGI9LRs6Zf9lWre1OQXAstSF1UKn12TRtEKKXcmJ5rz0EpVq7uIMdS7BZ\\/NIV+lkkdhNyc+2k7j52wuXdI13jzJm4sNFJIuN06wg9duclydxZeSP7dKkOEDcLZGx6xyj7uCCCOgImcEEEEEEYR8o7iGrC\\/QV0prsbdRLzP6kFzWrJTKwSJepYgstYf015sJIV5SzPXPLOS20zZ8pS1tkLaC0nzuxvAPTE2jl9b8ctPQNdtlqaLa8UMYcPrOflkvbNcxIUluu4iOqdZB135WXn7IpindcFluackXCoPbHaQlk8B2D3Rxt5Q9Q84xZS5BKrop9FbWpOa+SYnJqYccBSNEqLDUqon84FPBIis8Yu56m01wYlEAj+M4tbhPgUFv2d8OE8B2D3Quk5pHZl6t0IJ4DsHuhdH1R6feYoCIXHfGjNaKL80gsF7UdZL8pVsSLQRUmRq+dSJKsytQrO5Z1SBS5ScPHgPqLz1Ime2owJq4KY2pJIQ8qZUcvwpZp19s\\/wAdoekADfkDFf5Lq1vui0s7YqqmNuzZFp3pdTwUjXQhL1LFpS7yh9UFqbuuXWypeRQ+EKQQ+WjEr\\/DdhL1YmphI1kS0i4nIg+Y8+80EZE9KEPjduyO\\/jv4d23j8KPKI2UYUA7aXpiKVUJloArSC5V5mp1BpSL2AVTKPLKcNvqK10TeOzPJ8kvMcBYlq6k5XKjVXZZtdrZmpOSlm2VBWtwmZnplIHBSTci5A1+ctliGqwuT1xWkmnSzP4kXBYOHdPcSrV1fL7pkrkq7e4nW8qty163KLH4sxnwSUxCGw6kTP3pQmiAUMTSp5RO8J8gZcm21cM89qy2lPMFlJ4ZqiUt8o+xCXIYWaM+Fbcw2UXRiBet\\/zcoF5uoXYduU63Ke+6ji224jEiqNMrc1Q8pt\\/YhRZf1Iy2CUoH7hqc8pAKZKllpJO8penJlrVUN3HZMTCePBREfQmjI8wwhNTA3vibWFag51lMmjS\\/BSEgWA14Ximtrk\\/22JJxANxIU+UlE7rAutqm9Lb9ZwXJ1uLHcIydhVHA9vwEJQqjge34CIKfqepP2RSEPWPqH\\/GPuEOm+f0fGGjHBXaPdDtvn9Hxhhf1T6viICLewH2i8KQo3z+j4wnCiOf0fGGevbBDxj8P\\/i\\/+1DiGzHFXYPfDmGV\\/WPq+Ahlf1j6vgIIWY+uf8U+8QjCrP1+0H4GMdf1j6vgI9v+TPcbe8H7YfI4ns+IhdH1h6fcYbo+sPT7jC6frDt9+73GMdY9LxF\\/s+yEQvFyPrD0+4xbFyfrDxx3Qg7j4GPCNFd4Pwt9kOE\\/WEOEfWHp9xhsniO0e+HCeI7R74YhKNx8fsELxcj66f8AGT7xFsVTxHaPfGPHjnD19e+OQG4g9BELw3hxDbnD1\\/ZDcHCHEN4+ptW0rtvqtSlt2VbNwXfcNQWEydCtmj1GvVicK3G2xsKZSmJqbe+ldbQC0yfPdyy35FCGHZhxDTLbjrq1ZW2mkKcccUqwCUISCpSidAACSYbbzE5UpKiogJSASSomwAABJJvoACTbQRw0OI2wYHcjjpTYnJk6liCLewQt59DLqjdb\\/wA+3cuXeBCXJa0KC85snm9TN2TuCuW3Nt6wOyG4xtaww5LHQowM8kqGJc5U8YrolUpdW3edRLNETNBAbK5Ww7ZLCXZVeZ1ZO5pu5GNd4uF4lDWxn8vsvxC1T1VvE0xR8C4fayqfrWNKnLUCUaQRmUS3NrTMpWEAqQl5llDhsA4kZlImFIwHieuuttylMeb7QXSX0OBxQ01TLNocmlA6ZVBjIq4OYAgxGKw\\/wtxIxXq6KBhnYl2X3WFFAXIWnQKnXHmEL1iHpv5vlXkSMqlIWp2anFsSrLTbrrzzbbZI2g4O8jNpPX4ZOdxIqVn4M0Z9pp51qrTqLxuxtt7LZ7O37amTSNqGs1vMVG7KZNtO7NlxkPB7yaQNLYn2dYtIatnCqwqFbdBktcSUhTaVTrcocqdRLaFytAoTEvLISoNt5\\/TSjmqhvNOeWz+CrWJN510rRNVmYl5dw75SnASDASU7m1eThD8wgqOZEy68So55ZbOKzxBtl8mbARcZNaxNterLOZBk8LypoOGA8CDkfrM+4zMvsgAJE7R11BteYqS0PSDV44c8nGfmOzerUz2KDlUptxYYGU2zDsGC9MKIJ0Dj8kq29IJEYz4dclRoV4OoamsT6rXMWq8zquKYuqtu0mkMvMEnOUtGznJGddaWQEuS1bqdelnlnUW3lk3GaFCvTCnC2mKt3B3DG3rVpOsj9Z2\\/QqPaNIdW3rasw9J0eUbcnFnXczcm0szLilOrWsq1lOdIaxVkSMyfrKz49HZlwyAyEU10dfr\\/AKsUriDy4MdJQ9J7McJYO2WyLiVoTN06ms17EpbWMpTMVqrsGUeNgFJWKOh5BAyu+ikC9aBsbwjQwkiV85dSAFKShMslVtPTU0VTa76g9rOOAgkEG5v2bWcXL2q5UhFRRSmVZgtUpkMKTnqgZTLin50L1RxbmEA8dTcMuu5mbmptwvzkw\\/NvqzKnZl5x91f+M46pSyczmNdeXXxzba6Ov1\\/1YNdHX6\\/6scvYs2kY6x3M+dYyxhiLEroUVoTWKrOTsuwSRpKSjrqpWTQODcqy00DmKUC4iyZKlU+nIySEhLSibAEsMIbUrvWtKQtw961KVzJisEU10dfr\\/qwa6Ov1\\/wBWIb2veerdeo89c6x5H2GKwRTXR1+v+rBro6\\/X\\/Vg7XvPVuvUeepY8j7DFYIpro6\\/X\\/Vg10dfr\\/qwdr3nq3XqPPUseR9hisYcaY2JdGw7sCs3FcCyaDYlq3NiRcDaXEtuKkLbpM\\/MoS0pxaEbdyXlKo2wFnVU6pKe3MbXR1+v+rEdnl2saGbJ0X74pEnM6lZxbvC3cLKZs33UvMUWnOuXFc0ywhGQXKzMjbUxSZwuZtatxJRkVON5zvZjht3G20DCOE2+1tXa9Tae+pvRTMm9MNifmb6ECVkRMzKiDmCWVEAmwOFVaomg0as1xdgaVTJuaZCx6K5vsi3JtG4I\\/KzK20C4IBIJFoia2DY+MGk9idf1zWvPM\\/dnUJmu3\\/ctbnqtN0hDk\\/cNZXMzTTVSZbmHUz1Snqg+qVadLbS2WJhTswhDRCslZSwuUmw1Kha1+YxMyTQUCm08bZp6QdSgTmQND+65l2Y1UrmHmA5SiG3JkbMonFltORnJ12Ibdwlrl8TDOpO3\\/AHAtEq4tGqVUK2A\\/TZNSFKAUoKrD9e1iklopQzu1wonYBH1nx1tRdp2I6jh6Tw\\/harUKjqZpjEtV6UJ0JXKMNNTLTdnm0NtszCXZdtsIUhKGk+iSSI+ac7jSsU6rTfmEwUdm7kU8HZhEwt6w7dSnmX2llRcUtNyVEnU3uQdT8npjcqdhrrNztw4qTUk1rF9dyYVUC7pJWzVNrUlVcn7Nqj6Mj5Q7lLVZlSpdqXUtS5RpgBld+nbygOkvT28GJSfn6ZMTu3TXWbBtdVj1yqSDynJZTVy15LrRo9EQUvS0wGJihU+bOtL1Nc8tKGY22wRCEYwwMmYaqf4mdnbdblViYkqlLUeQluwnEizcy8y1T+0mVNqstGaaQ4haULbdbcQlY2v44caGTdkl1msrl3mVMqYXXKkqW7NWpQqXW8sdmrULQhaAtJUkqyqUDrrwJ0DrZstcldOLT8ne10JUiZYt5oLdtSlPlKVgzgfQh25JxpeesqaaapSVqUnyKbWhqbOwDZttNIaaQltttKG220JCEIQhICUISkBKEJSAkJSAEgJCd0OXlaysuZO7088Nlnfl6T2+PfEZr2Ja3iic8\\/rU87Nu+kGWtES0q2og9lKy6LNsosBfKM7hGZ1bi7qitZyemp93tZp1TitcqdyGwfzW0D0UjnYXNrqJOsIr+qev9PwhGFHDwHp7vjCcacXCD3\\/A2EYqfrDx+GsJu\\/savR7SIZw6fPmgdJ90NY9Ru8T932Q9ff3G3uB+2LVHJJ7MvXuhBXA9h90LLPm9py+PwhBf1T1\\/p+EZLXD+2H2R7CJ3AnohvC6uB7PfuhurgewxlQAXIHM2hCG8Lq4HsMIcIBqQOcZEN4IIIyIbb4+r7YbwxX9dX+Mr3mH0MCcyT0mMiHIpCK\\/rH0e4QtCCuJ7T74WjefD7RDwGiT\\/Ft7bfKEFfWPjhuhuv6x9HuELq4ntPvhuo5qPbl6t0ZCN58PtEJT9ZXr+IikJL4js+JhWEV\\/WPo9wh2HIQX9bsH2\\/GGT\\/1x\\/ij3mHi\\/rH0e4Qye+v2AfEw+ncPAfCFo3nw+0QlBBBD6RZI8L+3WPF\\/WPq+Ahu\\/+B\\/xv\\/Zhm5zen4Q7f4p7D74aL5vT8IyEfVHr+JhxH1R6\\/iYThNzm9PwhSE3Ob0\\/CHEfWHr+BhUNX\\/qD\\/ABh7jDJfAdvwMPH+Ce0+6Ga+A7fgYfTvHiPjBCUWr+qfR7xF0Wr+qfR7xCj9f1p+yPU7x4j4w3X9U+j3iG6\\/qn0e8Q4X9U+j3iG6\\/qn0e8RlI3Hx+wQ\\/Ddf1T6PeIbr+qfR7xDhf1T6PeIbr+qfR7xGQjcfH7BHqd48R8YQVwPYfdDc7gT0Aw4VwPYfdDdXA9h90ODUjxEOI3Hx+wQhDeFycgT0DOEIyBqR4iFwQQRQnIE9Ah+CGETKeSBvr7tdBjDiReddmJ\\/D+vXvYk8645rk+R3JO3HSWxqnNpEpb1z0iTbbWQQ3LI1RqqSYhrRJk5Aq+VTmHWkJhq482lNu3rZ99SbKnvpHfuzodQoNRdZlid6JcWFS0zDrOYSZiVbmCjWl9fCqLQck3NbFC2ljfcnPksLEcFk6m1geNotTZLPeaYyl2SdKjIT0mQdxKENzwueH9BGxFjrlv6RiTbac2XqDIBXnFkOMK3nMbJxYRvOtl9Ds889xOW8DIR5t3KU2AvB3lG9Km2fJlyMunHe472k5Qy5lEy9GxLnGMSaWxLtbgmSTR7ulESCkgJektg6j6NYj0dLMmcpKaYIBDU0HRvyIDzaRq7hw12ScsyCd2XTBw+UY4efchygcteDLZEvizgjh9drzwJyNUoE5ceHczLrJSMnWabZtHeUEa7YanJfztcuIat6jzYqOGqWhbmZSJNpld0m5LLZlHd+\\/MUZlG5143MTDaXIANLdCR+SqSidRYNTTS1buAzloW0JB3GwjVmrie0++GC\\/rq\\/wAZXvMVpswZunyU0TmZiUl3lHeTrOtJWrPMkkhRIV1kADotVxPaffEDCSha0neglJ8QSD7xFDL0sOI0PiAIbq4ntPvj0V+SKxHVifycuivXHJlD03QbBfw5mkCYEw7KDCy5K3h3TpaYBzWwv5mtmnTLMuvV1JOZlVtJMu6y4vzqFcT2n3xNq+ThYgi5NC3ESxJmYWuew3x5uNMqz9EUS9u3datpVmn6uoovhTtfbupaw6wlBzGxmHvpmpa8Nhs72GKpmUUbJn6O+hI5vS70vMI17mkTHcb+oyjCruSo9nfR6WcRa\\/5ySh0HvIShQHcTEhWCCCOs4sWCCCCCCIvfykS+A3R9FfDZl8qM9UsT74qjAdWNiKZK2fQaC8tko1HduatciG3NcLl\\/J3E6mUwMosSeA7B7o3v\\/AChW9vn\\/AEy7Fs+Xd1pawcCraYmmjrfR1q5LrvGtzakjaqbDblGct3fs2ntdLhdLzRly1ofR9Uen3mOBdsM6Z7aFiFwKzIl35WRbFrBPmchKsOpB3n8uh1RJJN1bwLAU\\/iF3tq1PLv8AVdDI4gdi22yfe2SRzJhwj6o9PvMOEfVHp95huj6o9PvMLo4Ht+AisY0BFyruJPvt9sbo+R0tfyi68bL0Ukf7kW3adrsOL1wpf3R1Sq1WaQydXZEM\\/cvJmYGuFpD7Hm+csokm4VSwTJ1abJP00xLSwI\\/BEs2p05ZcczNJ3jPMjqzjRpyRNtCnYC31c7iVImLkxQnJRpWSgHabb9uUBEq4M16isqhU6u0dVoZbI6y1g6rO+\\/DWWS1asu4E75uanZhXDzih4yoIOW4ZSqeBPnDPPmHEuHkjE\\/lg4mnrhbeF6TNlkG5DQkqLTMOPBNtDebqkyohW4uGxBAMd5bPJb6J2O4cZIsuoqem3SPzzOVGbnWSbjS0s2ynT9HXviB\\/KIb8RXtLnDKxJaaD0tYGB9JmZxgPJWiTrt33ddE9NsllIzaedoVMtmZUt1ebrTrH0SUNoW9qYwNk9Sj1uoZHOaqLEpnu3iRltqMhxyBnyM+GeYG9Koya5Yi+Pu95RjSPnGXSuRt2tWpY0i2XS6mWNmWJbNAqraFFpnVDtwSdZmy0EkMuzK29o\\/q+UOdH4Tynktk01RSErnHZ2cXuyJ15t1lsk85LMu0QeghPNH0JrX7DwrJy9yC8JNCkk63I86WNOCVt94BtqSbnkTHc553Wq4+CCl2qvtNkXspth5TTStdbFtlB4ancN0dkQqjgR1+PdCUKI5\\/R49sV4Tdv1Aew2iv4eMfh\\/8X\\/2oeI5\\/R49sMmPrKHV7iO+HiOPo7oZV9U9cYIVi9HEjq8e+LIvR9btH2\\/CGT7d3x+zfBDtj65\\/xT7xDqGbRycT15j2H45Q8hlf1j3\\/AKvshlf1j3\\/q+yCFGv2RPp\\/\\/ACTCcXIOSknrEMLGviOvshSfqq9fwEcgn6w8cd0LjcQegiGwORB6DnDiGF7weutYbhxFU8R2j3xQbwD0wQ3BDgbiD0Q44Q34wuOA7BGPDaDvHr+f2Q5g8ePXFAcwD1e3nisY+6Be4HrrSH4OYB6QD6xDhPAdnu3Q0aOaB1Zj1Q5Rw7D9vxhCxpfkfd1aG4vjbXyTWNNYw+xPvmxqdU3Ke5edvylakEKDS5ebqFpzDxmKe4y6laXlTlLqs3OL1kkIaoq1trbd1QrUpHb2A+IbmFWL+Hl\\/JeWzLW9c8g7Vlt6yVuUCeUqmXFLpKd+s\\/Qp6osJyCgFO8FDdEVxhK1ibwxW28O1Ko0jEDUi7N0KpUmcmKfUZSryNpynOSs7KONTEutc2w0ytbSwVNOOIOZK1JVKcBVqXw7jKgVWbbadkZepMtVBt9CXWlUyczSVQztuAtryycw6tIWCA4lB0IzCYRWMVb0uJnVeqqpGWWgIclqSkyDSjkrXK3G1GaUFgJCm3JlTWrknUyzj4MuqJUVjMkgkqVrEk\\/WUpW8FRzzO\\/n3Dmj41+5JambBLja5piaa8pbflnGl\\/RkjVKM1hDiFJO0bUHEgjIjdxSXftrsuoYm5\\/yF1xG0Smal3wgpKinPaJQ5LpIIPF3MZjI7jl8467j7GmP5hmq4wxPX8U1Mt2D9bqM3UnWQCAtuXTMrdEsyFJKgywG2kbggCwj6gS1Kk6e2W5CSl5Vg6hMsyhtKgbWUrIAVq1Hpquo77mPtdqroV\\/FEG1V0K\\/iiOJk61SKiQKfUadOqKdYplZuXmV6u856jSytOWRBzGYIIOWRh\\/mOge3viPqfWggKWUnkr0T+bzHj7fC7+X+L7vuhfaq6FfxRBtVdCv4ohDMdA9vfBmOge3vhHnJ\\/rqeH5w7u7x9\\/IXMn8X\\/y\\/dC+1V0K\\/iiDaq6FfxRCGY6B7e+DMdA9vfB5yf66nh+cO7u8ffyFzJ\\/F\\/wDL90L7VXQr+KINqroV\\/FEIZjoHt74Mx0D298HnJ\\/rqeH5w7u7x9\\/IXMn8X\\/wAv3QvtVdCv4og2quhX8UQhmOge3vgzHQPb3wecn+up4fnDu7vH38hcyfxf\\/L90L7VXQr+KINqroV\\/FEIZjoHt74Mx0D298HnJ\\/rqeH5w7u7x9\\/IXMn8X\\/y\\/dCVTqCZCnTs6oHKVlpiYOY4ltpSkIz6FKyb6MuoZRCX5fTFB+5seMGsDqTMOzybIsmbu2py7K9Zbl14lVoyMtIzLYSjaTstRbUpk7LKIUlEvcikoUlbz6Img3u5nQ3ZYLU35a+y0dQZq1EK26yOHmnYhC+G5Yy3xAaxbr7elDyquJNypd+dLbo2LdWakppGapN61cFZVu2Lbm2mwNVEjWnLUpD6kKQ35QurLdmUF594R2f5EVLZmNpVfxvOJ7SS2eYNrNaSspugVGeaFLlGrkWC36e9WS36WbOyAkFRzJp7blWk0fAypUKyuVWeR2qL2K5KmNKnnONyRNIk02sQc+pCsoOxfDKzmMPsPLLsmXCdW2bbpVJeWnLJ+dlpRsVCbOR1dacnjMTS9XJOu8rVATlH3MEEXlMPOzUzMTb6i5MTT7sw84d63X1qcdWe9S1KUfGPnEtanFrcWcy1qUtR5qWSVHxJJ9sEJuL1E7uJ4fE+iKrWEDfvJ4Dp7hDRSio5n0DohCU31O74wmLeEIE5knpi5as9w4c56fshFZyGXOfd4+MPgXIHOCE1HMk+rsikEUUQkEngB4HphauCR3fdfrlDiBvPqHXXGGzys1ZcyR7Tx+EIxUnMk9JJ9cUhYFgByEOQms8B6fHthuvgB48b4VUcyT6uyEFHNR6t3q+2Mpsbu4X165mCEl8O0\\/b8IQX9U9f6fhCqzvy6B7T9kIL4gePG6H4UkXUPb7IRX9U9f6fhCCuB7PfuhVZ4D0+PbCC+AHX498ep+sPH4aw6o2BMJRRXA9nv3RWLF8O0\\/b8IyE7x4j4wlG71\\/KEVHIE9AJ9QhhDx05IPXkPXDOH4cGpA5kQQ34wuTkCeqG6uB7PfuhxA0J77ez9cPwhxhBXE9p98LE5AnoGcIRkIG8+qG0DefVBCKvrGFobk5knpOcOQ5CCvrHt9273CGTv7Ir0e4Q8O8k9MMVnNSj+6Pqz3Q+NAByAhaN58PtEWwQQRkJ3DwHwhKjcnxhq\\/9fsSPeTDRfEdnxMOXTm4rqyHsHxzhsv63YPt+MZCdw8B8IeTuHgPhFkJLO8Dqz9f6IVhJfEdnxMOI3+Aj2Gj\\/wCB\\/wAb\\/wBmGi+AHX498OXz5wH7nP1k90NXOb0\\/CH0\\/WEEJxYvgO34GL4Tc5vT49sK\\/qnXAQpP1hCC+A7fgYQX9U+j3iF18AOvx74bucPT3xko3eJh6EF\\/VPo94huv6p9HvELr4en4GG6+A7fgYyEbj4\\/YIIQX9U+j3iEFcD2H3Quv6p6\\/0\\/CG6\\/qn0e8Q4nePEfGHUbj4\\/YIQVwPYfdCELK+qfHHdCMZCd48R8YXBFFbkqPUfdFYsWckK\\/xSPXuh+AakDnDFXA9h90bquQlvT5k0p8QLNfmCiUvbByrOyzA2Z8qrlsXPbFQkwdYhRDVGm7kdGyJJJ3o1CXGtKizklR6jGfXJY3kiyNPPR+n3nAmUrder9mTKFuNNpfVedn3DbdNQVvAnza1UabMoQ0UuvOsol0621CFqyZ23U6+mgpABAuqxsDfS1yL3sCOMSjCU4JHFNAmCoJSmqSjayb+i3MPIl3FG1zo26vgeIsd0Tp7TmA3NTTZ3ByXSvIkDNTTgSMh0\\/SKz9HSBEWn5T\\/AGIg\\/wBiNipLMqCv\\/ps4fVl9Rl8ilJsq47aZQAlMwpQJutbmst1gAtBtMusuGalFURwM1BokjJxLiFdO9tR3n8Lz0p48M92\\/IRpF+UaWS3dWgRQ7paYKprDXHmwrgXMpGS2aXW6HeFlzbK\\/MWlTD9RuOjLUNdol6Vl1bcJSWX5VhacCZVqUU4myXnWwg2SSFWdTYkkn8oskC5JItvsY6F2gSnb0upKy\\/9XYmAbXsZd5tSvC7bRSo2GiuIuRDUsuZ8pt2R35qYL8urq2b6ygb89+yUjj5vsRHNq4ntPvj4jDiY1qZPyxOewnQ7lvzCX2EJGW8ZDWYWR1lXbH20Ys8js56bRaw7ZSx\\/wDyflPgoeq3ieYZkWdUNfrKPqNiLd2vj6rQgrie0++JR\\/yZK\\/jLXtpZYXOupPz1bOGV\\/wBPYJZDjRteq3Xb9aebCil5xEwLwoTb2aHWmTLMZFhx7KYi3xvC+T0Xyq1OUKlaBtihOJmDGJdnbLIlL7tNXb+IiPN2LoS40ixXVpc15chIdaL+q6qWmJ1symzJY3w+4CQHJtUmqxtmE7LvygBGoIzPJVY\\/nJTaxAI2lFc7GqSKr73ktX\\/uwLPv7S0TvoIII7ci1YIIIIIIgG8sTeP3Z8oxpGTKHFLk7fqlm2bJNnzth9y2Hdp0uptJJaaOqqusVWZAyXqB4NB55tIdOs9H1ez9PxjIvTFu5N+6Wuk3eKFpXK3Bj5izUpHVUlSU0t2+a4mlNB0NtbVLNMRKMh7ZIU9s9qveoxjmjgR1+PdHzcxbN+f4lxFO5lKE1XKpMIKt\\/Zuzrym08bBLZSlKQbJSAAABaKQnHe2nJt64PazL7hI3flHVL07vSuO6HCOB7fgIXRwI8eN0N2+f0fGF0cSOrx74jUYCvrH1fARKg5Om3UW7ohYV\\/R7OZribpuKbJSlO2cql3VwyTpyQFKPzQzTW9ZwrUQ1x1NRCNzVnywlrWoTZQATTJV47iDrzTYmllWZO\\/WeOXSTkOAB1qaNtBFsaP+CVADRaep+FdhtzTaQvVNQetmnP1FeoSVaz0+7MOlA3BTnTGxHEu6G8NMJr\\/vfNpDeH+HV1XUS4Apptu07an6sSsKASpCUyO8KzTkPXxv5MTCsQ7VttOKbpUXak4w0pSbns69iGqzraAvcEpbpTScoNsqW+CRb6FzTaaPgjB1PX6CJKhyAdy3AvI0uVQ6sjS6ipalkkAlRJOpjzbdKS+FYl6S+kJiHtErbvfGzFK6ZctrUthEpXL3rdRk2Zcqfmj5NLyr7LMoDMzGow2hKXnEjXjvS0ZQSNs0CUyyUzR6cHBu3vKlW1vnd0vLWefj9ZXGMG2EOTs4y0VKW9NzLTZWola1uvuJRrqKiCpRUvMknIn6xjYAyhLaUNoSEoQhKEJB3JQkAJA4k5AAbznlluyjvTGqwhiny6dE3fXbgA0lpCBr3LUBxFo4JrLqnlZ1m63nHnlniVqIUTbhcqV3crwvF6OPaIsi5P1h447or9IuhQ7z8BGgh2yclgdII+Pwh6n6w8cd0ceg5KSesQ+G4g9ENnUEc4LaX7yPZb5w4iqTkoduXr3RSCMeCHSDkpJ6xD6OP4w\\/BzAPSAfWIbXwPXWsNucPX174rBBBGO5w9f2QIOpHr664Q\\/BzAPSAfXDgbwOwQ0aOaB1bvVDlB83sOXx+MMLGgPL7Yb3Q5T9UeOG6LoTQdxHXn6\\/wBEKQ1BCyfqjxzwujh2H7fjDZB4j0+PZC6DvI6s\\/V+mGFCxI65w2LBZHPd67H7odo+r2fp+MXQkg7yOnf6vHshWGFj0j369euFL1Se7r5w5YO5Q6CD68+6HSDvI6eHo8GGDRyWOg7vXw9uUPUnIgwhQuCIZheL0HI5dI+33ZxZANxB6IxyLgjnDatFA9ab\\/AHWjDbG1rSewer7OImjDijjJbFOqjqjctl4dXfdsrJSdRCS986M2rS5406oUmoai3J6SckJlmUqiWppLS0ToEn8\\/aHLHafuHk4xIXnd1BxFFNSGRSMU8PqbLzrbIXrBqaqFqNWTccy5rlZExUqlNzQK1IU6ttLaE548Y4ytW7b1zynkVx0GjV+TKVJVKVqmSVTl8lABWTE6w+2NYDzjkCc9wyJzljNZwTVJGXkMdbNMKYwLCOxRV52m0\\/wCmks7kDz52RemVONN\\/kkutTMs6psJC3FKBWqwsP7RsSYfZZYk6pU2W2QEoMpUZmXGRKgpKXGApTDwTYAJWkBVgVXOp+XtPl4p6dfk\\/1UdH+WDrTTbb9Yw+vR6WCSguOKclLduKlzKworcCkIVdiCgJy1irJRzSsbls8Aa3Myq5XFDE3C5QlmWxTL7t2o1GQE1tHi4Ei3Xb3oiEaimwJibVKoUkJ19VSNmnWtdGh3gLdO0dRaj9szbgIVNWtVJqmJ3g5FumvqnaK0UKUSktUtGZzSvXbSlIxxujk8Uq13bJxGUnLX2chdNICtxzKNer0l1OXMlQFFOeZWnL6h1Mxsj8l3EgAFIruDHlJUnKxNTUzK5178rM\\/wDhJJobBFgAzLIynRLZ1FrUjyisTSuRE1PsTiU2HZ1amNKGnAv00y76rk\\/tjjpUdLkDSJTFhcp9SLrm5KXtDEzBvE1E22yUyUtWKa3cS3FqUdiadSqrITknMlOr9BNUQrTmDsDnGSdN5Qa1JeaRJXfYFfp5CEKcm7dqNPraSVHcoSdRFBU0gbyR5W+obsis8IIl06GmPlsha2bWlLolW9bWmrWq8nPfV4alPnVU6sua4BKdlTV8AF6iyhCvi5TETSLwfmESiLqxXsNSFIQil1GeuSmSSyjMtg0iqFFOf1UhRazlFgIKwg6i1gRuc8iXZxiAKXhTGVLnSUEIlnEBmZSbiynX6RPhIITfMhyj8cwTY2Fn0ryhZWZCUz1ElniR6T1KqSbg2G6UmG1FJJG9U2LDQgnU+i\\/aGmHo+3lUZajSt8s0OtTjjbcvTLokZygKU695jLIqc0yqhKeeVk20wiruOuPKDKUlSkpVk1rjoPs74gG6DukDpGaReOtr4JTskcT6jddNrfkMxK0ilUus0r7nqHUK15dOTlPapdKXTlNSIkZqaqzbSkvTEo85UdoHG5ubVovSuI1JwYta3sVaZP0677ZVUbefRUZiUm5iYplNnnUUJ4TkhNzkvNttUpcpJtTbTzofTJB9SlqJeXxL5QWw1nYtUZGnO16SmqhMsy80ulioS01MmQnFTjUvUZVAl5Gd8zEzT5mUdEzJhxLqUFLjiVXN34UxRTsXUxdVpbc00w3NOSbrc20lp1uYabYdUkht15pQLcw0tKm3ViyrKyqQpIyI1x0H2d8GuOg+zvhKCObsyeY6\\/X8eRiTQrrjoPs74NcdB9nfCUEGZPMdfr+PIwQrrjoPs74NcdB9nfCUEGZPMdfr+PIwRjppU4jt4S4I4r4puPtMowywuv2+kJfSFIfnLft2fqlPlQClYW5OTcgxKMM6iy6\\/MJaCFFWquDXycNsv1G4sT8SqiXJiZblafbctPTJU69MzdanHK3XXVOLBUXgadSVuua2s55XkSczryguXZxEVh7yfmJUo3NBibxTuvD7DClrQpxDuU1XWrwq7CSnzVCbt2zK\\/LPJOadhMLBzjQtoN2mm19Hy3ZtxtLU3d9UrV0zQP11Ifm\\/mmQUs5AlLlKo8i+2kEgJez3KK0x9H\\/JVkBRNgO0HEygG5rHOOKdhWXUlIC3KbhqQaqK3EKG9px+oVOUXyUlQJ1Rbjvyn6zaZpdHQu6ZWnIUU3PoP1KZW88nLbeZaQl7m5BS4lOlrHMkvIHDM9g78oSU8o7kjV6+J7h7e2G+skc\\/x90WlfQPXE5CEjv8Y47hQnnJ7Se+ElLz3D1+PHxtKiePq5oTKwOG8+z7YUAToBBFVKAHXzDxzQiTnvMBOe8wceuHNEDmT17PjCkpue7ifs8YPHj2w2eXmdUcBx7ej0Qq45qDIfWPDq6\\/shnxgSCTmPq+fy\\/VDthuA0H6\\/X484ItUch1ncPHjflF0IqOZ6hw74eSLnuGp664x7FhOQJhCL1nM5dHHt+yEVnIZDiePZ43RloFhfifhBCZOZJ6TDdRzJMKrOQPXuhuo5An0DthcOIHH1Qko5kn1ePbCKzmcugfb7soVO4E9EN+MOIG8+qPVnQDn90EJLO8DoGfr\\/RCsIE5knph9A1vyHv6vCgLADlDZ8\\/VT6fhwhvCjqtZZ6BuHo+3P7YTh2FoFz4axav6p6\\/0\\/CGy+Haft+ELLO8Do3+vx7YbuHeB0cfT4B54eSLAd+vt+6HFaBXf9th98JK+qfHPCMKLPAenx7YTh9AsPE3jxAsPE3ih3A9hhudwPYYWWfN7Tl8fhDdfDtP2\\/CHBvHiPjC4RJyBPQCfVDCHjpyQrr3euGcPgXIHM2hxGgJ60\\/XBBBFFHIE9AJ9QjIHIeFh8Ibhks5qUf3R98NlHNR7cvVuhfhDeHwLW7hb4fKHwLADkLQQir6x8cN0LQ3O8k9MOI3k93Xwj2GbpzWerIeqGy\\/rdg+34wus5qUesw3V9Y+OG6MhG8+H2iDr2RbCSzvA6s\\/X+iFYRX9Y9X6fjHqTdaj3fIQtG8+H2iEV8QPHjdDdfADx43wuv63YPt+MN18R2fExlp3Dw+OsOwg5zen4Q3XwA8eN8Lr4js+JhuviB1ePdD6RZI8L+3WCEV8B2\\/Aw3Xw7T3wu5zen4Q3XwA8eN8LT9YePw1h1A9HxN\\/ePlf5Qiv6p6++EYVXwA6\\/HvhKMhO8eMLghN39jV6PaRCkIv8A1O1Q9xMPx6nePEfGGTn1FdnvMdr6PV3Kw\\/x7wSvoOqaFn4t4c3M6oa\\/7DRLvpFSmG1BOaltuMyziHWxmHWlrbUlSVap6mePmHrIHx+EN1koBWg6pGWqUnIg5jJST0jqyh9kgEXFxmFwdxGmhh9t1bMwy82SFsuNuIPJbawtJ9RAPiI9J2WUlEww5lkEutZjdmQCNbgOjLxwwC5X60Rf3JtaV1EaGu7T7EpN6JBTmUIw6va1r+fUkqcYyyl7aeSpW0P0Sl5MzCf1u9mDhZdJvrDLDm91KCzeViWhdalhCU65uG36dWCvVEvJBGuZzMASkoE5nKXYH0KOC0mbWGIWjdpBWC0kOuXxgfivaCGcwC4u5bCr1GS2AXGD55nUt5bZk+cc3U7lhTcyabNymZTOUzLZIUrKCW3W75TmSLWO8XsNbbo7ErDSKjSZnJnKZumzIQQLqyvyxyG2vpWWLC+\\/TkY80DDh8pnKpLg\\/ssm2+U9PkzpRn6PKecHjHaB3AnojpWx39lcDKP\\/rmXmmOrc0XxnuO7Ngc435b+Y90q4HsMSatIyz5P9dbaX7B2f8A\\/wA45Gmx+XA\\/SCT7fR+CRCEbBOSbvZdg8o1ok11t0Mqn8UpeyVKUEkFvEqh1nDp5nJQI1n2rpWwPNBzcBRksb9fSuB7D7o7V0ervdw9x\\/wADb+l3VMP2PjBhpeDDydoVtO2zetFrLbqQ0lTpUhciFjZJUvMeagqOZyaBMGTrVInBqZWq0+YA3ay82y7v4Xy+qFS7nYvsu3KeyebcuN4yLSq47xa8epZBBBH0Ai44I4atVSVoVHqtbnSsSVHps9VJsthJc8jp8s5NzBbStSEqWGmXNQKWhIUBwSSY5mMb9L6402jonaTt0F8S66Bo\\/wCMdWYdzlwozMlh7cUxKNtJmymWdmX5pDLMsy7rIfmHWmQFbQA482+mWlZmZWQlEuw8+sncEtNqcUTv0ASb6GGnnOyZdd39m045b+0SVfZHm71aqzddrFWrU+QqerNSnqrOLBdUlU3UZp2bfIU668+oF15f7I866R+yuuK3wzbO8jpHu\\/TDVH1u39Pwhwk+cPHEZR8yHlqdU44slS1qK1KOpUonMok8So3J7zFGHX3e43hyj63aPt+EclTZOYqVQkqbKpCpmozjEjLoIXkp+aeQwyMm0LcILjiRk22tfMlC844tP1h2+\\/dHcej9RBceO+C9BUkKaq+KtgSEzm3tQiVmbrpSJtxbWu1tG25ZTrriNq3rISQFiNTU5xNOptQn12ySMjNzir7sssw4+q\\/G1ka21tD0nKqnZ+TlEXzTc1LSybfpvvIZTrw1WLGJkFnUyXlZ21qHLI\\/WjE3RKRLoXqAiVZdlpNltWzDSM0tIAOqG07t3EA8nyll3osXQC0t67rtMqmcD74tRt1xSWwl6\\/aaqxGC2tb0vqzO2uRsymq5tfKQyWWX3iJdfJYcteU3tbjShrZT5eHDcZWXemQcsjwLQO7fxyI4xi9y6N1N2xya+Ncgheymbzr+FVpSy9daSkqxLti45xtsJacSsv0y3J9hxLymUllx5aXNullDnN3kNUpTmGsX1dWVap7FslIuKI9NX0dTWJty6tSdKspQ1GUqVvuY762rzKZOQfQghvzehT62soIShTqHGmQBqLZ2UgctOEQO7MlxN3bbjOYIVWae4sZje2xMofcTxB3obUNxB3+b50Zyp+sO337ow0wol9vfNIORKZZE\\/MKAz3alPmW0EkEFIS643mDmCoEKSM4zK4x2BjVd6hKtXuESgX63HXAR7G0kdxEcE1M\\/lkJvezYN\\/7Ykf\\/r36WhxBwgG8A9MEQlB3j1\\/YfsjSw4G4g9EPwcwD0gH1xx6eA7Pduh60c0DqzHqMN7oOuvdDtPAdnu3RWLEcOw\\/b8YvhgixI7\\/dwghZJzSOzL1bofNHNA6sx6o49B3Edefr\\/AEQ8YP1k9hHuPwhtY9Hw\\/VCFjS\\/L9UOIIIIYWPRPdr16oQk2I79IcsHcodBB9efdDpB3kdWfq\\/TDBo5LHQd3r4e3KHqfrDt9+6GFC4IgWNfGHKD5wHSD490LQ34Q4G8A9MMQmLkHJQ693j0wun6w7ffuhsOIy480Lg5gHphtY3H1HrrdDaxYhXfr6t0OhuIPQePVzwvDVJzTnxI3ekdfXDhJzA6t3q+yMdY3Hlv663w4NQDzi6HyTrJB6Rv9x9sMYcMK4pPaPj4zhuGCLEjlD5BzA6t3j0RdCSDkcunx9nphWGVCxPtEIULg+0Qqg7suj3fp98LIORy5j7\\/HwhqDkQfX2QuDwI7RDCxY34H49fbHiDcW4j4dafrh0g5HLp8ZwuDkQfX2Q1Scx44+MoWQcxlzj3QiPFp4+35w7B4Edoi2YlZWfl3JWdlpeclnk6j0vNMtzDDqTuKXGnUrbWkg7wpJHHmixCuY+ju8c\\/bHYWGFh1TE+\\/7TsKjhQnbmrEvT1PlpbqJCSJLtSqbrafPWxS6czNVB9OX7FLK3RjTk0xISszUJp9MtLSLD05MTC1FKWGJZtTzrylDUJbbQpZI1ATcboclJWYnpuWkpNpb83OTDMrKst6uPTEw4lphpAuLrcdWlCdR6RGsbN+TF0TcPsOKfXtImSsC2bcvXECUmbTt6p0uiyNLnU2RLVGWfqrurKsMIAuGv0yWLqlM7VyVt6SfbdMvPLDm4MAAZAZCPjLKt6m2vQaRbtFlkSNEt2mSVFpMmkDVZk6fLty7CdYpzUsMoTtHDk446dqreTH2O0R+MI+WeO8aVDHWLqziipzT77s8+WZFE286+5J0mVsxTpIKW4oJDEuhsOJbIbW+XXQlKnVE\\/VLA+F2MIYVo+H2ldouRlG\\/PH7lXnVQe\\/LT0wVKGcoXMrc7EKuW5cMtA5W0AXwRZtEfjCDaI\\/GERLtx\\/XEezw7+r+ESzInv8Ab10T3WvgizaI\\/GEG0R+MIO3H9cR7PDv6v4QZE9\\/t66J7rXwRZtEfjCKjNatm2CpavNSnhv8A+N5uW8ZHLh0iPQ8pRCUFK1KKQlCUkrWVFICUJBupSiQAkakq04R4UpAudAN5JsPWet57rRbflLOIbibW0VsIJOZW8uuXJiHiHVKa2laloXQKdbtsWzMrQE6jqppV1XTLywb13E+SzKXA3tmtr0tYVut2dY1n2m2EoTbdsUKhqCVBQLlMpstJurKwSFqcdZU4tzM7RaivM55n5zltqmrEjlRMBsLdZx2QsTDzDKQq0kFqcQiZqt53VfFedSlSUsIW\\/asxRAss+UDKVSpxxagJRjsiPrRgSlqw35PuxLDrja2JmbpFdxfUEOoLbrrmI63NTcg46ghJSpuSc7BBUkktpQCbgx85tv8AVPpHHlTShYWhiYLACVFSQJKXlZBNt\\/8AVJd8qtoVrVl00hbWT0++LS4OYeuE4IdyoG839fPjpFGWJ4H2RcVE9nVFsEUJAGZIA64MwGiR18TCwjn7Pv68YrCbjgRu4q6OgdcJre5kelXd3n1Q3gCSTdXs5+PyhdraDQdfHjFSSTmd5MUgixSstw4+6HQCTYR7FFq\\/BHHn7Pt8c8IqVkOs8O+Kk5Ak9\\/jOEScznGQhHs4nn17viRQniT2mECcyT4Ai5auYenu8c\\/ZCKzkMuc+6H49AuQOcWLOZy6PGcILOZy5h7\\/HxhRRyHjj4zhAniT2mCHgLADlFizuy6fd+n3QlFScznFIfAsAPb4wgeku\\/AdD36xas5A9e7x6IbrVqpKuge3gPbCizmcuYeDDV9XBI7T8PGcPoFh46w5DeCCLVHIHr3ev7IWBcgc4cQABfvt8PthI7yT0nj1c0N1HMkwqo5A+oRmlo76IzWlLh7crmGF4SdMxrsqoJE7YV3TMrIW\\/edEqqC5Q5mgXGUy6beqypiWn6Q5K1xuboUzOokHZ+4bbROMIe8fmpWU83M3MNSrcxNS0i0\\/MLSzLianHAxKNPTDhSywZqZU3KsKfcbQ7NPS8shRefaQrZU2k1CtTJkaWwqbnBLvzKJRspMxMNyqC8+mXaNlTDrbCHZgsNBTimmXVIQopCThCo5qPVu9X2xbH2l+4fXzhbdVWsfEW1a5Zl3UN8MVSg3BIP06oyyss2ndk8lO3lJpvJ+TnpZb0lOyrjM3KPPMusun4uNo6y7LOLYfacZeZUW3WnUKadbcQbKQ42sJWhaSCFJUAQQQRGCUqQooWlSVIJQpKgUqSpNgUqB1SoG4IIuCNbQks7wOjj6fAhus7wOrP1\\/ohZRzJMN1fWPb7t0eI3+Aghu+dyR0kn1fphtCjpzWegbvVx9ucJw+kXI7tYc3I8ft+75wQk8ckHrIHx9whWGz53pHUT69w9xh9IuR439kISLkeN\\/ZDZX1T447oRhRZ3Adefq\\/TCcP8AXXQh+KKOQPZ7eaG5OQJ6AT6hCyzuy6T7PGUNXjkg9ZA+PuEOo3evr7YIacOqG8Lq4Hs9+6EIfRoCetP1wQQgrie0wsTkCegZwgdwJ6IGxvPHdDiBvPqhBRzUe3L1boQV9Y+OG6FobneSemMsCwA5C0OQir6xhus+cerIezP4wsd5J7fbCB3knpJjIGgHgIIRX9bsH2\\/GG7h3gdA95hZX1j2+7dCCvrHxw3Q4jf4CHxuHgPhCK+IHjxuhOLl\\/WPV+n4xbGQjf4CPYIbv8Ejt9mXfDiGr\\/ANfsSPeTDsKSLqHdr167QyfO5I68\\/UPthos+bl0kd8OX\\/rJHV7ye6Gi+AHjxvh9ofV7zf2fcIVa7nv8Ad84nwcndc6Lw0HdFyrkpWZTCG17W10aoA+4eWVZWr5qGhrNfc+G1nLMrQrWW859KrMkrQFKTrAEE5AkA9PPl7e0xq+5GS4zX+T+wnkXXFuuWlX8TLaW4ovrcKPu\\/r9xS7a3HlFKhLydwy8uxsRsG5dqXYSM2F57M5spTMuJzAPmkJJGYBSk55E588aTHClSdOkZwIbyqm0N5SSClL7DjyAD3hux+tpwtHYuFnfPqFRnSpSlrpEgpat\\/5RMswh2+pOjmYHv8Af5e1z225YGMl1WY4hTK7QxCuS0VslLgLa6PcE\\/QltKDrj7o1DLlBDjzrg\\/CdWfOPZC\\/qnr74+y5QCgiztPPSxpyGkSzLWkhihW5ZhsMJZYlK7etSuOUaYbl0hhphqWqbKGWAgFlpKGXEhxtQj4xfAdvj3xY1Uc85ZpU4N01JNOjXNcLQ09e\\/Eflt+46mOVaux5vOuM7+xffYva1+xdKb24c+6EF\\/VPo94hq7ubV6PaQIcr4Dt+Bho\\/8AU7VD3ExhI3Hx+wRgR6pOEl3nEHCrDO\\/S828b4w+sy8C6jYajpua3KbWi6gsIEuEr8t1kpZSGgkjZ5IyEEY38nJdhvXQK0Pq6pxL7v9jthVRJp3bOTC35+1LSplqz8w88ttKlTD05RX1zSSFBuYU62lx1KA4sj6D0+YE1ISM0CbTMnLTAvvIeZbcF78fS9\\/hFxSznaS8u4SFdoy0vNr6WdCVX38b+OsZqxr25VOvLt3k9dKmfbLqFzGHHzDm02w6vZ3TcNDtl5CkTObeyW1VltvOgbeXZU69K5PttZbCY1DcuNXvmfk4sYKepcsk3TcuE1ACX0Olxwy+JtrXRqyRS4lKZn\\/vcDitqHW\\/JEzgCA8WXWtRjCY81wniaZtcsUCruAXykqTIPlACrHLdVhexINiASIxqqvJTKgq9iJKaAPIqZWlPvIiCSNxHaIcDcQegiG0Lg5gHpEfOKKWhzGW2gzSfnvSzwQkw1tdjdT1YKdiiYI+5+h1av7Qtr3AMCmF4v5a0sEGYR5zUYkJ4Ds926M\\/OTRp6Z3S3seaXs\\/wDcegXzUUFetrJW7adUpObWQILmzqih53m7IvEHaakQDaZNGR2dY8mwbLYwhiMtnk8aROJa\\/wA6U6jdrEowPLCbxtg+WVqh7E1DQ4OJbNTlS5YcfQCtOdolkYMsJmL7p5yJ8kk6lMAkkZhUo7K8xOZ\\/XR3HeMt5zjWJ8o+uJqkaD2HlBae1Ju6dJCzWVy+u+gu0ukWDidU5p7zBsXUS9QaoyFMvKOankPoQpTGsjangEwXrvn3t5bl7fms1Ao\\/ZXahTUIBSc1HWbDyvMyyUned4B0bfKbrgMphfon2olxYTWr+xNuIsCZCUuLte3bWpiXVSnF9TSbuUEzA82V2y2iP12mI55E9MEtsiRMhCUCoYsr08VFJSXS3L0+nhYJHpptIBnMNLoy70m3Wm2maCGKoAbhFNkpe1yQO3mki2h0P5e4HrO\\/WLFgiwXbsnHlDMS1EmlhRyOq47NyDQAz3pKkKd3p35JIPmkRlik5pHq9UYzYDs60\\/ccxq57KUp7GtkN3lD0yvLPiNbybPIbjq7+AjJdB3Eenx454vLFq89YfF\\/2puXR4XaS5b\\/ADl44pqJvNLH6KUD\\/wAoV\\/8AtDpH1ez9Pxi6E0cSPHjfCkRPcs9\\/22PxjVq+sYVRwI6\\/Huh2wfrJ7CPcfhDJB39o8fGHDZyWnty9f2wlf1j3wmOQRxI6vHvhWEAciD0QvDCxY35\\/ZBFyDkode7x6YctnJaT15evd8YacIcA8CO0Q2ddOYMB1BHOOQgi1J1kg9I9vP7YuhjxjH3HvEAORzHEbxD8HMA9IB9cMIdMKzSU9B9h+3OMcixI5Q4vUA9aw9ScwD6+2FkHMZdHj7PRDVB35dO8dvj3Quk5Ht3ePHTDChYkcOENwtCiDxHp8eyE4qDkQeiEqFwRHihcEQ6Qd+XT7\\/wBHuhwg5HLp98NAeBHaIXBzyIjHIuCOcJQbi3L4de60OYqklJChzHwPSM4tBzAPr7YrDBFiRyjxY\\/O9v2fI+qH4OYBHPvELpOY9hhiyv8A9ZHxHvPrh0k5HqPHx454SoXHeN0NwtCiFcx9HZ0ejxwhOAHLeIYIuLQ2fRVcbjv8At+cOknI9XP46oXByOY5oaJOY6+eFUK5j6PHjuZIsbHhC9COYMPAQRmPHVG1nk28LVPTV14wVGWz8lUuzLVU62FHyh1EvPXFPsbRHmral1U2mS8y1ucTN1eUKjk9lqpk5eanZuXk5Nl2ampt5mWlZVhKnnZh+YdSywwy0jzlOvOKbbQhO9bhSOfOJOGj9hsxhjh1ZdjsIbSu3aLLmrutZFubuCcK5yszSV5qUpMxVpmceaJcXqSrbbO8NkDnrykMW\\/QGCU0WXcyz2J3zLKCVZVppcmW3p8ggnR91cpJKBGVxmZeTmBBAv7yccIiu41XXJlvPI4XYE2jMnMldUmwtmnpIIAJZQmanUqBuh6VZNrKvGQEs2GGW2yQVBI1zqHes71H6nDMnLq3c0L6w6R\\/EP\\/uRSCPnV26jvCff8\\/Hoa\\/QcNgAC50+77+hrXWHSP4h\\/9yDWHSP4h\\/wDcikEedurkn3\\/Px6GvvZjmeuj0Na6w6R\\/EP\\/uQaw6R\\/EP\\/ALkUgg7dXJPv+fj0NTsxzPXR6GtdYdI\\/iH\\/3If0xkvzzTbSStXnrCRmCMm1DLoIG\\/cM9+fWI4+PpLSbU7VVFIJU1KPLAyUT+yMt55JBBOajkeHNxMSbB0maxiig05WYCZqkolXZpzLyJdS4soCgpJUEoNgQd+46xiTygxKTDtxdLSyL6C9rC9iDa5udd2kQfNLipnEnls9IesvgqYsGZZpUuw4kltlVmYUWhh28Epe1FhRqzs3OhWq4hM0+HGc2Ni6jI7MdI9YjDqjTjF38pLyg98yq0TEp+rdjTTqbNNsPsJcpVRxmrhprimpnUmWnZiRtyVdeS+yhwPIWHES5GxjLaPstjWVRTzhKgN5gzhrAWD6I0lQsoJlqQw7dQsLLV25Uv0QSokmPlftAnFz2LaxMLUlSnJuYcUU2Kcz8y\\/MkpsbBJL5ItcctN74qSOKkjtIi0uoHPn2AmGcEQoIHEkxDYXU+fwRl1nu\\/TCJUVHNRJ8eoeqKQQoADcIIIItKgO3qhNSieoeOMLCSe4cz193fBFyl8w9cJEgZ5n38\\/v9EBUB29EIkkn3Doh9COW7iePh1u+JFVKJPVzDxzwkpWW4cfd48dYpWW4cfd48daJOW8\\/p+2HwLaCCAkAZnx1QiTmczzwEkn3DohFauYenx47yHkptv3n3RRRzPVzeOuEVnm9fdFyjkOvmhEnPeYcQnifV8+vsjxZ4Deevf8ACCLVHIdfARdCKjmeocIeSLnuGp+Xrj1IsLes+MWE5Ak828wxUSokniT4Hohd5f4A6ifgPcfVDeHoWBcgc4ISWczl0e\\/x8YUJyBPq7YQJy3nfz7+f9JhxA4+qHtw8B8ISWd+XR7\\/0e+O9tG7HataPOK1Dv+mNuT1NCF0e7KKleoK3a086wuoSSVEhLc3LPS8tVaY4ohtuqSEoXw7LKmGHuhieJPaYQJzJPTGNU6VIVymVCj1WWbm6dU5R6SnZdy+V1h9BQtIUCFIVY5kOIKXGnEocbUlaUqGXSqlO0ipydWpr65Wep8yzNykw3bM0+wtK21WN0rTdNltrCm3EFSFpUhRBmEP2po56fFqyeGeLtOkK2\\/N2xT67g1i7SHGqdetOptSkGqiJKn1txt155xjyhU18wVZqbpVQabel6hShU6bLPKj3aavJ5406GdYeqNZl13thHUKgZO2sVKJJrbpq3XioydKu2mB6aftKvuI3tS04+\\/SqmrbGiVepOMTzUp2DoB47ztKqhwpqVRWy9LuvXBh7MLdCdhMsLcnq1QWSpWZRMBT1clGBkkFFZKjm8wiJMWH2Mdv4g2cuzcVaVTbqs656c5RKu3W5NmqybktMJ2M5S7jk5pp1qoSOZ2ZmXWVzKWwh91D6SHmdJgna1heiTFO2K7cZ9+lVSmtsU3Ae2WaUHJepUpYDdDpeOipKSEstp8xbrrjq2WTKrl52ZkUSrk9PdTVfAtL2s4aYx9hdhmUqkwhSK1TJRH5SUq8uhHnzaGwf2Sw6SiZZaVlmhLvMuslQcMqmC2o5An1dsN1HVST0CN6PKIckzVcI5at46aMUrOXbg6EPVq5rDYfXVrjw9kFBcxM1ahOlbs1c9jSoKFOlK5qv2\\/KZzM9850eVqNZkNFL6skhPSfYPtyi1cQ4YquFp4yFUZSC4ntpScYV2sjUZVVi3NyMyAETDDiSlQIstsqyOobcBSOYKlS52kza5OeZU06kmx1KHEAkdo0ogZkEgjcFJIKVpSoKSGvGCCCNMgbz6uuuEYKzuHLodd8EMnDmtR68vVu+EO1q1Uk9A3dp3D2wxO4E9EZCBvPqj1A3n1Qis5qPVu8emLYOMEOQ5CSzvy6B7fGUM3zvSOon17h7jDonMk9MMXDmtR68vVu+EPgWAHdBCK+AHX498JRcs5q7N0Ww6QAjxsfWdfgIItX9U9f6fhDdZySevd49GcLLPAenx7YbrPAenu+MLaB08b+rr4w8gWHjrCSuB7Pfuhurgez37oWXwA6\\/Hvhus5ADPifHtyjKTvHiIVCJOQJ6vbzQhwhVfDtP2\\/CEFHIHr3ev7Ifj0akDv+NoRhA7yT0kwsrgez37obk5Anq9vNDiBvPqh+ETvJPSTFIIIyEDefV17oIIZOHNaj15erd8IeE5AnoBPqhgTxJ7TDkLRvPh18IZunNZ6sh6hDZfH0d8LE5knpJPrMN1HNR7cvVujKb0\\/xflAjVRPd8SIl8cgPW01PRDxFojpUX7ex+uXZ5IWlKafV7Ew6m5fN3X1VumfbqusEJQW2vJxvUdY7ma4lCJ8IBSlS2G3AnW8471N5jMgkZo5hlmmI\\/8A8ndrXlNi6UVtlxJTSbtwwreyBcLjZuCj3lIFxaCrYpQ4LYCWlIAcUW3A9rIS1lvrv5sJnpBaQkKclVoz1lD9ifUoZp3pIG1OWQ59\\/NEH24TRpezRyrpYRMpkZ+kuLQpwsqIef8wOVaWnfSSuZCAFIItooCOudlS\\/PKLRGyopKpSaZBtcfsaZfbGmYb0s8\\/nEAflnLfRbXKS6R7LIc8mq05h1cTCnXGXFrXXsJrDqFROTDbaW20Vd2ossNuJ2yWW2i45MuKL7mJzD23lZR7PPayzLoO\\/M7RtKsznv5+ff0xsL5eWgKo+ntPVJbTiPutwhw5uBLi5Uy6X0yxrtql1p4j9fNpVbKmDNAAIdZckh\\/wCBGNcVBd21EpK888qfKtnjxZZS0rPPeTmg5ngTmU+blE+wtUE1nZ5gOqpSUdvh6m3QVZyhYkJdpxCl2TmUlbCgpQSkKUCQALCKAxzK+a4orrNrBqtVPLYWGRyacWi3IFCkkDfa190ckviB48boZv8AFI7fbl3Q6X9Y9X6fjDJ45ry6AB8fjG3TuHh8dYiUehxyJ1xi4+TG0YZgzO1mKZTcR7emW\\/LfLXpRVv4wYg0uUl5gkbSWUqly9Pm5eScQkyshNSTbZclvJ3FkdF\\/J5K+us8ndTKctxx1FqYy4n0BpLjLDaGETLlCuktMraG0mGy7crrxemCXg665LjJhhgQR3bhB0zGFcNvK1UqiUsKOgupEmwlSrAADMpBVYacBYGwtmkrzUyQIuLSrCOeraEIJ1PNF\\/V3mN58aLPlB9ZNL0E6BIl8tG4tIGwKMWwyHPKgzauIlw7BSylzYavzEZnapW0SZfYh0pf2T29OI7XyjerqY0YcC6CJsNip48fPCpAlJMwaFh9d8kJsKAzAkvuhU0RtAP90ciFZJLWq2lvmXwHilwWuqkvsa33TKm5ZXEfmum2u+3oqGhxq+rJRp87rshII01W4hI4jeTY9x3ExD0hVG8dnu6\\/SYSi9B3kdPw\\/THz6V9YxT8OkcCOvx7o2fck\\/ICb0kLlm1KWhFKwiuSbSQjNtbz90WTIoZcXlqoKmZx95A+sssgDzErMav0fW7R9vwjbhyRkmF4sYqz+bmvLYeScmlIH0ZRPXLT31KVu\\/ZUmnILQ1h5qnuPFNQbdXjL7Jcdubs9GEvf++5uVlbbjv7UjXde4INosTZKyH9pOEEEA5aoHrH\\/6dh58H1FvdxOliCYlE6OculyqXO+Upzap9PZ1jnrfTTEwsBPNkrybJQzyz1N5I3RuPlPdfD186H1qh1g\\/M9p4y3FsUpWZpBuWsYd00vPKJLZl3haQTLJSAoOMTRWVayQmS7o0Sv0N4zKtTVU7QWEZE64LSKs46SNXcle2ZAOv52qfTFL+Uz1YuaWOAtA2zSkU3R4YrCZcZeUNqrmJd9SSn3SCSWH\\/ALnkolwdwclZgpyzMTfySKf5tsBwQ8pISuZViWaJOijnxXWWm1HuWw2hQOvokEkWi+ttcx+UrDaSbF2lNEXNrBiVeIPMJWkW7x640lYDNBMncT+7N2ap7J3HPJhqaWCd2WqPKDq5b8yekRkCn6w8cd0dHYHN6ts1N\\/Pe5XXm8tXL9hkKeoHPPeCXSMstwT9Y63m93g8CO0RL8RK7Ssz5\\/wC0Qj\\/EZbb92X1RyHPG808f4wHsQkfZDlJyI7YXhsDmAemHCTmAYjawdDyPs5X++MFY3H1E\\/C8XDcQegiFweBHUR8Ibwsg5js3d0eL1APWtobjkEnWSD0j28\\/thwg5pHVu9UMmFZgp6N47D9sO0HiPT48c0MrFx4QQpCqDuy6PHfCUXIOR7d3dDMEP2Fbino3j4+OuF4YoVqqB5uB7Dxh9DKxY34HowysWN+B6MEXtq1VA8x3HsMWQQwsa357+ut0KQQQUnofrjkAcjn0b4ccYZtq1kDpG4+jvHjdDhB5ujeOzx74ZWNL8obItoYdpOYB9fbFYSQcjlzH3+PhCsNQQqg5jLnHuhdCvwe0j2Zw0ByIPRC4PAjtEMrFj3GGz6Krjcej84doORy5j7\\/HwhWGwOYz9cLpVmN\\/EeM4ZWnj7fs6++F6EcwYuBIOY3EQ+QoLSDz846DDGL0LKDnxB4jp+0Q3DJFjaORQrmPo8dUKQ3BzyIPWCIWSrWHWOMNLTbUcd\\/cfvhJFwRzi8Eg5+CPAhYEEZiEIuSrVhpSb+PCEAlBsdx4\\/b8x0cwNCfD03\\/jpQJyaYD1HsRly8qiVJbU2Zmmuss0Jrzxq7X58mJGcSgDaLaknyD5pdEi+3ZdTNOS65mXJhRdOY84NgaraebPNIKx\\/wDbOeNWvJ24duUnDep3i6ypqexEuAS8m6U5E0C3Fv0+XdSCNZIVV368XMvNcaZl3MtwI2zIQltCG0ABCEJQkDgEpASkDqAGUfN7yj8UGvY+nZJpzPKUJCaMwEq9EOypLtQUU3ICzUHn2FKFipMq2FfVtH0W8nvC\\/wCD+z+Qm3W8k5X1uVqYKgM3ZTIS1T0hVrlv6PZYmEp3JXNOEfWJN8EEEc9Re0EEEEEEEEEEEEEfcWAB85zhAzUJFeW7eAqZZ1ss\\/wAEkA+gEcwj4eOwcNVAVifQM83KapwHmyTMS6FJPSrNQy6MzvzMWtsQaQ9tUwa0tYbS5VFICyMwCzJzXZjLcXKl5Up5KINxaNLiFWWjzygLkM3tu07RGYk62AGp0v6rxAK0aX5msY66Z90z6mlz9cxqrD01s2Q2lEw9eOIdSnFt7zs2XnqgnJkaoQJdKjmMtXNSMU8ELbNm45aa9pTgdNXtTSXxBtup+US7klM61DvC7aWnbyS3HUyrvlUtO7RgOuOsuFTLrqkobXGUkfXjaTZzGVVKVXSlqkoQctgUN0SmtoKRp6JSgFOgukgnUmPlLiTP9OVDtAQsOoCgd4UlltJB5m438d8OItKkjnHv90IxTWT0j1xBg2OZPh0Y0cLFY5hn7IsKlHny7N32wlrp6z468otKzzbvb49ULDfJPrPx1+wQQoSBvMWFfR6+77YTi0rA4bz454dCAN+vw+\\/rSCLu2E1L5h6+6LConj6osUrLdxPu7e6Fx6AToIqSAMzCJJJ9w6ICSTmTvhJS+ZJ7T3d8EOpTbXefh1zgUrmHpPRCRIAzMBIAzMIlRPwhaU31O749ddwpVvHgPnASSc\\/AHgxSCLVK1R1nhDoHAeqPEpO87+\\/rfFq1cw9PjrhFaghJPPzDpMXE5ZknrJMMlrKznwA4Do+0w+BYWhcWE5kk8TvMEEWqVkN3E+M4UBc26EOoTbXnu8IsWczlzD3+PjDdZ4Do8e73woogDM+jt5oQJ4k9ph8C1gIFmwsN568dd3frFizkMun3ePjCUVJzJPTFIeSLC3rPjHqRYAcd5693vjk6DXqpbFbpVxUWadk6tRKhK1OnTaB5zM3JPpmGVZDMLQpaAHGz5jzZLTiShakxIi0XsfqbeVapSmn0M0bEa36bOy0qXSpFFvKnsusVKllSiAhTzktN04rO+bfkqZsU5PgxHGWeb1\\/Dx2Rl5opX7N0isTltNzbktNMPsXTbjwOS5ao095jysMlYJDh1JOdYQkBCDJzDmWs4SaX24YDk8YYXfmy0BP0uXeQ28E3UJV9TSiSQMxEpNMy84m6rJZRNoT+3rzdDeTtjJdCxcrDsy6U03FCAwhKlHIzV5dK3JJwAkhJmkdtJKCU5nXnZTMqzItLfw1xUqFlvpp9QU\\/ULZdUSuW1td+nKWoKXM04rWEpSpZDj8otaW3MlOtJadUtbmpPlNeS5pdapVW0odEqgsvS7jEzX8SMKrbl1LYnGFqem5+9LApbIJYmZdW1cuGzZNllpTba56gyTM0xMUydzlsi6Je9bTt+6ZYIQmsU9iZdaQCUsTqNdmoyqSSo\\/rWeYfl9Y5k7DIFXP37hniXPWPPeTTO1nLenHQqdkknNcss+aqfkUnIB4AAvMghE0jzVBLiULbrHyZ\\/KmRhRpjYtttmJme2dGYVIUDET2aYrGzSohzsG1NPEOPPYZQ4C3MyRz\\/Rrd1SqFSaXZJXR+1DZVT8YSL85JMJbqyApwpbSlJmVgC7jRICUTm7NchuaSOze9ModTBSgiR1yrPJr0t6lVfS70ZaGy5SphmYuPGCwaAyBLoln8pibxItOlMN6zLTalTExfNHl0pEqkLuNiUl2ma8pEcWO6MR4bm8NTrcs86xOyc2w3PUmrSS0vU+sU2YSHJafkn0KW24082pKiELWEFQspbam3F8BVqkTtEn3pCebUh1tRyqKVJS4gKKQpIUAoEFJQtChmbcSpChmSYbvq3BPTvPw+MNFndl0+O6FVq1lE9e7s5obqOaj1bvHpjSpFgBxOp690a9IsB7TFsWrOST17vXF0JrPAenx454cSLkd2vshUIqOqknoHt5vbDEniT2mHL6twT07z2c3t90M1nIZdPj7PTD4FyBzMEJE5knpggiijkCYWvUhI64CAakDnCKt5Pb7t0IK+sfHDdCpOQJ6IQJ4k9ZPxh9sW14AW+EZG6El8ezIfH4w3Wd+XR7+PuhUnMk9MIE5knpjIQNSeQ6+2Drr3QiviB1ePdCCzwHp8e2FVHMk9e73e6EFHNR6t3q+2HYUgXPgLwkvgB1+PfDde4dvu6vSIWWczl0D7fdlDdZ3gdHx\\/RDyRYDv19v3Q9FkEEEZCBYeOsEJunVQrr3evdDBZyQo9WXpO4e+Hb53JHWT6t3xMMXzkkDpPsG\\/35Qsbx4iHE6IJ9nuHxhrwhudwJ6IWWcknr3ePRnDdZySevd49GcZiNxPf18Y9Ru9fX2xI++Tr1ktX9pQ22X3Upq1oYZVssBsFl5Vv1u76el9x3VKkKlxcqm2m8wl0TL2fnNJIkXYyNFC7ddSV5FFUQSRkPNNPUBrZ5hRCl5bxnqncAM4jC\\/J6ans9KfGOh7Z9Kaho\\/VCqmXSSGXTRsRbAkw86MynasGultnMZ6k1McMyYlI4zspFKozoKiU1F9vJX1SlbGuonPIFQ2XH90QeO6sPKep\\/n\\/k04+ygBctL0WbzXGZKpHF9GnFWspOpaQUAG5Ga6Uk5Y6s2GTNk0NCibImqowBuFnUTSt+thmdJ0tv3am8KL5QRTHU6T+DlecbWpNQwFkqQiZW8HNoKJiFfc6WEMFwraDAuBDhWttsPeUhCVOFhaGtR1nubS3KacySlD7ZzOZGzmn0AdQySMhzJyHCN3PyhujeT33ow3D5KUCrWjibRvLdqVCZ+YKxaE6ZUMBwpb8j+6MPl1LLe38vSkrdDKUtaObGc1reaG47KZmkDLjvc2mSt\\/HNzq3ZdsZvk5Taqj5OOzGZKy4puSnpQqUrMT5hXK1TiM2ddyDLhNiq6ctilFsiav2vsdhj7EqLW\\/Z7DtrW0mJCWfBAsND2oIIBBBuCoHMfqycyT0k+rm9kMFnNaj1n1DcPZD1RyBPQCfUIYRbu6KuibL8mnrnlehnjLby0vqXRdJi4Kk26pZW0mVruF+FjKJWXRmSyGpmiTky8lIDbjk6F\\/su1zI6f8AkxVV2+FWljRAXs6diDhnVlBSj5PlWrbueUTsUhfmvE0FXlCilOu2JUZr1CEEdsbOllzBOHVE3tJqb11Nmpl1ocOSAPZ6rSoC89Ikla6IcRp\\/2b62+BH6PjuuSbESk4jMfKSZ9xvDrRWpYbQpqdvbE2oKezOuhdLoNpSzaAkebqPCrOqUd\\/nMNHPPMRJniLV8pXmZhEtoYySXliWff0hJl5gnzHH5ZvBBqWdPA67DU7NpQTvyfd6d2v2uOhnZ3iRRBOZmQa0toX6tIMAm\\/AFwE9wNtbRj4mJFDnrf\\/TD1GblwfaLiIskVSciDFII4LWNx9sVLDkbiD0ERug5IKTdXWMeailbYYlqbhzJuIzUXVOT01ebzK0jUKC2hNOe22awrWW0UoX5+ppdScwD6\\/Htjd7yQUuhFLx7nUqWHn5\\/DWUWCUlsNycvfDzS0go1tZSp5wK1lKQQloJSk6+vRXlIOFvY1jApNlOChMi4uLOYmowX4fkwu3faLX2IN9ptQwxe+VBrDhANvqUGplP8A58twQbi8SbdGRlKqBcrxSc11iWb195Cw1IpWEZnMEo2utu4a\\/PuIh2\\/KSKs5UNP+0ZJbSGk2\\/o04d0hhSVrWqYbfvrFWvF50H6iw9WnZcJR5myYQo+etcTJNGFlS7Mrr5OSVXO60COOu1SqUogjnzDyOOWW\\/0QnPlDczMu8pJdsu8+681I4U4UysmhayUyss5RZqeVLsg5hDapycm5lSU+aXn31fWUqL78myUEvsA2begE5qI49qACTMVWffKrD9IuFQVa6r5iSTc2htmevNVNIJ9KrSzRtqLIkyqxvyLY0G4i27SNd+C6CmzAoq1i7VZ5fRqAJl2tU5k5729bPd9bh0dvIOaezd3eyOqsIEhNkU46hTtZipOEkEbQiffb1weCjk3qZ7\\/qZfgx2kg5HLp948GGK0SatUb8Jt8f4qynhytb1c45YmtZl\\/+6L9xtDpB3ZdHx8GF0HiPT49kNUHJQ693j0wuk5EH19kaVxN78L6jrrfGMoXBELxeg5HLp98WQcIaTqkpPX6jDEO21aqwTw4HsPccj6IfA5EHojjQcwD0w+bVrJB5xuPaIb8YId8YIsQcxl0e6L4YIsSOUELpOYB9fbD1pesnrTuPwPp+Eccg5HLp9\\/j4Q5aVqqHQdx7\\/RDaxcHmOj7oSsXF+I6MPIIIIZIuLQ0DYg+3whRpWqrLmVuPwPjph4Dkc+jfHHw8aXrJ38RuPwPjnBhjxhSx+cNx6Bh4DwI7RCyTmOvgYaoP4Pq7vHdCyTkeo8e+GCLG0IhaFEHmJ7PaTCcEJIuLR4Re4Pq6+Pcd+sOknI9R4+PHPC4JGRH6R4HGGiTmOvn8dcLIVzH0d3p9\\/bDBG8H1whJscp9V+fL7R98Owcxn0xWEUqy7D4zhbshlSbHu4QpQuLceHXLh0IWac1fNV9XmPR9kOgct4\\/T9kcfC7TuXmq4cx6Oo9Xtz6c9yYZItoYfpUFfEQ9kJOaqU5J06SZXMTk\\/NS8lJy6PrvTU26lhhlI\\/HdecQ2nMHeojfwjjQSDmIyZ0RrQF548WWhxouydtPzF4TuXFo2+3t6W6eYo+f10hpX7l3pjS16pM0Ki1esvWLVLp05PlKjbOZVhbqWhqLqeWlLaBcEqUANSL7ag0l6vVykUVgkO1WpSUglaRctiamWmlOkfotIUpxZOgSgkggRv7wNsuXsq2LYtWV2SpWzraplGDjKChExOsyaJeYnciErDk863OTjhOS1OvkqJJMZBx8XYkstmhpmXcy5OvuPAkAKDSCGG0nIDNPmLdTnmcneoR9pHyCr889UKtOzUwsuvOzDq3nSbqcecWXH1qPEreU4onjePrJTJRmRkZWUl2w0xLsMsMNJ+q2wy2lphtP8VDSEpHcNYIIII00Z0EEEEEEEEEEEEEfZYdzqZS6JNKykInWpmTWpW7MuMqeayB4677LadUbsl7sycx8bF8rMOSczLzTBG1lphmYZKhmkOsLQ4gqA1c0pU2jIg563m5iJXgbEKsKYvw1iVIUoUOu0qqOtotmel5OcaemmBm0tMS6XWDuOVw5SFWIwajKidkpqVNh5xLvNAngpaClCud0rKVAjiNd8RJ9KPDJ\\/BHlQtPOynWi1TsSLls3H62ny0WE1CTxLp07cVzzLIUCXmpW8a5VqO68lWoZymzJSM3FBHCRup5avR0VcK8BdOyyJF19yyac9gTjOmUbcddbwxv6tCoWHXppLebTUpYuLb4o9UXq5Ny+IMxUn3ESdEfUNJ+Z6T6zH2mxo5Lz87TK9JPtTkjXqFR52VnGPSYmUNSDEol5pQASRMMS8vOJAt+TmmlWAUI+XO0mkPUjFtSadbU0JhzzhtKh9VJJbU3e5uppTZaXc3zpNzrC8GYHE5Qhmek+sxTMDicoh0QOFipI5\\/Vvi0r6B6\\/HdCJUkc\\/q3xaXOgeuCPQkncDCpUTx9XNFhUBx9XPCZUTz+gePfFhIHE5QQsI5+z5n5e2LysndwB8bz+iLCQOMJlfMBl46OHviwnnJ9JghYAG6LlKJ6h0d\\/TFhIA9w6YtKxwHr6OzphKFpRxOndz+XxhKl8BqefW+KklR37vhFIItUrLt5h3w6BwHqgSnirf7fb9nVhSgn4CESc95\\/R9kVJJOZhq67n5qeHOenqHV7c+jLe8lNvHiYXFHXNbzU\\/V5z0\\/ZCMEBPEk9ZJ95hULSm+p3fH7ooTkCeiESScyf0DweMVUrPsHjOEVq5h6e70e\\/sh5KbDXeerQ4SALn7\\/Dx9kWqOZ6hwhFZ5ge32ERco5Dr5vHVCMOoTxPq+fXHwhCRc5j6uu74wRQnIE9EVhJZzOXMPfDsORYTxJ7THPWXcbtqXbQbiaUsCl1KXemAnIqdkVlTFQYHW\\/IPTDOe4\\/Sbo+dWr8H0n4eO6G7qtVO7idw+Psgdl25mWmJZ9OdmaZcYeQTotp5BQtJ7lJURbdu8IypGbmJCdlJ6UcLU1JTUvNyzo3tzEs6h5lwcQUOISoWIOkSaNDXERuqIvHDl2YS4uhtUe76Kc8w9Sa\\/5RJz7bWqANhJz9PYmVAgHXrB1SpPmtZ2RoA0FMTVyWNeEq35ghm57InMOaupawVlyVVUPmsO6x1XXZuqW\\/RFAlRcPlAXmXiUq3\\/wAfJ\\/bfhdWF8cTDGTIiflWpzRNkGYbcdp84QRoVOzUi5NLFybzIN8qkx9XcP1VmuUWl1hgWaqdOkp9sXvlROSzcylB\\/jNh3IobwUkHUEDuHCfEgWzOfMFbcC7XqrqkOCYAcbpsy8nZKmAlQVnJzA1W51kkJAymkoCkuh2OZytnJ\\/N6NV8DG7CWjhvAfEyqr8qplOZAkcMb2n9rNvUJtDRU1K2ncCW5iftNbeylac4mctksyrMlRVVLelHd1Epll6QGFt4aPGLNPRW7bui3pyjlhxaUTDtKcSlaFyEytt7ySu25NolqpQ6g2lT8i9Kysww2F05Kl9ueRdt0axVIseTltBn0gPF13ZBiOedKnKPWMvaLwZMTCwpRpVVyKVR2ibsTRXS2A8qZo7MlR+27ZrL12mvV6ntJRPS4Ls1kTb0khIE5ZIJsqwbngAQpsomikLYcWuBATkCfV2whGRelXo63forY53vgteIXMP23PbegV0MuMSl1WjUc5i27lkkkkJRUaeUonZdtx5FOq7FSpKnnHqe8uMdI6lnZOZp83MyM40pialH3ZeYZWLKbeZWULSeBsoEBQJSoekklJBPCjrTjDrjLyFNutLU24hQspC0EpUkjmCCOXKA7gT0Q3JzJPT4y9EKrOQy6fd4+MNnFaqCec7h6fszhtA0vz+H64bhs4rWUTzcB2D1w3WczlzDwezvhQnIE9Hv5oQh5A1vy0Hj18YIITWeA9MKQgo5kn1dkep9JRUR+vh7BC0C5vbQfGE1ndl0\\/DwIQWch27u+FFnNR6t3j0wgs5nLo9\\/j4xlJFgO\\/X2w7CSjkD17vX9kIKOQJ9XbCizmQOjf6T9nvhBZ4D0xkIFh46wQkTkCeiECeJPaYVWd2XT8PAhBZyB693j0QoC5A5m0OoFhfmberd8et0Ik5knpOcIE5knr9nNCyjkD7Obj4zhCMgDcB3AQuCCCKEgAk8ACT2RkboIaOnNZ6BuHo4+3OGLxzUB0D374dE8Sesn3wwUdZRPSYWga+A6+2HFEhIHdr6rQks8B6fHthus8B6e74wss5k9A4fH2w3V9Y+OG6MtIsB7YWkWA8I3b8gTUn5LTlrEo1NIZarOAl\\/U2abIaKpthm5cP6wmXaLiVOBSZmlsTetLFDwbll5r8n8oSqXDjU1q21TXE81cZQQrLiunz6gRuy4NqzyB4noiHFyGc5LMcoVY0vMO7N2oYf4nyUkjUcVt5lu1pioqZzShSWj5JITbus7qN5tBoK2rjSFzLMamEmz2Hcz9BWpJwJOWRJlp5jI8+Wq6vIjLeOiI3tyk1Tnk27UQhIUpvDdQmFemE2TJvys4vW99G2Sqx1VuF7gnpLYg+AumJUT6FddaToTo4xLm1huBU8dPFRteIg\\/yiKRbco+iXUi4sOytSxrkkIySG1tz8rhU84pe7XC0KpjQbAUBquuayT5oTHwsBZNCmEnLzKm+gAfWKTLyqwTvO8kqyO7cObIxI2+ULNsLwt0bn1NNl9m\\/75ZbfKEKebZmLdo63m0Oka6G31ysut5AUA8WGVr1lNp1Y3mHSwabPo50zyVZ83nsNpA7c0H1jjEG8ktwu+TTglBuPNZ7E7QBtoDjCtv6Wsct5ggXvrcjSwEY23ottCxAr9NNHXpfS1Gp7f8A+vvHGPvnjkg9ZA+PuEMlHJJ7MvXuh0+fqp7SfcPjDRfADr8e+L4TvHjFOxLL+S+VMlrTZo7sy0UoXo7VGTkFKbDqlOJxulalONIH07qEhqlMzCxrMsqXLA6i5hO0I69+TDzsojFXSyprjg8tm8P8Mp6Wl9VRLsrT7juiXnHwdXUAYeqck2oKUFHylJSFZOahHZWypwrwJRQVEltVSb33NhVZwpBvewCVAAcE2toBazcOHNSJYaeip9O8cZhxWvL6\\/s15xMSiJ18pOmplV7aJsiXnVScva2L00xLrWSwzMzdYsFuZfaQdyXX2pKUbeXv2iJVgf3oZyxYiU\\/KSpyWXiZoryCHkGaYsXE2bflwPPal5yv2qzKvngNR5yQnUIB35y7ueecYW2c22c17W13KSPH\\/4zTzbv3Xt3X4XhnFJtRZnW11y48f2Q2bd+6\\/qvwiNLB2QQRwwoXBEVRCjZ4j0\\/A+O2N63JFS7bVlYzzidbbTN02nKubyG9lJ0iqvM6qciQsqnnwtWscxqH8HztEyTkQY3u8kesIw\\/xhzz\\/wDHG3uHPnRZn4b4598pgq\\/E9iMAn0pugpUBxH05IKAPcFJSr1euLg2DgHadQrgEiXrBTfgTSJ1PwUR4ExJz0XmnP1PqqtSSgO3dUXG8wMnEJpFCaKkkcfObUjeD9TgIgu8v0ojlQccW1rKtS2MGwgHPJKVYSWe6AAfqjNZOQ4KOXEZxOz0YE7TDNS94zuKrDIjMZbKRIzG7f464ga8vZPOzfKo6Scq4hpKKRIYKU9lSCvN1t3AXDKrKW7rLVm4Hqo82NQ5bJtoFOtrKV1RsJlEymwDZWAFWewrSHAon86Zacmlp0P1UqWoJ0uAkXJNyJvtgcK6hUQfza8U2\\/tJeZQD42B9sYj4VhSLDoGYIJFSWAedK6vUFpPYpCgR0Ax2QDwI7Y67wyP8A3i2\\/1S0wP\\/66aPxjsFBBGXQcj6d\\/xiKVb0qjUFcfPpsn1zDn2\\/GOZpi5ff8A7q4fas\\/Pj8YdjeAemF0nMA+vthqg7suj3fp98LIO\\/Lp3jt8e6NUsXF+XX3+qGYdpOYHqMXQkg5HLp98KxjH0VX4Ho+\\/XSGVCx7juhRB5ujeOzx74dMqyVkeCvfzevhDIHIg9Hj2wuDwI7RHixY35wmORScjn6D2QvDRCtZIPPwPbDhBzGXRu9HN46oYWOPt+yCL4XBzAPr7YQi9ByOR4H3+PhzQ3BHItL1k9adx+B9PwhSGSFaqgebn7Ie8YZULHuO6GVCx7jugi5CihQPrHSItghlY4+35wpJuMp15eHL5fdHIA8CO0GF0nMZ+uGDK\\/wSf8XP3eD2Q5Scj1c8MqTcd43QgixtDtB5j6O7x18IUhuDzj0QslWsOscYZjyLwciD0QuN4B6YbxclWXZCFJvqN498IUm+o3j9eh+2HaVZ7jx98LIVluPDm6vshp2QslQV1EcR8R1QyRcWPGBKr6cR74dQQkleQ3ndzHo+zxw4KwyQQfgeceqSD48\\/nCzburuVmU83SPsjaByd9puauIF8lklx1yl2fS3koCvOSDWKyyDnkdoXbfXkOGrvzz3auY34aClnmiYUYdSzreo\\/cEzUbwqGaQEupnJt+ap7h1iSou0eSpKQr6qvNyzGUUh5QNa+iNnc6ylYS5VZyVkyL2V2DBXUpgi2uVSZFLC9CCHwg\\/XEXZ5PdENV2iS00tGZuiU+dqJzC6e3dCKbLpP8cKnlPt8lMZgfRjZZT5USUjJygyylpZlg9am0JQpWfSpQKj0kw8hDM9J9ZgzPSfWY+YSkqUpSlKupRKlHmSbk+0no6fRYCwAHAW9kLwQhmek+swZnpPrMJ7M8x10ejoQvBCGZ6T6zBmek+swdmeY66PR0IXghDM9J9ZgzPSfWYOzPMddHo6ELwQhmek+swZnpPrMHZnmOuj0dCOxLVm7Wr9DuPC3EakU+4bCvqk1O3a1SKywmapM5Tq7JPU2r0moy7uTS6RWZKZclZpJIQ2tzWUW0uuuJj96fvJ93HozXHP37hxTKpXsA6zMh6RnG1zVVn8OZl9YH3PXNMubaccpW1WW7fuSaU6maaU3TavNqrDbc1VN4GZ6T6zHb1nYly7NPete+ZBu4LXnZZynOommGp4pp77SmJiRnpOZS4xVKY4wotOyzyFrDKnG0mYZ1JZPfPk2+UNh5mhyOyXavPil0mUeUMF45eSXW8OmYUCqj1zKkvKoqnSRKTis6KelaZeaXLU+Xl5qn0Jte2SMYzll1CQSUVNoFwBtKS6XLJSpxlCikPBxKU+cyuZHbFCXmiJkWchU5k8ST6YpElnSI5IHCbFtM7fWi9eEhhvWZ0uzT1l1QzdUw6nJp1S3VJkHWS\\/cFjrW6v6SURKVulyzaGpSm0GlMpIjS\\/i9oE6WmCj80q7sG7qqdHllOKN02TKLve21y6Rn5W\\/P22J96kS6zuT8\\/ytKfJIDrLeYz7WqOBK\\/IyzNRlWWq7RZtpExI13D7qavSpyVdGZqZamZQuAMOJIKHXEoaXcFtawUk8LVvCOIKA861PU1\\/IypSVvstuONJymx7QBAcl1A3BRMtsrFt0YiFSRzj3+6KFY5hn7Io8y7LOvMPsrl5hhx1l5h1otOsutktOMvNugONONOJDbjTmakqJ3DLciVpHPn2eMoiCm1JNiDcEgggggjQg33G++9rWiNAjjpw1PcD9v2woVk9Q6B38Yt7YT2h5h8e6LCSc8yevo7oAg8dPj11aElY4a+6FSsDhvPjnhMqJ7OqLYIcCQN0eekruHx+fwggihIHGElKz3cB7+3uhYST4c+t8KCQO88\\/lyi9S8swOPu+3x1QkTlmSe0mLVKCBmfQOcmGq3CvdwHMO+HQkDx5wqLnHdbzU\\/V5z0\\/ZCMEEewtKSdTu+PXXMEJKVnuHDn6+zqgUvPcOHT0\\/ZCSlBPWTwHxPVDqU21O\\/gOX3w5oB3Dn7oopWWYHH3QiTkMzzRUniT2mEVKz7IdSkk93E9cYb1WeQH3X15xQnMk9MUgihOQzh7dDg7t3Dwi1astw4n2CEVHIZ+qKk5kk9vZ9kIKOZ6uaFJTc9w3\\/KPYoTxJ7SYYrUVqJ9Q6BCzy\\/wAEH\\/Gy93g9sN4eAubc4cSLAqPQ+\\/h98ZK6O1yOW1eFnV1tagu2L\\/tqtI1SMw3J1WnzikHjm255O+FJUChYWtCkrSogyy4h14cq86sI5tWQUN53HObByH7oEAkb8hkNbgJfdImXZylUybfIL0zT5KYeKU6qS7MS7TrpSjPzUlThyA3jszEfP7yvJBDdew3NoAC3U1dhZA1KQ3R5lsepczME96r8Y+j2wudXObMcMrWbqaYnZXUm4TJ1WflGhcjcGWWrAGw0SNxtzMO6VVJyj1KRqsg4Wp6QmWpqXXlmlLjeRKFjWSVtLHmOtghLjS1ocIQsmONzPSfWYMz0n1mOR5CbnKZOStRkJl6Un5GZl52Sm5ZxTMxKTcq6h+XmWHUWW28w8hLrTiClSHEJUkgjS2nWkPIU26lK23ELbcbUApK0LGVaFg6FKkkpUDoQSDppGPnLCaNdM0kdGCmaSlkUra4hYISEzVKsJVkGfqmGbzyjeVHmktJLj4sydQbskHZl0s06lSt2eTNF6r5mIjE\\/XAqsSVRTcOHVcZYqFHuOnzjiZCcSl6UnUPSxkqzT35dalImGZ6nKKnWSgoW1LvlaiFhMQn9MvASa0YtJfFzBgtzApVr3O+9aL8ztFvTtkV9lmv2fNLmXd01MC3qjT5WpPtqcbFWlqgzrbRl6Puxh\\/GrG2fZRgTbE0lhFYqcucL49Yl0pQ3L4yobSWH5gtp0ZTVpVtFRYaKiGJF+QbKlLUpR+eG2jB\\/4M4mecYQoSkysFtZBIU24kuSqyr85ZZSuXcV+c7KOKtdRjGNRzJPq8e2Gjys1ZDgn38\\/q4euF1q1Uk8\\/AdsMieJPaYYA3AeEU118OvbCazwHp8eOaE4qTmSYpDh9FNuJ3\\/AG\\/KCLVHIHr3ev7IQJyBPq7YUWczl0ePs9EN1nfl0cfHjjDjadwPietO4Q8kWHjrFh3ceaG5PEntMKrO7Lp936fdDdZAGXSch6N\\/wjJAuQOcKhMnMk9MN1HMkwqo5JPXu8eiECcgT0Q\\/uj0d3HS3z4Qks5qPVu8emEFnfl0fHwIV4QgTmczzwtA1vy+P6vjDw0AHIQk4eA9PwEJxUnMnrO73CKRkIFzfl8erx7BCTxyRl+MQPVv+AhWGjys15dAy9J3nx1Q7Cki5Hdr7IbOnJB6TuHphkTkCeiHD6t4T0DP0n7B7fU1WdwHT7h49kPNjdpvPu6vCjqu3AW9g1N\\/hCRPEnrJhuTxJ7TCqzuy6fHdCCjkD17vX9kZQ932e6HRqQOZEbXuRIeZb5R7BZp55ttyboWLTEuhRGbz6cKbwnC00MxrOCXln3tUE\\/RNOHfllE1zGpofcPMOE5hmpU5aQABxdLROZB3BLq88ufoziERyLIB5TDRqBOWf6sYHowAxVPPu4CJwGNqQmwp1RVwn6aOHTMp7eiG9p7KX\\/ACcdsalthYawXjApuSfSboXboJF7EpWoKG8EgXBvrf2xhZS\\/Tk334mZFwP0m6eCLnXUaWtb4xE\\/+UEqB0c8EcuP6tbm7\\/wDkW5\\/REYzDlZMtVEZDJL0urnzJUh0EE55fgDLIZ8YlFcv9T5Z7ROwpq6lL8rkNIi36c0AsBoy1Vw1xPmpnXQU5qcDtGlQ0rWSEJ2u5QcSURb8OFnZ1pIIyQZFYy3nNSZ0Hq\\/ATl6YpbyOFJX5ONKQAc0viDELa7i1lKrHbC3MZH0a8yRbSMbbugpx3U1G1nJGlLTbfYSrTZvyOZtXPS3O0dhuHNauo5erd74br49mQ+PxhXthuTmSek5x0QjefDr4RSMSaPkx+R0h9JbdwwYtzj+\\/eU74I+T+TMFStLrHhOsSlWjnOqI1lAEpxNw9CSoD8JIUoAg5DWUMt8Edh7JVXwPTABufqI3\\/\\/AFzx+0+zmYsjDP7lo1Gjz3vKT7r+4+ETZIiCfKRzljzo4kcRhJcR9V5PRL7iIF8pGbWMdNHBwoWlpeE9ztocyVqFbV4rU42le5KlNpeaK0j6m1bz+uIxNtP\\/AEd1n+70rhcaVWT3\\/DXiYRir9x3e56X\\/ANYOtdIjlgggEcCAR2RWEWVZpKTxSd3YeHx7NwhaOHIqoixI5QRvu5JhllGEeJswEp27uIzEu45v1nGZa2aQ4w2TvGq25NPlGXO8odMaEY3y8krOIcwtxTp4SQuVxAkZwrzzSpE7bkkwhsJ4hTZp6lLO4\\/Soz4Rz35TiVfijrZTfKmpUJS7G3oGqMJ1HFPaKRpwVlNtLi5tgRSNpdJzWJMlVwi4uc30c+dORyBWvK41vYyftFz+1gf3x1b\\/81IxAk5eL9tb0qf8AzHf+rfg\\/E9rRb\\/tYq\\/fJVv8A8zIRAh5eRZHKu6VXD\\/8Agd7dG\\/B8x1vsVWn\\/AN3\\/AGSC9yMJYfv4iQVcdfbEu2vfulVP\\/uBz\\/VTUYw4cJS3ZduoTmAqQ195z85x95xW\\/mBUpWQz3ApHZ94g5KHXu9f2x8Hh6SbKtwncfm5Hsccj7kHMDrG\\/3GIPUNZ6evrebmb8\\/25evjHND5BfePDtV\\/wD9j8fdDpJyIPr7IXByOfRDVJzAPRuPb9vGHCDmOzd3RrCN4PrhqHQOe8du7m7soXBzAPr7YaIPEenx454XQrI5cx98Yzid44jUdeHvhKhcd41HXWtoVhRB5ujeOzx74TioORzHNCB6SbcRb7vlDMPWVZKyPBXv5vXwh2DkQfX2RxoOYz6Yetr107+I3H4H0w34wQ8ghNB5vV3QpDBFjaCFknMdY4+PHPDtlf4B\\/wCLx385Hojj0nIj1QuDwIPWDCVC4tx3jr1x4oXFvZ4xyEEWIXrpz5+BEXwwRwI9RhnUHkRBDxteuN\\/1hx6+v0wziqVFJBHN7R0emGFCx7uEOGyxpvHR9XL9ccklWW48PdCwJBzENEqCxmPSOcGFkK5iew\\/CGlp4j1\\/P5w1DsEEZj9EVhAEg+8dMLAgjPm93bDcEKJVluPD3ePHWr2Q3i4KI6x0QhSL6jfx7\\/vhCk31Gh5dcYeJVrbuf39kKJVq7ub3dkNQc94hRK+Y+vvhojeD64EqvodD7Oj3fqjk5SWfnZmWk5VtT0zNzDUtLNp+s6++6lpltP7pbi0pHWRzxKEwEt5mhyUjSJcAydq2xR7fk9VASEtS0tLyUuQEgBIEtTlpA4aqjxAOccvAGhG48Z8N6XqqcR91VOqT6Bv2ktQlKrkyhQy+oqXpzqHMt+yKsiCARJuwjZWihTk2UpCpuorbSciCWZVloJJVmM\\/pXphOruKSnoV5nG3lYVYol6DSELt2crNTi0ggFRnZliWaURv8ARbkZsJNhotd+IHYPkt0sCXxNWlJv2s1I05pRGqRJsOzcwhKje4WqdlVKBvbs07t57bghHaL6E+s90G0X0J9Z7o4Zse72j5x2Bm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dFoIR2i+hPrPdBtF9CfWe6Cx7vaPnBm7h\\/jJ+fj0dOSptVqlGmm5ykz83T5lIH08pMOMLUnMqKF6igl1oqAJbcDiFZDXR09u0THe66eEt1aVkK40lIBW80ZCdUUncfKJQeTEFOesVSa1rVkQrIEOdIbRfQn1nug2i+hPrPdFlYE2w7UNmTmfAmOK\\/hxkudsunyk921HeeJBLsxRJ0TVHmXNLBcxIuqAJF7FV9RUaJSKuLVKnSs0qwSHVoSl9KRb0UTDakPITodEOJG7QR31cN24E4jIyxOwYt261KbCHE3Fa1oXq2UltbOqV3DJNrcbDa1tZFkEtOLSGsiUK6nqWjhyddwuOO1LACw5FUw2825812jNW8hKX1uFezZtdco1LugOa7T0qltyWSGwy4ylplLfzu0X0J9Z7oNovoT6z3R0lTfL826yyEisyOzbFzoQhHnGIsFyoeVlPpFX0FO0Rq7mucJaSm59BKRpEEntkGCJ9ZW7IOpzG5Adl5ga23meYm1G1jYk33XJuYp\\/Yacmd\\/gXpX+fYnf\\/HoeSeiRya9N2\\/k+CFsvbfVKxOS18VRX0RcI2AqtSmhLqO1OuGlMpdzbDueyaDTTaL6E+s90G0X0J9Z7o2g\\/wDaC7VxqnZ3sOSbEBSMF1hKk3Frg\\/hcddBvBHMRrE7C8AJIKZFwEW1DNHBtYAgH6LuLgEb93ebj6aS0dOTtpjbol9HzD57aaqlpnrIXVVnUz1EsqqqprYE62\\/ZLaSvPNzMcHbOCnJ9y7zMwjRqw0Wtl1t0JewwtyYaK21haQ9LzDbsu+2VJyWy+26w6n6N1tTfH47aL6E+s90G0X0J9Z7oxnP8A2gG2NWXJhLY+wE3JDOC5myibanta+6QRbTKUjXUGwtko2LYFbACZJ0AWtb6PTl3E2ySSRvud1zpcx2a5hvoGIQpwaLuDDq0jMNowEwv11noTtKM0gKPMFuITvOZTDP7gNBP8k3CT8xOD\\/wD1SOvtovoT6z3QbRfQn1nujBmfL323vqSpql7MZMJTYolsESq0rN75lmcnppebh6K0pt+bvMZKNkGCUiypJ5e6xU7Lgj6ugyMIFtDvBPfy7KRhxoGOISteizgwwpWtm29gNhYpadUqA1i1SHmzrAFQ1VqyTlnkc8uDfwQ5PiZdemF6NGGaVzDrjqwzhfbks2FOr11JaYl22WGWtZWSGWG2mGmxs2m0t5AfI7RfQn1nug2i+hPrPdGQjy\\/dtSUIQvD2yd5SEpSXXMFELcUkAFxYbrDbYWsjMoNtoRmJyISmwCFbHMEL+tJvEXuElcooJ3aJzyqiLAWBJJ4k3OnOTujVyc1TW2\\/M6PdhsLQ0EluSs+YpaMt6vpWaY5KS7rmsrIuLS4rIHz9QZDgJvQy5MmqPvOTOClvsKmEFDnkj+JdNYb1WQ2NkxSaww3LqKUnNyVaQ6XlF0HbBTov2i+hPrPdBtF9CfWe6M5v\\/ANoNtbFu3wFsTmwCklMxgyrWJTe9+wxWwr0wSFWUD+iUxhubD8BufWk3r8TkpKjwsfTpq9QLgE3795j5KZ5ODkvquGVSdizdFDanELEpiLjGyX1L2QBeTcNyTq0IaIOzcYEu2ouOB1b5Q2Gfh6hyRXJ41dookb0xCoS1tPsh+QxOoiXErcT5kzlcdtVRgOy+4sBTZllnJDzLwzQO5dovoT6z3QbRfQn1nujcSn\\/tA8RBKU1PYhsYmiQA4qn0qr0vMPRCuzz1aoKaJANjnWQTe5I11cx5P2Bnr5G3G77v2PTtPq2\\/aJaXva3C1+7MYxbq3IaaL1UI+43SCxOkUrUyppVVn8PLpBQttSCCulUG2dcvTGo4y4nLUaSWS08tW2Z6luLkAp0suP2dpQSc0op1paTuLCpyUaUoMqyK6vSr\\/qCih2ZS2jzaONgw7rfrl1gtO5\\/bRfQn1nuhzLT89JKUqTm5qUWsAqXKvPMKOSSlJUtot55ayzmQfrkDKJPJeXtgaYLbdf8AJxp2Te9M0HaLVZBaFAH0m5RVCWFpJ0DTk6hCb5ypSkpSdBNeTXhl0KUxOhtV7pSZaYTa+UD0mKmhI3b+xN+CdTGnS6+Qm0rKTtHbXv3BO7pdBybl1V27aBV3lALUjVlJ+z36WgKSloErrvmvO5ZbFsvRjFePJN6e1o7V9zA565JFpWombs+8bFuBTh2rjadnSpe40XAQoNof2qqOhptt1naqae2rLUkuSv8Avenq1pW668kEZBC6nNTLYG4EiWmlvMhW4cG9YIJGeRUT9bI444jSQG0q8vUGxkA3PU2QXuGtnmuVZlHzr62RC3ipOp5moc8prTfLD8mWqlLdYwVtZwk66rV2kzWHsQSMvYCwWueqEvOqQq2UhuSdczFPpBN1Jis95MSrKMjVGTYWSDMutEk2scjsjMpNt1u3Rccb2iGTfejtj9hqHjiFglixZTLKdo5N3Nh9ddHkS1r7IOt1CdpTMm8xtU7PbsvrYLoLW0JjpZxeoN31jw6uv0RPTp+khX2UoFWt2lThSfrSU3N05at3\\/wBn+c06xy\\/BSkFRy1ABu+Ou+S0S8YxMIxa0f7FuGbmwS9Va7YFp1yfbcOWs6xX25Vu4ZR88PKJJbD6m9dvajPUXZFG2r+TDirs0UXbhL0Gccy2kMc4arFDS2XD6CXq06y1Rk5QCHFtzDqQbKUUJUkmB1Pyd8XyWZcskzSEn0Q2lh\\/NYA\\/8AV5lb+twADKC+trnSIKMES+725J7k5cWQV2a9c2E1UmUubJNlX1PMIenFawbLlCxNl7qZLKVgByVozdNbcYRlLOMLWH4wHxe5ArFejtTVTwPxos6\\/pUJXMS9BvmlT1jVpTef0UnJ1amO3VRKnNLTwmpxNsyi9\\/wCxDLO1JLZ\\/UK1JGqYOrOFsfUsBKvpDBmIqbWpcNrTnQfyTyFLUpNlZGQ6TmGXMAoitKvs\\/xXSFlubpjoKb3SlK0OG2+zEyiXmFa6WS0dd+ljGkjDgedWF8wEgnPeRmVTZOfQU5DMcSCOqJfNHl3JWkUyVeTqvy9Pkpd5IUFBLsvLNNOBK05oUAtB1VJ3Ky9MRw6Boj42YJ4xWJhNjVYU\\/ZdwXheVBRIomJmn1Wl1WguVaTkpuq0uuUGcqNKqMpKpMy9Nok512ZkUJHlMu06622ZJO0X0J9Z7o+ZHliKdlsT0KjzUu7KT0j9KuTUrMtrYmGM7VIl2gtl0IcRnVKvmyk6gAi4sT3XsRp71N2a4al5hC2ni1PTDjbici0Gaq0\\/NISpKyChSWnkJUkgKBFlAEkBaCEdovoT6z3RRSyhK1rWEoSCoqUUBKEJGZWsngE5ZE8MzzcI43ynhr4G9+7S+vyPKLbzd3sIPLTTjv8bez6G16y5btx0attKOdOn5eYdCciXJZK9Sba3HM7aUU+0TrJIC88juA1RfKCcHGJS68CNIGlyrezuSh1jC65ZploNpcnKFMG6LQmH3EnUmJidka1dDCXXMn0SdFlGtZ5lplErkvinpiYKYWIflX7gVd1ea2jYoVmoYq60vhsqSmcqxdaokmELybmkKqLk9LnW1ac8pKmzgtp7cpjoy6Veh+3gVXqsLA0jbSvSw7os2wKlPN3K5d66I1ULbqk1S6tRZMLpE7L2hcFbrU6xddOt2VdaZdk6JUa1OK2B+o3kKztXk8FbXsEYik5yQpNalaTjDCLk8w6w09WqI3MJrIlEODMV1CmsUxKH+zQy83JqZDy3Fttxzr5Q1DE\\/hpuqNhHaSKHEvrLjaVhKXGpiXsFKSpVimabyoCiBMXA0JjQk8rNWQ4J9\\/P6uHrhqtX4PpPw8d8Xk5AnohEnM5nnjpRAub8B8evsjhOKRQnIE+rtisJLOZy5h7\\/Hxj36yu4de\\/v4eFoUkXPcNT8vXFhOWZ6N\\/phuTxJ7TCizwHp8eOaEVnIdu7vjJQLC\\/P4dfZD0JKOZJ9XZCCjmezd9sKqOQz9A7fs4w3UcgT6u2H0DefV17oISWczlzDwYRWeA9Pj2wpwhAnMk9MOQtAub20Hsv1r4wms7sunx3Qgo5A9e71\\/ZCijmezdCCzmcuj3+PjDyRYeOph3rr74sgggjIQLDx1gihIAJPAAk9kMCcySefMn3mHTysk6vOSPUN\\/vyhi6rVSek7h8YUNSBzhxNgCo+HXr+ENVHWUT0n2c3shus5nqG4fH0wqTkM+iECcsz0b\\/TGW2La8hYddb4EDefV8DCKzmeyEFneB0e\\/wDRl64VJ4k9phuTxPaYd9W\\/TrrjD6BrfkPf1eNovItKH\\/dNdGdPQMZSe06P+KvDsA9vDdnE4vG1KTh3VlZAak3SlI38FGoyyCcufzXFHxnEG\\/kVVa3Kb6NSuvGTL0aP+KuXsAicZjg4E4eVJGrmHZ2lt555Efr9lzjkedsJzzSRrHsjK2hFtPk47aQ4pIBwRjnQjN6asKkNW039rksSLJJBO68XvsbuZmmW3\\/hRLf4oTTr6btANd+njEVrl9v7jrDf\\/ACl7N\\/mtxliK9hyck1oc5NN9Q8vJ9uUSn+X2\\/uPMN\\/8AKVs3+a7GaIr2HX\\/74\\/8Awf8A\\/p0UJ5Ggt5O0uOWJq9\\/vCVhzb4k\\/hvNq0t9F0nx+paOylHIHr3ev7IbqO49mXwhZZ4D0+PHPDdZ4D0+PbHR6BYeOvwiiYkg\\/Jlv7rvHb\\/Jwnv5zsO4Ip8mWP\\/wC15jsOf+xvnj\\/\\/AHOw7gjsDZJ\\/SPTf74qH+2PRY+GP3LT\\/AHd74pibJESv5SqrLEPROHMqzcVR6RW7Ky95iWpETv5S5SnGLm0P64XkFqoUPG+lIYCFBbLlIqGFk448VHzCl5NeZQgAkgy7mYAKQWdsqSrZ1Xt9gukk24D6Zp4v7SB649xQD9CzRHBUuT3AzDQ+JA9cRhm1aqweY7j2H7coexxqTrJB45j9MP21ayAecbj2\\/bxPbHC8VUsblDjv+yL43pckrvw\\/xdPTeFB\\/0NMRotjd9yR844u08apApSGpa4LNnEKTntFLnaZXWnEqyOrqJTINFPm6wU6rhuihfKXbK9j+IyNzc3QVKPca7T0DxOZSRbvJi3tgygnafQQfzmKykaX1+h55XwSYlOaK7qDhi6EqCi3c9WS4EqCihXktNc1VD8E6ikLyOXmrB5wYggcvxJy0pyp+kNMM64cqlFwVnpsqVrAvt4I4e01Jb46ifJadKgp\\/3wLP4UTrtE3+11W94\\/8AHWo8SBl\\/uFbe7ed\\/T6Yg0fKDKdMSXKgYwTL2psqxZWDlRk9RRUoS7WGtu0lW2SUpKXPK6XNZJzUNiWFa3nBKen9gkz51sC2XFQSkt4XpjISDcgSodlQo7tVpbBULfnEa2vE32woCajUrG967nPMdpLTC\\/YCq3fGFuG7odsi3VDMBMkpG\\/cTsph9onsKkEjqKTH3aDxHT493ujrzDQ5WRbx\\/+dpj\\/APzZqOwAeBHaIi1RAFQnwNwnZoDwD645lmBZ53kXF9\\/5xvv+7lDpByO\\/gd3p5vHXzQ4Scj1cDDRJChmIXQSob+I49\\/YfR2Rr1jj7euuEMw6B4EdohcHMZ9O+GqDmMuce7x8IWQcjlzH3wwsXF+XRgh2k5jP0Hti6EUqyPUeMLRjH0VX4Ho+\\/WGVixvwPRi9CuY8\\/Dq\\/T7+2HCFaigebgez7IaQsk5j2GPFj84bjv+fr63wmOSB4EdRHvhdJzA9UMGV\\/gH0HP2d2UOkq1T1c\\/f6IaUm47xughaL0K5jz8Or9Pv7YsghmCHaFlBz5ucdIh4CCARwMcalWe7nHthw05qnInzT7D09nTCFJvqN43jroj1Qhab6jfx74dwQcYIZIBFvfyhsGxvF6FlBzG\\/PiOno9UPAQoAg5gwwi9Cyg9XOPHPDJBBsYcIChcb+tD39bo5JKs9x483X29cKAkH3jphqFAgKB3dPR3ZQqlXMePMent8fa0pHEez5de7c1DsEEZiKwgCQcxCwUD29ENwRcFEcPVCwUDw9UIQZkcDlCVJB7j1vhJSD3H9Xhe0ZlaEVJVUcZzUijXTbtqVyppWsKyQ9NrkaI2lJBCdopqrP5Be4tJd4kRI1w9ljK2fRUFOSn5Z2bUd+8zUw9NIUcwP7062lIHABP1t6o0JaA9P1Z3EmuuN5hmVtujy68\\/reVvVWcnEhRVrILfkciSC0Q7rjJwFsxIJpLK5Kl02T3p8kp8nK5HPd5PLttZZKCVbij8JIMfOzypagZjGypS4KZNiQlk2PBuRTOqSADuSuqKJHBV9b3j6AeTnTvNdnknMBOU1Gdqc8rhmPnZp6SeOqKakgnemx3ERysEI66\\/xlfxj3wa6\\/xlfxj3xy5p3+z7\\/Ho6X92Z5jro9HRaCEddf4yv4x74Ndf4yv4x74NO\\/wBn3+PR0OzPMddHo6LQQjrr\\/GV\\/GPfBrr\\/GV\\/GPfBp3+z7\\/AB6Oh2Z5jro9HRaCEddf4yv4x74Ndf4yv4x74NO\\/2ff49HQ7M8x10ejotBCOuv8AGV\\/GPfBrr\\/GV\\/GPfBp3+z7\\/Ho6HZnmOuj0dFoIR11\\/jK\\/jHvg11\\/jK\\/jHvg07\\/Z9\\/j0dDszzHXR6Oi0EI66\\/xlfxj3wa6\\/xlfxj3wad\\/s+\\/x6Oh2Z5jro9HRaCEddf4yv4x74Ndf4yv4x74NO\\/2ff49HQ7M8x10ejotBCOuv8ZX8Y98Guv8AGV\\/GPfBp3+z7\\/Ho6HZnmOuj0dFoIR11\\/jK\\/jHvg11\\/jK\\/jHvg07\\/AGff49HQ7M8x10ejotBCOuv8ZX8Y98Guv8ZX8Y98Gnf7Pv8AHo6HZnmOuj0dFoIR11\\/jK\\/jHvg11\\/jK\\/jHvg07\\/Z9\\/j0dDszzHXR6Oi0EI66\\/wAZX8Y98Guv8ZX8Y98Gnf7Pv8ejodmeY66PR0WghHXX+Mr+Me+DXX+Mr+Me+DTv9n3+PR0OzPMddHo6LQQjrr\\/GV\\/GPfBrr\\/GV\\/GPfBp3+z7\\/Ho6HZnmOuj0dFoIR11\\/jK\\/jHvg11\\/jK\\/jHvg07\\/Z9\\/j0dDszzHXR6Oi0EI66\\/xlfxj3wa6\\/wAZX8Y98Gnf7Pv8ejodmeY66PR0Wj6Ki3bc9tqQaLXalINtqK0y7Ey4ZJZUStW0kndpJOZlRWA6w4kHNROeZj5fXX+Mr+Me+DXX+Mr+Me+NtRq7WcOz7VUoFXqlDqbFixUaPPzVMn2CFJXdmcknmJhshSUqBQ4n0kJVvAKWnpViZbUzMsMTLK\\/rNPtIdbV4ocSpBFiRqndyvH0mI9alcWRY07fNBptRuLDa4J64LRuRlpUrPScxVaDUbfq0rMsJ2krMSs7KzzU0W2USqW6hSaTOpQp2TaKuCSNcHI5DtyOfo5x8eeENdf4yv4x74qlxaTmFHPr3+\\/fG8xttAxjtHqkrW8cYgn8SVmUpsrSG6pU1NOz65CTU6uXbmppDSH555tT7oM5OuTE44gobcmFttNIbYkaZJ01jzany7crL9ot4MtFQaQ45YuFpBulpKlDN2beVsKJUlIKlRjXj\\/pGUrBAGXnpWmMLTQ2q9NV+46tLUa2qPJPzk9TWnahMOus65RMSLgdSuYp7QQtlKJrXWoJjkaZnLAWZU3FW\\/bN6VnFV2WE41N0Gynnbfw78pC0Jbana4prYVthIQ6qXnpCUuppSXFak4EKjepymfJwW1yjuAlNptrViXs\\/SBwtZnJzDav1Gbm5O2qwuaUhc5aV8syUrPOzNv1ZLIXSayzIzVTtSsKXNyaXpGdrtMrMO9egQrB+8K5Z2Nyao9e1pVN6l161UtvUemSU5LKSdVb6Fmo1OTmWFNTUhPyz8jKT9PmWZuXbmJZ5h5f0Y8mnYpsRVhai45xFWXsQVxxhMwuiyMoGkodUmygJtT0y6pLRUuXdVKv0VcvNsusOlS0XcoHartVxJhGYVISlNap0s4eyYqziFTzz7qUhSktNLQ3JyrqU3IRNCZDrQDrarEpR0hfmlvpHY6zzlCtl2dt6mPbUIt7DuUnmZpUq6Q2VVOuIVMVhaNnrIfUicp1Nd13FOSjeWqORwh0bb5pN00S97sqsnRX6XUm6p81tuGsVaec85UwzPTbLyZKWMyl1aHH25upOqK3AthBKVHNmkW\\/QrZkkUu3aRTaLIoAPk1NlGJRtShmNd3ZJSXnlaxLj7ynHnFFS1rJJUp+o5D2COxnMXStPkHaNhGgUzDlLebUw72Mu05NzKFpLa1PulASta0KUFLeEy8L3ExfWORa9jWtYgeW9PTcxNOLCkl2ceVMuBCwAUNJUexYbI07JpsJSLBJFosWrmHNx6\\/0e\\/siyCCIWTlASN56v4n3eyIfFqjkOvm8dUIE5Ano3xepWZ6hwhBauYc3Hr\\/AEe\\/shxtO4es\\/KHkiw7zv+UWE8Se0wgo6xz9Q6oUWchlzn3ePjCCyUjdxPDv7B6eyMgC9gIVCazmd3AbvTz+OrnhBZ4Do8e73woo5An1dsIE8Se0w+BYAcoPffd7v1RYs7sun3ePjCCjqjrPDv8ARF5OZJ6YRWczl0ePs9ELSLnw1h5IsAOO8+74aCEycgT0Qh1+nfz98KLO\\/Idp9\\/s4\\/ohOH0i5A9vhCoIIITdVqoPSdw9P2Q\\/Bvhs4rWWSOA3DsHfxhi8rNWXMnd6TxhypWqkq6B7eb2wxJ4k9pMLQNb8vj+qHFaBKR1w9+sWLO7Lp4+PHCG6zuy6fhlChOZJhuo5kn0DsjLSLC3rPjCwLADlFizuPSfB8dcNXTkg9J3D08f0c8LLOZy6N3p5\\/HVDN5WashwHv54cSLqHIWPw+33Q79VHer7fu98bTuRQYed5TDRxcbaccblGcY35lSEkpYZVgNidKh10jclCpmZl2M1f3x5pGZ1om\\/Y7qBw8nss91SpXAf\\/PIyyHblxy6IhOchzmeUhwc3KIRbOLRWQCdUHDC6U6yuhIJSO0gc+6azj28pFgOpRq6r1XpragrPPUBfd3AqTv1mkZnzt3AZ5Qjai6iX8nPa8FGwewZi0Wtc5nqL5ugC1tCoJJPeTF97F0Xmaad5GJWlcALJbp6jr4C\\/uiKZy\\/VWfa0X8IqKEtmXnceqbUnHTrB1DtIw8v6UYbQcwgNuorcwp4KSpZW21qqSAsLi+4dEH54yIP\\/AMj+H\\/39EmL5QFPyyMBsDKY4sibmsX6jPMt6jmqqWkLNqsvNLLhzQNR2pyqQlStZwrUpG9C8ozGHJyFa6\\/m4evy\\/4RTnkfMhvycqOoIKPOK3iB0qIP5QivKZz677BkN3FhdsjeDGPt2dKsdVRJVcNyVJbCRb0P2JLuEbt5LhVY6jMDuIjssnMk9fs5obqOZJhZRyB6eHRv8Ashso6qSege3m9sdCAbgO4RSA1IHOJJvyZOQfd0q9IOrJLfkslo\\/IpzoUVbXyip4jWfMy+ohKTrNhukzW0VrAJUWQAdfzCOd+TDtPnH\\/SamENOlhrB612HZhKCWG3n71acZaddyUhLzyJeYW0hR13US76h+xLgjsDZQAMEUw2Or9RPE\\/9ffHxSPYe+LLw0CKYi3F506219JIvr3pHrB74mgRFp+Uv07aUbQ3qu2CTJVPHumiX2ee1+dZXB+ZLxdCwG9h80BvZbFzaeU620bDIDspaIy\\/ylOnIXhJovVkyzi3ZHEe\\/aamcBdLMuiq2xRpp2WcUk7DaziqQy4yHk7Yok3djm35QYd2rtJe2fYkQoXAl5NwC5HpM1OSeSbgjUKbBG8G1iCkkExKCaLOgb\\/2OfZNsHv4CIj7CuKT2j4+M4esq1VZcyvfzevh6uiOLSdUgjmh8CFAEHjwPOPtjg1Ysb8+vv9cVQnUFJ3jdfh9un3RyMbnuSNnHfI8fJHJAaYmMMplKgk66nJtm\\/WXULzUU7NCJJrZ5JQQpSw4peaCjS82vXTnz8D2jjG3nklZ4M3PjVTi8sGaoFmTolQpzUeEhUK+yZhaB9HrS3ziGUKUddCZpep5q1g0l5RDPb7HcYpAClIRRHk3BNuxxJR3FHT\\/s0rFzoL3Ogi0tiLoZ2oYXKty3KqyRcC5eodTaSNf46k2A1JAA1tEsDRGfSuyrkRrAuIuhRUkHglykU9KFHdlkpba+wt8OGUKz5RpSnKdyklanFPNuIr2C+FVWaSkKSWGmZasUItO55hS1PUZ1\\/WT5uzfSk+elcTPdEB8roN5saoAarFNeCtbPPbyb6dTLVBBQJbPW1vO1j2mIV8pso7FN0+MNKjKybrQr+itYk5OzajMqZnanJYoYy0tZbW6tbKHZalSVHaelpUNobTsH3mttNKffvLybJkP7A9nISU2RSZlkgXuPN6xUWbekb6Fogm1iRp6JBNnbZWj9I1Ym90VOTc1OpDkmkaAaE3dNr2043jVFhSsqsGg5kkgVNOZOZyFYqASM95yCQEgcwGr0x2Mg83RwjqrCB1JsinpBObU1Um1g7gFGcddyHAnzFpOsOnVy5z2kDkcxzQzWU5KtUhwM9NKGlvrPLV9undY8Y5fmUntnwRY9qs\\/+Yn4aX+Ih0g5HLmPvhZKsiOgnI+33GGoOYzHPC6VZjrHGNaRfQxh+3Tf3cPuh2DkQeiFxv4c8NEHPd0cOz7IWQrmPPw6v0+\\/thgixI5QQ7Scx1jj3wuhWYy5x7oZpORz9cLg5bxGOtHDgd3d18OMeEXFocRUEg+8dMWg5jPwIrDST+Yr3\\/D7QfZwhgi2hhwDwI7Qesd0PG16435aw4j4+mOOQrLceHuPd46YXSooOY9PWOiEKFj3cIOvCORQcvN5ubu8fGFR7\\/G+GqSFAKHD2j7YXQrPcePvHf46YaWniPX8\\/n1Yi8HLeIWScx7\\/HRCMKtNuPOttMIcdddcS0000kuOPOuKCW2220gqcccPmoSj65y4ZCEAFRAAJJNgBqSTwtxMEOmnMvNUd3MTzdXZDmMi8PNDHSwxWbYesTR5xZrMlMqDbFYds2r0S3nVq1VajdyXBL0qhqKUrStwfOI2TbrRczDqIzdsXkUdOG6gybio2G+Gjaxmo3pf8AKVF5DYSlWWxw\\/kr4CnVZ6jbanWwHEnbOstfSxuJfCuI54BcpRKm6g69r5m82wRcJ0fdShq+Y2Izk7ydxtnMUWqzllSlOnX0qt6aJZ0t62se0yBsAg3upYBGsal4IkOWlyAtxrS0\\/iBpJ0OlqQkKmZGzsPJ6uJWrUO0bbrFaue3tkhpwtqS6uhPF5tA1mZdR+iyBofIpaHVsBpy+MX8Urim0LyWybpsa1qY8EKbJT5A1a87VwvNC0kt1oENOK8wOtpdjJnsF1amMGZrbtJoUukgF+rVeQlWkhQTZanA+4kI9ICxIXpqgHLeRSGzzFs8pIZphTmvYLeZUo25tsreeSe5TYPiDEWVCyg9IPEeOeHaVBQzHq5x2xLvpHJ0cmraDTW2w++6mcQR+va3e+JlaW4EoAUlyTpNdk6GStaS5rLp6DtF\\/ROIZySO16TgZoJ2eEfMOjdhbOOtOJW0\\/OYY23XZ1taH3Xg6zPXZLzM42tK3CpLiXkObPYtZlDLTTNe1XFWzKhh5NV2s7O232bFctJ4kp9RmADbQy8s8qYC9bhHYkkC4JBiaSWwnG87kUuWQwlf5wl6gvfpqXJNho24kPWA56RC+SvLcfX48fD7Wh4eYgXKGzbVi3ncAd2WxNEtit1baCYb2jGz8hkpjaB1sFxnUz2je9rhumq0u5sKLWQ2LMwqt6gFks7EUi3rbt9LWxQtLWy+apMlvYhRQ3s\\/wBibccyz\\/Y45GYxmmHUlLNvstAEEbWouPZZJPHUkmM9+fOMk7gRlFeVLbxsMpi1I\\/GE3PrCbpTT6DX3gpaR9UPM02ZlxqQPScTmBuLakSqS8mrEbwSqZqBZBPpJTKSosOYU7VEL1\\/uJt7oh80PRB0qbhDS6do6YzFp7YbKansObppEm8iZCti6zO1emyMq4yrUzW+h4tM\\/RKdWgOtZ9uUTk29NeuhLkvgfU5Bg7Mrert0WHQi0h0qGuuVq10Ss8rU1SXG2pRyYbAz2Q105yjnsWLgdBS3I0hpO472ZxxYyG86xnEpyJ\\/c7uBJG+OFmMQ7nfBSJqXZSSAQzJyxzy\\/wDtzbx3+zcIryp+VPsxls4p6cRVJQBKCxSm2wV3NiUzs5InLuuFKSdVaAkCJXJeTAxdJnatOkEgrDb8oyeF7ESU7bjpryCtxjT1o8aLGK+jtQ26RitbsrSalel4Sy5T5uqUjW5QSqJenSbUpNT9Nfm5JE9tVTizJp1lKYKHUrmApxDO1WHlVrFRrsumVqrwn5dL8rNIZeZYKETMm8mZlH0JQ2jUel3m0OtrTqqSoZkfVjjtc9A9vfHE21bGMhjzE71cpjM+yxMlTzjVQbl2nm3nG2GlIQmWmZpBZS3LtltSnM4T6Cgoozr6UwZhlnCNBkqFLr7SXkGgywsuFxxaO0cdK3V9kyCtTjy1HK2lOugF7BWCEtc9A9vfBrnoHt74rHs18j117j3XlcKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkKwQlrnoHt74Nc9A9vfB2a+R669x7rkclTKjM0qdanZVWTjavOQpRCHm1EFxl0J+shYTw5j54yWAqMJOUx0LpPSQwoTj1hZSEvYw4d0eYXVqXIMJXPX5Z1PcdmZ6ivNNALm7mtltb9Rt7V15qpyRm6Kw3OLmqKiXzJ1z0D298fd2HdBoNTEvNLIplQWhqY11ZNyzxISzOZfghJyameGcuoE7RTTYjpLyc9qpwHitukVp4owxiBQk3lurIbpNQmFsCXqAuClEs6401LT5JQhtotTalASmVyAbRMGyeMKBNyTzQW6lvOhSUgu3bCihbRIP7IYUe1ZOuchTCgpDyhEFEniSesmECST7h0Rtx5WfQ5Ro\\/4tMYtWJSjKYSYy1CemyxKtKEhaOIv0s9XLeQlDZYk6dXWQ7cVtsbQeam4KZJSzEjQWDGo2PqTlCAFHUKSlaTwKVgKTbhcgi+uhuL6Ex82qzSZqh1Obpc4mz8o6WyoAhDqCApt5u+pbebUlxBOuVVlAKBAIsWrIZc590XE5DPwYQJz3mEpBJzH1dd3R0jXITfU8N3efui1RyHsEIndx5oqo5nP1QitXMObj1\\/o9\\/ZGUkWHeerQ7FpOZJ6YQUcz1Dh3+OqL1nLd08ez7YQUrIdZ4Q8hPE+r59fbBFizmcuYe+EFnm6eMXk5DM80Ik5nM88OQtAub8B8etfuixSshu48B8TCBOQJ6N8XqVmd3AeM4QWrmHp7ej0eOEPJFh3nU9da3h3rq8WHeSemCCCH0Cwvz+HX2QQQ0eVrKyHBO7088OHF6iSefgO08IYk5AqPWT1wuFoGt+A+P6obvq3hI7T283shqs5DLp3ejn8dcKElRJPEnOG6jmSfQOyMltO7u1Pj17hAn0lX5a\\/LruixR1R1nh3+iECcgTCizmcujx9nohBZ4Do3+mH4eSLkD2+EJKOqkk8w\\/R6zDAniT1k++HD6uCR2n4eM4aLOQy6fd4+MPNp3d593VzC1ekoJ5dH2Rud5BOUmZrlB7emGGS41T8LMTZydUFIHk8q5TpGQS6dYgkGbnpVgBvWXm8DkEhRExzSFmFNWPIoQAoTFyyDK8wcggU+qzA1d4yIWyjmPmbhnnkYjvyeWlIqGnNeM4XlNGhaOF+VZCAgL8oU9feFdCLRVrp2QSmsmZ1xr+cwGtX6TWTLP0jnAi1qEypRBXX0LCd+8NU6dSVEjdmkujLn85WecRrbrNmV8nDaaUqyZ6BNy5sqyimbm5KUUgai4Wl4tkW9JJKQdY6K2Ks3mqSd+esvOgGxA7NhvcBu1ZvruIvuiJF8oKqLKMO9GymlDnlE3euIM+2tISWUs02h25LPIcVtAvaKcqkuWgG1DVQ9rrQUoS5HKw7A2NVOW8uSgJy35BMwQD1ZqPr7IkC\\/KFKjqymiZS0LaKHpjG6ovtbvKG1SzeE0vKLyCjqNO+VziAVI+kWxmlX0S84\\/2Hgyk6krLLOYZSVEbiA0o5Z8N2sT1Z58YiPkoMdh5NWC1ZSnzmYxM9bNe4TjOtMjSwsLMWGpuAFcYj225WbH2IhvyJo6Ab8PoemLO7fYm1juOnCPv1ngOjf6fHvho+rcE9O89g4evf6ocE5knp8D1QwWrWUT15DsHCLwQLm\\/L4xTqBc34Ae\\/q9olW\\/Jd6dNvXxpjVNDC1SMnamC0hMTIUkJZm6lV8SZiSlyNdKyqYZpc+sFKSgeSq1yCWtYj7z5LfTi3R9Nurh4LE7VNHmm+T7MDZfNUrjVMl7bKcIWX\\/njZloNoLXkwVtHdsUskdjbL2i3geiZx6SxPuWOU2C6nOlNrbgUZTbeL2IBFhZmH9KTLEE+kp8nhqJh1P\\/6xLNiPF8pApIf0QMGq5tlpVTtJOh0lMvs8w6ms4YYozZeU5rgoVL\\/MKGw2EK2gmSSpGyyVIdjRz8oLpLlR5P8AXOJLpFAxsw2qzuyZU6jUflLooQ8oWCEy7JerLR2yxq7ctMf3\\/MZm0RjzjA+J272tSJl7cT\\/QwExbQjf2VuNr3sbZS5XBmpM+LX\\/IE77fVUlV\\/Va9uNuUQckHdkeI932cDDthXFJ7R8fGcMAcjn4MOEnIhQ7RHAbieVtd3cR174qBXoqChuO\\/7fb8bxyjKtVWXMr383r4erojalyUlQLeMGI9M128pvDQzxQR9Mr5tuihMa6MlD6JHzoUu5jctxnnzz1TJIUARwPs6j1gxsf5L+qiT0j56WLqW1VnDO6KZqFC1l4tVW2qyUJWMwz5tJ2u1OokJaWjW2ikINTbapbzrZVjhqxOWiOzFrE28zfYmySLE+iGSe4jeN8WDsqfTLbRsIOk5QurtM375ltyXG8j6xeAsNTe2pNol6aHE0NriDLFSiC3bD6Uk5NJKFXA24cickqcLjWeSTrJRvB1G8ou3yomjlnSd0bbh1ZnKqYDVSjaykAShNCxCr8+Uy7oQAuZSLkT5W3tFbJpUkSlG11nJM2h\\/MAXRd0nmQX6DKTIGsCnKVqSWiVJ4lZ8rySrV8zzt+axEf8A+VQW6luo6E92MiZUqakcfrcniVteSMJp7+EFTpQaa1A+JmZNSrG2dLrzGylJZKUMKClTEv8AJLnA\\/sKwgwCFGUmMSyxJvmSTieqzYBBF9G3xa17JItpoLy20sET9Xc3AfRT\\/ACB\\/ISkv6vS0PffTUWjoYLvbSzSnNJDNXnmxluIzblXslc+ebxy4eaU9ZV28g5jLnHujozA18fc5VGd30dbcdOROsNvISSQT0DNg6u7eQvfxju8HIg9ES6vt5avUE8TMKWP\\/AOQJX78326mOUJoWmHe9ZPtsft3+uHSDkcun3\\/bCyTkc\\/QeyGw38OeFknMdfPGijDWPzvbv6HLhwh0Dzg7+I8dBhcEEZj9HVDRB5vV3QslWR38D7IQtNxcbx74bh4lWY6xxhVCuY+ju8c\\/bDUEg5+CPAhYHMZ9MMkXFuhBDtKtU9R4wtDVKsxv4jx47OuFkK5j6Ixlp3\\/pDlx64ceEIUm+o3\\/Hr7oUhVCsxkePMero6z3QlG\\/HkirJ0Vqla1XvfGHA23cTrxpV9zNDl63cyJm4WKHJmnUKoUx9iy61OuWXOtB6bmFpn5ilJrkrMSbymZtxotNRr56t4coqZSZxVXJfDdHfnpeQfrc5LzcxJSDk0FhhycEky860w66hLBfUhLDTjraph1hnO8je4XwxUsW1QUilBpU4Zd6aS24vKpxuXCVPJZFj2jwbUXEtXSVpQoA5rA6msFNFjSM0hZpuXwXwbvm\\/WFuhhyt0ujOytqyjwd2BbqF41Y0+1KY5tNZITUKzKn6N4nMMOlG3fBnkCdIC6RJVLGrFCxcJqe8EOzNGt1ibxHu6XAzU5JTaJeYt+05Z9wgMtzchdFel2NpttjNbIS7sgiq6Ri5KUapViWvIUSmybLcpImdQ2RKyzadm0zKUim+TSMkhhtIDbIfnJdtAAS2E7o6Vr2Il63NtBWLiqcwwoKC5Nl3yKQUCo5pVIyKZeVWMvMBW0tQRu1gDlFe4r8qryaMDlcvQ0Yt2wVdnTNIMKwnhRbrZstCqhUEt1dSVLvkelJCpSzqU3Q4pBTn6Lw75Nk++G3q3NIl0GxU2656djY3EtKLUbjcoOVBlQvYoSoG2P1hckTyemDqWHsRahcmLlblW0uzDd6XlMy0l5UATtJe1cPW6C+ZY7i3JVaYrLbhzDrrwIjMWzZrRewSQlnBTA+0LVdYaW2ioWtZVt2pMzSXG1oX5XWmpU16bW8nJt56eQ+6prNCysANx0VBHO+Iv8A2gO0p3tGNn+DMA7OpUk9jMylJOIK+gHQB6qVQpp8yQkJupdDSpa05lEpOQXXRNiGC6QEKW07NuptdQQ3KoURbXM0FTl73IvOqtrbXU5E1PSPuh85Uui0enNkZEzHlVReB3Zarm0kmd2\\/MKllnrH4XwFRxdxCqeuHrknGEK1hqU9uVpuoFE7kOSUvLvDVGQSsuqWOO0zzjrWCOdsTeUdt2xgp013arjNxt6\\/bStMq72H5B26UpKXKdh\\/6MkVN5UizRl+zBJUE5lKJsGTwnhmRCfNqNIJUm2Vx6XTNOptaxDs0XnAeagq5tv0F+Wna3VqmB85VKoT5Cgc52emZs5\\/jHyhxfnDLm3b+aON2nV7fshOCKcm5ybqD6pmfmpmemV2zzE4+7NPrtuCnn1uOKA4AqNuEb9tthpIQ22ltA3JQkISN17JTYcybDn3XU2nV7fsg2nV7fshOCMaw5D2CHPQ5H3\\/Pqx7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/wCfVj3XU2nV7fsg2nV7fshOCCw5D2CD0OR9\\/wA+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/n1Y911Np1e37INp1e37ITggsOQ9gg9Dkff8+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/n1Y911Np1e37INp1e37ITggsOQ9gg9Dkff8+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/n1Y911Np1e37INp1e37ITggsOQ9gg9Dkff8+rHuuptOr2\\/ZBtOr2\\/ZCcEFhyHsEHocj7\\/AJ9WPddTadXt+yDadXt+yE4ILDkPYIPQ5H3\\/AD6se66m06vb9kG06vb9kJwQWHIewQehyPv+fVj3XU2nV7fsg2nV7fshOCCw5D2CD0OR9\\/z6se66m06vb9kG06vb9kJwQWHIewQehyPv+fVj3XU2nV7fsg2nV7fshOCCw5D2CD0OR9\\/z6se66m06vb9kG06vb9kJwQWHIewQehyPv+fVj3XU2nV7fsg2nV7fshOCCw5D2CD0OR9\\/z6se66m06vb9kG06vb9kJwQWHIewQehyPv8An1Y911Np1e37INp1e37ITggsOQ9gg9Dkff8APqx7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/59WPddTadXt+yDadXt+yE4ILDkPYIPQ5H3\\/Pqx7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/59WPddTadXt+yDadXt+yE4ILDkPYIPQ5H3\\/Pqx7rqbTq9v2QbTq9v2QnBBYch7BB6HI+\\/59WPdfnsU8Jbb0tdHW\\/sDbqLLVSnaUoW7WJlBcdoVxyAXN2dcrakNqdKaZVWW5apsy+T8\\/RlTsg88lNVd1oSt5WlcOH92XJY930x+i3RaNcqluXDSprULtPrFGnXZGflVOIU424GpplwImGnHWJhGo8w4604hcTcLSr6rbr0nUtYiWK\\/Jp9KcvpJJ9QTMbuBLeSJhtI3qdZSMt5jRvy3WjaizcULQ0k7alCLcxcYRbN6LYbHk8piBblMb+aZ1x1IQ2lV12lKDydlG0W5N2jWp+ZdKp1Gf1T8mraIrHuzxqm1B7tcQ4LMvR55SyVPzdLU2TRp9wkqU4pcuy7JvLWorcmJCZmnSO3STxr5Q+CUy62sSyTQAFxMZB\\/1d10BwEWF\\/NZt1CkgDKlicUCSlmw0WqVrHqHCEFq5h6e7xz9kXqVkN3E+PHb1QgTkCeiOgUJG+2g3fPrjHKoFtBFFKyHWeEIEgDM\\/p6ouJJOfgDwYQUrM7uA9sPpFz3ceu+CLSecnfxPjoEIKOZz9A7IvWeb190IqOQ6+aHo9AJNhx665RYs5nLo9\\/wBkIrOQy5z7ovO7jzQgTmSemFoFzfgPj1r+uHgLADlFqjkM\\/QO2EOv07+fvi5RzPUPGcWw8kXNvWfCPYIIITcXqpPSdw+J9Hvyh+DfCDytZWQ4J3dp5+OXPu9GecMn1cEjtPw8ZwspQSCTzD1no7TDIkqOZ5zx5oWgXN+A+PX2Q4r0QEjjv+fr+yLFnIdZ3Dxz9EIKOQJ9Xj2xco5kn0DshFZzOXR4+z0RlpFh46mFpFgB7fGLCQASeaG5PEnrJ98KLPAek+PHNDV5WQCRxO89gz9\\/whYFyB6\\/Vvh1PopKj0Pv+FobKUVKJPOfZzCG6jmSfQOyFVnIHr3Q3UcgT6B2xltp9+g5cIEDeeen3xIk+TiU3baTWPNaCmv8Ac7ApmlaqkEvK+d8QbUnCptz8FtHzFk8gfsiiwr+9ZRJ20lZlCabacqFpG2n6m+EZZKUJaXkmtcEZAJSZoJOYOeuCNwyiO\\/8AJq6AHq\\/pe3QshHzfSMFaCyFSmttzWZ7E+oTJanSsbPyX5hlBMSiG3A\\/5ZLvOLa2DQfkA6S72tN2hL62eylqy7qZEZB9dNbJ1ufMy+9OWQ1cj9ciKv8p+dMl5N2OEosFvt0OTAvYqE1jCjNO8QT+xy5awIuAVDLmjp\\/YfL5pmgk\\/VW\\/VX9Nf2tmcQDx\\/PbA13b+RMNn5QNU9tino7UfZAeQ2BelSEwXM9p863DS5TY7LZjZ+TGjFeuXnNt5SU6jZa1ndJ1hAikTasxkuorTlvz8yWliSebLzwB6Y2w8vXV2ZnSxw0pLC2HFUvAC3nphTT4dcZmajiBiOvyWYbSCZdxErKSs2hDh13GZ5twpShSFK1QWIkihqURltJ19We7M5IZRmcufzMuwDKNz5PMp5l5O2zVm2XtKS7NWNwT5\\/WKlPhWpV9YP5t9rHQJTZIrja472uOMTqve1RbZvp\\/UJaXZtoBqOysRvFiCTqT9g6rVSek7h8YZE5DPohZ5WasuZPv8c8NnDzek\\/AcYtJtO4c9T4fq98VikWA79YmafJgaItrAjSiuHZSwTVMW7PoomEZCdcVQLOdnlNTCtQKMq0LlQuSSXVhLr08UtNZlTpHcHyaKiJp+gniZWC1KCauDSgvZzylrdMrp9Nw0wikJWVm1qbSSJeeRVpmXaQt1ptueU5r7V5xDZHZ+AGyzg7D6FCxVJdqBqLh59x1J9YcB8DyJtZ1EQE0qTF96Fq0t+e6tR4jio37x4kSKI1PctrQEV7k0tIhSW1uzVBdwsr8mNsGUtrkcYbBl551wEBLyW6TNVJaGj5zjpaLZ2gbEbYYwP5Te2FXdyf2lxSkMl3yPBO8Ln1A205kLKlBei3Sl86mTCaCp8uJBdQGi7LjbJaz2uKGBNYaxDLkXD9EqrWls35SRfSCm4IuCQRobKA0MP1FHaU+fQBcqk5kJFr3UWV5bd97R5yqTmM\\/Qe2FkHm6N47PHvhqk5HqPHx454XBIOfPHzzULgjq\\/WkU2RcEc4esryOqeB4dvjxwjOLk8an836WOHTBc2bVXkr1pjh2obQo\\/cTXqgw2sHc6XJqnsNtMneuYW1qHWyScFweBG4+484jJrRBqxpOkxgrOBeoXb6pdJJAaJ\\/3c21EKcns0HaJqGrmn6UZ5sfTakQbaFJefYFxpJgAmawriBhNx9V1dKmw2rdoUuZT4iJDgqaMljHCk0bgS2JKK8rXehFSlVLT4FII9d++Jn+iZNbDE+daJA8ttKqywzQokhNQo84dXIhKCfJd6nCRqncNcojUl8qPtryvR\\/0Xrx2ST8w4xXZbJdLTpW2brsn502aXh9ChDosorW05k46plC2c0sPxs70ap8yeMVrNqWQ3PM12SdyWvLJdEqDzQyT9bOZYZA1gW0D6TzSkRiT8pPtxVc5O6jVQIKhZukZhpcaj9KNRMzbGItnhRDWaMyq6gjOZKWfPISTMFlK4v5GE+H9lrkoCCqQxfWZRXAgPSNKnRodCCmdOU23hSd4IjqrbVL5np1Sr\\/laTJvi1iLsza+AtY3YGbiN9uEQssCXs5S5JfP9imKY9llw27c6jPPnJ8nG7my64yBQcxlzj3ePhGM+Bb+rU6\\/LZ73ZGUf1czwYmHG9bLhu8pHHeM\\/N54yTBIOYi6cToKK1Nm2iwwoeuXaB\\/wDMD0I45nxaad5HIR60J+28O0K5jz8Or9Pv7YWByIPRDUEEAj09R6IXSrPjxHtiOLTxHr+cYR79x068et+joHnHohZJzHWOPfDRKstx4e6FgcjmPT1w3DJBBsd3A8OucO0K\\/BPHm7Oj0eOaFkqy48PG+GgOYBB48DC6VZjrHHv9MNLTxHHf3fr+PjHkO+GRB8ePGULAgj3johohXMT2H4QqDkc4aUm47xu+UEPEqz3Hjzdf6I26clZdKmapi5Zi1kmakrWumRQVj6L5tmKnSqm4GzvWXTU6ONpvDewyOe0GWoUHPeP0fbHaGEmMd84G3pTcQrBdQ5VaZm1UKDNTJlKXeFCcdadqVq1d8MzJl5WqJZa8nqKZWZcotUZp1aZlZl2nIl3a+2mYSmMbYHxDhqTUwieqMswqRVMr7FkTslOS89LpcdIIZS87LJYW6oZEJdUpz8nmtMtnmIGMKY0oVemisScrMuNzvZpzrTKzks9JvrCNM\\/ZImC9lBzEt+hdeW0x5maS6y06lIIcabdGR3ariEqBG791l19MX7f8Acfyv6sY0aOGkHYuPmHFvYgWNUlzlvVxL0uZSeS0zXLXuGSdMtWrQuiRZmJn5sr1EnguVn5NTzzQc1JuVmZylzcjOO5Hx8f61RqhQanO0mqSr8lPyEy9KzUrMtqafl35dxTTzLza7KQ604kocQdUqSfzbKP03kJyUqUoxOyjrcxLzDTbzTzS+0Q626hK0OIUkkFDiVBSVDQpN+dnG3\\/cfyv6sG3\\/cfyv6sN4I1VvD2jrj8eRjNyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1Y1I8pHfekPo94f3XjFgxO3Jc8hQ2WbouC1nLmuKTlpC0pNfk92VOk\\/NEyiaZVbj0zIVuoMg+QSlsmpzR2CKavW0BU3l1dIyXUr5xt1yeRqJSymXxEuaSUnLW1i6uYlKkp0kauqMm1A6ylKXrDV6c2b+SptC2sYZTirBM5QqnICYMnMsOVGVk52UnENsurln5eamGloWlDySFmzTgCuzcUUrSmD4h2hYVwtUEU2tzM1KTDjCJltQkZt9lbK1LSlaHWG3AoZ21oUEglKhYgb4m17f9x\\/K\\/qwbf8Acfyv6sQ77e5fnEFhxsVvD665dCG0MqckcRaXXlKSEec6GKtYtPSHNdCNUmacdKFKC5krTqOZMWXy\\/wBY824yi6ZXEGkOFQ2y6pY1oVOngZFfmzFtVuVqLmSmywrOlt\\/sqF+d56mttVfIp2\\/UtKlnCrc4lIJIkJ6VqDp\\/tWqe5OKUbcLg3sLXJtjyu1HZ5OKCWsTSaDp\\/RUvUpIXNtM85JsI3m2iuF92sSeNv+4\\/lf1YNv+4\\/lf1Y0r4f8tFo2Xg5KsuYl4dMOOuMpcbuBN0YbqaWshJD09eMk3S21JzzdfbmFSaNVThdLaddOd9j6YmF18yaZ+jzLFXkCpKDU7TrlCu6loWtOskLnadOsjJad6dm04pQGerq5mKZxFsc2mYUJ+n8HVumJBtmnJF+UuTuCUTSGHVXuLWb1vpcWvMafU6RV\\/3JqtKqm\\/Sn1KUnCLAFV0sPLWCkG5BSLD62Xhlzt\\/3H8r+rBt\\/3H8r+rHW9KxUsGrhKZe5JKWdUP2KpbalrSokAJCp5thha8+GzdcB5+G77xp+XmEJel3GnmVjNDjLqHW1j8ZDiMwsdnbwivZiRm5RQTNSszLKJsEvsONHS24LSm43kEXBA9mwU0pH121I\\/tgU37he1\\/dDzb\\/uP5X9WDb\\/uP5X9WG8EYtvD2jrj8eRjzKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/ALj+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/ALj+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/wC4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/wC4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv8AuP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv8AuP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/ALj+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/ALj+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/wC4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/wC4\\/lf1YNv+4\\/lf1YbwQW8PaOuPx5GDKnkff1x+PIw42\\/7j+V\\/Vg2\\/7j+V\\/VhvBBbw9o64\\/HkYMqeR9\\/XH48jDjb\\/uP5X9WDb\\/uP5X9WG8EFvD2jrj8eRgyp5H39cfjyMONv+4\\/lf1YS0jMIWtKzQ8xOwoEsicu+Qoq6jZRWWjMN3jaw+e7ODDrhUJZNWXLrtaZfOS\\/m2fqaf75usjtLCStKp10IkVqIl60wuTWkkBKJllJmJRagogkkoclkp5zMgc27oDyacarwdtTozTzpRS8U\\/8AyzUUlX5PPUXGxS3lA+ilTdVTKNKdVYty0xNDMErWDD8dUOWruGqlJvN5wJd1eX84tFpSJlKb3NzLrcUm2odQ2RqkWghOocZcW08hbTra1NutuoLbrbqDqLQtteRQtBGTjZ4b93PDRSs+HDxvjYFynuBwwH0xsUKPT5MylsX7NtYr2mEMeTS\\/zbfD01O1aVlGhrNNyVKu+XuWjSaGFFpErT2NVqX3yzWvlSsh1nh3+iPq2pBQrL32G7UcCQN1xr3a6aR8xahJPU2enKfMCz0lMvSzmlgVNLKCtOp9FYSFJIJBSQQSCDFq1fgjjz9nR6fHPCKjkOs8O+Kk5ZkwiTmcz6OqHALC0YcUJ4k+mECcyT0xcpWe4cPfCSlZcOJ9kKAubDjDqU2F+J+EWLVzDm49f6Pf2Qis5DLnPu8fGLiQASfR1nohAkk5mHgLAAfrML6MHjx7YIIIfSLDvO\\/5QQQycVrqzHAbh8T6TvhZ5eQ1RxPHqH2+7thm4vUSTz83bCt8OIAAKjw3fd8IQeXmdUcBx7fHjjDdZyGXOfd498XZ857TCBOZzjKbTu5DjzPXy5R4kZiVHh8eHs+UWKOQ6+bx1QgTkCeiL1KzO7gPGcILVnu6OPWfs4Q914w8kXNvb4RYTxJ6yffDFSipRJ8CF3l5DVHE8ezx1e2GizkOsw62n2n4da+FoUo3ISOHs6HzhNRzPVzQgs5nLo9\\/jKL1HIE+gdsIKISCTwAz+ztPNGc2m2vLQfOHALC3KJcnybmgFjB3SZugJH+6+Jtl0DW2mtrG2rXqFRKdgfqan3VhRd\\/vxXq7wwY2\\/wCkjNa93UaSBURLW83MHJwZJXNVCfSQUcEK2cs0pX4S0rSPxSNevyeeiGk6Cty1JSSFXTpDX\\/WkrU4y4FNStoYcW2lLaW0hbbSXqA6A1MKccDheeSdk+0lOc2kBNh7EabaQvMyFLpMqoayTqFTHlgSAN4zE2F5L87JX+9lGfO\\/lkz6pTYaqUzBAqeI8OyZA\\/qgbMzVAjUaH9gB05bK9A+llJB662HywCqTvIapc7M8rF94gnwHnBSPEHSwtBs5aqufOmnZdkgVLItqwMOKIlK20NhtMxQvujKULQdZ5GvX3FbRzJwLKm8g02gxgPZoDduyaxq\\/SOTa9wIJPlTre\\/hmr6M+jVjJDlSri+6fT50jKiFIUJa5rct3Jtp1pI+5SwrStdQ2by3FF0LpCi84khl58uvMobadQgY6W4nUoFKb\\/APnbacRn9KtboO7IcF5DiQDv84xe+zKQNM2LbK5BScriME4SW8mwGV52gSszMAgWue3eWCd5PpEAm0UFj98TWLMTPJOZDmI6uUKJvdpE9Mpb9qAkcgN2kcwTxJ7SYQJJOfPnn3Qos7gOc8fX+gegw2dVqpPSdw+MSpA489B4dfCIXHoCfJ8LcdonJp4fVVxlaW7zxJxbuRhTksWUvNSl3TNnl1p1Ot5Y3trTea8pOWo609J5ZyqjBHf3Ix20q1eTF0SabslMGasq5bjCC2+gFN5YkXreAd2cwoKPlHz4JgOpGydDoXLfrZTUEdvYWY83w1h9k2Km6NTQq27OZNlS7X4ZybeqLSpiQinSIGl5VhRB5rbStXvUY2hR0bpJ2wb10dMfLObl0zC7uwVxSthEu55MpD5rtkV2lBhaZtSJUpdM1s1pmlJlsjk8S1rZd5Q0eZbmG1svoQ6y8hbbrTiEuNrbcSpK23EFKkrStKylSVApWCSBlujcvtB5l1lX1XW1tq0uLLSUm+h4E\\/DlGW4gONuNk2C0KQTyCgUm3tjyqQrMAjdzHt5\\/YYWQcxlzj3R9BfVuOWVfV52e+laXrVuy4rZmEr2gcS7QqxN0twL2zMu6VpVKZL2suw6CfpGGl5tj5sHI59Hj3R84X2VMOraXbO2tbawNQFtqKVWOlxmBtoNIpM7zpbuOtu6HSDkcuY++OysJa4baxUw0uIKDZod\\/2bWgtRQEtmmXHTZ0LUp5DjISjYaxLiFN\\/joWgZR1iDmM+mHku8ttaHG1raeZUlxtxtakOIUhQWlxC0nWStCgClSclJVvHMY1s\\/KInZSalXLFublnpZwEX9B9tTStP7VR5e0wth5crMy803o5LPtPpIuCFMuJcSRbUEKSDfhbjE3HBufNOxUsCYz1de56XIk5KPm1N9NNUPNWnIKE3v8AwBuKkrQCk8ny59ot3fyXOk6ymXLs7bsphrd8g4lTx8lXb+LliTlTmNm060h5JoHzwwoP7VlpL5mdgX2GFDpnDq62ZtFiXikpSzNJte50FGeolp9MjVEqQFbYaoQvcCXQAd5Ud0bCeUKstvEHQT0wbSU2t56o6N+MUzTW0thalVui2LW65QAUGUnVqbFaptPLglpZU3qJPkim5rYLRzf5Fs+tikYzo7tgum4lpc461ey21T0quUWSBf6\\/0SUDSxKFAmO5NrTCZqVl5luxTOUWebaWRdKgEB1tXqEyFcxcHSPNIwWmg1d0w1rHKao041q78ituYk5gHLLIqCWlgFWQyUoJOZIOVvV4EYY4VzAl77ohUfNeM9LqyG\\/6WnzYbGZUADtg2Qd5UNZASogRmdHWuL2QiqJOtnZRpdzzC3W9PAIHttHD9TTaZB\\/SbSfYVJ\\/\\/AFEXJOR6j4zhcEggg7+OfjphtCiFcx9HdEPIsSDGvh2CCMxCyVZ7jx9\\/2w0SrVPUeMLA8CO0QypOU9x3QkgEWO\\/gePXOHSVZHfwPjOFgSCCD9o7oapVrDrHGFUqy3Hh7oTDViDbcR1p9nPhDwHMZwslWe48ff+iGYJB946YWBByIPeD3wypNj3Hd8o8h2lWXZziFgeBB7IapVrbuf3wolRSernHjnhpSb6jf8euu4jtPATSbunQ2xLexLpstUK\\/hDdz9NlMd7Dklhx5UlKI8kkMT7YYU24EXVako4WapJs7Bm6aAw1T59xh6nyFTpssXCzFO0sT7Rtm7rQuCn3Pa120eRrlq3JTXi5I1mkzzW2l3ElxLTzUwlILb0tMtMTcvMIek51hicl3mUw7FJQ4hSFpS404lSFoWkLQtCwUrSpCgUqSpJIUkggg6qs47F0PdMCs6AuIzNn3euo1XRJxLuFhbxS7OzkzgbdlQfPlFboks2Xyq2JtSlT1ao8qx5VMSrK52lpdrVNdlLj58267CWdqdMexBhmWCNoNIlATJspSleMKXJtBKZRP1c+IaZLthNOJuqqSDaaUbzEpS0Ho7YltYXht9rDNdmCaK+4RIzDqjanOuKBU2VG+WTcXdSx9VhalPpCUl8OzIdcdB9nfBrjoPs746\\/sm96Nd1EpNWpNWkK1TqzT5Sq0Wt0qbl5+lV2lT0uiZp9Tpk\\/KuLlpqWmZVxmZYfl3HGZlh5L7KlJUsJ+12yfGfdHy8mZF6Uecl32ltvNLU24haVIUlSDYgpWEqBBBCgQCk3SQFCw7mZdbfbS62oKQsBSSCCCCARYgkEEEEEEgggg2McXc9vUe6KTOUis02TqslOSc5JzEjUJZqalJuTqEo7I1CQm5d5K2piTqElMTEnNyz6FsPsuFLiFlIyh06Y\\/JiYWYBYqTFPpMpdkvYF0pfrNlTYrKnUtSwcQmp0CZmJyTmCuft6beTL5pdU45TJmlzsyRMzTjTEyrbJ8Z90Yv6UejvS9IrDqpWcFS0lcTe2rNmViYbGVLumTln3JZl97VLjdKrSAaZVtRLxbl5hU40y9NSkoEX\\/AOTxtmrGyPFWVNWnpDC9eLMpX2mHnAy0ltThlKmWkE3cprjzriilC1qlHp1tCFOuIIqrbBgRzGmGHlU0FGIaSlybpLjasi5ggAv01Z+qUTraQlvMQETaJZwrS2l0KhXTWhvhu8VGUr95ya1KUQlc5RpphCSDkhCDRGHsgSPOcmXSUghStY66fkaloTyqszR8QH2iCcmqlb7cwFA6uQ8olqrLahTks5iVXr5hPmapUrPeu0Or2zW6vbdw0+ZpNet+oztJrNKnW9lN06p099yVnpKYbO4OMTDTjawkqSojzVFIzjj0qI3cR44R9Y5fH2Kkobelq64+04hLja1Ik5tp1twBSHELcYdStDiCFJWhVlJIUlW4n52Gp1Rham1vuocbUpDjbzaM6FpOVSFpdQVJUkgpUkgEEWOsa0qvodYlSSVrpVVtesoCTqtpnJ2nziyFHJIam5ASg1k5HWVPjeVJ+qkKc67XhPjvh3PJq1Oty8KPUJQnZVez5x6ammUK85S25215yZmmG1aoUc1IKCEpd1SnJO3YEEZg59kVjeS+1TECEqanpWmVFlacrqHpdbS3EEWKVdm72BSRcELl1jXdbSMpnEU80pKlBpZSQQoBTbgI3FKkKABHA5bg2IIjX1YnKF6ZmFUwiTbxcuSvMS+oh+jYlSkteSnEtkJDb07cstMXHLjJOqfJavKOq36y+cbHMH+XRuqiPS7GKuEyGwS0Ji4sJbknqNMNBJycKbVuOYn251TifPRr3hJIQpGy1XEvazHyFYt237hZ8nr9Do9bYCSEs1amydRbSD+ImbZdCTnvBGRB3jzo6NuTRYwhuBLi5WlVC2ZpwE+UW\\/UXWka4OYzkakmoyCUEgJU3Ly0vrJJ1VoX56YvWqLsPxuhbeLNmdPkn3gQueobTci9nOUds8\\/SjSnnym1wmYanEkWQpC0XBsvD+23GVDKEy1fqzbSbDzebeRWJIJF8yRLVFLyGkqub9i2ldzmCgsJWJD2B\\/LG6M+JSZOTTi\\/SLbq7oaQqgYv01yx5xsu6gQgXI8tu0piYcdKm0pZuWovpWk6zOzdZLmze28fbUrsnKzq21Ikp1tLsrVKVMy9bpMwydyZhmblVJW40sglJl2pgc2tuiBJc+hdckql1+0LqpdZbHnIkqzLvUidy3fRNzDBqEm+5nmdd3yFBGQ3byfiLbr2lfoxTjk7Z1wYm4cS+1S9Nu2vWJ961J9baiUGrS1NmJ62Kkgg66WavLv852JUF5UHibyINlmKy6\\/s6x0aXOO3U1Sq822oqWsj8m2\\/KtU2ZZbQSRmXSamsggKcUfSN44d8phL+RnENCp89ewM1RphymTabAemqRmzMMTCyR6WRyVQCSpIAGU+jZS7jodbbDlKqcpOggkttOpD6QCQdeXWUzDe8cVtJ4iOY1x0H2d8QicF+W5x4s1MpT8X7GtPFinsrBcrdIc\\/U8u865SFPuP0ySqdrTBYP0rUtLWxSVPLKmVTrKXG3Jfc5o\\/8tJowYjNyNNq+IVRwtrr4bbVQ8Y6emRpeuFhDgaveRmKlbcvJNkgNPVavUR5xgpeXIt6r7bHJWP8AyN9suBw9MDDsxXqayTafw8fppns06qcUzJI+lGG0pGdTs5SZNsJOZSxZWW7qHtN2f4iyIk8QtU2bcIAkMQN\\/RbwJAyoE2tS6a64o3SlDM2tRUAkD0kZt7WuOg+zvg1x0H2d8dI2jjbbN10uRrUjMSFWpFQb20hXbaqcnXKLON5lIfl5qUeW080SkpLjExNkkEcY7TkK7Sqk2lUjONv6yc9QKKHQkn6ymHC26knPPNbROY4cw5inKNP09xbU3KPsraUUOBaDZC0KyrQspuEKSQQpKylY1ukW0nymHUoS5kKmlpStDrZDrS0KF0qQ62VIUlQN0kKsRqI5vXHQfZ3wa46D7O+Gm2T4z7oNsnxn3Rr+x7j7R1+s91mYd646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+DXHQfZ3w02yfGfdBtk+M+6Dse4+0dfrPdYh3rjoPs74NcdB9nfDTbJ8Z90G2T4z7oOx7j7R1+s91iHeuOg+zvg1x0H2d8NNsnxn3QbZPjPug7HuPtHX6z3WId646D7O+HEpPOSM3LTjBKH5OYZmmVHVIS9LuIdaJGsOC0pJG6OM2yfGfdBtk+M+6HWC7LvNPsqW08w428y6heVxp1paVtuIUDdK0LSFJULEKAI3WjxSUqSpKgFJUClSSLgpIsQRxBBsRGBHLo4Ty12YO4LaRdHkwp+1q6\\/ZdwTLRO3Xbl8yCKzQHpsKzSJWjVyizUk1qFDiJu6VpebWlYVLxhCSSST9g7onG434bp0idCDHTCZLKp2tKtCuPW2wUpdeeue2wxe9lto1tZTSZi4qZI05SknXRLJe1DkdSINqlZ7hw98fbbCNebxbgvB+LGynNX8PyE3MhAslufSyhufYSLaCXmguX3kktX+rlj5xbZqCaJjObKUkNTYKgqwAU5LEMX7yuWEq8dxKnVEi9yaKVmd3AeM4SUrLcOPu+2KqVqjrPCESeJPaY30VQlN9Tu+P3RQkAZmESSSSTv45+OiKqVrHqHCEVq5h6e6Hkptv3n3Q7FqjmeoeM4t6vB7YIIeQnifV8+vHlBBFq1BAJPoHSeYRdDN1euch9UcOs9OXu+EOR6kXPdxhMknMnid5PjKGTi9dR6BuHZCzy8hqjn49nR4HtENVHVGfPzDp6fVDrab68ToPn13wtRuQkeHd7uXuixZ5vX48c0ILOQy5z7ovJ4k9p8dcIE5nPp8e6MpIsAOiYWBYAcotUrIEnfzDt5vYIbqVqgk83TxJ6O0xes5ndwHCGby8zqjgOPWfshaRc24DU+7Trxh0egm\\/E8OuXH2QkTmSSeO8nmhuo6xz9Q6oUWrm6ePUIQWchu4ncO\\/iOHbGW2nu36Dw+Xyj1Atrz3eHXw74TWcz1CGj6t4QObee3mHx9IhdaglJPq7eaGJOeZJ6yTGUBYW5QuJ9nItWt9y\\/JuaPRcaU1O3D+qTdE7mXcnTVcU70+bXEpcaZWhK6FL0rMaqmlLSt5l19pbTivu8X53yvEq7HQdYJn2ZXLWB3yMjKSRG4JG7ybUyzzTll5xyUe1NAG0U2NoRaJ9uagafYwCwwqc62EhGyqdx2nTLjqrR1VupUpup1aZbU6FZPFJf1W9bUTjpfdbl03BeFdnH0tyTVWuCqzEyoFaGpNqcm5pbp2e2WptqWQVJSzrq1EgMjKON\\/LgqCvwKwVRUJKjOYqdnUp1K1fRlImpRICAL5v\\/AIvlAF9SEgekL9u7HZXzdoOKsPNaBIy6zuSkuCXWtRVqLXlio303m1rx59ml\\/cTd2aV2kpcbCy5KVXHXFaYkHCACqmovets0wqAddAWZBqX2hQ6tJXrbMlOQhpSm9jTKc0chs5CUQd2XnJYb1iQCd5IJVxyJ39XStdq8xcVfrNcmQryuu1eo1aYClJWRMVOcfm3QpxLbKFHavqBUltpJ4hpI80d6EBttLaOCUpSncBklAyGYAAG4c271ZR3SaeKRQsO0dIATTqbKSAsQRlkJOVlgRu0sk28NNLRyBWJkzc3MTShZU1NTMyoci86XCPUV+6LFHMk9fqHphm6rWXkOCdw5+0+OYQ4cVqpJ5zuHjqi2SlJipTsnTpRCXJyoTcvJSjRUltK5mceQwwlTiyEICnXEgqUpISB5xyyIZQgqKUJBKiUpSALkkmwAtvN7ADiTYa6RqRr98eojoHWoLF0JNES1PJjLPUXRrwTl6g0pcyFfPLuHVuzVbdKJpa3mTMVZ+dmDLqKUy+12DTbTTaGkEZH2lbVPs+1bZtKm\\/wDyPta3qNbkhqtJZHkNEp0tTJXJlsbJpOwlW8m280N\\/UQSkCCO7pRhMtKysukAJl5dllIFiAGm0IAHcAkWty8ItxlBbZabuBkbQiw0AKUpGlri2nDl4R9LBBBGRDkea7yhlpiyNOrS4t1DCZVhvSCxQrElLIbDTUvTrnuqo3RS2GG0pSEMM0+sSyJcAfsIbI3ERh8hWYy6Pd9nCNtfLpWb9yHKT4y1BqWXKyl92\\/hhekqgoWhp\\/bYfW\\/blRmWCttAUiZrVtVJ15aVzCfLFzADqPPYY1HpPBQ7R4EfPzF8n5hijEEoEhKGazUkICdR2XnbpZIvzbKCNb29G+htTk612c7Otf1uafQCdDZDq0g20OUgC3CxFodoVluPA++Fgcjn4MNQcxn4ELpVnx4j2xGvGMLxiVfovXAm5NHbBaqaxUv9Tm16c85mSpc1QqYzQ5pxWWt9IuZp7qnBkBrFROWW6QKimU7EjCtFHqublJv2wE02ogJQsuU66bcEtNgNvNFlzWlZ53zXmi0rIa7BT5sRi+TsuJFb0WLNkisLdtetXhb7ylKzXmq4Z2vS6Dk4s5NylclWWwpLQS2hOSAnz1yV8A6mKrhBY0yFAlmkrpis88x8zz01S0pKch9VEojdxKSASr68cjeT6v6A2v7X8Mp9EKm5ybYbOiizScQzEvLOpvpYM1htVt93Ad1zHdNWdTVdn+Bqmr8oXaVTm3jvHazNKYL6Cd5IdlXEnhdJt3+VnR5KetPEKSpdVaVK1Gg3a3SKowtLja5aYkaoKdUWlIdS06hTSm3m1IeQ2vdquJSdZMZvx1Tp8WUnCvTn0srOkWESkjbekdiwuhyyA0gS9Dm75rNXt1sJlUtMo1KNOU8FLLTCEkZJYY\\/Y09nS0wiZZaebOaXW0OJ3jelxIWk5pJBBSRvBKeYKVHcGM051UyaF7PMOp1tcBPYuJCrAWP5Y27hawtHFFaaLTyUqsShTzSiN121AceBN7Q4gggiDKTcd43RpYWSrMb+I93T4+MKoVluPD3Hu8dMNAcsiD1giFwQR7x0QwRfQ\\/qgh0CQcxCwIIzENEq5jw5j0ePHUqCQcxDJBB+B5wlSc3iIdpVzHjzHp8eOtVKsjnxHOOmGoIIzEKpVzHjzHp8eOvwi+hhmHgPOPRCyVa3bz+PG+GaVZdnOIVBByIPeD3wypNvDgfnBDtKik9XOPHPDCuUSlXLSJ+h1mUbnqZUpdUtNyzmYS42rIgpWgpW280sJdZebUlxpxCHGlhaEqh0lWe48ff48dSgJB946YSCtC0OtLU262pK21oUUrStBCkKSoEFK0qAKVAgggEEWBHoJBBBIIIIINiCNQQRqCDqCN0dgaBmnJdWgjiBT8A8cK5Ua1owXXUHnLJu+YbmJ2cwqqk5NB1U5LlnXeFsOzTuvd1Alm3DTZl03bQJZBmKrI1yXTaV4Um6aZTajTKnIVaSqsjLVKkVimTcrP0utU2aaRMSlQp09KLdk5uWmpZxt9h+Wedl5lhSXmFKbWrKFledm0K\\/bfnLdr8up6TmRrtutqCJqRm2wryeelHCDs5hkqOWslTbjanGXkONOONn77QJ0+L40Er4k8AcfJ6pVrR2rVTceti5G0zU9M4avz02VLr1AShLszM2lMTLwmLstSXS5OUadddr9AYXOOT8jc1BbefJ9ltrEpP45wPKNS20STYVNYiw7KtNtN4wZaTmerdHZbCEpxGEDPUpFCSmsBImJcJqSlIneptjW2NVM7DDmI37yF0tyk64o3kwbJS26TceZAjRQF5Im5BlCRLTPYUbcU04hxJ85KtYZ5kZjjn2jjv3iOt7CxCt2+rfoteodZpldo1wU6Sq1Ar1Im2J6k12lzzCJmTnqfOSy1y77Uyy4hxCmlFDifObAO0bR2Frp6fYe6Pl7NycxIvuys2y4y+0tbTjTqFIWhaFFC0LQtIUlSSClaFAKQoFKgFAiO0GFszLSHmVpcacSlSVJUlSVJUkKBBGhBB0IJBFlAkEGNSXKb6KgrtPc0l8PKbrVGnSrEvitTJJGTk3TJRtqVkL0bZbRrLfpLCGaZcSwo50hqm1INtMU6rTLujdDwO5W49PN6eiJnku5JOoekKizLzdMn2lys9KzbDUxKTEs+gszDUxLvIWy9LvsrU1MMvJLbzSyhWaDvja6eWiHN6N+ICrhtWSeewfvmdmZm1ZkFcw3bFTcK5qbsqemFLW4fJGwuZt+bmSXJ+jANKmJqfptTePcvkx7XRPSzGzPEczlqEk0s4SnZhes\\/TmU510RTiiSqaprYUuRFz2tPQqXSlvzJsP8U+ULsuVTZx3HVDlyZCdcScQSzKLCUnHVJSippSkWDE6tSUTZIu3OqS8or87X2WCgJHCFQsHjuPsjjkOKRu4joPN2d3CHSVpWNx7RzjtjskpB3+2OVodQQglRHZ0HP2fZ6YVCge3o8cYaUkjvHOCLwSN4i8L6R6vHfCcEJ6668II6yuvBPC29g45WrRpSJxzMmp0po0apFw8HXZqmGVXNLBG4TomUbzmhWZjGK7tCppW1mLFu5TW5Sm6XdDG0QVEEpSKvTGUrQkb0pC6Q6vVyUXlKGas6ovCzz7\\/AGGJHS8XYjo5SJKqzPYpsBLTBE1LhII9FLMwHEtpIvctZFcjGaxUZ2WsGphYSLeguziLcglYUE3\\/AItjGsW3JfS00Yaq7W8O67iLZIQ6H5qp4e1ufmKFPpQgAOVqn0p56RnJPJCElm5KYWVKQzrNZ7HLYXgpy5ekdYyZOmYwWZZuMdNlVtJeq0sg4eXqsJGzdW5PUSTnLVcWg6riGmrNk1LcDqHJnVcQpj7IKSefLt3fZHwF2YVYd3ul03LaNHn5l0qK6i3L+Q1bWIIKvnWnmVnzkfO1VzCmyR5yFbiHq\\/M7PNoDfZbSdnNDrrqkBtVXkmfM6whFgkpbnm3JepouBfK1VWW7gfk9EgWBhnatizCykmlVao09AUlSmZSYK5NZCr5nabNdrIvKvc3cbO9QAsoiN0WBXLaaIuIrUlT7jvK5MHq44lAXTMUaI4uiuzGsAtuVu23116kMyiNxRM1ubt4uJB1mGyNQbZbIxis3ECisXDaNxW3eVCmM0s16ybgpNyUZ5WSXMmpylzk3JrOotCxqziyEKSojJSAYL92aF1uzhcfs26ahRnSpS00+tsoq0lvBAZam5fyKclmwciHHkVNzVGqQsnMdNyeEuk5gfWvulw4qt1Uapyw1W7lwmuyrUqrFDa0uJQlNKmaTcSklRJ2QklN6yVA5+brc+4m8jPY7i0uTGA8eT2Ep52600rE0u1PyfaK+rLszQXSpptPAuLmqy5+ilX1R0Dh3ynphWRrEdHpdVHopVMyi3KHUNT6TjgKZmRmXAD6KGmpVBAsSCbx6JsvWKdMhJbmW0E\\/gu5tK47v2TJJPRqEmOQSpKgCCCCMwRvBHSDwPr9UQV8MOWL09MGZiVo913RR8TpCnjZuUHF+zm11RLK8wsPXBb67Tu6YmMytcvM1eq1MpcCQ60\\/LI8mXs0wn+UOWS8mTk8ZNH67bbWkJTOVzDK66ZdbL7hWSuZatu5Zez3pFlAVl5Obmqy9VsKS6pStmjnHF3kN7ccO53qTTKVjGRF1omcOViVW52OuUmRq\\/0RPuuEZQWpKXnCCbIW6kFcXLSNtGzerBAeqVQoDysv5KryDjrJUQi4TN00zjKW7lWVx\\/sbgErDZskydYI1N4ccstoHX+iVbVjWbHqUwop+aMR7Pui3ly5OZSqarrFLqFpoRkDrKFxqCck6xQVIKs2LN0rNHzEBDS7IxwwavIupCkN2ziZZ9VfSS06+WnZWRrE3MMPJZYmFOMPNIeZDD21SgtuhHO1f2VbSMLLWnEWB8V0bsycy6jh+qybJSDbO3MTEo3LutnWzjbq21DVKzeLAkaxh6qpCqViOgVIqy2RKViRW6M9socZU6l1pZvohxCV90ZGQRwQrjOeSmHR06q0qy6ehXYd\\/EcIuFcldwLUwFdGq2d3aXUju9kQYyzw\\/qZPhY\\/A7+7x5RvDTpob2F342Ug29YNrDeTw77iObgjhjXZMfgPnsQ2f\\/wDbFiq9KZEBqYJ60tgesOq+32QCWfJA7NWvh8+t2+D6OmuDDvsHq4bu+Ocgj59dwMo4S7pB4aykpz4Z7t+WWfEmPhrmxksK0Av7qrts21w2pIcNy3XRaLs1LYVMoS4KjMymoVSza5hGsQVMoU6PMQtYyZalVGccSzKyj8w6r6rTKC66RcDRtF1nUgbt5ANri7bso4wjtH+zYb0u4++wy2CQTYrcWkA2BNt+m7Q27ZgjCG6+UI0QrOSv560m8BZd1tKlPSdPxJti4ak0Nm08kO0y36tUqg2XGn2nGQ5JhT4VrNFYQoxjPeHLQaB9sB1LOOT9zTjWvnI2fh3ftSUvU2mWzqc7a8jQ3ApxvURqVfztq0tQTLqDwndJ2N7VK6UfRGz3GdQS4QEuyeGK5MM6m11PtSCmUJHFa1pT3xopuv4XkL+f4qw1JqSMxbfrlPS9awIyspdU6sm+gQgkjURt2ihWlO9RCQOJO7P17j6N0R5bz+UCaMNOS61adiY8XfNpUdRx+mWha9FeSkrSCJt68p+qJJ1EL1XLfH0biSFbVK204qXh8oWqz+s1Y2jJIyyk5lNRu\\/FCZqeuS4jLWpNHsymFnJAXmRW3StTiN6UtK8otOjeR55QNZyFrAM9JNqIu5VZ+iUnswbarZqVVlZojW1m5darn6tgbRic2pbNJHMHcWsPrSnMG6fT6nPZ78EusyZlwf7d5AHHUgGV07UZBnPazsqgg5EF9vWz6NUKKvZDFdxUZGQM4lRO7zGX15deaWtX2n0ZboWV2cu7pj10KboNtYIWWyMtm9SrQuSrVHM+TqXtnrivSrSDnnMvJb2VJY1WJpaV7R9tiZR0PVOU\\/5SDEJKm5DGO60yrqVBuXsfDiyaSWwUpac2dQt+y26ssrclnFAu1F1TTu3SxsW1KbFp0r\\/wBn9tcmUJeq1YwXQWgR2onq3OuupuRoBT6JPSylccqppCTvz6axec297O5QKDLGJagpIBStqSkJWXUo20Wubn0PJA1uQwsX3Ag3idyu7KUjeEzTn+Kykf8A5brfDn39mcNVXlIjPVlZpWXTsk7ubMhxQB6vaYgNTmNvKSXuh1M5jBpQJYmvLEPyy8RL0tCUfbnddMyxMSCa1Q5VcqtLS20Sr0uZdllYbl20MvhDnzExh\\/pmXSXF3Fed\\/PiZZEu+u48W52ol+W1NzUylNyVN5TGqdnsXUApJCS0lIVlKpfyB22R\\/8Z2wYPklgjMiWln55Y1FwEO1GmLUQn+Ikg6a74jM15S+FmSPN8NTTxG8TdelJQjTSwZlJo8gdO+5tr6Aqr1ZGtqyDuQ4az6En0gNkDfu49HoQN8gZkUzhkRnO5Hr3JlFAb+lQ+A8+17RWxvraGkVi5KA623rOtorFzVyeQy4SEkJS1Sp8IdKT9ZrNJA3q+qmFmdC+\\/y2DMXRZ7bp1tZDLtafbTkfNydcpEupRIyJBbGR83ztyoz\\/AP3F8ENgdrtyp+a+qWcFTT6RystGMU3uOaQBzNxfWq8qShA\\/0mNm1hf8KnTf1JoBHrvbnyj0CTfgAJ+axu\\/+fh\\/1SKC\\/W8iV0tYUM9yZtKh\\/GMuk83MmPP8A29C28jr7W77YRk2othtmquBbuXmocKpVottk\\/XcSHVJ\\/BbVnuS\\/sLr4\\/8rLU9VX\\/APh8ef8AuO4DvYbcJUEW1GA58ewnGVjx3XsbetJ8qahfwKR6sUzHG3PD\\/D5x6A6cQJQjfTnwf3Lzax6ylI9aYUTiDSj9eTqCd34KZZe\\/0zDe6IBqNGnHunzLb1KxNpzS2MjLTDd2XnIzTKkpI+iEvSXS1kcwkof3jmT9WFKjbmmXYFHnavS8YcQxLU9K6lNS1pYs3s1PJEtsyqbblG56nrmHmG07XJjaTGowoIBUENrZPkKYcfW23T9s1DeccKUoRM4enJLMtZASm5r0yQSTbUfW9E20JyGPKfw66pKXMIrbzEat4k7RWtrAJdpDA1OlioHUakkCPQRo9wU6uNuKk1OJUwobRp9AbeSFp81wJStxBbUoKQVBe5Scxn5ojmYjL8knymNQxI+atH3G+53pnFmkSym8Pb4uCoLmJvE+kS6St62bhn5x4vT9702VTtJWoTDrs5dVMZXMTjq7gpkxO1uShSKxKViTRNS6siTqvMqyLjDw+s2sJGY5y2vitPn9IjjHa5slxLshxbPYXxBLFKpdSXJSdazrk6nIukiWqEi6pKe1lZkJVYqCXGH0PykwhqYl3EC\\/cO4gpGLKNK12iuqclH\\/yT8u4UCap04hKS9JziU3yuIKgpCvqOtKQ6yVtrQpXMQRbrp6fYe6DXT0+w90VVG7yDmfd8ougi3XT0+w90Gunp9h7oIMg5n3fKLoIt109PsPdBrp6fYe6CDIOZ93yi6CLddPT7D3Qa6en2HuggyDmfd8ougi3XT0+w90Gunp9h7oIMg5n3fKLoIt109PsPdBrp6fYe6CDIOZ93yjvjASsCUuOo0dagEVen7ZtJUAVTVNWXG0hJ+sTLTE6sgHPJrhlmRC5018JP1CtK\\/HjDJuXMpTaDiHWp23ZcgAs2jdCm7ttBvMIbQtTds1ykpeW2220t1LhZbR9US8rOrKaDdFCqqlhDUpU5fyhRGQTKPK8nnN+\\/LOUeeGfEawOUaTuXuwhVbmPGFeMslKFum4n2HNWzVJhCUqacujDufRrvTCkjNl2Zty56BLS4eA8pbo8wZbX2EyGfp15IuI\\/pvZVUsOuLKpnBmIHS0i+YopVcHnzHoiygF1JVXO4izfom2YI5G8pWg3aka0hFyhTRWu25Ksso+L9\\/wD8N42sbEE2jQuSSczCK1Z7hw957vHRFVK5hw5z0+PHWkSAPcOmOmkp4n1fPr47uQ4opWQ3cT7unx8IRgJzzJPWSYIeSm57hv8AlBBBBCbiwgdZ4D4nqHt4dcPQb4seXkNQcTx7Oj0+7thmtQQnPn4AeOiLycsyT1kn7YZLWVKJ5uAB35Dv7IUlNz3Df8ocJyCw3neevdFhOZJPaYRUrM9XAeOnsi5avwR6e7xz+1FSsuHE+yMtCbC\\/s7hHqE21O8+4RYtWe4cB74RWrIZdPu+3h64uJyGfgwgTxJPWSYc5d+7n4\\/Lv8IeQLm53D4\\/dvixxeok9J3D4ntGXvhkTlmT6emL1rKlE83AA78h39kN1nM5cw98Pto3D1nr3e+D66uNvgPv6vFhOeZMIKOas+bLIdX6YvWr8H0n4Q3dXqDdxOYHV0n0ZxmoFhe3h4Q7CDq9ZWqOCT6yMwT8BCkhIzdWqEjSaeyqYnqnOStPk2E\\/Wemp19uXlmk9brzqEDPnPDeIak5AnojJnQpsgYkaYGjDZLzSn5O4MeMLZaqNpBKjQ2LypE9XlJyadGs3RpaddSVt7IFOb5ba13EvtgX1va4vYXPfbvtw431h1hpTzzTKTZTrjbaf7ZxaUD3nhePRwoNHkrCsejW\\/JFPzdZdqU+kSqlazaTJW5SGZKXKgt5ZSnYSSSQ5MKKTuLyiCqNJeljdZtHRi0irsW8pExR8FcUalLurzUXKmmza2qnNlWze8+ZqKpZoFxJSlTxU6dUKjdNibPfN2H94TIVs1\\/MU\\/LNuAqK0OTzJkUFKk+clSXJlAQoEFKyDwG+NzysN2otTQJx0dbmNjOV+Xs205BO7OYXXr8tmWqbAKm3MiaCKy6dwJSypIW26EOo4d8pMHE+17YRg4Aq85rsqp1N8w7Ov4kotOU44m31UIprylKUCEoDhHohUdxYaWml4PxlU0gJTLUuaDYOgvJU2adQ2k33qU8hCRe5JTb0rRCppbe2qdOa4hyelUnsLyAonI55AZndkd26O+1HM5+rsjpC1Wy9X6ekkkIcddOe4fQsOuJz386kJHWTxjup1eqndxO4fE+iPohXFXmGU\\/oslX+Osj\\/APQRxVNH0kjkm\\/tP3Qg6rWXkOCdw5+0+OYRkdoY2Z+qNphaLFhqQHGLs0iMGaDO6xWEt06oYiW8xU3lll+Wf1JaQXMPuCXmGZhSGVJYWH9QjGsnVGfPzdsbTORNsVN\\/8p1ot095CvI7euC8b7m3UpC9ibFw4vC6KUpSDMSy1CYr1MpUjm0p0smZ262Jhll5smHpYzlbpErYqEzVJBhQG\\/K5NNIUb62CUqJJOgFydBHko32sww2QD2jzTYB3ErWlNu7f749IWCCCO3oteCCCCCCIX\\/wApQslNL0o8Cr\\/aYbaRd+Ba7aedbQyjyuese+rlm3X3igJdemUSN6UyWL75WfJZaTYbIbYCRHOaXkdQnd+D0Anm9PviYF8pksVyfwU0YcTQ1m1aGKd6WIt4Dc2vEW0pK4G2ju4vJwtdVvXmdgctYZhEPUHPIj7c++OJ9rcl5pjqs2ADc2ZOcQBzekpbtSTxJmEPa63tzuIqvELZZrE3YHKtTbovoD2jTalW7s1xfjbujk0qyPUePfC4OWRHj9MMW16438R7unx7YcoV+CfR3ePgIrAixtx+O6NOoBQzD18+h8I3pclTcXleGWJ9qlYUqhXzT68Gyvz0N3PQmJBPmlJ1G1rtN4o89SSvakIQrWU5KG0R6oJ3C6ZkFLyXRbnqkqlBUTkxMSsjU21DMFKErfnJkHV\\/DSreSN8Pvkq7kXJ4n4l2kXg23XrGka6Wy4UIemLXrstJNare9DrzbN1TakjW2qGdvqoWjbKErXQuq51r8oa3M9ZNDq0s3v1swahJTqt\\/m79anjilWYJJXwa49k\\/\\/AJb8qypNAFtjE1NcKNwzec4flqi6CTwVUaU6EgAlS8oNrmOz8GTBq2xKkrUordpEw\\/Lr0vbzeqvtNAC+5ElNNXvuAOlrRCs5fiwhZHKd42z7cv5NJYh27hZfsk39MQozWHlv21VH0F5Cc\\/KbgtesPLDTj7KXnHG21t6nksviVZk75Za1uzSVayl0iQQ6rMnWdZl0MPZk8c3Wl58cjzk+dG6H5UThyul6QujJiwGFJZvbBy5rAVMAHUdmMNL0euJaFeaE7VDOKzGsSpSy0ptO5LSI0Y4RzwmbMkmCoqVIzM\\/KE57wTMLnEpOtxIbm0BOW4JyTzbu6azabwxR5tNyWVNMqO82DTjK1E6m+dhN7nQm28Ry1jCW7Cpz6CCP2c44BltZE1d9IsNAmy0BJ5WOkdvJUFAEcD7D0Hr6PtEXQyQsoV1HLPrG\\/h1j49cPAQoAg5g88QeIWpOU9x3RXx2RUEgg+CIpB2Qhab6jfx74TC4IIzEKpVnuPHmPT9vv7eLQEg+8dMLA5jMfo7YZIBHwPKDrrxh0CQcxCwIIzENEqz3HjzHp+339vFUEg5iGSCDYwlSc3cR10fHSHaVcx48x6e3x9qoUU8N\\/V0\\/b1w1BB4GFEq5ic+s\\/Hx7OHhF9DDW7uI5\\/K3x\\/W8BBGYhVK+ZR7D39\\/gtASOHjthVKgrt6PHNDKkka7x1vjyHYJBzB3x8df9h0HEi3Zm3642U6529PqDSEKnKXPISQ1OShUMt2ZbmGCpKZmXUthRQFBxH1aV5bjvHthUHnB9IhbD70q+zNSzq2JhhaXGXmzZaFpN0kHjrvBuCLgggkFSFrbWlaFFK0EKSoaEEbj1odx0j5jQs08cWeT5vWVwlxcaq156O9Wn3ppqnSakTU9aZnZxKpq7cPn5otrUxtSqYr1lzU1Kyr8w87Oygp1WmXpupzE8JsZLFxWtC3r0sq6aTdto3RJpnbcumjzQmKbVGNotlbbi9VLkrOy0wh6TnZabZl5ySnmJmRqEtKT8u+xEOW+bGt7EOgv0C4ZcuNKO1kp5nURPUycCdVucknlIWG3UglLiFJUy+0VMzCHG1KTHWWjTpX478nFiMumlt++MFrlqHlNbsqanHZeiV9lDaWl1215taJxFrXlKMKZROlLDkvUW2GJOrS8\\/JtUmoSdS7avJ9ou2+UmsTYQl5KhbVGGnH6hTUlqTpeNsibrmGVKysyVfUBmU+spYnVgioKQlXn8r0xsl2zv0NbFFrrjj9KulDa7Lcdp6QQM7KRdb0mN7kqnM6xYuSoUAth2eRtEfjCOKvWxrMxksWu4WYh05uq23cUmuVKc20Tco+g68nUKZNuIdEjVqXMIanaXN6qw0+0kLbcaUZd7FvRp0qMK9I\\/Dqj4hYZXQxcdsVDUlphDmzYuC06shsLmbdu6kJfemKRVZMLQXJd8uIelXJeo06aqdJm5GdeyqQ6hSUOtuJUDktC0LTkU5BSFJWknMHPMKTnlu4HcfldVaLXMI1lyTnWKjQ69RZ\\/TtG3pKoUypSLoUlWVQQ9LTUu6kKsSlaCAUn6qj2ghyl4jpagky1RptRlVIUk9nMS0zLTDZSpKh6TbrLrailQ1SpJUki+givaS+jpeWjLiVPWLdKFz9LmUu1GzrqaY2EjdVvl9TbM820HH0ylRllp8lq9IW+5MU2b1TnMyMzIT85j0Dzg9hHfEvHG3BSwdJ\\/Diew3vxssTzavLrZuWUbaXV7crjTS25asU3X1Ev5JcUxVqW8tLFUkHXWtow6GpuRi7Y\\/YA4h6NuIVRw9xCp2xmmdebolblA6uhXXQ1OKblK5Q5tbaNvKvahbmZdYbnKdNoekZ5hiaYUlP0a2F7ZpfaXSfoqsqak8a0dhCakwEpbZrEuEhLdYp6QEps7lJnZVH9Cv3U2hMs60EfPfbBsom8AVRU9T23JjC9QeJk3\\/ScVTXV+l9HTizdRCbnzSZXfzhoBK1GYbdB6eQ9luUM+scfSOfxuhwFBQzBB8c44j0xxoWDx3dvf+iFASDmDkYv0gjeIpWORCyOO\\/t4+v9MKBQPP6DDFL3MsekfEQsFJVwIMIKAe7w+XytBDqCEAojn9HHx6IUCxz7vd3++Gygjdr8fZ+uCL4qCRwMWgg8DnFYSRzHtgi8LPOM\\/ZF4WnnJHoz8euEYIOuuufGCGVWodDr8sqTrlHpdZlCCDLVSQlKixkoZEbKbadbGfSEg8eMdIXFou4OXBtHG7fmLfmXQoGYt2ozElqE7wpqRmfLqU2U5nLVkAk55KSoJTl35FQojnMbCRq1UphvT6jOSetymXmHWkK\\/t20ryOAnUhaVA8Qd8PNTMwx+0vOtdyFqSD4pBsfWDGDNc0JZJRK7bvuaYSM8pauUhmaKs8iP19ITUmEFI3KHze5rZ5+Zq5K6oquh7itIqV83v2vW28s0GTqsxKvK4jVW3UpCSbQvnyS+tGRTmvW1kp2fa6uo9o7sou2h5x8O+JbKbSsWyoCVzjE4lNgBNyjBJ8VsCXcV4qWVb9TpGwbrdQb0LqHQODjaT70BCj6yfhGqiRwj0mbLJTQafeVEADiUrta7WWUlLygpwgUSu6yUvKaSpwKCCohG2SlSkZfSpvDTno7TIlr70nZRun7FqVbpl8YlLEomXKG5dMm1T6wtTbcuUNpZVKoKGkoSpKktp1o2Z7Qc4Pv7oNcdB9nfGW7tGXOnNU8L4ZqC73Ut+QK1Kv9bWYcmTdQuL3I1OhjZMYtqkv+1KDXPsHZhm\\/+I9wIuO\\/feNdP6v8AyjP+GvTX\\/ORjr\\/8AGY+aF4acFTln2Hb10nXpZ5tctMy8\\/eGJrLUww8goeacl52qNB9p1BKHElCmlJK0KPnFJ2ea6en2Hug109PsPdGK1jOkS9zK4BwhLqJSSpqly7dykgpKuzl0ElNzlJV6JUSNbmMx7HdefAD05OPBIISHqhOOgBVswAW6bBQABtvsL3taNUU7h\\/pQ3QgJrEtiTV0OSzjOpXrlnHU+TPj6aXUir1gBDboUAuWWBrBStZCszCElorY1zeW3tmSpySQAqduGhKASUk6xRIz864N5AKSkOBR85GrmobZNdPT7D3RTXHQfZ3xnjanWWkFuSpdDk0cEtSkwAO8JTNNt314tnW+gjVrxJPLJJQwSd6lh1auW8u8tNQY1nU3QzxLmilVQrVoUxs5BSRO1SdmUjzCPoWaQmWUBmpO+cBK0av1FJdj7ym6Ef1V1jEIZZAKl6Zbu8nzSSmbmqtuA85IzkiSdVeY85EZ67QcwPu74ptDzD490a+Y2lYufvknmZYHgxJSt7cgp9p9Y000UCOBBjGXXKivc6lv8AtGm+7S60rPDnpwtGJtL0NcMpTVVUqtdlXcGWshc9T5KVOQTnk3K0wTAKlBZ\\/8MICFJQM1J11djUvRwwXpOqWrIk5xxJzLtVnqrVNchRI1mZ2felQADq6qJdCVAArSpWsT3UVq6h6O\\/OKFRPOY0MzivEs3cP12pkHelubdl0HdoW5dTSCnTcQRoN8YjlQnnPrzb5HJLikDhwQUjgOEfOUyxbIoaUJpFoWvTAgDIyNCpcqvMADWLjUqhxayANZxalLUrzlKUrzo+n10jcOAyAyGQyG4bt3NCUEaR1559Wd9515evpuuKcUb2v6SyTrYXsbGMRSlLN1KUo8SolRPrNz74vKzzDL2xaSTxMUghuPIIIoSBxOUWlY5t\\/u7\\/dHoBO4QRfFpUBz+gQkVE8\\/o4ePTFhUlPEgQsI5+z5n5e2CFCsnhu9\\/r\\/RFhUEjMkDxzDifRCCnuZA9J+AhAkk5k5nrhYAG6DrrrxjBrHXBWq2tWUYt4VrnKVNUmoS1wTspQ3XZGpW9VqdMNzsvc9uvSam5iW8knGG594SqkTFOmm\\/LpVSZYLRJSMuS15SyX0j6JK4a4jT0pTce7UpTIqCXnZSUksWaFINlL1y0aVSWUs3LJMt+UXPRpVjZskqrtKSmlzU\\/T6JqvUoDoVmOB3joyPo9PZuMYSYs4TXHhxckljTgtO1O3KvbtTYuJxu3XnJKp21U5J3ylu4LfclcnWZZlwF6ck2hlKJ2jjaFU9T7EnkYzwdhzbfhNOCsXrakq9Ioc\\/A3FriO0ekZpxKEin1A3S5MyE5kaaeQpf5TKy8kpnpWWeNz7KNqdRwLWEKJMzTpoNy9RkHHMrM\\/LJNkJKiCGZ2XJUqSmgnMgktLzNOOId9AOn1OTqko3NyrqVtuA5hXmuMuDett1JCilSeBJOXBSCWlIXD\\/AGiPxhGivkzuUypGk1R5exb6madb+Plv05Kq3RUlqRpOJdJkWwZm6rUYzS2xVWG0GYuG3pf6SnOa9UpiHqG9NylI3c0+pyVVlm5uUdStC9ykKUkLaVwU04jWBQtG\\/PI+d+ytazYSqPkRtG2a4k2aYln8M4nkHpKekXbXN1szDDhJYnJV\\/KlEzJzKElctMtgJcAUlaW323mUfQ+i1il4ipUrW6JMibps2n0V2CXpZ5IHayc41dRYmmCQlxtRIUClxtS2loWrm9oj8YQbRH4whjmOkesQZjpHrEV72Q5L6\\/wC749DXZQ+2iPxhBtEfjCGOY6R6xBmOkesQdkOS+v8Au+PQ1IfbRH4wg2iPxhDHMdI9YgzHSPWIOyHJfX\\/d8ehqQ+2iPxhBtEfjCGOY6R6xBmOkesQdkOS+v+749DUh9tEfjCDaI\\/GEMcx0j1iDMdI9Yg7Icl9f93x6GpD7aI\\/GEdM8rJhoccOT3XiBIMCcuLBeu2xfRU2D5Y5TmH3bFvNlG5SUy7cjWTc86hxbQVLW+h5lxRSyy92xmOkesRkVhVTqBiZh7ifgtdbaZygXfblcpNRklLbK5mgXXSZi3LgZaQ4lxIDbMyyWyptxAenCvIEjaddeRpiVqj7UJrDE28WpPG9CnKY2FkpQavTm3KjTnCojIFiXRU2GQtJKnplpCDmVlcq3a\\/QBXcHTzYSC4wFWURfIiYAZzgb\\/AMnMGVeJBFktKJ0BIgGkgDMwiSSSfAEdg4qYe17CPEq\\/cL7paLFw4fXdX7QrCdmWkOzlv1KaprkywkqcCpWcDAnJRwOONOyr7TrTjrSwuOve2Po6tpaFqbWMqkKUlYNvRUk2I0OpBBHjuuNY+ba0KbWpC0lK0KUhSVCykqSbKSoHcQQQRwIg8dsEEUJCQSTkBzwoCwtyhMUUoJBJ4D2noHX0\\/YYZKUVEk9vUB0eiLnFlauoZ5dQ3ces\\/Dqhq65kdUek\\/DvhQBJsIcACRc7zw+z59XTdc1jkD5o9sIKVlw4n2eObm90VJyGfq6z1emECcySYyW0ewe89fKBIucx56ePyHW6KE5DM+jrhEnPMnx+iKqVrHqHCEVq\\/BHp7vHxMPQ6Bc26EWqVmeocO+Gjy8\\/MB3cT2\\/ZCjq9QbuJ93T49kMycsyftz74cQk3ufVz5fcP1QtRtZI9f2fPoxRashlzn2c2fdCBOQzipOZJMIKOsezh39sZjaPvPPu68YUkWHfxihOWZJ6yTDFatdRPoA6B43wq8vM6g4D63b0Q2UrIdZ4RkAXNucK6Pu6\\/XFi1cw5uPX+j39kbXeRLsX7tuUZwWfdllzUhYtLxDvyoBLa1JZ+bLEr1Jo8y6tH7CmXuSt0N5Cz5qnkssE\\/TxqeJyGfgxIu+TgWCuraQmkFiiuXS4xZOENGswPLbKhLT2I14SlXl1tLKShl92Sw2qLKVAh0sKmGknYqmEqU8oNS7yv0W1ag5TmUMqSDrqCQQOJAEb3DMv51X6S1a4E6y6RbMCmXV5woKHFJS0Qo8N+kSndISoJk8Np2XWvV+dapSZBAOWS1tzPzoUjPn1acVk8c0jnMRSeXcvEUjRew6s9lakTN54y0yadT9Jqu0i17UueZm0HUKUFQqlSoTidrrDJtWq2VarjMnnShqOzpdp0gKJM1UKjUXATuHkMuxKt8d+Z+clhI\\/cuZ82UM\\/l97zE3fejth22tINBtO+bzmmwlQU4LtrNEock46orIWGvuLqKWAG0KbLszrLc10Ib4mDYxd5amDJEjOzhKmS7r5AJ7H6NoNVxLL5zqCTP1OVSCk2Sp1IIuFX64rz30XserTwslyqPJZbBt6XnNQlJJ0C3ES0u8Re5OW\\/EW0S2K1tKw65vHk8k8sE5fWcW00Ad+46inDnvAIEdoOL11E8w3Dsjr6xG9UVN85Zq8mYSd31c3luDhnv+iz39PNH3ilZDrPCPoFVVZ55xI\\/MS2gf4gWfYVG\\/gY46mNXSOQSPaAftvFizmcuYbvTz+2JD\\/yaOw03Lp13\\/ec00VyuHGjzds5JvAKyZr9z3hY1uyaVqLKm0tu0GYufcHWnlOIbDQcb2+pHcJyBPREvv5LTh8GqLpgYrTMo4pU9VcJsP6PPltSW2xSpS9bkuSVae\\/Y3Vums2o9MNZhculiXVwmYlmziT86xhRklN0sOvTKjut5tLPPJV\\/lUti3NQ3akbGjtdpUpNHBLhXru\\/JIU7fnvRp3ncYlvQQQR1zFjwQQQQQRpt5eHD1V88m\\/inVGmTMTeGt24Z4gSzTZyWUNXhTrOqTwQWnApEpRbxqc86CuXKWZZ1zbKCfJ34CaVZHqPsj01tNrDtOLWiBpN4diVE5OXRgXibI0ZktB9QuNm0qpO2y+hheRcdlbhlKbNNICmnFONJ2TzTmq4nzJUqzG\\/iPbHLW3eQLdepM\\/b0JulKlybjVySmnFq0GtwicaFzoRltuUYr\\/FjITPMu20elkhW\\/VbbiwTfd9RTYsDwud4h2lRSQQftH2w9SoKAI+0dW7du\\/THGoVzH0d3d+iF21lCuo8R1dPbFBrRw4jceY69\\/HfESBKDY7utevsjN3QDur7mtKLD1Li1ty1xN3FbE0W8s1\\/OlAqDtPQpCiAtK6xK01Kxreblro11oShcunRLrZp+K7dPWopTcFvVemoQFaoU9KiXrSVFOeqtaGKVMZZjXQhx3pXEIPCm6RZOJ2Hd5leo1a17WtX31a5SlUtSq1Jzsy2sj+9uy7Lrbo36zalpI3xMiwgrhoGKFi1IlLbaLlpspMOKVkEytTeFMm3CRlualJ19zM8+4g8Dx1tzT+D22PZdiwJ7NmZMlJTDgFszdOrGWdVe4PaeY1pKCToAlAIMdZ7Bpn6RwLjKhXzrlJtc20neUmoU9KWQN4ymYpa1C2uYqOlwIw++U7Yamv6JGB+KUsyt+bw5x2FuzK0M6wlKDiNZlfXOzbz25TLQrdl2zJav1HXp5nWOslIMQbA+d16fXqfnl5POSk4lJVzzjDjKylPHd5C3modKQrmJ9Ablp8LziryZulJSmJQTdStK06NihTXNUrdkRhnd1BvOuzjOWeofuTpNwyb6yClMnOTOWqrUU355WDE\\/5Ncs3JqUAiepbuqnL678q+y6gZjgAwZk59OUdw0hzz\\/Bs8yLlclMKKQreEpWxNE8TYpcdAJ0vexsNKW2iSmSourAH7JlJeYuL2zNEsqB4FQQym4G4FPHWMrGnNYZH6w9o6YdNuFBy4pJ3jo6x43+2OLSeBBy6IdtuBYyO5Q9vWPiIh602N7afA9fKKuBv6Kt\\/A9ceR4\\/HlYIaNuam4jzfd2D4Q7hEIII3wRUEg+8dMUghtSb6jfxHP7\\/j47\\/IXBBGYhVKs9x48x6ft9\\/bxaAlJzH2EfEGFgQR7x0Q0QCPgeUHx66MOgSDmIVCge3o8cYaJXluPr8ePgqDzj0QyQRvhJSFdx68LiHSVEbuI8cIWBzyIPWCIaJVnuPH3\\/b1QoFZHd6RHkNEW0I1+zr7b9zxK89x49PT3QoFEcPVDUKB7eiFAsjjvHthtSOI9nyjyHgUFdXSOjv8ZxwN0WvQrxo03QbhkGp+nTicihfmvS7oz2c1KPpG0lZphRJbebUk7ylQU0txtXLg849cKBfMfX39HjhHjbrrDiHmXFtOtLSttxtSkONrQQpKkLSQpKkkAggggx6lSkKCkkpUkgpUkkEEbiCNQRGHli3xj1oCYny+JeEtwvzFuTjyZOpS04y\\/M2xdVKKw59zd80Zl5tnbb1iQqLK5abYfSahRZyRmQ+w1LM0HeUOwm0uLSD9rzQoF\\/UaSYmL5worM4yq4KCVrbZmKxb7+qym5LVXNuBpmsSLLZZVMSUtXJChVGfl5VUfCfp8jVZGaptSlWJ+QnWHJebk5ppL0vMMODVW060sKSpBG86wzBAI1SAYwpu3Cu\\/8AA+66fi5gVX7gok3bk2qqyUzQZ2Zl7ktZ5La0vrlH2CXalRnJdx6XnZd8ulyRffk6lLztPdmlq0e0rZZgvb3Tks1wy+HNocrLhikYvaZQiXqwbSAzTsQNNhHbtqPosvpKX5Vas0m4G+0p03duzPa5VcITSJZ5apqmuuAvyS15EKJ0U\\/KLN0y00d6kZfN5qwS4lKw0436B0jPsTbbU1JTAUAUrQ4hWqttxOSslAZKQ6k5EozQridyVpEMMZ8FsNdLLDyYw6xIk0ytYlA5OWtdFPbYRXLdq5aS2mqUZ10FK0TAQ2zWaM+oSlWkkZENuy8lNyOgHk+OV6tjGR2i4X47TtJw+xjdSxIUy5HVy9MsPE2a1ktMMDXcbl7YuydzyRR3nG6VVZ0rRb85Lz09KW23v1olxStT1Fy7ipaea1XFM65Q4hSTucZUNUrQFDNJSErQc9olJ1RHzCxdgbaFsLximVrEpOUaqyDyZmQn2FEsTjDbhDM\\/TZ5CeynJRy6gHBolRclZ6XZeD0sntqSqOFtpWH3W0GXn5KcaVLzcpMIBW0paUlcvNMKOdl0EBQAUTdKZiVeUkNvRGJ0l9F3FDRavhy0sQKWpymT6pmYtG85BhxduXdSmHdRM3Tpo6yZWoNIWyqqUGZcFRpDj7O3S7KzEhPzmOIUR2dcTTLno+GuPVkT+FmNdvUy4KFVG220OzgVLlubaSRK1GSqMuWpyhVyVUoqlqtTnpYqCnmFuJbcdl5mPlpm8mPino3u1O+cPWapijgogOT6q1KSyX7rsySJ2pZvOlyTSdvJSjRIVdtIl00hxtpyYqkpbpWzLL7r2WbWaZj6nIbfcbaq0u2ymZuEttPuKGUHsyby0wpSVAsG7Tl0uSrriF9m3xBtP2M1fBk0\\/O0pp6foSlLcCUhTs1IIGqg7lF5iVQDcTaBnbSCmbQ2UB13WGFjn3e2LwecHsI74bxUKI4GLfKAdUnr4iKOh4l5Q+t5w9R9Y7s+uF0uoPE6p6D38I48OdI9Xd9sXgg8D6OeEFJG8QRyIPOD6RFwWodfbHHBSk8CR2GFQ+ocQD7ISQDvAPjBD7aDnB9\\/dF2sk849O73w0S8g8c09vD1j45QoFJPAg9hBhJQO8QQ5ghvmRwOUXBaunPtA+GUJLZ4EevT5wQtBCW0POB7u+K7Qc4+PdHmRXL3iCFIIs1x0H2d8V109PsPdHmVXI+yCLoIt109PsPdBrp6fYe6Cx5H2GCLoIt109PsPdBrp6fYe6DKeR9hgi6CLNcdB9nfFNoOYfDvj3Krl111oYIUghLaHmA9\\/dFCtXTl2AfHOAIV4eJ\\/XBC0WlSRzj3+6EcyeJzihUkcSB2kCFBvmfZBCpcHMD6d3fFpWo9XZCCnkDhmrs4es\\/DOEi+o8AB7YUEpHD26wQ6J5yfSYTU6gcDrHoHfwhoVKVxJPaYtKgOJhVidwvBCynlH6vmj1n1nuz64SJ5ye0nvhMudA9fd9sWFRPEwsIJ7vjBChWObf7IsKiezqi2CPfQT3n2\\/d9sEEByOYIGR4jiMjzb+btgJy3mEyvo9f2eOyC6lHTQc\\/v4+H649SCTp7eX3xiHidg3cVn3HI4w4HztQtq67dqTVwpkremFU6oU2pSCvKm61a7kqULZmW3EBx+ltgtv6y\\/JUEKMmvftybnKm0XH1qlYXYtTtPtPSAlGvI8nky1JtzFlqWCiqaoTWs23TbvS0hxyr2w02yhxaV1S20qknJ+j0DWCTzk+kxjLi7gOzc84LzsN77nb4k30VFKpR405iqz8q4iYYm0TLCml0yuNvNpdYqbS2w7Mark2pt39eo8xnhHCm2HDreF8dASlQkWlt4Zxo2yl2oUZ1waSs\\/fKqfpDqsvnEu64m1kupcYfQ1OS1xbMtq1awBUQptzzqmTJQ3UKdMLUJWdZSQB2hAUWJloX82nkJU4wSUOJdl1ONKnY0isylZlg9LnJaQkPy7igHGFqz81SScik\\/gOjzF9SypMcxmOkesRFp0DOVxqVDqdMwR0wZ+aoFzU55ukUHGSptmWRMqBaalKTidL7JKGHlZANXuguyE+2th24WGFtzVxTkli174pNxSkq83NSZ8tlmJqSm5WYbmKbUpaZbQ9LTVPnG1uMOtTLS0Os5OKS4hSVsuvhWR+W+1fYzjLZJXF0vENPV5q9mepdVlM0zSqtJgjLN02dCUpfayKQp1paW5uUzoTNy7KlJK\\/oPhbFVAxpTE1SgTYeSlKPPJFwpE\\/TnFpCg1NMAqJQfSDMy0XGHwFFt1RQoD77MdI9YgzHSPWIQgioM5\\/R+Pd8\\/ePXI+zHM9dHoar5jpHrEGY6R6xCEEGc\\/o\\/Hu+fvHrOzHM9dHoar5jpHrEGY6R6xCEEGc\\/o\\/Hu+fvHrOzHM9dHoar5jpHrEGY6R6xCEEGc\\/o\\/Hu+fvHrOzHM9dHoar5jpHrEfaYeXUbOu+j1ouESjT4laolGsdemzYEvOKKUpO0LKVCaZQN6n5ZoDLMZfCQRtqDXajhytUnEFKcLFTotRkqpIPalKJqRmG5lkrSLdo2XG0pcbJCXG1KbVdKiDjzUkzOS0xKPjOzMsuMOp5tuoKFgHgqxJSrek2I1F41Lcu\\/oxP2fi7aelHa8gV2hjBT5G2L2m5RsuS8liNbVOSzSp2YdQlLTDd2WbKSSJFtCnVvTlqVycedKpxpMaCInsTVkWDpbYAXtoyYqDWl61RBJUyfRs11KnmQWict246ItagBWrPqsvJzSGVENTckw3KTiZqTmKk2qFNpOaNGJ+ifi3cOEeKlJckqpSX3ZiiVxlp75gvS2XZh9mlXbbU44geWUiptMrzbOU5TZ5ubo9VZk6tIT0qx9qcPYkpWP8J0LHuH1pXTq9LJVOS6VhbtIrLf5OoUyct6SHmJlK05lAJe0fbuw+wtz5u7VsGTmFsSTyltK80mX1LDqUEN9qv0u0uLpyTif2Q2b\\/AF1PNGymVR0BDNxwrOXBIO4dPWfG72xVxzX3Aeb7+0fCGrjgQMhvUfZ1nujNAvoIrAAJGZXqHXH4fCjrmqMh9Y+wdMNScsyfT46YCeJPphFSiT1Dh3+OEZDaOHrJ+z9fee6PBdZudw6t48z9wgUrWOfDoHMIQWrPcObjFVq5h6fHjuSUrIZnf0DnMZAG4DSHQOA9UUUrIdZ8Z+O+G6lBIJP2nq37t\\/6IuUeKj2nwYZOLK1dQ4Dq6e2FJGbwHvPH293dDn1Bb849ezl3+uLVK1iSTx9QHR2CEFKzPUM\\/TFy1cw9Pd3\\/phFSshu4n2RltovY+wbrDn7PdAhP5x38Pn64tWrmHp7u\\/9MN3F6id3E7h1deXVF5ISCSdw4nxzmGKlFRJPP7BzD0RlAWFocihPEn0wgSVHPwBFy1Z7hwHvhFastw5+PUPth5CbanefhB0YsUrM7uA9vX49kTEvk5GHyqLo0434mPNbJ6\\/MZJa2WCT5z9Kw9tKlzUtMADNIaFTvmtyyTrbTaykxm1qBtTsOhxeondx4Dd44R6AnI84cKw05OvR0kpiUTK1K7qFXsSKkveFzqb+uuuXJQ5tRKUjM2pN2\\/LpBTqlqXbIWvepWurLvYyJvf8q622LAHce111BtdsDS+psbAxPNnkqX6\\/25HoyknMPAkG2ZeSWAvuBIfWRc2ISo70iOz9Jip+VXvTqeleaKXQZcrAJzRNTs3NvuZ78s1S4kzvy3b8zvygpcsrfSrv05bwpKJpMyxh1ZVg2NLqbeLzTWvRvu3m5VKwpTaVy9SvSdbmGkHJmaS+06EzCXUCbNi\\/VBV8SbumUr1kM1RVNR+KBSGWqYoI4ZJLkotWQz1lKK+J3+ebpbX83ifpP4\\/X3LzJm6fcWLV8zFGmMgC5b8rX52QtzMZDLVoUpTkEcSU62+ORvJiZ\\/Cnyj9rmMjd+WpEnU6bKPaqCVzlZlKfTnAsg2z0uiTaUJB+opQTdKI6F2xPinbP8J0cWQ5OzTE04m9lKRKyLjj6Ckb0pmZ5lRPApRxUY+SspnZ0dTquMxNvuA\\/uEJbZA7EqaWfSeEfTqOsc\\/UOqOLobXk9FprXAmVbeUMsiDMZzBB683Trc+frPIqOQ9gjuqYV2k0+5+m6sJ\\/tQopT7QB9kcnK1cWvmo28BoD6wP13ixZzOXMPf4+MT7vk42HS7M5OaTup+W2asW8a8Tr6lplTakKmJGkCgYXI1HXAAthifw6qKEBpRabfVMjc+p\\/WgGKVqpJ9Q6TzD1x6eHJjYZnCLk+tEKyHWVys21gZZF0VWUd1EuyldxEp6cQ69KOhCUI2srWrpnpdwp1s3W1EuvZB5dt7H5LtK\\/OzZSSmTpi0g23PTT7KUnMdxLTb4A3qFxewIMgw23nnlrO5uXWb33KWtCQCOIylZ8QIzygggjpCJxBBBBBBFi0IdQpC0pWhaVIKVpCklKhkQQdxSRxHBQ6QY8trSGw4fwax+xtwncQttWGWLOIdiI1k6m0l7VuyrUWVmEDVQlbEzKyTMxLOoQGnmHGn2M2lpz9SiPPg5cXDBOGXKRY2OS8uqXpeJUhY+KVKbUgDXVcdp06nXE+F5JDombyodzTCFBKdXaBhWu4yt1yj9uch21BpNRCbmRqa5dR0ulqel1qUTfWxdlGUkC+qgSLC4iWLWc0tKv8A9afW3x3PIzeFrsjU8SAN8anQdYA+BCyVZ7jx98M0nVOfTxy5\\/tHjKFweCknrBEcruI+48u7rx4RAlC47+EPmnNXcfqnn6D9sSycBLycvHBzCm8Q+ry6q2Na0\\/NPJVrrTWGaVJt1TJzfrqaqjMyArNKlBA10JWNQRLkq1h1jj9kSKOTdu\\/wC6XRnpdIcdC37Fuu5rXUCfpQxMTDd1yqnNbMrbS1cplmFJ8wplvJ0+cwsI5U8qujKmsG0OtNpPbUavoZWoXu1K1OVeQ44FDUfsqUkU6EXKgb3Av0F5ONT82xZVqS4bIqdGU6hO\\/PMyE0ytCbcf2PMzawdfqkblXEom9bXpOOmCV3WTU1pRQcYsLK9a1QdaSFpRSMQ7SmqRNqSDrBYElV3CASSSBv3gjytrbYnrQxIlqRVmVydSpFwzluVSWWN8tPJemaLOsOa24bCZK21kgaika+4pzHqS6NteNdwdtNS3EuTFJROUOYAy+j+bJ59uTb3c\\/wA2rks+nXJzzOcedFyquFkxgZyjmlhaSGESbTuMNWxIozTKEplmaVis1JYrUdmVCFKbDElJ3exJBDZJYXKql3Aw8ythHSWxytIxFQiSvMK3h+nVMAkeiqYlUpmNCSbpXNtpXvyFFjrvxtqdKMs8gZbCWnJ+nLNlG6Sbs3J0sUsuqTpdQUSCQNGaVEHpz4jxz++FgcsiD1gxx0pNNzstLzTZ8yZl2ZhvnzbebS6g55cSlY4w7SrLsh9xBuQRZQJBB5g2IPhrHPy0XvwI39\\/cY5FtwLGR3KHt6x8RDptzU3Eeb7uwfCOKBIIIO\\/mMO23AsZHcoe3rHxEYik21G74ddd6QQfRVv3A8f1\\/Hj38rBDRtwo3Hen2js6ukeriYdAggEbweEIhBBB+B5xWAEg5iCCEKTfUb\\/j113eQslWt29HT2QolRG7iPHCGsKpXnuPoPD1+B3tEX0Igh0CDwhVK+Y+vv7\\/0w0BI4QqlQV29Hd0wypJGu8db48IB0I8D1940h1CqV8x3dfT3e6GgUR2dEKhQPD1c8JhopI36ju60MOgSOHjthUKB6j44QzSojs6O4wqFA8PVzwkpB8efW+Ew6CiOHqhUKB6j0Q0SsjjvHjh9sKAhW8e3iO2Gykjw59boIxfxf0b6ZdJmrishEtRriWVzE3SvNYpNadOa1qby+jplRdJP0yR5FMu5Gabl3XXp05aaFPKu4maOdQp+Dek+1cd2WDSFy9KpN1PpfmcRMOmEFKJdEw46TMXnaks3kqVYceXXKfIKR8zVCqU+Vp9Djjgsjjv7ePr\\/THX+IOGFp4l0\\/ySuyezn2W1Jp9alEttVSQUc1BLbxSoPyxVmXJN8OMOZlaUNv6jyNjVG8NY4oRwjtHpKcQUM38ynfq1mhPlIQicpk8AXm1tJ9EpCjnauw8mZlCqUXNcJY4rWE59qckJt1pScqFEHOlxkKBLEyyr0JmXNvqL9Ns2cZWlxDZTL+wnxwsfFW1KNd1q3PRbqtivy6Jij3XQppuapk63nqqbmC1quSM3LuAsTkrMNMTEnMoclqgxKzLTiYy8s3FKq2+hmnz4+eKGQEhh1YXMS7CgQBJzCswtgIBIlX9owpKdRpUsNYx562EuMWktyfl6LuGw6v872FVpuXNwUGcTNTlhXcylTaEt1ml7Uu29caGEIYk63JOS9UYAMrL1GpU1U9IzEobQq5SHBzSnpLFPt6pG2sRJSSVM1\\/CS5Z1lFwSiWG0rnp+054BqXumhNqKlGdkENzUswG3a1RaK5Mshzgzal5O2ONjk05jfZ9U5jEODCorbrlMbCnZBgqCvNMSU1IWiXQhWVC5hba6Y4sNqcFOmVok0dw4G2q4bx9KM0urJl5WpuBKUy7iz2Uy5a2enPkhwu2JJl1KRONgqSBMoQt0566RXJi6NmlDL1G9cG6hKYNYozLZmpxFEkGhZ1YqC0hx1VzWO2qW+bJuacStp2uWs7IMuTDs1U5yQuOaVmrQzpB6AGlJo2vTk1e+HFQrtoygW6nESwm5u7bLclGzkZydnZWVbqVutFR1UpuulUF51W9ppxrUdckXUO4WplTVSo0+8xMsKCkqlnVy05KObycy0pLjShmUhxCi2vLJoqTmIyBtjH26aQlqVrctLXDKoASHHFCRqKU55AGbZacYdyTnuflFuuFJK5k5GNvgPymZBKW6ZjqUfpjzSENmoSjTs1JFSAkKW9LpDtRlbjTI23PouCoKaFkCKY38nej1pbs\\/QFiTmXSXCGA02HCo3uthWSUfJJKlOIXIuLP11rOsQgIImn35hFoJaQSHkYp4I2nJVueLhmLkYt9Nq3E9Mvqz2zt5WE5IVyZCHM3W1VibMu25tCtgsvvbbX9jdyGVnXLS5u6tFTGBcu84hx+UsvER+XrtAmXc3nDKU6+relkVClNoRsmZaXq1AuB9TufltZYQCsdUYYxHhzGTanMLYhpFbUhrtnpaUnGDOMoukEvShc84YsVJ\\/b22iq\\/ohVxfmbEmxjGWHApxyV87ZCilCkIXLursLnKl8Bhw8ky8y+o7st9DGzClDhvA6d46uyLtp0j1d32x2Ri7hDiLgRiBX8L8VLam7UvO3HmWqhS5pyWmWlszLKJmRn6fUJNyYkanS5+WdbmZOoSEw\\/KPtLBS4XW3W2+s43LiOzWUOpKFgkFKgUqSRYEKBsQfG3ssTVLrTjDi2nkLbdbWptxtxJQtC0HKtC0KAUlaVApUlSQUkEEXhYKSef17ouhvBDeQHcfgfhaG4dBaxwUfScx6jmIvDyxxyPaO7KGmsoc\\/wAffFdoecD3d8eZFdx674Ieh\\/pT6j3xdt0dCvUO+GW0HOD7+6DXT1jtHdnCcquR6\\/X1YwQ+2yOkjtB+GcXbRH4w9sMNZPT74rmOkesQWPI+yDrrf17IfbRH4wiuuj8ZP8Yd8MMx0j1iDMdI9Yjyx5Hr9Y9sEPtoj8YQbRH4w9sMcx0j1iDMdI9YgseR6\\/WPbBp0fu8ehq8LyOkn0H45RTbo6Feod8M9dPT7D3RQrT1n0d+Ue5TyPsgh2X+hPrPdFheWeGQ7B35w2Lg5gfTu74oXDzAenf3R7kVy+EELlazxUfXkPUMhFsI6yjz\\/AA90WwrszxP2\\/KCFipI5\\/Vvi0udA9fd9sJwQWQN5v13fbBFxUo8dwPoHX2xbBBBnA0SOvVvgggi0rA6+zv7s4sKyeG4eOeCy1b9B1w58dfdCggnu65QoSBxMWFfQPSfHjohMnLefbz98JlY5t\\/WfHdC0tg8L953dd2phwIA7+uUKE85PriwrHMM\\/HrPshMknjv8AHsiwqA4+rnh4IA36+4DroQqLySeO\\/wAeyLCoDrPRCZWT1DxzxYVAcT6Oc+MoWBwA9QgjrXEnCq1sTJENVeX8lq0u0pFOr0mhtM\\/Jk6ykNuE5JnpILUVLk5klI1nFS7kq+vbJro+aZ2kzoCVGTtetocxYwGU+WmrYqc\\/MiTprLzpcU5ZdfW1OTdl1Aq2jjlCm5ect6cddnHkUtc4+Kwz2KpZPDcPHH7IZzctKTsu9KTsuxNysy2pqYlZllD7D7Stym3mXUqbcQobilaSkiNk6um1ajv4ZxZR5PFGGJo3dpNRCiZZyygJqmTiCJmmzjedRaflXG1tlSy2pC1lYk+GcX13CVQYqNFn5iTmGD6C2XMqggkFbZCgpt1lwgdrLvodl3QLONHeJFOilyhGBmk1S5b9Tq9JaZr6ZZLlSw2ux1ii4i0UNtbWY1KY5MPityMoj9lqlBma5R2gEMKn5d\\/WbTn3TLipVWKRLzAQ+cs5V8hp\\/M5EJQgnVePUytYGfXEDu7dHGU+cW7lwyrc3ZlwyUyiekGGpuaZk2J1le1ZfplQlCmqUOYbdGu09Lqm22lBHkzLABUnKXCDlR9MHRsmJK38dqCcabKZW3Lt1K45gyN3IZbSUN\\/NuJFMl5+Uqrh3zMw3ddMrdYmiENOT9OClrTyfj3yNJWrqfqmyHEDU8pYW6cIYheYp9caUbKDMjPqLdMqoBJAL6qcppAHbTsy6So9k4J8pKi1VLMni+UVTpshKFVWmtqdl1k2HazdMClzDVhdTi5Bc4FrUAiWYQAImeQRqD0cOVc0ZscDIUmSxCbsa65rYMCxsWhL23PPTTyUIEtRrhcm3rbrDjz5cYkJSSrrtVeKG1Lo8up9ps7NqbfNInAhMypUgtYBSpZD0qsEZjVmG0jIH8ZxDCOPnZceK8V7O8Y4Jn10zE9AqlHnE5ilmekn5dbraCAXmA4gJmWTcZX5VT8uoWKHVA3joqlVSl12VE7Q6lJVeU9HM7IzDbxaUoXCH2kntpd2wJLTyEOJ4pBjsaCOKaeZfQl1l1t5lZCm3GlpcbUR0LQSlXgb4ViFqSU6HQ63BBBFuBvx5jhGdHIQRx8EJgjkII4+CCCOdptSn6PPytTpk09I1CReTMSs1Lq1HWnUZaqkqzIUlQJQ60sKbcbUttaFoW42e6sQ7J0etOfDxOEWkXa8oaujbOW7X5NbNKrdEqz7aWlVixLkdamHKJV3djL+WUedbmqXWAywxOyVZlteTYx4gi5dj22\\/F2xyrOzFGLNVoFRWj6ewrUlLVS6q2EdkXUEBapCopZ\\/Jsz7CFGyW25ticlm0y8RTFeDqPi+QXJ1NlOfIpDUyEJWtsEhWRaF+i8wVAKU0u1lXW0tpyzgj6acvJP6QGh89V7xosnNYvYFyy1Ps4j21TnTUrXknFhLDWIdtsLmZu31NKUJddwSq5615lapYu1GnT843R2dURJJJJ385ifphvpEV62Eoo12tu3XbikeTqMytLtWk5ZaS0Wmnn826jLBvMCRn15qSQlqbZaQGhhBpX8jjo16WtOqeJmirXKBglic+XJudoMpIuM4XV+fdC1KYr1pyEuqo2BPuuhAFWtWTdpZR5TMOWlV5mbTUE\\/T\\/ZxtE2e7ZZQPYGqqZHEaGlPVDAtadalq1LBCQXXKYpS+yqsik2ImJZxxLaFI86Mo8tMqniDH+xGuYXdcmZBpU1Tiq6FoUVtEEiyG3l2La9bCXm8jhyq7J6Z0iHKpWe4cPf48dSKlZbuf3fb1eDkTpG6KuPmihdyrNxxw8rNnzzrjvzNWFtioWpc0s0ojy22LnkttRqyzqJS48zLzXl8jrJZqcnJzALAxxJ5zExdlnpVxTD7LjLyDlW06hSHEnT6yVAEXGoO4jUaWilHGnGHFMutracbVlW24lSHEKG9KkKAUlXcRfjxihIAzMIqOZzP6BFVHM8OHD08\\/phq65xQPSfh49ENgXNh6z3afbu6t6AEC53nh9nzPRtdc1tw+qOfpP2Q2UrLcOPuiqlao6zw+2ESeKlHrJMZLaN2mg3d5698CRmOY7vj9w6vrFCdUE+DCBOeZMVUdY59HDPm+0+M4auuZ+Yn\\/AIx+Hf6unPMSmw13nq0ORa6vXOQ+qOHWenu6u2G6zkMuc+6LiQB7h0wgTxJPbDqE3N+A95gHv4W5xRRyHXzQgTlmSeskxVRzPVzQ0dXn5o4Diek9Hoh5Iue7jHqRc93GHVOp8\\/W6nIUilyz07U6rPSlOp0kwnN+bnp59uVlJVlI3KeffdbaRkcitW7MmPTuw0tCmYRYSWDYEqWm6Phjh3atnyqmswymm2VbUjRWlNFYbcDSZWmAo2mqrV+tvJjz4+TVwxcxf08dFuyxLCblW8WKBedVl3EhTL9EwzTMYj1pmZ1lBOxmqXas3LOZqBXt9mjWcWhKvQTxirJo2G11zQIDkxTvmtvgFFdYfbpiwjdkVIam3XTvH7Hx3xX20muN0Kjzc+4oBFKpFTrDovYFEpLLeSDa6gP2O4NB6VxYEgAXXsopippyaWB\\/Rk7I01tViLHNmcCTu184Zv+iADuMajsfcSn8PsJsZcWHXGkTln2BiBfiXHghSFVCi0Gq11lvZu+Y+t+dl22mZchRmXHENJStSiiPPfG2mpga61uzEw95y1qUtbjry\\/OW4tRKlrWtWalEkknWI3xMw5XTEY2DoNYmyjDqmahiHVbQw8p7iVgaoqtdlaxWmlJIO0EzbNv1+UKApC0B\\/aecltSFw3bdl\\/Ka3TkZZhD4eVvOQEsC+M8uAzbA35gk6uWajlUfkK0VcpgPHGL5lJMxiDEyJMurALkwzQaemZ7YrNypCpyuTze+\\/atu6WNzMPKBqKHK\\/RqU2q7VMpC5gpBOVDs\\/MFKkZbAJV2EjLqKhfMlSBvSY7rQhLTaG07kNoShPUlCQkewQmo5nP1dnNF61cw9PdDZ1eqNUfWPsHT2+OaOuUjeo7z1745zj7PDSx6tiniZh5hlQW3Ha1iJfNpWHRmmQFOu1W7q\\/T6BIIbByCnFzdQaShJ3EnrJj1maLRaZblGpFv0WUbp9GoNNkaNSKewF7CQplLlGZOnybO1UteylZRhphsOLUrUQPOJz1vNw5F3CoYu8phosUd9gu0+0bzqGKtRe1FKRJnCu26zfNFfd1AdVLl0UWgSTTihqomJxnPcI9KiOh9jkl2dMq8+UkGanWZVKiNSmUY7U5TfVJVOHUAaptc20mGGGrNTT9vrOoaB0NuzSVqA0vr2qSRexsnTSCCCCLkiUQQQQQQQRD8+U3YVuSeImi9jawwlbdw2Xe2FlWmkN5Kll2ZXJO7rfl33CnIpm\\/u8uZcm3rkjyKdUUDcVzA40VfKFMJncQeT6qN6ykml+fwTxUsK\\/nphDSVzbdDrL8\\/hrVGmt5e8lXNX1SKhPtNlaQ1S2p15KWpJbzEH2j076SwXXWQkqcYlRPt2GoMg63NrI0OpaZcTbiFEabxqK8z29KmwASppKXwQLlPYrStZ3j+phY7r34RBGac1vNV9bm6\\/tHP0+uHCVZceB5+jrjjQcsiD1giHja9cfuhxHxHjcfRHExFxY8Yq6HoJBzEbgOSkvMIquLlgPOkmcp1vXjTmdfINppczNUWtu7PeFF752oHnpy1fJvP19ZATp5QrLceHuPd46YzQ0Br1+4zSdsMOvliRu1us2ZPHWKdp89U552ks6oI19pcMjRUhKhxOeRWlMVbtkoRr2zPGMilGd1qkOVNiwJUXqO61VkIRbXO55mWgBqrtCjULIM82YVUUbH+F51SgltdTbkHlE2SGaohdOcKydMqBNdoSfqlGcWKQYmt6Ftf2tFvS2VblSNUp9cl0n8MVOVXIzZQnIZBo0iV2h\\/8AnhoDPiIpnym3B9Vp6XWD+McpIKlaXjHgymizs5qKDVSvHC24p2RrDiXdbIuy1p3ZYEs4yB9GhDKyoh8askDRNuL5nxYlqY45qs3NRarSAFABHlDCG6xLqK+ZZNNcYbP4zwb3l0A4JfKYsHPuz0MsN8X5OU21TwVxkp7M7MlOfkdm4mUibt+sHX3FO3u2mYftZDMKz3ZKCdavvJYxJ2tJw5LrdKlSszUsPvjUg9opU3JIOgtlTMyTfIhAN73MdA7ZKXcVNwJ+s3KVNrdvbKWHyL3P1UTCrgA3UQfRiJHhzUPnCzaK4VEuS0uqQXmd6PIXVyzSeb\\/5XQyQN+SVAc277xKtbt5\\/HjfHQ+CdTU5TazTFKH61nGJxCfwtSdZ2K9XPfklcmCocAV\\/u47yB5x6I6PrLHm1UnWhu7dTie5LwDyQO4JcA9UcgzKCh90W0zkjwV6Q9x6sYdJUU78swebm9nDu9ELg8FJPYejj1cYaJVrcePvhRKsuznEalSb+Px667sVSb6jf8Y5FtwKGRyCvVnwGcOELKD0g8R8R1xxgOe8GHTboOQVuPMeY9vRGKpFtRu4jlHgN\\/RV7evjuI39\\/KpUFDMHMeNxisMUqKDmPSOYiHaFhY3cecc4hEJUm3hwPzi+CCCElIPjwMJi9K8tx3j2wqDnvBhv2xUEg7vsPuhogjfBDsL\\/G9ff3\\/AKYUB5x6IahQPUeiLwop4ekQ2UA7tPh90Hh111aHYX0+v7IUB5wfSIahQPUeju6YvCiOHq5oaItoYQUcRoevZDtK\\/wAb1ju8emFAeceiGoUD1Hoi8Ejhughu1tDp18PC8Ogs8+\\/r5\\/HqhQEHgc4aBY593X4+2FAecH0iEFAO7Trl+qPIvmZeXnpZ6SnZdick5ptbMxKzLSH2H2nBktp5pxK0OtrG5SFpUkjmjEy9dHio0Wryt9YK1ieti46ROIq0hT5WqTNNmpKoS7u3YnLYrjTzUzS5tlwBcuy8+htK98vPSqEJZVlmFnn3jq490KBQPA+jx8I2VLrNRori1yjoLTySiZlHh20lNtKBStqZl1eg4lSFKRm9FwJUoIWATfKlJyYk3EuS7ikkKBKQTlUQQRdIO8fmqFlJ\\/NUDHeuh7ywlx2ZU6fhfpgS1TkpuneT0uRxek6U63VpMpUGmxiFbsrLhVQldnkpVx0OVXMPIaDlQotSXMTNWTJFw7xgtTECgUa4qPXaNXKFXZRqcot0UCflqlb9Xk3FFKJiWnpV16XSCtK0LKHCyh1t1tZYWjZIiGXxhvaOIUiJS46Y28+22pEnVZbUYq0gSc\\/1rOBKlbPWyUqXmEPSjigC5LuFKcut8K8QtKHQcrsxcGD1xOXjh1MzQmq\\/ZFSZmqjb1QYT5y11S20TCX6XUdiA390ltTUvOajQE66mTCpFdGbTPJtwLtLTMVfApk8D4vcu47h+YUGsM1Z7efouZS2foWYdUfRllNqp61ltlqXlbuzkdP7OfKCnaZ2FMxMXZ+TGVCJtSwqeYHoi6nFlKZ5CbaB1bc4ASQ\\/MBKWTOSSpKkhSSFJUApKkkEKBAIIIJBBBzBG5Q9Bj6m1rqrtn1WXq1Bn5iSfadZcfZbfcTLT7TSwsys+ylaW5mWc11JLTqSBrlbZQ5qrGlXQx5UDB\\/SKap9tS9STYuJTqQmawtu6faSak+E6zjli18pYlLgaKUrUJJlqVrjKG5h+Zt5MohNQc2v0S5qXXUhMs9spoD6SSeIQ+kgEqLYz1X292ttGVHJOrtUtK8yPn5iXBmOtleIxL1aRquHK5Sn0TMu+A5LTDSkLPYzcrMMqUl1hZSQ1OSjz0o8MwbfcBjsOkVqhYrpvnFPmpWoyM0gtrQMriDmSCtl5pYC23ACM7DyG3kXBUhNxfrvlmtHeRxnwCsbS6sOnIeuDDaUYpN9CWbSucnMOa5USy07OKQVOTD9hXbMbJaW0FLFNr1wTsy9sKc2RFqCxz5iJzmANZoN1Ue8MDb8lWKxal+0WsU8UqdK1yk9K1WmP0+5aC555KWarSXHXEoa2SQ4xOKQfKJpOvDn0sdH6uaLmkDiRgrXfKH2rUrbq7bq77YSbhs2qpFRtOugoGxL09RpiV+cWpdTrclVmalTSvbSLuX08wVi2U2l4Cw5jeW7NM69LopGJpdnL+w8Q01ppmbzISSG25tvs52WSdRKTErmOdZj5+7ccELwvil+YbbUJOeXmQ5awOYFUu5fcVOMpUy5YG8xKTCybrF8fQQeBEVhtmDz58\\/XF2soc59\\/vjblux0JHiNRFIlvkfbC8EJa6uo+OrKK7Tq9v2QWWON\\/Xf4x5kV3HrvhSCLNcdB9nfFddPT7D3QXWOF\\/V4cut\\/qTlVyPx+EXQRTMdI9YgzB4EH0wZlcU+4jiOvEiCx5H2RWCCCDOf0fj3fP3j1+WPI9frHtgggihIHEgdsGc\\/o\\/Hu+fvHrLHkev1j2xWCKZjpHrEU109PsPdBmXy9xj2x5H2GLoIs1x0H2d8U2g5h8O+D0zblpyH3+Pw4R7kVy+EKQQlrq6h4684t1lHnPu90GRR3n4mPQg8SB74WJA4kRaVjmzMI5gc+XP1xbrgdfu7OYwoNjkTw7r9d8KCBxuYWKzzbvb49UWkk8TCJWeYZe2LcyeJJ9MOBvwHvPDrfwhQAG4QqVJHPn2b\\/siwrJ4bvaYTJA4mLCvoHr8d0OBAHf1yj2FItKwOvs74SKiePq5otKgOJ9Hj4woDkPZBF5WTw3e\\/wBf6IsJA4mEys824dfHuiwnnJ9JhYQTv0+P3QReVnm3dfE9w9vxiwnLMk9pMJlY5t\\/WfHdFhJPHfDgAG4QRepf4vrPd49EJk85PpMWlYHDefHPCRUTx9XNHsKCSe4c+t\\/wi9S+j1\\/ZDaYYYmmXZeaZZmZd5BbeYmGkPMPIUMil1p0KQ4gjiFpIOfDKLyoDuEJFRPH1QtKVXBBKbEEKGhBGoI3G\\/EH3w6ABa2hHHjcEHf6uFvbHQV4aOdhXHtZijsu2pUFZqDtKAcpq17\\/2SkvLDLaP\\/ALHIOyAGrrapGetyWG2Lum9onllrCzEWrXLZMlqZWhNkXfbAlWsiJZqz68l+bohd1EbR2zXJOaKENtme1Ds47oUoDdxPjjCRJPGN47WFVCQVSMQyFMxVRnLByl4jkmKrLmwsFIMylbjbqAfyTgUexNi2kERvqRiWuUKZbm6ZUpuUmGrBD8vMPS76U6XSH2HG3rGwunOUHQFJGhzSwN5ci3RMsUbH\\/DWv4f1dK0S85c+Hbr1ZoBeUtWu9VLSrT8vcFHlGEBKVtytQu6cdWQsS7aPMRujwV0zcHMcZFubw0xIs3ERCWdu9JUipokLpkWAvVL1VtSoNydepqMyNQT9Gpwc3amsN8RYLksq1LuZLFxUKn1MlOomZdY2c8ykjhL1BgszsuMs89jMISVBOYVqgR0DV9GxuSnmqzh9ddTtyqyjwm5Hyl58mTfQc2lyFXp6pepSCmjvbcKJx5O8B0lIJpDFnkz7GcZhx+kKquzqquXKUNlzEGHitVifyD7rdWl8yxolmoMyrKVECXKUpSnoTC3lM4kkA3L4ilJSvS6QlJdfSJKfATYAJnpNotKunRSpinvLUbKU9fOVTvqfdtCqBSlE4mWcV\\/epzKXVmfwQtSiwvf+Ah5avXH0W4hJCgpKgFJUkhQUFDMEEcQd3vGecQpsPNPDT70dC1L3BVjjHaMqENmWv6XevIpYQC2t5u7qbMyV7y7pGrsl1ypzUq24htapFQddS9sywL5bzBmvpkKfihRbwwaq6tmiZn5QLvyxNoUjXmFu02UZuKVDz3nCX+5KfRKoWEu1N8treVy9jLyOdqNAbensPMSWNqUi6kzeF5kVJ8JsVJS7SyhirJeIHpNSsnPJQQU9sr0SrofDm23Z9iINoXUl0KaXYFqrpQmVzEC+Woy63pNKAT9aaclVkXJbFjEiaCMVcKNK3DXFumJq1h3tZuIdOS007MTNn1+RnZ6QS6c0pq1JTMOTlMmSRqmVqDFOmEKBSphKgYyBp94UCo6qWqiiWdVu2M8PJlncMglbitg4rPmacV0745jqmHK3RZl6TqdNnJOal1ZH2H5d1p9lQ3peYcQh5gjeQ822ba2tFsS62JthEzKTDE3LOjM1MSrrcww6k\\/nIdaWtChfS6VEd8fUwRRJCgFAgg7wRvBHj1Rdmek+sxpCCOHt05d3L7OcOdn3+774pHO0OvVq26izVqDUpuk1FgfRzcm6WnCkkKU04B5j0u5qpLjDyXGXQAlbauA4PM9J9ZgzPSfWYflJuckJqXnpCamJGdlHW35WclH3Zaaln2lJW29LzDKm3mXW1JzIcbWhaVAEEGxCHGG3W1tOpQ604kocbcQFoWhWikrQq6VJI0KVAgjeIywXixhfjZaM5hXpL2Dbd42rWkoYnlVijMVSgzD2TjbE7OUt1pyZpFSlg6VStboyxNSLxMxJpkVNh2NL+mDyBjFVkp\\/E7QVvGVrNMmmnqm3gxeNcYeS+1quuGUw8xEmHfJphWuGmJSiXy5LFtImHpq+HXg1JKzwzPSfWY+zsvEW78P53y22aw\\/JIW4HJmnvEzNKnQMhlOSDpLLisgEB9Gzmm05BqYQDme5dlvloVeSZlcP7Y6W7jSkNBDDGKZDsZfGNNa0SFPqV2MpXG2wBcPrk5xxRU\\/NTU+4Etmj8c7DMP4kS5M0xLdPnrHK0QoS5N9zLwC3ZXUkhspmJW9kpl2xdUQjsTMNcQ8HruqlgYo2XcuH96UZSE1O3LrpM5RarLNu+dLzKZacZaVMSU439NI1CVU\\/Iz0sUzMo++wtDsddkgD3Dpj0G8QGNFTTRtSXw80p8Mbbnn2kON0atVBL8u\\/Rp6aRquz1r3rT3JO4rOmHS225MNGfZp8yG2GKjNVFsFk6A9MnkAMXMOm6jfWiNcbuOliJZfn\\/uBrr1MpuKtKkwFvBukzrAkrYxCYRLI2gckEWzXpp51mRpdsVZ36dfdOG5zC2P6R+EGzfEkhi+kpCTNMyauyrdLWsApl6pR3g1Pyj1gcqXZdpbyUl1poslLh49xZsxxLhOZW1OST62gVFCgi61oFrqb7MramUJuApyVddI17RtkggR2iSTmYQUrPhwHP09ccxctv3DaVcqlsXXQqzbFxUSbep9aoFw0udolbpU+wcn5Gp0qpsS0\\/ITjKsg7LTTDLzZzC0jeI4FxeoP3R4D4nxvPpjJDZQSFApUm4KSCkpI0KSDqCDoQQLG9xeIBa2hFiNLbrW4W4Wi11zV81P1ufq+0+z1Q0JyBPRFSc8yT1kmEVKz7OYd8OJTmPcN8HXzihJUSfAhFSs9w4e\\/9HjqqtXFIPbl7u\\/m3c8ILWEDPiTwHT9nXDwHAeA8O\\/rdHo104nTw69w91jrmqNUcTx6h9vqhoTkMzzRUnPMk9ZJhFR1j1c3jrjIQjhw3kw8BYWiQJ8nZwnVdmlniTivOSa36dhHhJNyklNhoKbkbuxFrMpSKQpbi0q1DMWtRr6YQ03qOukrVtgyy6w9Kh0oa35LbFAoiXCldWrDs6tKcs3JakyhC0KHOgP1GVcOQ4tDPLgdR\\/wAnYwk+5PRSxLxZmmdlUMXcWX6fJOagymbVw3pDNKproey11FFz129pctAFDQY1kEl9wDYnpM1xM\\/fkpSUKzaoNFlW3EHM6s7UVrnn1HfkAuUXTiOcaoIIJ3cjeU9iTzHCGJWm3FB2eMhh+XG4Hzh1t2dRvFwZVuf0BIP1jdGeOrditIytUdakfW86qr2nEktyyu\\/TzXf4aG0RXOXtxIDVC0fcJZWZKhP1e8MRK1JBaQW\\/meSp9tWxNrbAzJf8Anu7mm1kpAEu6jNYXmiPTY7W0qMzMEbpeUKU9Tj7iUpJOX4iHRl0mNi\\/LGYlG\\/wDTZuuisTKZmn4WWhZ2HskpsBDe3Ei9edWB4a8xL1q8KhITLygFlUiiXzUzLsqjAGx5fZ06ZmSMjMzOqD0tsIAB7A446OPNHQvk94c\\/BTYJgORW32czUaOmuzFwUrW5iWaerTfaiwOduSnGJeyhdKWUoOqTFT7VKoKrjXEkyFZkMz30azYkoCaa23IKLepGRa5dxwEaKUsqt6Vo+1UoJBJ5vb1emGJJUSSd54nxzCFHV66t3Abh18Mz7IbLVzD09nR6fHGLNAzW7\\/d4xWcSfvkvOEiri0lNIfGuYlkOyeGOEFFsWSddAIlq5itdLdTZmZcEAmZRRMM65JuKQ4NlKVJxKx+uW1Jm7RHL+TP4PpsrQbvXFSblnWqljbjVcU3IzRCQ3NWhh\\/TKXaFJQ2NUrcMtdbN+B17XCCXUMJaSphxyYkaR1ns9kfMcJUlJFlzLbk6s6el526t1o3G\\/9jlkXJJ0sbWsLCojPZU1i4sp3O8rvzrOU6gf1MI567iRaCCCCJpG2gggggggjGzS+wiRj5otaQmDiJRM7O4g4Q35b1BYLZc1LqmLfnnrSm0NJ3uPU+5maRUWEADWdlmkngTGScEMzDDcyw9LPJzMzDLrDqf0m3UFtafWlRHrhDiEutuNKF0uIU2oafVWkpO\\/uMeTHvQopUkpyJSQQQQobjmDvz6R6utUEggg7xvHjoMZf8oTg9+oLpu6T2FTUgulU238XLpqVuSCwdaXsy8ZpN72QgEhAWg2jcdEW24EoDjag6AEqjDpKstx4cx6Ps93Zw4EqMk7Izs5Iuj8tJTUxKOi1vyku6tlemovmQdLnS2u6KddbU0440sWU2tbahxCkKKVDXXQjj845JCwodBHEdH2R9JZ9yztoXVbN1U8lM\\/bFwUW4pBQWUFM5RKlL1KVzWnJSSl+VQQpIzT0bo+PSopII4jxkeqHiFhYzG4jiOiNW8y1MMuy7yA4y+2tp1tX1VtuJKFoUOIUkkEcjA244y4280oodaWlxtadFIWhQUhYPApUAQeBETNsML4lJKt2JiDS3i9S0zdv3NKvNZ5zVHmVSs8pISkklE1TH1NOIRn5rpGZ3k7AeUTwZTpFaDOlBhNLS66hULlwfuarWtKsIEwqdvCzWG77sdhtIz1kzF3W3Q29o2FKCV7VhK1JSI0VaDd9\\/dzoy4azDj5fn7YkJqyKgknX2KrWmnqfSmVKBJUTbooz+asinbagzy2ipKGCFy\\/dXhTY9XU4XXxQ2KXOOKV56p2iLXRppxzocfdkVTWeeeTwW0NmpMcG7HJiYwdjHGWEnHFJfoVZ86lc2mZyj1BUk8\\/uIIfSZBxKwkApCTYhdo7sxUpjEuGMP1xIBYrNKbQ9l1CRUpJEwGiATlUyozKFJJuld03BjyxsIqomTu1EopWSKpIzUoAdw2zQTOtnPMDW1ZZ1pGeeanQlPnFJjKxKinflmDzc3s4d3ojr7TJwgc0W9NfHvCVEo7I03DXGm5mLdYdQG3HLEnKuuu2S+ttBUG\\/nGyKrRJrZoUrJE1kFZZKP27TqVBOagpJAKFA5pUDkRvzIKTnmCdxHqj6E4nQ0+5IVOXJUxUJJp1tVvrCyVpX4ll1rTTde\\/COIKqwZaZU24nKsFbTgPB1lZQtJPcba8N40McgCDvBz7OY98KpVnuPHx7fZDMKI+MLAgjMRFbff3fd9vqvqVJKe8c4dAkcPHbCwUD29ENEr5j6D3+O2FAcsiO0GEqSD48\\/nDakhXjzh826R5qt45j0dvTDoHgQesGOMSrPcePvhdDhQekc47ejojGW2b6Cx5c\\/Dq0JBKdFDTdfreOu6OWbdCtytyuboPdC0calaVjMH0HiIcIdKdys1Dt3j18ezOGo8KOKdRy+Xy3w6gigIIzBzEVgIvoYRBF6V8x39fR3++LIO2GlI4j2cfVz63wQ4Bz3iLwsjjvHthoDlkQesEQoFjn3dfj7YbIB0Igh2CDw9I5x2xeFEdY6Iag84PpBhQLPA+v8ARx9Hthsotu17uP3x4RfQi4h0FA9R6IvBI4boagg8N8XhShz59u+EQjJ+ifUfUbH5H9ToL6fX9njsi8EHgYahYPHd7ovghBBG8Ede\\/wBsOgpQ58+3fF4WOfd7fHqhoFnn3j1H1xeFg8d3jp78oSUpPC3hpHkdN39gRZ17OqqskhdrXMlaZhmt0RIZ2k0hWu09PSTZbafcQ4NoJlhUrPleSjNKCQiMlMDOUJ0lNF1+n21pA0yqY34USimJeXv2mTK5q\\/ralGlKSh9dYmywqvbJGqpUndrkpPuvBKZW7NgyGXPkgecH0iDW1gpCwlaFpKFIWApKkqBBSoHiCMwQcwRwhdXYpWKKSKBjCjyeJ6MkKDDM\\/mRP01SgAXqPVmrTtOdASlJDTimFoSGnWXGlLQqW4YxtiLCU4ico9QfYUnKFt5szTzaTo082vM280NcrbyHEIPpICVgKEknRh038OcYqfSr4wpvqQuxujzMhPPty7pkrutaeQ5tZaUua3Jsy9QlFlxh1tCphluXqiGn35Cfqcrk472hyveDNv6TWjfZWmThcy1U7rwiZRbWKclTW1PT8vY9VmRMPioMEeWA2Hc06qcYKmG0G3Loq9emXvIJJtSYibmGTdCuNi\\/cKLkruEOIEiFrk7ksqcfkGlrdAL7M7TpV6XadlZrIInJdhbEvOJKkTzM2jWbVtR0TOV2xT0f56oWZpbYes4hYT3lS5y0cRrysaSdmbdu60avKTdMqTd+WHIS4mqZNfNs5NtKr9sSbLcumZXIytvTso\\/OCbgGAtnA2YVetIwlNzGIcB4rabbq+HZpLbOKcOzzCryVbpks32chiNMqbtzrFKMrVp6V7MNUaYflmkuXtWNpWHtrGHU0TERZoWJGG1CQn3Afo2adOVSWXXjndkip5KVNKdU8wizvazMu08tKcEYrrKHOff74+wxIksO6ffNytYQ33S8SsLnao9PWBelLmmZn52tGpBE\\/QxV2milVNuin0+ZYpl10V9DUxRrjkqpTHW1GW11fEBShz+vfE7fZUw64y4BnbWptQsdCk2OhANiRoeMcwPMuS7zrDqcrrLi2nE3Csq21FKgFJJSoAg2KSQRqCQQYc66uo+OrKK7Tq9sNtoecD3d8XbQc4Pv7oYyp5fZ8Ibhxrjr8emK66en390N9dPT7DFdZPSPXHmQd\\/XqghxmOkesQZjpHrEIZg8DnBHnZjmeuj0NSHEEN4IOz7\\/AHffBDiKZjpHrEIQQdn3+6CF8x0j1iKa6en390I5gcTlFNZPSPXHuQczBC2uOvx6YptOr2\\/ZCOunp9\\/dFNoOYH3d8ehCeXvP3QQtrq6h4684t1lHnPu90Ilw8wHp390UK1Hq7I9sBwHsghaLSpI5\\/VvhEknjFCpI5+\\/1DOPbE7heCFS50D1xbrKPP8PdCJcHMD6d3fFpWo8+XZ4zhQQT3dcoIWJy3kxYVjm3+zx6oSJ5yfSYsKwOG\\/x092cLCBx190EKlSjz5dm6LCQOJhIrPNuHrPri0nnJ9JhQAG6CFCvo9f2eOyLCSeO+EysDhv8AZ8IsKlHny7N0ewoJJ4WHXr+zlaFFKA6z0QmpRPUOiLCQOO6LCs8B6z9vD0+yPQCdw9fCHAkDvPPrQfGLyQBmT6Oc9kJqWTw3D2xYTzk+kmE1L\\/F9Z7vHphxKANTqfd11aFQoTlvMJKXzDd19Pd74sJzzJPWSYIcAJ3D18IIIIIIdCQO884IIIoSAMych1w1W6Vbk+an2n1cB1e2FR6ATuhVboTuTvPTzDv8Ad7o69uTDiybr2i63b1PfmnAdaoMIMjUdxzBVPSRl5hwJJzCHnHGt6gpCklQV9spYSMyewQ0W4pZ6BzDm7T1xkSz8zLOB6Vfel3E7nWXFtLHGwUgpPqvbnDqVlk3bWpK9PSSopI7rggi\\/XCMaJnAKp25VGbgwwvms2xWZB0v06YXPTlOn5R\\/NK0Kk7goa5WfktmQEpUiVedyCVl1SkK2mStgcoFp54CbCTuqcl8YbWlPo9nfFOVcsyGFEKceTd9Bfp92JfzBS2\\/ck5UGW17jJlKkIVYpQHDefHHu\\/TCRJO8xsKo5TMTyyZLGWHaDi2UQkobNZpzDs7LpPGTqLaETcq5v\\/ACzS+0sSArXSVUDG2J8OPB+kVedkVEgrMrMuy\\/agWsHkNKS1MI0F0zDbyTa5STYjZXgry3ODdaTJSGJFBvjB6pOOtNvz0oRf1lNaw1VzLz9OlZS4Gkheaiy1Z84W2v8A5YdUg57b8JtLjDPFymtVCwb8svEKULQdeVatwSbtWkWyrLOq0XaqqNNfzyHk1QlKa6AUrU1qKbK4l9w2DZtzhZrFv0+Yec1s55pnyOfzP4RnZQszSik+cEuOLRnxQUkhXTs\\/gEaVPsVqwrvq1u1eRcD8i648+iYlZgJKQ7KVemqk5+RWNZWTiG33AFKyVuziicUeS1sdxV2jtDnKzgWfcuUsvpOI6MgkXSlKluS1aTdXoqdeqLraE2PYqN737hvym8QyhbaxDT5GttCwU9k+jZ5R0GsxJtrlCLX0NNSSd7gBidxIXzQKgUpTUDJuK4MT5VLKB3AAPKKpYk5\\/VRMFWW7KPqkvlxKVNulaVeclaV6yVDIfVUFaqkk7xuzHAZ88KKw9NrT5wK2TM1cy8XLblAhJkb6lVX2l1tCUtlw1uWmKdiClSW9+vNVjydKs3nGnFbQnYDg7y3FkLcYp2LWHt4Yb1FCEtzVas2fRddAcmkqAddnKLOpotYpsqRrKEu23cj7awlpSlJzcTzfizyNdpdHQ7N4bFNxlT2wF9th6dZmphKPzQ5TppMnUO23AsyrM+pJ0K1AEi+MP7d9n1dCETE7MUKYVYdnUmM8sVG1wmeklTDKUWuQua813EWBKQqS5tHP98X\\/GV3wbRz\\/fF\\/xld8YFYM6eOCuMiWEWDijY98TjqGlpoqKkLfvEpWE5LctirtU+toCdYJUo0RtCXQpoKK\\/NTlnTcR7dqBS2++\\/TXlHL9eIUWdocgdV9kuISknL6R4Mk5EZcI5nrWCsTYdmnZKs0eoU+bZ\\/bZWbk5iVmmxzXKTLbM0gd62UjfxBtbklPSNSYRNU2ck6jKrtlmZGZYmmFfVuA6wtxs99laZtY7C2jn++L\\/jK747Ww9xlvvDZ5pFGqzk3Rw8HJm3qmVzVKdSV5uhptwl2nPOnPN+QdYWVpSXg+gBB6jBCtVaVApy4g7iM+bdlv9vNwzi7I9J9ndGPhrEuIsHVaWr2F63UaDWJQgsVClzTspMJGZKltLU2pIflncoS\\/Kvpcl5hu7bzS21KSUT0hJVKWXKVCVYm5ZzRbMw0lxBIAAUApJyrTqpK0kLQTmSoKAMdZcsvoOUXS6wLktMrAqiKmsXsMrZW\\/edGpraDUr8w0pSXpmr0+blGd01eOG6zOVCmqZ\\/XtVt\\/53ozXzu+1aUpLwxiSSSTvO8+OgR6DWjXi6qwroFu1uaUi07nmW23lOrOypFZXqMSdTBUdVmWfBRKVNZ3bES826tKJDVXGJ5afk+zohY6\\/qpYc0Qymj7jnVahVLeZk2gJCwcQFByo3PYCksoS1IUuY1nrisiXUmXbNFcqNDkWn0WhOTTv2Q2Z7RpDbXgCTxxKhiXxLTPN6Tj6ksEDzWroaSGqtLs3K0U6rtjziXJ9BCu1lAt16Sm3I4A2zbPXcJ1t2blm1qp02e2ady6KZUoJQtagAC80oiXmrWKl9hMFIEzcaVVKz3Dh7\\/HjqSUrLcOPu6+0+N2UClZdvMO+ECchme0nj7fjEtAtoP1xSHQiilBIJMM1KKzmfQOYCKrWVnPgBwHx7YQUviB2Hu8e\\/hkIR7Tv7h11uh5KbDXeerRRSs9w4c56eyG7iwkZD6xHqHXFy1hAzPHmHjx7csh9DzBxzSE0p8A8HFy5mqffmKNp0u4W0ILim7Ql6mzU7zmUs79qZG05GszmzUUtrEuUuusoUpxDrjjcuy684crbDS3nFHWyG0lSiba6JBO7hDzLS33mmGxmcecbabHNbiwhI9aiBE\\/Xk+MIDgRoUaNOGD0uuUqNGwqt+tXBKLb2apS7L5Q5fl4yikk6xMvdVy1doOKCHHggPFppSlITjTiZc8rVbtvG5pqbYZppqNTmzNvuJbYYpNP12peYfcc1QhpmmyrbjiyoIbSlf4O+NlWIVd+5qyLorQcDbslR5zyVZOrlPTLfklOBOW4qnpiWRlzg+iI6vKFYnfqR6GuPd0NTCWKjP2TNWRRlBwImE1PEKZlrJZfkciCqZp7VdmKsgJJ2aJBx9SNm2uPnBt0em8Z4owHgSTcJnMTYibedQAVFMzVp9ik09woASMqHJmokqUlKQEmxAC7dzYKbl8P0Ks1ZY\\/Y1FpPZNk3ALVPlDMPI\\/OIKktS4ABJureSReGJjViFMYs4wYo4nTKndpf9\\/3bdraHs9aXl69XpypScokH6jcnKTDEq03kA00yhsbkxzdGZ8jo1PlwAFGWS64Ohb+b60k556wU5qkc2WX1Y6dk2DNTctLD+\\/vtNHqC1pSo9gBJPUI7v3JGQy1QAAOAGQyGQ6uAj6jzctL06QptKk2w1KyUuzLSzKdzUvKMolpZsdyGk5BpuTpHFtQfcfdU68suOvuuvurOhU44oqUojmpSlHxJ9Vqlao6+aESeJPpipOZz8CMjdDnBhWkZpXaPGB+wW\\/I4lYvWLbdeDaC4tm1X69Jv3dPag+uin2tL1ioFO4KTLqOslPnJYlJZyZfYlmhmdmXmmUDmt1xLaB\\/jKAjBSkrUlCRdSlBKRzKiAB6yY9I3k4sG14B6CWinhc\\/KrkapQsGLPqtxSTiA0qSvC9ZL7ub0lVJCUFQlrsuSsNbVxKHH9QOvth5xcZuwQR2pKy6JSVlpRrRqVYZl2xa1kMtpbRprb0UjS8Wk02Gmm2k\\/VabQ2nS2iEhI08BBBBBD8OQQQQQQQQQQQQRCF+Um4KKszS3wwxqp8ktikY2YUM02oThSCmevjCypqo9YWFgApSzZtew7lwysKXrMOL2y0rLUvHXSrPt5xE575RlgkrEPQeo+KtPk1v1fAPFG3q9OTKGtqqXsu\\/A5Y1eZ1UgKQhy5KlYs6899Vpmmr2qCk7RmC2lXBST1giOPtqtL+jcZVBaUFDVSQxUmtNCX2w3MEG+uabZmFbkkXtawBNZYgl\\/N6pMWFkPETCdN\\/apBcPAG7oc9mpveHaVZbjw5j0fZ7uzgslRScxx9\\/UeqGiVZ9vOIVSrLceHMej7Pd2cK0Um+o38Rz+\\/4+O\\/SRul5KfEBLshiphjMzGqqWmaVfdHlczmtE20KBcbpOeSUMqlLXSnV+uXl56moNaU1oV3Qmati7LSdXm7RqxLVmUCl7zKVmWMu820nIFLcvNUwuuZZjXqGZyK98IbQQv02FpN4fLdfUzT7wfm7CqIS4W9v90zKWaPLqyzCwq5maEvUP1ltoKPP1Il26Kt0\\/c7i7TJN1zZyt0U+et5\\/WOSA+4hNSkFap1s3XJ6nsSbZH\\/10CMkF0xwxtPkzg7b5I1VH5KSxbJyjrpACW+1mmlUZ9BJBGYTspKzzutgXsxUAs27J2WT\\/wCEGyd+nKVmmsPTc1Lpvcudi04mpsKtfVJYmnpVsADRm2uXWN38pdwLXYmmXh\\/jfI012Xo2PeFEk1UqioEtz9+4WTSbWraG155Ayljz+Gbamss95WFKSvdqLsepirWrRZoqCnUyaJN855K20kTKOLXvJCnNiHTwBCyUpSkpiYh8o+wGVifoJ0\\/FmmU8zFc0dsTLduebmkELmGbGvtxOH9yyrTOsFrQ5cVWsWqzjjaHVysnRH5l0JlWpl9mFTg3UyuRqtJUvzpWYanWQeJbmkbJ4J\\/ctuS7alAgec\\/mM8zl23hecFc2eU17OFzFEmF054jeltkpSygjeB5pMSRP9oTawjnTaBTfNqvOKSnKh9bc82bWumZTZ4+BmQ7qL7tbnNHe7bpGQUcxwB5x29W+HQORzHr6R8RHGJVrdvR09njOFkOFG7iOjo90YqkG99x61\\/VFeBRGihp9n2iOTCtbpz6Off74vSrLceHuholQUAQd3SOI+0QslYOQO49PN6eg9Xqho+zn4\\/Z14QKRxGo5db4dAg8IVSvmO\\/r6O\\/t4w0BIO77D7oVSoK7eju6YSQDvhsgHQw7BIIIPqhyh0K3KyB9h7jz9GUccFEdnOIWBB7ecc4hhbf3Hl4jr2mEWUnUajrh9o+EcklRScwcvce0Q6Q6FbjuV0cx7D8I4lDqk7jvHt8d+cOUqChmD9nbDBSRv9sHor7j17fj6o5KCGiHVJyB3j2gdR5\\/T68ocpWlQ3H0c49EeQgpI3+3hF0EEEJKQd\\/t4x5FQSk7vsMKBY593u8eM4SghsoI3a\\/H2frghwDzg+kGLws8+\\/390NQSOBi8LHPu6\\/H2wggHeIIdhQPA+jx8IuBI4GGoIPA5+\\/1ReFEdfbCC3yPt+f3QeOsOgvpHq+2LwoHgYahY590XAg8DnCCCN4PXfCChPDTrv+yHMXa6uo9o7sobAkcDFwWRx3+z4R5CchG6x679PfDoLHPmPaO3hnF2sk8493vhsFg9Xbui6CE2I3g9deqKSspKyLa2pGWl5Jpbrj62pRhuXbW+8rXeeUhlCEqddVrF1wgrcUc1kqMO9dXT7BDXMjgSIu11dvo7soFEqJUo5lE3JVqSeZJuSe8wE31uSe\\/XXTjx15\\/aYdbQ84+HfFdcdB9nfDbaHnHw74rrp64TkTy95jyHOunp9h7ormOkesQ21k9PviuY6R6xHmQczBDnMHgc4IbwR52ff7vvghxBDeDM5ZZnLo5oOz7\\/d98EOIIbwQdn3+774IcRTMdI9YhCKZjpHrEHZ9\\/ug9R7\\/d3afq9a+unp9h7oprjoPs74Q1k9Pvimunrj3Invg9Xf8ADrSF9oeYfHui3XV0+wQjtDzD490W66uz0d+ce5UjgPj8YIWJJ4kntihIHEj4+qEcyefPn6opCoPaevXCpWOYZ+yLCtXUPR35wmVgdfZviwrJ4bvb8IIUEk7hbvPq6uOZ4QrFCoDiYRJJ4mLSQOJyghQRzPs+Z+UKlfQPX9kWEk8TCZWObf7u\\/wB0WFRPV2QoIJ7uuULCQNw9Z3wqVAcT6PHxhMrPNu9\\/dCZIHE5e\\/wBUWFY5t\\/WfHdCwgDv+Ee9dfr8bwoTzk+kmLCsc2\\/3ePGcJkk8TFIcCSdw+UEVJJO\\/7B74pBBDgQBv1+H39aQQQQRapaUjefRzn0QuCLoTW6lG7iroHxP6YQW6pWYHmj2+vr6oQUpKRmT3wQsJ4q0Hsi9Sio5k5+4dghBboG5O87+wdvX454SW6VbhuT0c57TCJIHGHEovvv4cfXHpVfRI6+zxPOLiSd5Ofb7+iE1L4hPrI93Hu3c+6LCoq3c3RCalBPb0d\\/RGQlFt\\/qHAdeyPUotqd\\/wAPv674uJ5yfXCKlZ7uA9\\/b3RQkk7\\/sHvhJS+Yevu8ZQ5b2Q4ATu68YuUoJ4ZE9HfuPuPvhEnPMqOQ58+AHjj09cUUoJBJO7pPE\\/aYaLcK93AdHT74UkE9w4+7Trd8V6I7z17Pti9x0nNKSQnn6\\/wBHv3x81WrZt2vtlFao1PqJI1UuTEugzKBlkNlNJCZlnIE5Fp1B35ZxzilAdvR3wiTxJPWSYzGFOsrS4y44ytP1VtrUhYO\\/0VJIUPEHw7vUFYVnClJPNJKT6iLEDvEdD1nAS3phSpigVOoUJ9J12m1ny+VbcQdZtSC4tqdbIO7WVOOlJCVpSSFBfdWEWlrpRaKVyW5UKze9wYnYRy08zJVyzq1WZuuSC6K4tKHJWkzddbmZ+06i2gqfpL1NfbpgqDbTU83Oyrz8nMuVKz3Dh7\\/HjqYT8vKTkq\\/JTrDU1LTTS2H5d5CXGnWlgpUhxCtxSeHSDvTvEbKfclMQSC6RiynSOJKQ+2407KVSVZmHm0PIKFvSk2pHnMrNoBC2Zlp1LzLiULbWhYChJKJiiuYfnmJ+l1Gak5hhxC0uy7qm1nIoKCXLEJeaJSM7L4cZdTdDqFIUoGWTo1aRlk40WBa93WhXk1e0Lllkqok84lLU9S5xtwszlu1yX1nFSVSps2Fyb7LhcEu+2EMuzEi7KTEZW7Zz8dX8RP8A7kQk9GjSGurQgxOVPpFQuDAe+Z2Xlr0tppwvTNOcCVNytbpCHlJZYuKkIWFNqWUNXHSWnaTOvMzbchUaZLuwWxft3Ei16BVaFX5K4KHXqZLVS17hknQ5KVmmvta7KddSErTNMJCkOszSG5tDjbstNtNzrDqHPmBt\\/wBhc3szrIqdJ7WpYPrK3X6PU+zGZIBC3qdUOzAQ1VZG9pkAIbnGbT0ulIVNMSv0P2X7SKftCoyXT2MvXZJtCarIINgb2QmelUqJUZR9WikEqXKPHzd1SgWHpjv7bOfjq\\/iJ\\/wDcjLep2FYmnrou4gaL2Lro+c3qG2ijV9DaHqxR52nFK7OvymbRSC5VLYqyZVipMpcQip09xUhUHVS1enW14dbVf7n+Ij\\/3Y+xsS96xYF10i66O4ryqmTCXXZZSi2xUZJw6k7TZnVSomXnZcrZWdVZaUW5lkJmGULTofJ72uzGx3H8pWHy4\\/hWsIRRsZU1KVOpm6LMOJBm22BcOT1KcV57KWstxImJILQ3OvGN7jvCMrjDD81TXG2lTSUOOyC12AD5RZTDihYpZmkEsO62QSh6xWyiIUuOGDd+6PeLN\\/YMYn0r5nvfDu4Z23q5LJLqpSYVLkOyVXpcw6yyqdolcpz0nWaJPBttE\\/SJ6TmkoQl4COoHHCs5D6o4dfWYmNcupoW0jSKwOt\\/TtwXpRnLyw3t1hjE+TpzA8ruXCll95S63Oy7LZcma9hdU3plFSfCdqm0pirrnJlcpatKYahvqVl28w74+uk\\/KS7LjExT5hqepVSlmKlR59hxL0vO02caQ9KzDLyPQdQtlaFBxHouJIcT6C0k\\/NCuUaYoVTmqfMtuNqYdWlAdSUrypWpBStJAKXW1oU08kgZXEKFrakUrLdznn6B09fZCBOWZJ3e0n4kwKVkCTnkMyfHSf0w0WsrPQBwHjx7MscAAfE841MWrWVnM+gcwHQI36fJ4cGFXxpfXpjBNyS3qPgZhjUDJT6WipEle+Jjztq0VsulJQ0Zuz5bEUJGYdc2CtQLZS\\/q6BVq5h6e7v9XTE275Ppgl+p1oV1TFSfkQzWce8Rq9XpaZUkIfesyxFKsi35Z1CkpcShq4KfetQllKKm3ZWqtvNDZu6y4njmoCm4ZnTnCHJ3s5Bm9te3N3QP\\/wDWQ9a27S8TDA1PM\\/iORKklSJTPPL\\/i+bgdir1TK2BrpbW97RtG0o7hEjZtLoDasn7gqwddSSBryNHbD72YPROv05W78UgxEe5dnFMUvDTBfBqTmgmYu67qvftal2llLoplm0z5mpLU0kcZWfqV1zkyyg6wXNULabjLoiTXpN3CatiGilMuqMvbdKlZJSAo7Py6eBqM04nVyGsZeYkmHc88nJbV3KBMQZeV1xYOJmmfeNIlpwTVGwnt+3cNKaWypLIm5GXduK5ApBIHlctc9x1ekzMwU67qKVLtha2WJeOM9jNLOPvKjFRUO3pmAZCdnTdPoJdpjCKSwjNYpzt1+qrnGk+iVCWWoA5HDHUGPZwUDZYJVJCJnEEzLsaaLKJhfnrqrE5sipKTSw4bWHapBsVJtrttOW29WQ4R5sqy69v4aygGUDdzgulY\\/wAQx2apWe4cPf8AZHxtny5blZuZIyMw8lpJy37NhJOYPQpbqkkDiW\\/RH1qlao6+aPo7UFBc2vW4bSlCe4gZlexSiPV6hx7MKzOq\\/igJ9mp95MUWrLcOPuHf46IkF\\/JsME\\/1RNPypYpTsspdMwBwju+55OZ2YcbRdt8iXw4o8kskgNLmbcuK9Z1pzeQqlhKUZqK2495OWZJ6yTE5n5MPgabM0R8XMdp+WEvVccsWhQ6U6pjLyuyMJKWaZTJpEyoJUsm87nv+UW0grbZNPbe2pddcYZlezunGoYqp103aki5UHTwAlU5mT\\/4lTAPcfC+fRmO2qMvp6Lau2J5FoZ06XF7rCR3XuQQLGTPBBBHVMWHBBBBBBBBBBBBBBBBBBGPmlVgxJ6RWjbjpgdMssuLxPwuvG06WuYVqNSNx1GizSbXq+ZW2gOUS5E0qrsl4hnbyLYfQ4yVIPlszUtOUqdm6dPy7spOyM0\\/JTso+koelpuVdUzMsOtq85LrLyFtuoP1Vpyyz4+tTHm28rngP\\/Y8coRpGWjKSiJS3bsu9WLVppYY8mkfmTFRhN6PylOZ1EIbkaFcFUrdtMIZAYb+ZVNM+YkZ0TttpXaSlHrLaLlh96nzCgBcomEiYlidL2Qth8A3sFOgW1iIYql7plZoAWBXLuHS5zDtGhffYZXeYuRax366Uq4KSesEQslQV2jiPiOr9Eca24UbjvT0dHX3w8B4EHsMc3qTl8OB+fXyiEKTbvHD7+vhaOZpNUnaLU6dV6c+uXqFJn5SpyEwg+fLzsg+3NSr6P3TT7Tbg\\/wAThEvLCPEZFwW\\/hzirbziUip0+173piAtSky8w8zJ1hmVcUQlwKlpg+TTCClKkusqQpCFAoiH0lWY35A9HdEhDk18Rvut0fzaUy9r1HDW46jREtqJLholacXX6RMLVvBT5VO1inMpOeozTEIzCdTLlfyqMPrmsL0HFMqkiaw7V\\/N3XUCym5OrJQlLylf8AZVCUkW27\\/VVMqKSLqB6F8natplcR1bD7yh2FcpweabVYhybpilL7NKTb68nMTi121UGEg3ABTKJx5wvoOlDo2YpYSzjkoii43YR3JbElUJtovM0x68LZmWaDXkthCj5RQ5+akK3KOIbUtqbkWHggrQmPLytJmqWPiNOW1XpR6m1aQqNVtOuU9\\/JL0lVpCcck35J5OeqHpeqyXky95yUF6utlkfTy0U7tFy4S0yRdcLk7as7OW\\/Ma25SpZChUKaoJzP0SJGdZk0HPeuUdI5gIF\\/Lc4BzGjrykGMsxTJF6n27i7OUrSAtF5xKUpmV3+uYmbvmGtlkkNtYoUy92m28m3G2WWElJCkuLsvyeMSt1uTqFKccSE1yjy9VYRqkNzbKEszraRuzpL7ZUNbCSURoDHm1eiGXUleU3lZmZp7iiNVNOZnJVw77JHZrINrXeSN9hGOQOe8fohZK+Y7uvp7vdHC06ebqEhJVCXILU5KsTKMjrZJeaS4EKO7zka2qoHIhQUk6qo5NKgrqPRFmutFJUlQIKVFJHFJBsQfAix\\/VHPCk30O8H1gw8QtSDmD2jpHQYdocSsdB6M9\\/o6RHGpVlx3j3QqDwIPWDGKtvn6jDfpI7x17D1raOTSvLcd49sKg57wfT454YIeG4L3H8bm9PXDgKy3g90MEEaH2+73e33R6QFap38fv8AmO+HaV8x9ffCgPOPRDVKgd3A9HNz8\\/wi8KI4eqPIQQRoYdhfT6\\/s8dkKhRG9J9IhoFA9R6O7pi8EjgfXwhCkA7tO7gflDZQDqND17PVHIIeB3K3Hp5oXByyIPYRHGhYPV7vX35Qolak8D6OaMdTdu7x3e39ceZiNFC469R61jlkPcyx\\/xh8R3eowuFBQzBzHj1RxSXkncfNPXw9fN6YXBIOYJB6obII3iDKFapPq8fh7+UP4IbJfPBYz6xx9I4erLshdJSR5pBHVzejmjyEEEbxF0EEEeFIO8evr7Y8gGfNnu6IvCyOO\\/wAdPfnFkEIKOR9vXyghULB47u3v\\/RF4POD6RDeDMjgcoQQRvEEOgpQ58+3xnFwc6R6obBZ58jF2uDxGXtA+MIKUngPh8IIc6yTzj07vfF0NgQefv9UXZkcCR6YSW+R9vXjB7+uuUONZQ5z6d\\/vi7XPQPb3w2C1Dr7Yu2h5x8O+ElCu4+v52jzKOQ6\\/VDnaDnB9\\/dBrp6x2juzhvrp64rrJPP8PfHmU8j7ITkT36+Pdz+3mfU5zHSPWIrDbMdI9cVjyPMg5+7w69Y9biCG8VzPSfWYIMhG4\\/ZxHf0QPUvFcz0n1mG+Z6T6zBmek+swQZDz6069Q9S8EIZnpPrMGZ6T6zBBkP6Xx7vl7h6l4IbwQQdn3+774XzHSPWIprp6fYe6ECQOJA7YprJHP8fdBYncCYMg5n3QvtBzA+7vi3XPQPb3wjrp64ptDzD490KCVHh7YUEp5e2\\/jx64c4VKlHnPu90UhErUersimZPEk+mPQg8SB749AtwA8IVKkjnHv90Wlwcw9cJEgc\\/f6otKwOAz9gPxhQQONzHsKlSjz5dnjOLSecn0k\\/GEisnhkPHXu9kWZk8TnCgANwghUrA4b\\/AB0\\/pi0rJ4bh454sghYQT3ePyggOfPnv6YIIIWEAb9fhBBBBFqikDziAOvn9HPC4IuihUEjMnIePXDdT54IGXWePoHD159kIkknMkk9cELCCd+ndx66tCynzwQMus8fQOHrz7IQJzzJPaTCKnkjcPOPVw9fP6IblSlEZnsA5ubcIUEk9w5x7dKdwueuP2DSF1vAbk8enm+OcNySd5PpMWFQHWejv6ITKirLP0AfCH0N+rvPHwEeAKVqTpw6+3wi9S+Yb+vo7On3dsJE85PpMWlQHcISKiePqh4JA3e3jDgAG7rxi9S\\/xfX3fbCZOW8n0+OeLVKA3cT0c3NxPwhIqz3k90e9WhaUk79B8eucXKXnuG4e0witwIB51cw+J6oTW8N4Tx6e6GxPOT2njDiUE7+6w59e2FFQGide\\/refdFylFR3n0dHj9EIqXzD1xRSs9w4e+ElKCes9EZCEbrjwHz68YEo4q9nz68YqTlvP6YSUoq7OiKEknOGy3hvCN\\/wC66OwfH3xlJTbXefh1zhyL3HAjcN6iPQOs93r62hOeZJ6yTATxJ9MIqUT2dHfDgSVeHOCGlTkJKryM1TZ9hExJzbS2X2V55LQoZZhQyU2tJAW04gpcacShxCkrCVJ710HdLGq6I1\\/MYTYj1SafwIves+U0K4X3iVYdXBNvISKsHSAGKNMO+TpuiVSUMyZ1bokG23BVZSpdIKVluHH3ePHX87cVBp9y0qZpVTSSy8nNDyT9LKzCQdlMsqI3ONKIKQrNLic21pU0taVMVWjUfE1EqOFsRSxnKFVkBL6E5fOZKaR\\/Q1VpzigrsZ+TcsttWVSHm88u+hxhxbZk+EcVVXB9bk61SZgtPyzgK0G6mn2VWS8w+2CO0ZfR+TcRcEiy0KQ6204iavZN5N3JINJcdYXPMstuKWhQUidllAFqfYUnNCkuApKyhagFlKkbnkx9tru9KfV9kRluTP0zK1atbpWi5izVgmqUsBvBe7Z15Zbqkg2HCzYs6+84Q4lLKCm1krUFqYD9sLKVy9Hl1yQqBX2K\\/Tmp1kIS4MmppgKzXLvDVK2zmdbUVnrsrzzU0rjra6U\\/J3a9sqq2y7FM3Rp5CXpNeWaplSZQRKVKnTCleaz8tfNlaeCVIdZKlKlJtt+UWpRaSpf0wwRjCl44oUrWqYQkrAanJQrCnpGcSlBdlnSkDMBmS4y7ZIfZW26EoKlIRnToq4oSUnU6jhPeCZOoWjfLcxLScpVGGZynfOs\\/LCSmaPOSs0h2XfptyyazJvy0wlcu9NIZaXLkVGZMQ5OVZ0GZ3QW0oa9alFk5tWDOIqJu+sF6u+VPJTbk1MhNYs+YmSCF1Wwqq+aK4HHXZyaoL1tV2aDa66hpMlNqafYeafYcWy+wtLrLzS1tutOoWlbbrTiFhTS21hK0LSpJSsHI5Zg9+aYOjpReVA0Ha9ZqG6e3j9hkhVw4d1eYSy07LYg0mRe2FPfmllpUtb2J9IZdotVUT5DIVR9isGWnHbXk0K7a8j7aj+FeG5nY9XpoKreG2JirYEmHl3dnKOlQcqeHg4s5nHKepfnci0CVeZOOoSluUpFooLyg9nnnTCcU01gdoVJROobTumSkJS6QBYInUJDSybATbTBKiqaXHn6uOFZyG5I9vWe6EFKy3Djzno+2ORrVLqdv1Wp0GtU+cpNao1RnaRWKXUZd2TqFLqlOmXZOekJ2UeSl6WnZKaZel5mXeQl1h9pxpxCVJjiCQBmY6qDZBIVe4JGUixuNNR48PbyjjFKNfSG7gft+XPfHJUekVKv1ek0GjSjs\\/V65UpGj0qQl0lb87UqnNNSUhJsIAJW9MzTzTLSQMypwAcY9NDATCyk6POAWFOEck5LJpmE+G1s2pMzzAWmXnpm3aJLy9arato224V1eotT1XmVqaaK3514llBOoIMnI0YEKx35QDBxM5IKnbZwien8brmUk5CTTYPk71nPL1s0rQvEifsqXdY3l6VcmE6pSlUTmsfrmFuYY13ZuhubrwZt2VO7f8563lw3jd\\/uSzUDmct4G8Exz3tzxO1SZdLRcSW6TTJusTLd7hx5SFCVZI\\/rhSwsIG8iaRa4UIvDZJRlTKpiaykLnpuXprCik3Q2gpcmHAeKCp1vMbWBYUNSCBrGxXxGkKPIYj4r3M4uXo1Ep11X1W1goUZOj0eTnq5OoQpxaG\\/1nTpZaGwtaUhDQ1lpSd3n13zeVYxBvW778uBwP129ror921p7NRDtWuOrTdYqC0k5ZJVNzjyk706oKfTLY5XfGFOGWhzdVvyk0JauYvV6h4cU4NPBE0imPOruG6Hw1mVOSMxb9Bm6JNnIoSquy4WvWdbQqIXSpYTtRlJYZFK3kqc4b2m83Hd2f+9oVnGi8h\\/DC5XCmM9oFQQTN4lrSafLvuAZ1yVGaXNTcw0sAANzdRqTzLoG92nC4slN5Nt6q6F1ej0BlVmKPT1TTyEk5UvzxSlttadxUzKSrS0E3smaUAbqUI7WpEuJKmSbKhkpLIW4OfaPEurBz3khSyneeA6BDwnMkn9A6PRApWZ6t+Xs49Z+ENXXDvQD\\/AIxH\\/wCSPj17uGYjrckuLUo71qUpXio3PvMc36rUTxJJJ8TrFFqU4oIQCcyAAkElaiQOAzz\\/AHI4n3eqLoA4DL0ZtC7RowQmJJ2mVmycJrYRdkg+EJdlr8uGWN2YhIUlKU6gF716vqQhWs6hCkpdcccC3HPOs5L\\/AEfzpN6fGjFhO\\/IfOVAm8SqVeF6SzoSmVcsXDdD9\\/wB3Ss2tQU0yzU6Jbk3Rmy7vmJypSsqyDMTDCD6jEXnshpmVuq1ZSfrqap7CrcEATE1rxCiuV3aApN9QAJZhuXsZiYI0ASwk8ybOOi9t4s0fA6jdBBBBF1RKoIIIIIIIIIIIIIIIIIIIiM\\/Kd8AilzRu0oaZIq1VCu4E3lPpaZCUqT5bf2HLCnEBLylLScTCrabRpKGGQ3slFXlEuaNa\\/K26Pf8AZJcn\\/pD2RIyTU5dNsWkrFeyFFJVNN3Lhe8m71StPzOz8uuKgU2uWiyXgprUuB4FxlZTMNRXG1JNawvWJFKczxlVTMsLEqMzKKTMspRa5zOqaLO43DhBBBIjW1eX86p0y2BdSUdqjnnZPaADvWElHDRR1G8ebalQO7gejp93X4zyVQ4UHpTzju64ZIWFDMbj7s+uF0qz3Hj7+6OLFoFtBpxH29bvhWJHA9dc45IKCgCk7vaD8CI2PcmXiUbWx0qFjTThTIYl23NSbKC4G0fdBbDcxXKW6sqzC8qWm4pVLeaVLenmdRZI1Fa1ELKDmPV48eyPucPrzn8P74tG+qSc6jaVxUe4JdoqIS8ulzrM2qUeyyJl5xptcrMJ4LYeUk\\/WiG46w0jFmEMRYdUEqVVKXMsyxXbK3PIAfp7q77wzPNS7x1F+zI0veN9hKsrw1iaiVxJVkp1QYefCPrrlFLDU60N9y7JuPtaA\\/XOl7RO10MrxFLvqtWhMPFLF00jyiTaUcwurUIuTKEo8\\/JBXSpiqOuLRntPJWNYZp+i1O\\/KdtHdu48GsCtKCjybZqeGd4VDCu8Xmw6ZmZtTECVXWbanZpRBYTI27c9uTtPaCS0+qcvoBQfR50plXhRiBKSFXsDEqhTBm6Yp2g3TIvNgoM9RJ9EtOlOqclAT9LmlNKTvybmcuffst05MApHS20OMecEJVMvPzeI+GlTXZbuuz5Ob5oyGLtw3n1OvZNiUavKjUCafcDjOtKpcAfYDm0Txf5P+LXMOVinedLMuKFWQ1OIcuhTdNqKly88hSFa5ms86opOiHOzvlUAT1\\/tRoqKnKPuy4DoqVPDsutHpJXNSgQ4wpC06ZXUCXSCLlSVKtmFxHm7YV1jyu3BIuK1nKVMusZcV+TvlUxLqPSnWW8yj8VLGrnkmO0wc8iD1giMZMM56YpF0zVGn23ZV2cQ\\/Ivy0y2th+XqMgtxYZfadCHGXmtnNSy2XEJWl5QbySrzVZHIWpHDhzg8P09cfQivS3m1SfIH5OYtMoI3EO3K7HcR2oXa3C0cSTjfZvqsLBfpj17\\/wDzXjkUr5j6+Y+PVCoJHCGaFhY3biOIPGFUqKeO8e0dOXT2RolIvu9nD1Rikcx7YeBQV1Ho7unnhZDikbuI6D3+PZDIHPeP0QqF9Pr+zx2RjKb32FxxHEde2Gykg3T94+fW+OSSsKGYPaIVCyNx39mWf6I4wHLeD6RDlDwO5e49I4enohgoI3ajl1v+MAUDooevrd8IfAg8IUC8tx39fOO3phqDlvB6uI90KBY5x3d\\/V8Yb669\\/zMeFBGo1HXt9UOgQeG+L0rI6x0Hx7OENQeceiFAvpHq8d8BF9CIRDsKB7ejxx9EKJWpHA7ug7x47MoaZ57+MXBZHX2w0W+Wo5Hq3whBRxSbdc9\\/xjkEvJO4+aevh6+b0wsCRvBy6wfiI40LB6j28\\/Tn+jshRK1J3g5dW\\/I+jhDKm7cx3G9vb+v2R5mI0UL\\/bu9RtHKJeUPrDWHTwPqyyPs7YXS4hW4HI9B3H7fRHFpeH4Q9I3+sc36IWCkq3gg+OjiIbII3iDKlW7Q9cPlpHIwQyS4pPA7ug7x47IWS+DuUMusbx6uI9seQkoUO\\/wheCLQtKuCgern9XGLoITBBBBCSlJ4ezSCCK5npPrikEJ7McD17oIv11dR8dWUV2g5x8e6E4I8yK7j13wQtrp7PR3ZxXWSece73whBCcquR9kEOMweBzghvBmRwOUeQQ5zPSfWYMz0n1mG+Z6T6zFdZXT7o8sOQ6\\/UPZBC+soc59O\\/3xXXV0+wd0N9dXT7B3Qa6un2DugsOQ9ggsOXXQHshxrK6fdFMz0n1mENdXT7B3Qayun3QWHIezrkIIXzPSfWYpCGZ6T6zFMyeJzj0DkPZBDiKayRzj3+6EII9seR9kELa6e30d+UW7Qcw+HfCcEe5VHh7evsgi\\/XV1Dx15xaVE85ikEehB4kD3wQQQQQoIHG5ggggghQAG4CCCCLVKSniQO07\\/AEDiYSU+PwQSek7h3n2R7HoBO4GF4sU4hPEjPoG8+ocPTDUuLVxJy6Bu8emEypKd5IHjo4mCFBHEm3XP9cLqeUfqjVHSd59WWQ9vbCJJO8nPrJ+JhBTw36o9J3eoc\\/6YQUtSuJz6uaFBBPd49fG0e5kp3C\\/f9\\/3Whwp5I3Dzj1cPXz+iEFLUvid3QNw8ducJFQHP6B498WFajw3dm8+OzKHktcbes+rcPt98eWUrfoPd7OPWsKKUBvJ3nmHH4CE1LJ3cB7\\/TFmeW\\/hCZX0D1+O6HggDvPP7oWEgd55nr7++LyQOO6EysnhuHt+yLM+c+nf8AGEyvmHrO73\\/HKFdde2FgE7ovJA4wmV5\\/V3Dp6e7tz9UWk57yeriPdDZb3EJ9fN6OOf8AxvgIUATu9vs9nq18YXlSnVWp5db\\/AF\\/GFlLSgZk+jnMNVuKXu4DoHxPj2wmTnmSeskwmpee5O4dPOe6HUN8tTzPDr27+EeXUvQaDreevdFxUB1no7+iEiSeMWk5bz+mElKJ3cB44xkob5e0\\/Z14ndCwkDvPP5couUvmHr5vR0+OmEycsyT2kxYtYQN+8ngOeGillZ37gOAHAQ+EgbvbxhUXuOlW4bhz9J7ejshEkDj9sUUoDdxPjjCJPEn0w4lJOp3fHrnB1bh3\\/AGRUkk+4dEJqXlmBx6eYH4xapeYyHDp5z8QOqElrCBmfQOmHQNwA8I9395667oqpQSMz9pPjxnDNbhWecJ5h39Jii1lZzPq8ePbCSl5Z5bz6\\/wBJh9CN3E8+XXt+EOpSB48\\/lHyd326a5Ky8xT5h2nXFR30T9Cqss87KzUjPMONvtbKbYWh9nN1ptaHWloclpltqZbUlbZC5AvJw6bb2NtpO25eb6ZbGLD2UlqbftKWppl27KKwpuSlb3kpUaiUzC31ty1cblxsZGtuBxsSdNrdPlU6IFKCQVKO7x6yfHPHz1Puu8cHcQLcxyw1mDJ3RaM229UJQKc8kr9FKdhUqZU2WlJM1JTkip2Tn0bliVUiYlnG5qRlnUQ7aTs5pu1LCb2G5wMtVaUD81hipvCwlag4kdpT5hwArRTarkQ0\\/a\\/m0wmXnUIWtjKq1NlO0ScwBiBqYKnHaNOluXq0mk37SXKvRfaSqyRNSqlqdYJKc5LsupaG5lxYnGS081NsNTUu4l1h9tDjbiDuU2sA55ZDeOBB1SD5qvO3x3fgTitMYUX9T6y6pxdv1EopV0SreurXpUw6j9dttDMLmaW9qz8sEgLdDcxKhSEzKlp1i6KGkhaOOWG1s3za8yFUK5WdV2mvzDbk\\/atysBtFWtmqbLINzMpNKCcyltucadk6rKoVJ1Nt5zL7yk9CP457o+VMs5ijZVjmVqEmJikYkwnWQ+x26SlxickJgodlZpq4S42rK5KzrBJafYW60czLvpfRkopeKKKQFNT9JrEikocbV6D0tMtpU060q2ZKglSXG1ZUrbcSlVgtNhrR+UHaCcvhfihSdNPDCnsqw2x1qTVOxNapjYck6Fi07JPT0rcwUwAwimYmUaVdqDj6AtCrrpNbnpybMxcsgzEbEkk+4dEeizh5SLE0wtHHFLQ7xmb8tpNftKcpdMmdZtU9LUlTrMzRKvSdqoZ17Dy55el16jKd2jCfJaY0tpyVkZltcA\\/SDwBxF0csdb\\/0er7pjgvqxLsetd5uTZmFNV9L7jTlv1uhNuITMTNKuqlzlNrNDcKEuzEjU5XWbS6pSB9j8O4qpG0PCdB2h0IJakMQywVPyZczro9cY\\/J1amvKAF1MzKHShwpQJhoJmEISy81m+cG0vBs1g\\/Es7IuoJaW8pTTiU5W3Av8o262NQETLZDyUXJQ4XmRqyQJRXycXARqg4S416SNUlECp4hXZJYYWm+626mZl7XsaVarFxzcmvJLLkhX7kuCSkH8i8sTlkFP63CT5Rtu0rroE1XbftNhwFukSL1Vn0pOaTOVNSW5Rp5JH7LLScquYQQDm3Uc8xxR2DoVYDy2jBopYG4IFpqVqFiYf0pF1KbU3sHb3rQduW\\/ZtDqCW1sTF4Viuvy6td0hhbadu7kFLwqxRveUrlz3letRmm5SkiZn6gqdmlIaZlKDSmC1LPvrPmtIl6TKNLeWrJIDalcdx+cflCYuVVl1BEs4XTX6t5vLJQMyl0umlsM5EpuQpwsyAKECyi65vJIV0bspoIp0rJJdQlH0ZIdvMFfohM7OjO7nKgBZAXMAKV9UNotYCyYqHLf4x\\/dVjtYWDdPntrTcKbPVWazKoATsbvv9bE64xMEZF4y1p0y15qW19YS3zxNoa1S\\/Ma2nuzZTaTUzOKHmsNBlBPAreJKiBwzShBB6nPX9bpDYtTeOOOWKmLU1twi+r1rlbp7MySp+RoLk2uXtymLJJJVSrfYptNT1Sgy5iWVuM+R0eXJA2s3rTSsgBkHMg2Tv35tJQR0kknLM5\\/RvZxhH8Xuy3CGEezDU1T6LKN1BKQkA1WdCqjWleiPqqqMzN2JuSlSQVKOp5jxrWziDEVbq4JUifn3fNiSbiTaIYkwb6+jJsspOgFxYJAsmOfdc1fNT9bn6vtPs9UNCQBmYqTxJPWSYRUrWPUOH2xIkI4e09e6IiAAPiecSwPktWj4qt4q6RelDVZALk7EtGjYOWfMzDKXGl12+p9q6bum5BxTZ2NQolDtWgSD7rbrT3kF5vsALamngZq0ah+Q40dzo6cm5gTJT8oJS58YJOfx+uoBKUKemMUG5OdtJTjYKltvs4ZyFiSE026S8ibk30LQwQWWtvEdYYMpv0VhumSyk5XXGBNvi1lB2b\\/AC5Sq35zaVJZ8GxFgUpjzeQYSRZTie2XpY5nPSAI5pQUJP8AawQQQRKI2MEEEEEEEEEEEEEEEEEEEM32W5htxh9tt5l5C2nmXUIcbcbcSpK23EKSpC0rSooUlQKVpO7zYeQR4Rf5aawda9fGPLv09tHp3RS0xNIDAtEq5KUay8Qqs7ZqHNZRcw\\/ubY3Xh+4pw\\/srxs2uUVE06klKJ1Ey19ZpQGJiFhYz4EcRzjvHjjEpn5Tpo6fMmIuAmlPR5AiRvegVHBu+ZthoNstXHaTkxc9kTc2tIG2qFet6rXPIJWrzxIWVLN\\/UbREVoEpOYJB6RHF+MqR9B4kqtPSnKyiaW9KgDTzWZCZiXSDoCENuhtVtM6F8bgVZUZbzSdmGLWShwlv+5r9Nvu0QoA24g+EcmlfAK9ff47emFQSk5g+npHdDFDoXkD9bgBzHs6OodsLpVlu5urmiKKRfUDXiOHq6+\\/CiRzyeGKCsQtHej0SemA9WsNKlM2VNJWoF5dHaQipW1MFvgiWZpc4iiS\\/++CiPj6yV5SYdF68RduElEZfe21StV162J3Wc117KQDbtKWUq85LXzRNSEulw+Ytcu7qndqtQheTQxS+4\\/G2oWJOTYZpGJ9DckmG1OBtsXRbiJiq0Z1SlDMbSmruCnttAoMzNT0ojXWpDaFywtDS9DRr9qloTTykyd30xTsmlS1lKazQ0vzjQSgnVCn6YuppccBTruMSrR2v0YT86dpFHOA9sVXbbQGabiUCqygULNBFWUXXQkCyUBqsMzbDaUmyGClIyBWWO2MEVX8LNl9OdUrtJ\\/Dx+jpm5uu9OShtBUr6yiuluyz61HVbySSSUlUQxOWY0en9FnlGcY2KVTjT7UxMrMpj7YOzlkSMm\\/TcRJqZqtwychLMlTDFPo+IUredvSkuwEsokaYxlLMNOJlm8cpOcanZWWm2VBbE0w1MMrGR1m3kBxBOWY3pUOHD2xKO+U0aMovXR\\/wAKNKahSO0rmCd2LsS95qXZTruYeYlPy7VJqFRmdmVmXt+\\/ZGk0umslbaG37+nlbyuIleFtXE\\/bokXF5v0h9UtvOZMs8VPyys+YAqeYQn8VgZx3vgquIxhs3w7WS4l6dpaVUKqKScyhMSQbYQ44q6vyjzCZSaVe3pTlrWtHLGOqSaZWptCUZGlO+csaG3m80S4kJJ1KWnc7IvfVB1OsdpA5ZEHrBEOW3QcgrcfxuY9vQfZDAKI7PHCFQQeEZqkkd45\\/PlEGjkQct4P298KhYPHcfZHHIcUjdxHQfh0Q6StKxuO\\/nHOIQUg7\\/bBDsKKeHqPD1QqFA9R8cIZhRHWOiFAoK4ekc8MLb\\/WPt+\\/1GElIPjz63w9StSOB9B3jx7IcIdSrcdx9nrjjwsjdxHXx9fGFAQeB9HPGOpvmPWOvVr6oR6SPD2j7vdHJAkcD6OaFAsHju93rjjkOqTu4joPw6PAhwlxKt2eR68uvgeBhooI7x3b+HXHnHt0q36H38Pb8e6HgOWRB6wRCgX0j1eO+GoUU8PSIvCweO4+z7IRCSgjdr8fZ+uHQIPDfFwURw9RhsDzg+kReFnn3+zx6oCOBHqMJh0Fjn3e7v98Xg84PpBhqFA8\\/oMX7xv3jPnhBQOBt74QUA7tOuuMPEvLHHJXbx9cKh5J45g+sesb\\/AGQwCzz7\\/Z49UXBaefMejuhotb9PWPsH3R5Zae8e37\\/ZHJAg7wQeyFA4sfhE9R3+\\/f6iI4wHnBy6CD8RCodWOfPthooPA390GYHRSevXu9scmH\\/xk+kdx74UDqDz5du728PbHGJfB+sCOzfCgWg8FD07j6jlCSCN4PXfBZB3G3r+f2e+OTBz3iCOPB5wfSD3ReHVj8IntyPtO\\/2x5HmQ8CD164ewQ2D550g9hI9+cXh9POFD1H4wR5lVy+34QtBCe1bP4XsI94i7WSeCkn0jvghNiN4i6CCCCCCCCCCCCCCCPLDkOv1D2QQQQQQWHIdfqHsgggggj2CCCCLdZI4qSPSO+CCLoIT2rY\\/C9hPuEWl9PMFH1D4wR7YngfZC0ENi+eZIHaSfdlFhdWfwvUAPaBnBHuRXh6\\/leHhOW8wmXUDnz7N\\/t4e2GeZPE5xYVoHFQ9G8+oZwQrIBvP2fGHan\\/wAVPpV3DvhIuLP4RHUN3u3+smGqnwPqgnt3QmXVnny7IUEqPC3jpBdA4X67\\/sh0SBxIHacoTU8kcPOPVuHrP2w0JJ3k59ZMWlSRz59m\\/wCyFhu559w+fL2QZlH6otw8N3qhdTyzwyT2cfXCRJ4k8ec8\\/pMJFZ5hl7+72GLSSeJh1LduFveeurQZCfrH33PXthUrSOknqyy7PthMqJ58ugeBv684TKgOf0CLCs8272+PVDgQB3+Py6PfCwkDh6+MKEgcd0WFfQPX47oTJ5yfSYsKwOG8+z7YVCgCdwi8nPMk9ZJiwrA4b\\/d64sKirj6BCKnEp3Z5nqy6uJ4CPQL7hc9da+6FZQNVH1db++3thUknifRzQit1Kdw3n2euEFOKVuzyHQPRxPE8ISJA4n0c8OJRffqeQ8Ot3KDNwSLcuJ9n64vUtSuJ9A3D1QmVAdZ8cYsKyd3AdXH0njCZUE8fVzw+lvdf1Addc49COKj13nrxi4qJ4n0cw8ZwmpYHDefZFilE9Q6ITUtKBvO\\/mHOYyEotvt4fOHIuJ5z64QW8BuRvPTzDs6T27tw4wktxS+odA+J5\\/d1QkVAcfVzw4BwHqg66vFSc8yT1kmE1L5h6+6LVEq7PZ+mE1LA4bz6Mh292Xvh1KOJ17uXz+EHXXXsipIHGElKKuodEWkk5kn0nxw9UN3HeZHpPd46umHACT8Tyj0Ak\\/E8ovW6E7hvV0dHbDVSio5qPr4D7IoTlvJhJSid3Ae\\/f3+Oh9COXrPXw\\/XDwSB484qpfEJPUT09nf6umEVKCBmfQOmLVuBA6Vcw74aKUVHNRz+A6uYCHwAN0e9W65xctalnM8OjmHjxzwgtQIKcgQQQrPeCDmCDzHMbjuyI7Yopee4cOfr+yEyQBv9HXDyEbid\\/AfPrxhxKNxPs+fy\\/VHc2hvpFzGibjMik16c2WBmK0\\/LyVypdLhlrPrW5mnXUykZllunLdSxVwgATNuvPOFqZnaLIJTLRsy6E1qmtIcebmJuXbbUX0uoUidlVgKYm0KTucCkkBxSSUqzQ6VFK0RCrr9Ilq\\/S5qmzW5LyCWXcgTLvozLL6RuOba8iQCCtsrbJyWTG43kr9LCfr9CXo\\/3xPf9\\/8AhXJ\\/96kxNzAC7ow\\/ZWiX+akbTVVMTlrIcYlm1BAU\\/b0xSnm21rpU9NL5b8qHZSnEtFVtGo8sDWKQ2wxilppHpTkkkIYka4QAFKclQG6fVFALKpYSk2sIRKPrX1x5O20ky0wMD1h\\/9jzC1uUN11Zs1MrJW9TwSbBEz6b8sLpCZvtm\\/TXOtpTIism9avYV10O76GsN1Khzzc4ylR+hmGiFNzchMBIKzKz8ot+SmQkpUlh9eopKwlYyD0odATC\\/TS0gNC3TeoLtMkl4YXJS57FGnTMo2+q9rPtdqqXVZFMnmQnyabrNoYpSElbNVl5lssz1sXHW9tNPMW7SKZOYeSlQYnpVicl81MzCAtBz35jcpChwC0KCkKTrKyWFpjN3RJxoXbdRnMLa66VW\\/dry36C+4taxSrlQkKTLJQSUok66mXalyEj6Kptya\\/MTMTb4oXyetrK8FM40wDWJpUtQsZ0WqiluvKPZUbGrFOdbpE2b6MtVNaGaXOOAAdqmmuOrbl5Z1UXltawLLYnpsnVmpYPztFfYmHW0\\/XmqY08l95sEWKlyxCn2wCLsrm2kpUt5IjLHHW6vuSw1uCaacCJ6rNJt+nqG5XlFUC2pgoVn5rjNOROzTY\\/3xjPIjMCNPypGNSMHNDrEVMlOJlrjxPEthRb6NbJ1abtbmBdC0hJDiNjZUlchbfbz2M49IjXSpYjd9pXXcmfuOi2fLPZtUOUVU6i2FDVNSqiUqYZdTu+klae2082VAHUqR3c8QxOW5xsF2432NglTZgrp2EtsLrVeaRkn\\/vuv9uRqKWHglwh1Mjaklb0zKLUhtba67PtoSEL11Y2y\\/D52obfsLUx1Afo+FXE12phIzseb0JaJ5YcSSQpqbrC6fSnrmxbdG86GtcS1D8FdmlUnEns56tjzCV1yqzVBJYSpKt4W1IImpxojULBII1UNK0nLqm5piWTxedQjd+Cknzlc+5Kc1HqEdypSEJSlO5KEpSkcwSkBKR2AAAdQjry0ZTazr02oZplWilJPM68VJBB\\/ctpdB\\/F1gOc59gKVnuHD3+PHV9V6o6XX0NDc0nXkFLAUf\\/KE29Y3C54xfVdQT+iPedfhaKKVn2cw74yL0P8AAKqaU+lHgRo9UlMyDipiTbdt1iZkklb9KtJU4KhetdaSASoW9Z8lXK450NU5R3b4xvWrLcOPjx+mJQXyXvRrF7aSGMWk\\/WqeHqPgfY0vY9oTL7KikX9io5NNT0\\/T3\\/qLfotiUK4KVUGgc25e9pMqy2qDGdhql\\/S9bptPy5m3plCn9Cf2O1d6YJ4XLLawL6XIA4QuTYMzNMMWuHHEhVt4QPScPqQFH1ROBo9KplApFLoVFkpemUejU+SpNJpsmyGJSQptOlmpOQkpVhOSGpeVlWGmJdlIAbbaSkjo5iCCOtAAAAAAAAABoBYWsBwHICLHGgAGgG4DcPAQQQQR7BBBBBBBBBBBBBBBBBBBBBBBBBGsnletGtOlFoA48WZJSXlt32Xb6sYcP0Ib2kyLrwxZmLgckKe35wM\\/cdrouW0ZUEpAXcJzcaABjzX0qI3cR44R660eYVykujUvRI018e8FpeRXJWtTrymbnw8JCVNOYc3shF02gyy8lthqYVR6VVG7enHmWWmvnSjT7IQks6goXbNRrml11tFwQqmzZA3EFT8mo211vNIKjus2m+oEQ\\/E8r6bE0BosFhw8lIupo31BUUlwcDZAGo3YSA849EOG3eZfoPf46uiGAJHDx2wsFA9vR44+OmKDUkjXeOt8RFSSO8c\\/ny68I+1s266rYt221edCc2NYtWu0q4Ka4SdRU3SZ1mdYQ8lOYcl3Vs7KYaVrJel1raUhSFqTEu7CXE2Wn5XD7Fi1Hg9KTsvb150fNTalKl5huWqaJKa2SloS5s1mTqDGsdm4XpdeS0qiHEh0p3HePd2ePXujfzyZeLCbuwdq2HE\\/M7Wr4ZVhQkELWjXXa1yuzFSp2qFq2znkVYbrkq4dXZSsqqmM6+a0ITyr5U2FFT+GaTi+Ub\\/ZWG50S064kekKZVFttturIBJEtUUSqGwdEideVxIPQPk+YhTKV+pYamV3lq9KF6WQokgz8gla1IQm4AL8iuZLhGqvNmk2NgRKh0gcJbT0tdGbE\\/B+qusKt3G3C+r0KRqLqS+KROV6jmati5ENtr1VzVtVz5rr8qjNxszlNZQpC066VeYrRaRcOF2KdzYdXjT36Lcdv1+vWLdFIm0lExSbntqqTVLqFOmUKIKZmSq0jNU9xJTrBwrBGeer6WmiBfSbhw8mLZmniuo2VPeSNBwlTpo1VU\\/N05ZUo70szCKhJoQDmyxKsJHFIiPjyrvIW4141Y8YjaWGiXV7Nr1Rv+epdz3LgtVp1NoXCLrl6dISFbrVoXJV5tdrVZ24ahJi5anJV+o2omWqU9UxIzU8lyUlDpfJt2o0SiuVrDmKapJ0ik4ilGJqSnJxxTcpLVqXUmXUh10hTUqmaacSpcxMKaYQacyhbiVLSFbfaphCbmlBclLOzUzJOPSzrbSSt5yTcAel3Ut\\/Wc7JVlBtsKWfOFEJKUnLHPSvLceHT0d8Kg84PYRH3OImDeMmC89T6LjThZfWFVfn5NM1L0u97aqtAXNtpUWnnqa9Py7ctVJNuYS60J6nTE3KrLZKJhQOQ6\\/BI4eO2Or2nWJhpD8tMMTTDoJbflnW32HUgkZm3WlLbcSSNFIUQeBjmJ5l2XdWy82tp1s5VtuIUhaVC1wpKgCCL7iIdpXzH198KA84PYR3w1Cgeo+OEXhRHD1QFF92ndw+6Gofoe5l+sfEdw9HGHAOeRB7CI40KB6j0QolSknNJy6eg9ohogjfBHIhZ59\\/Xz+PVCgIO8GGSHgdyvNPsPd6fXCwOW8GEFAO7Q+77oIdhZHHf7x7hCgIPAw0C+Yj0j4ju9UKA57wYZU33W7xu69kIKAd2nXL9UPEuqTuzzHQfgeIhdLqVbvqno5vQRuy9XZHHhZHHf74UCgeB9Hj4QwpvmPWOvVr6oT6Se8e3l6x8I5IEjeD3Hvi8L6fZzxxyVqTwO7oO8Qsl8fhDLrHDvH8ruaKDw1Hsj26VbxY8\\/v68YfAg8DFwURw9XNDUKCuBB7D7+iLwsjrHX39MJt6vH7fjxjwo5G\\/XXKHQX0j1eO+LwoHgYahY5wR1+Of1xcCDwOceQkgjeD13w5zPSYvCyOOR7fsyhrrKHOff74v2h5x8O+PCAd4hJAO8A+MOQsc+72xcCDwMNgpJ5\\/X4yi7MHgc4SUDhce\\/r2wkoT3j1\\/O8OQpSeBIi8OrHOD2juyhpmRuBPoJ+yK66uo9o7soQW766HdvFjw6I5eyPMhG4\\/Z84fB\\/pT6j3xeHkHpHaO4mGG06vb9kV109Y8dWcILXcR4G\\/zg9Md+7l+vuPRjkNoj8YeuLsweBB9McfrJPOPd74rmDwOcJLfeR4jw69Y9ZnVxT8Ry8eiI5DMjgcou1lDgpQ9J7447M9J9Zi7aLH4R9efvhPZngR17YM44p+3l3d3uEchtF\\/jGK7Vz8b2J7o47aL\\/GMXbZfSD6B8MoMh7uvVBmT+j7hD\\/aufjexPdBtXPxvYnuhhtl9Xqg2y+r1R5kV3e3roHuv5dH6J69fd8eZh\\/tXPxvYnug2rn43sT3Qw2y+r1QbZfSB6B8c49yK7uuvd4R7mR+j7h84fbRf4ximsr8ZXrPfDDaL\\/ABj7INos\\/hH15e6DIeY9\\/wAoMyeCfcO7r1D1PcyeJzimYHEgemGOZ6T6zFI97Pv90Gfknr2eqHu0R+MPXFpeQOk9g7yIZ6yekeuKa6e30d+UKDXifh1693tgzLPD3H7TDov9CfWe6LC8s9A7B35w2Lg5gfTu74prq6oUGu72nr16cx3QWWd5t67fCFipSuJJi0kDn7\\/VCJUTxMUzA4nKFhu3EDwHXwgDY4n2QqVjm3+7v9kWlZ5sh7T49EJFaRz59njKLdoeYfHuhYQkcL+MKCUjh7dYVJJ4mLSoDiYR1lHnPu90WkgcTlCvshXhCpX0D1+O6LConj6uaEyscwJ6\\/HP6osKyeodXf0wQoIUe7xhUkDiYsK+j280JFQTxIHafGcIqfH4Iz6zw7z\\/J7\\/QCdw9fs6tv14wqyU7zc9bwL++HBJO8nuHdCKnUp3fWPRzekndl6+yG6lqVxO7oG4QmVAcT6PHxhwN+JO\\/Tq\\/wgKydEj3a+zh74VU6pW7PIdA+J4mEiQOJHjq4wmVk8N3viwnLeTDyW\\/V3DU\\/r9sAQTqT9p69sXlZ5t3vhMkDeTFhXzAek+ngO\\/1QmTnvJh9Ldu4e8+PWnKFgAbuvGLyvPhu6+f7IsJyzJPaTCK3gNyfOPsHf6PXDdSlKOajn0dA7BDoAG4evjHsKqeO8I9Z+A78+wQgTzk9pPfFpUB1nohIqJ4+qFhJPcOcEXlfR6+77YTJ4knrJMWlQHWfHGEiSeMOgAbh6+MEXKXnuG7r5\\/shJSkpGZPfCa3QNyd539g7evxzw2JKjmTmYcSgnU6Dlx+6FpQTqdBy4\\/dF63CvqHR3wkpQTx49G\\/wPT74tUvmG\\/mz6Ozp5z0QiSBvJyHOT43xkJRuvoBw63fGHQLaCLiSeMN1ugZhPHPIniBl0DgTv9kWOOlW5O4e090N1KCe3oh0DcAPCAC+g3xcpX4Sjx5+kwipRPUOiKFRVxPDh1DqhNSstw4+7vh5CNeZ9w65+zvdSi2p3\\/D7+u+KqUB1no7+iESecn0xRSgkEqP2n4mGi3Cs9CeYfE9J93Nzk5CUgd54nrdC4ucdKs0p3J9p+zoHHp6B8+3dFz4U3vaOM1hTKpG67Iq0rUApBcDE9JIUWpmSqDbCkLmKbPyjszSavLlSRMUiefaU4hDesOYUrLt8cY+xw\\/wrxDxmuOXsTDKwrrxIueqtuoatq0KDUriqb8sUHyl5ySpkvMuMyTLWsubnH0tykowFPTDzTSVLC1OSjDEyqoiXVTXJZ9ipNzhbTKP099pTU4zNF0hrzd1ha0udp6Fjc7tMuQmJmVnJaYk1PImmX2nJdUuVB5LyHEraU0Uel2qVhKmyn0g4EqGoESltGLHS2cZ8OLUvy2XiqhXnTUzzEqt9LsxRK0yVStaoE4rUaBm6dUGJmQdWG2233pUPy6FNzbZVtn0UbOkzNV\\/Fevt7Gj2jKTjFNeeQSg1ASan6rPAHiml0tWxAz1VPVDWQQ5LbtMXJRckbpkYJy9+U\\/SKqlrYZYW16ep9eti0Za4JK9MQ5S4EsSaZ2oplrefmbRoslUqUpim1J5+5pyrIq1vyrjVCMiUzU5v3xlFHwmwco2G9tLdQirH5tQ9MONKn5uRlXkVCuVKbcYbYbXNVCadlWpstMMtZVBxDCJaWZaaT8n9pOHcN4UxxX3cOVin17D8i8qbpE3KzSJpp5L6G3pKXcebUUuvyankSk06lWR2Zlu1F0u5U\\/QmlY5m8TYQpMhMS8zI1+qNtylWbcl3GOwabKkTswhK0pCUzrTZdbYSCWmH3G1lKm0lWDuKOIdPZ+7zE+65xNOo1OlK\\/eNcm3NZ1FKoVJk5mpzajs0Fa2aXSZUoQEAqU3LZblZZwDsZcTqxjNiviHirXgUVO\\/7urlzuy2trt05ipzz78hSWVHWJlqPIGWpcoCpShLyrWstSgFKlEcsPjmMLdFtzD+nzQauTHKuN2kyhClJebtCieT1u8Z1tQBbWhzVoduTTKiCqWuVwo\\/YlasTenS3l07LSqcyHXUheWeYaTmp1WZ50tpUrjzdMdfeRJglVPwvibaLUGz51iafNLprziRm+iqOtTk\\/MtLAuUTtWdcYeBvZyjosBx5\\/wBu9dQ9VKXhuWUBL0aVEzNJSTZM3NoQGGljgZeRbbW3xyzq73um3ZNuyxlaUxrfXmSqZWcsjk5lsgefINJRu4BRVl0xzKlZbhx5z0ePHVQlKAEJAGQAAHBIHD1cw6oSJyBJ7THXjiy44tZGq1FRG+19wHcBYDuEc6KOYknibwE5Ak9pj0meQv0Y\\/wCxm5OjB1qpyS5K8cb25jSAvFLrOxmEO4iydOVZ0q6glb7C5LDemWaxMSj+o5L1MVAKZYdcdaEBXQP0bZ7S\\/wBL\\/ALR4lWJlymYhYgUtm7npPVEzT8PqCl65sRKq04tbTaH6dZNHrszJpW42XpxEtLNZvPtJV6sMhISdOk5OnU6TlpGnyMtLyUjIyUu1LSchJyzSGJaUlJVhCJeXlWJdtDLDDKG2mmkJQhISABcGymk5nqjWHEkhpKJGWVw7RzK9MkfxkNhhN9+V5Y0ubyPDsvmdemiNG0hpBtcZ12Kzu3oSEg8LOHfHIwQQRdsSyCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCIlnynbReE9beBel\\/b9NJmqBOzOB2JUwy2lbpo9W+cbsw3qMwGZYLalKZVmr2pE5OzUyttc3cduyEultRyflpxinpsaOFM0ttFTHDR7qaJZM1iJY1UkbWnZ7IS1Gvyl7OvWBXH1hp1aJWj3nS6HPzgZAeekGJqWbcbD+sY7iujiu0CpU0JzPOy5cldQLTbBD0vqSLBbqEtrP9bWsbiQcGpSvnkk+yBdZTna59o2QtIHH0rZDbWyjv3Hyzkr5jv6+jv8AfCoPOD6RCtXpdTt6sVW3q9IzFKrdDqU9R6vTZxBamZCq0yaekahITTRJ2UzJzbL0u+gnNDrakkdDRKiOzojjdbRSoggpUkkKSRYgjeCDYpI3EEaHQ2N4rWHaV57j6++MttC3G6SwMxyoleuCoKp1lXDJTtrXjMFp+YblaZUEomKfUlsS6HXVfNlclKZMvutS70w3ThUW2U\\/TrSvEMEHhF6VEcd493Z3RH8QUGRxJRKrQak2pcjV5KYkZlKClLiG5htSA8ypaVpQ+wopeYWpCg26hCwk5QIzqRUpuhVWn1mnqCZumzbE4wF5i2pbDiV9m6EqSVMugFt5GZOdpa03F4mYYSY0bJmSv3B+\\/abVKZUG9RqtWxVJCuUSqMtrStyUm\\/J3JunziWXMg7LTKFuyjwKClh9Pm5\\/Ye6ZchMeT0\\/EiiKpzv0bZuG323JiTUfqrenaQ4tU3Lo1RrvLp788tbpAakWm48+uzLzxNwouNV44NYiV7Du4HVJXPNUx9L9Arim1AhNft+bbmaPVm1qQgrbqdOn5dS20vGVLwDo2d4McrlVaKqUoWk9hy5LtDZsHErDVlU1T3ckIbS\\/WrUm31Lly44FvTUxSKolZU6USdstIRqr4exh5LmNaGHZ3BM8zjGnAFw04BEhiFgXKin6Pfc82qIQkgJcpk0ubfUCoU5g2QOsaDtjwZilLUtiWVVQakpKUec5lOyalEJSMk2hAeZSo5iETLK5dpKhnfVYkTb61RMG9Iaypy37lpFi4s2NUtXy6h1+m0q5aWHyh1DTs1S6mzMGn1OXS68qVdWxLVGTJL0suXcOsNKek3yBmB9+qqVyaNd6VLBW4ni9NN2XcBnLxw2mXikqTKSMzMTBvC1m3n1Fbk2KjdcjKtDyan0CXZCNn8ZglpGWHiVKNXngTipTK8JZLanpu1ay7KVqmJecUlDFapKzJ1yjmZLKs5Cs0+UVNNp1tgtiNhFh6Y100jYyV+Uli6JJOqlVVpwaplbbTkj6RxhKBS58pAIS0Gqa44VFT04omKYo2NMc7Pai7LSM1VMPzku6Uz1Kmm3mm+1GXMiepFQaU32v5v5aW7dsEhC0kgxJq3s+omJZRMwluRrkq6g+bzbbjYmQg8Zafll2WlJ1sh5KFEAKaXa0RF9JTk8NLbRVXOzuKGFNWmrOki6sYk2QVXjh+qVbdLCZyerlKaU\\/bbcwtJMtK3nT7cqTqSFiSCVJVGFQWRx4D2Dx0x6RVj40Ya4jIRL0G4pQVGYQUKt+rBNOq5K05LYRJTSgioEJz2i6a7PS+RALsYV6SHJNaF+kd5dU5zDlvCu9ppa3lXrg+qSs6eemVpWpb1VtxEhN2ZWlTUyW356bnbeFbmSlWxrUqt99aujsJeVLLO9jK40opYV6KDVqES60b2AU\\/TJlwOthIGZxcvNvqUSeylE+ik0HiHYtNSylqos4q6bq8wqiCy7bS4am20hDhO5KXGGk2AKn1XKognAg8PHbF4WRx39vH1\\/pjd7pGchDpPYYLn61gfXLex+tZnavtU+UWxZOIsvLtpU8sPW7W6g9QKmWG\\/oWlUW65mpVF5ClNUCWLjbEaa72sK\\/MMbgmrTxIsu67DuaSIE3QLwoFVtqssJVvS45TavKSk2GnUFKm30s7N1pSXWlrQpKo6Uw5jPCeMGe2w5XafVbIC1y7L3ZzzKTbWYkHg3Oy4ubAvMICrEpJGsU\\/VcP1mhuFuq06Zk\\/SyJccbJl3DoSGplvPLvW\\/wCydWdL20j5sEHgfRzwolakcDu6DvHjsyhmCDwhQLI47\\/f9vjfEjKDw17jv69kabrXXr1xyCXkq3HzT18PX35QqDlvBjjgQeB9HPCiVqRwO7oO8eOzKEEcCPUYOvlHIBZ59\\/Xz+PVCgIPAwyS8k7lDV6+I7x7e2FgecHsI74QUA7tOuX6oIdBShz59u+Lwsc+72w0C1DrHt8euLwsHdwPXw9B4Q0Wu71jr7ISUpPC3hpDsHnB9IPdCqXljjkrt4+uGQJHA+PjF4Weff7PHqhktnuPjv9\\/zhGRQ1B+w\\/L3w\\/DyTxzB9Y9Y3+yFQoHek59YMccFpPPl2+Mouz5wfbzQ2W7c08uj84M6hvHt0jkgpQ58x17\\/bx9cXBzpHqhgl5YO86w6D3jfCiXwfrAjs3wgoV3HrvtHt0HeLfD3Q91knnHp3e+LsyOByhoHEK4KHp3euL8yOBIhJBG8W674MgO4\\/b8OvjDrWUOf4++K7Q84Hu74bBah19sXbTq9seac\\/n16+HCE5FePr+cOdcdBiusnp98NtdPWPHVnF2sk8493vgtHljyPs5w4zB4EGKw3iuZHAkemCPIcZkcCR6YNZXSfXDfM9J9Ziuurp9g7o8sOQ6\\/UPZBDjXV0+wd0Gurp9g7oQ11dR8dWUGuege3vgsOQ9gjyw5D2dch7IX11dR7R3ZRXXPQPb3w31z0D298Guege3vgyp5Dr9XVzBYch7BDjXV1Dx15xTXV0+wd0Ia56B7e+DXPQPb3wZRyHsgsOQ9ghfXV0+wd0U1ldJ9cI66uoeOvOKa6un2DugsOQ9kFhyHX6h7IXzJ4kn0xSEMz0n1mDMniSfTHsewsSBxIHbFNZI5\\/j7oRimskc49\\/uggsTuBMLFY6z48c0Wlw8wHp390I66R0nx6IptOr2wQoJUeHt0hbWUef4e6LcyeJzhErUersi0kniSe2Drrox6EHiQPfC5Ukc\\/x90WFzoHrhBS0J4qHvPszhMvpHAE+z4d8e5SdwPXsHh9se2QN5v13Q5K1Hju6QPgePjhFhUBvUcusmGqnVngdUdA7zmYSz5yfbzQsN8z7IM4H1R7etYdF5I4Zk+oes7\\/ZCSnlnhkns4+uECtI58+zxlFhWebd7fHqhxLe4ges\\/H7wI89NXMD2feR7YVJ5yfST3xYVjm3+yEiSeJ9fjdFpWB19nf3Zw6G78ye7d136QoIHE\\/Lr2QoVKPPl2bosJA4mElLJ4buzv4+rKLSecntJ74eS3bu7h8+ft8YUABui8rPNu6zx8euLCc95MIqeSNyRrdfAd59nbCClqXxO7oG4eO3OHAANw9fGPYXU8kfV84+oeuEFLUvid3QNw8ducJkgcT6OeEysnhu9\\/wBnjfCgkndB118ehChIHE+jnhIrJ4bvf6\\/0RYSBxiwr6PX0+PG+HQgDvPwg90XkhO8+zieyEisnhwPtHjoi0nLeT6TDdb3EI\\/jH4A+njCwCdw9fCPQCd3t5de2FlLCRmT2CGy3VK3DcPb6YSJzzJPWSYsK+j19Hr4+OuHko5C558vl8YdCQO884uJCeJhJSiocMh0cfX0+iLSeJJ6yTDZb2e5G4fjc59G\\/KH0pA7z8PCFQstxKOO89HeeaGillRzJ7BFpIG8n7YRUonhuHv7e6FhJPhxMehJPhzi9SwNw3np5vthInnJ9JihIHGElKJ7OiH0N8vWePXW+HgkDx5xVS+Yevu8ZwitaUDfvPMBx7ezrjl6DQLhu2t062rRoFaui46vMNydIoVu0udrdZqk46cm5SnUumsTU9PTLh3IYlWHHVnIBEbftGzkMNMzG9dPrGI9PpOjpZU5sXnKhiITUL5ek3cgpdOw3o8x85sz7JUQum3nVLHdAbVk4NZna6LEOL8LYQlhNYkrtNo7SklbaZuYQmamAnQ+aySCqcm1Ag+hLMOq0Po6GNnTaPVKw72NMkJmdWCAostKU23fcXnjZllJuPSdWhOu+NL6lqWcyfRzDsEZR6O+hXpQ6VlQRKYGYQXRdtKEx5PO3i\\/Lt0CwqW4hZQ+mfvWvO063ETLAS6pdOl6hMVZ5DLglKfMup1ImBaM3Ik6FuASqdW7vt2d0hL5k9R1ys4rJlJu0WpoKOuql4ayjYtlUoobPVlbrF4zUu8jXYn0a2Q2hVu9MPMMqZK06eqNGt2RpsmzLUu3aYwyh2XkpdpDcpK06hUxorl5RpsNNS6WpZmSZbyAdaZyjmLGXlZUqT7aWwTRVVJxIKU1eulUlIJOoDjNNaWmdmW1fm+cTFOcSoEKYVwtag7Hp+bU2qszfYZrHzGnJEzNkcULfKVMNKH\\/AGSJpJ3hQiPFot\\/J2bHofzfcultijMXzUW1MTD2GWFbs7QbTStB1nJOs35UJeVumuSkwk7J5uhUiypuWdbUWKxMpUCnf5hdg3gLowWUbcwrsWw8IbOYDBnk0SRkKP85Py7bgl5uvVl7WqlxVUNKdSmo1ufqVUcStQMy4MxHQl5aVk3MF6TsajCSQrNKaxXEpmJrLIefLU1lapSXcB3oXMzE4hSMtpKpIjCnF7HOgWvS5i+casTaRb1Gl1LSazeVfkaVTm3dVbokqYzNvy8v5Q7koy1MpTG2fUAmWlFryTHKeJ9q2ONoE63K1GfqNacmHkolKPJpcbke2KgGkS1KkkBt55JslCwy5NOADNMOEkm+KBs4pFAZMyJeUpLTaCp6dmVpdnMgAzKdmnl2ZbUL5k9qhtBOjKQAI2J3rpR27Si\\/I2XIruGdSC2KjOJdkaK0vdktttWpUKglKgQpsop7agNo1NOtGMK8SMT6lcS5q7MQK\\/TpKn0iSdcdnZ96To9DodNbUXX3FvPLZlZOWRmFvTU28pxQGb77hb3aCNInlscN7YTO0HRxs6cxIrTanmEXvebM9btkS6koyYm6bQwZa7bgaUsEOM1BFn6qNRxt+bSsojRNj1pZ6QGkrU1zuLeI1arlNE15VIWjJu\\/NFk0hxA1WTTbWpxYpaX2GvohVJxibrD6Enyuozbri3V23gLyTtqeOyxO4rU3gOguZVlupMqerTrZKT+RoLbrbjCx6Sf\\/jMzIvNEhxLLyCEnW1falgzC2dmhNKxFUkjIX2l5ZNCrC+afWhSVgjKbSDDrTibpU62oaZO8qTpJ0fSK0mJ37jK5J1\\/DjDKhSVk2jVaTNpnKNW5oqVV7ouGnvNKcl5hucrM6qjsTso4uWqFMt+mTjJUl8qVglZ0p50xPqTmUgSzJO\\/JR855Qzy3hOzSM9+qo8eKvjJWVnZ1eylWHH1njqJBSgE5ZrWfo2weOayN3AR23S5QU6ny8urLWQ3rOkbwXlkrcyPFXnKKUnfmlIMfSeg4cpmBcI0LB1GKvMqJTpamsFZQZh9LKAqYnJgNpQnziemC5MzGVCEKffdKEJSQkctYhrEzWqlUKrOKSZqpTbsy8lF8jYWbpZbCipQaaQENNBRKg2lIKibk8iTkCT2mGjjhWchuSPb1nugccKzlwHR09Zi1pqZmpmXkpJh+anZp9mWlpaWZcemH5l9xDTDDDDSVOPPvOqS2002lTjjikpSkrUEnKbbJIAF1HQAa2v8Ab+od8fAv1u7zEvL5LPosCoXLj3pk3DTdaWt2SlsB8MpqYlkutKrNYTTrtxLqcq46M5afpVHZsajS03LBanZK6a\\/IF9hBfamJnkYKcm3otsaHGhPgDgI9Jolbnt6y5WuYjlGzW6\\/idejrl236h2ZQpZnGaXcVYnqFTJlS1EUSl0xlGzZZZZRnXHVOFaUKNQpCSUnK8Gg\\/NXFj5zMflXUq59kVBkH9FtI4RYNNlvNZNloiyyO0cuLHtHLKIP8AaiyNP0eZJJBBBEhjOggggggggggggggggggggggggggggggggggggjzzuX50Uxo56eN0XxQqaqTsHSXpxxhoTjbDiZJi8pmZVTsUaS3MKSlD06u62\\/uymWmvNk5O96YwckhMaRkOlO5W8dPOO\\/3+6PSH5Xbk557lF9Hu37NsiuWtaeMeGl3i78Obju8VRugvy1Qpj9Iuuz6xPUeSq1QplMuJk0ipKqEpRavMNVa16K35MiUdm3EwHtKPQl0odDO5hbOkRhJcdjJmpp2Xod1hlFYsG6ShO01rZvejrnLcqrxly3MP0tufRWae04lNWpshMZsJ5f2hYVnaXWp6oMSjxpM66JpEw22VsS70xYvsOqQLM2f7QtBeUKbUhKLlKrV\\/WJByVmnnEtqEs4vtELCTkSV2KmyQLIKVlQSkkXSBbkMYgQd6Tn1gwsFg8dx9kcYlakHMH0cx7RDpDiV9R6D8Dz+\\/qitikHfGnh6CRvEXkocSUOJSpKgUqSoAoWkjIhQOYyIzCgdx7YahRHWPHCFQQeHjthhSLG59ShoefXrtCSkHuPOOLkqNM29W5W6rFuCu2Ddcg5tpCv2nUp2jTsq7nnrNOyExKvM6+WSxKPy2sdzhWjzVZ\\/4Q8qDpG4ViWpWMNuUzHK1JcIbNfp+pbl+SsulCW0Lem5GTdpdVTLoRtVifoKJ6aeDqpm5EhYWjBcKI6x44QqCDw8dsaDE2GMM4ylRJYuw\\/TsQMIQW2XpxsoqMog2uJGryymanJAnUoZmktqVqpCxoZFQcX4kwu+HqNVZqUBUFLaS4VyzxFrdtLOhbD1gLAPNLAH1QIkm4Faf2jDj05KU+2cQGbVu2YLYbsrEFLNpXEqZcWhtqUkHpmZeoNanFOkpTK2\\/XKpNbtdbKU6uW0CxtIrFGyNjLsVw3BSmtVPzVcmvVGUsoB+jYni43VJUIScmm2p1Ms35ubLmqECClV7UoNc1lT8g0X1A\\/ruXylpsE85ebA2pGfmh9DyAc9VMd3YT6S+lZo\\/GUZw1xUnLqtSQCEN4fYhFVxUHyRrzkU+STPTKZulS2YJJtyr20veU62qpRPLmMfJKps6HpnAWJDJrN1poeLRnZvvKJWvSLPoDehlE5TUHUF6e0K4vvD+3+WmkNymMKM24nRJnqelNwTYZ1ycwvJf85brM0zaxLcvcgD0ALK0vbEruylLukZ6z55XmGYJNXoaljIDOblmUz8vtVEnUfpqmZdGW1nFDNUdtXlh9glpEWn8z35aWHeLtoPB7YMV+mUS7JCTdfSgOPyLz7U07SaikNNKTNSLsnUJZ1plSHGX5dCkw2MIOWEw\\/qD0nQdIPD2v4WVk7Npy5KA1M3RaDzmvk9OPU\\/Zt3JS5UJU2G2ZFi69bzlKnEJCArbNg7pB2Zfcsi68EsVqNX22m2XH5uy7kbNQkUuKVspesyErMN1GmKc1F69OrMpLuuBK0rlshmeV8V7K9oezmZTNVihVeidg6FStZllLfpinMwDa5WuU5b8mlxWhSlM0l9IIC0JVdItinzGC8YMFNDq8nMF9F102Ysp0pFipK5Gb7OZKAQcywh5k2ulSknMfusfuQQ0cr7VPVjAe9bswNrbu0daoE8XcRLBKwyS1LS8pWahJ3hTRMzCc5ibcu6sMyrTpMrR1pYRKL0j49ckRpv4EeVT6MNk4w2xLKWoXJgxMTd4vBlIC0rmLRVI06+mSGiVzLkvbc1TpZxp8CoOtpbeekvWbpe37Q0sy100+nXhKICUqfVlRawEpCUBPlkow5T3ghOX7LSzMOLGbs39YnKuz9J7Ci6dizNVd+1ag6Egylxs+Ry+0ITrBFWZVMUsNax8xc5NSTjiR+wp85IkOG\\/KK2rYULbM66ziunNlKS3WiqbmQgaKKKkwGamXFC1lzjs22i1w0dQYHiHYnQ50uOtSLlNeJJExSFDsCeGaRWFtJQN5DTMve9s9gLeeXP06fpM9N0yqyM5TKlIPuSs9TqjKvyU9JTLJ1XZeblJltqZl32lApdZdbbcQoZKTmIahZHHf749EvFvRv0ddJGkobxawqw\\/xNlX5QsSFcqVJk5iuS0orMEUO8aX5NcdJQcj9JRqxKKOWRVlmRp6xy5AfBC6ROVTALE67MKqm7tHmbYuxhGIFnBQH0UjJTbkxSLtpbKlZh2cqFXuqZbyJTKrPmx0JhTytcB1jspfE9OqeFJpVgt8pNZpSFaDWYk2m6igqVuBpRQlOqnrAmKYrOxrEUiVrpcxK1hpN7N38xndN92Zhapc2HKczEg2RewMTwKB5\\/QfHui8KKTmCR45xwPpjZ1jbyPmnJg0ubm5LDaWxgt6WKlCuYO1E3W+4jIKQhNoTcrSL7cmFIzDiZG156XadQttM08Cwt7WpXKDXrXqk3Q7ko1Wt+tU90sz9HrlNnKTU5F4bizN0+fYl5uWdG8Ft1ltQ6I6IoGKcMYqY85w3iCk1pkJC1\\/R09LzLrINrCYYbcL8svUXRMNtLFwCnURWNRo9VpDnZVOnzkiu5CRNMONBdt5bWtIQ6nkptS0mxsdIbJfPBQz6xuPblwPshZK0q4KGfRwOfUD8M448LHPu93f74vzB4HON8QRvEa2ORBI4HKLg4ecenx9kceHFp4KJ6jv9\\/D0Qql8fhDLrG\\/2bsuniYSQDvA+32wQ+Cknny7d32RcCRwPj4w1StKuCgergfUd8XgkcDlCC2Du98EOgs8+\\/3+PRFwWOfMePHNDULPPv8Af7N0XBY58x7fHqhstb9PWPsH3QkoSeFvDq0OgQeBHx9UXZkcFH0EjuhqCDwI+Pqi4EjgT46obLff6iOvhCSjkfC\\/zHyh2HVjnB7R+iFA\\/wBKfUe+GWurqPjqyiu0HOPj3Qgtdw9Wnygssbj7\\/nD4PI58x6Iv2iPxh644\\/XT1jtHdnF2sOkeuEFvuI+\\/2\\/rgzLG8cuB6+\\/wBkchmDwIPpi7M9J9ccdFdZQ4KI9JhOTkq3q+\\/nBn5j3xyOsoc\\/x98Gurp9g7oYbRf4xiodWOfPtGceZDzHv7uvUPUZk\\/o+4dc+tz\\/XPQPb3wa56B7e+GO2X1eqK7dfQn1HvgyK7urd3WvPUujl7vDv6156vdc9A9vfBrnoHt74Z7c\\/ij1mDbn8Uesx5kV3e3roHuuXRy93h16jz1ea56B7e+DXPQPb3wz25\\/FHrMU26+hPqPfHuRXd1br1HuuXRy93h16jz1e656B7e+Ka6un2Duhltl9Xqg2y+kD0D45wZFcx16oMyP0fcPnD3WUef4e6KZnpPrhjtF\\/jGLdZR4qJ9Jj3IefWnXqHqM44J+Hd3c\\/gPU+zA4kD0xbtEfjD1wyzJ4nOKaw6R649DfeT4D9cGcncPietYeF5A6T2DvIiwv8AQn1nuhrrp7fR35RbtBzD4d8KDX8U+v1eHV4LrPC3u5c+jrDkvLPOB2CEypR4kntJMI66uoeOvOLSSeJPjqhwN+A8PVfrugyKO8+8mFiQOJA6vG+LSsc2Z9nj1QiSBxI+Pqi0rHNmfZ49ULDXcTu7uXXgfXHoQONz111rCxWebd7\\/AB6IsJJ4n1+N0JFZ5t3t8eqLSSeJzhwN25DTxPr\\/AFwoADcBCpUkc+fZv+yLC4eYenx9sJKWlPFQHVxPqG+EVPj8EZ9Z3ezfn08RDgQB39co9hySTxMWKWlP1iAejifUM4aFxauKiOobvdx9MWQrwghdT5P1Rl1nefVw98IlRUcySfHMOA9EJlY5t\\/s8eqLConq7IUEE93XKCFCoDn9A8e+LCsnhu98JkgcTl7\\/VCZcPMMuvd498OBAHf4\\/KCFCQOMWFfMB6T6eA7\\/VCZPOT6SYRU8kfV84+yFgE7h6+EegE7h6+ULE85PrPjKEVPJG5PnHp5u+G6lqVxO7oG4RYpQTuPHo5+OUOJb3cTy4deOndDgQBv1+H39aRepSlHMnuhNSgndxPQPieAhMrJ3cB44nx0QmpaU8T6OeHwjn7B18PbC4vKirj6hwhJbiU5jiegfE80IreKtw80c+R3nd083PCBIHE+jnhwDgB6oIvUtSzmT6BuA7BCRWBw3n2fbC0rKztTm5eQp8pMz07OOty0pJycu5Mzc2+4oJbYl5eXQ48884o6rbTLZWpW4DMxsUwN5JrTrx4XJTNJwVq2HlvTgbUbrxheOHVNYl39RTM2KLVWV3tUJN5pW3bmqJadUZcZAWhZ2jId1FcxFh3DEt57iOuUmiSpCsrtTn5aSS6UgEpZD7qFvua2S2ylbiiQEpJNo2EhSqhUnQzISU1Ou3ALcqw6+pNzoV9mhQQm1yVKKUgAkqABI1wkk7zFqErdcbaZQt151aG2220la3HFnUQ22hAK3HFrICEAEnPzdYxK0wH+Tv2JSlSdV0kcba3d00kNuzFnYU09q16Gh1tWa5Wau64peq1ysyLwOSzI27aU4gE7OZQcnI3Q4E6EuifoxpTOYN4JWRZ9Vl2wpd3TUq9cV4pQhoIe1r1uyarFyy8u4lJdel2KqxIa+s4ZdGUc6Ys8rnZxQu1Yw7LVTGE4i4QqWZXSKSVpsClc\\/UGfOyEkmy5alTTS7EocKSCbLo+yPEc\\/kXUFytHYNrh5Ym5sJOoKZeXUW72tdD00ytJIBTe4ELbR\\/5KvTg0i1yc3beDdXsa15wNOIvXF0TGHdvGWf1CzPSkrVZVd1VyRcQouom7btutMFptRCz5qVbytHv5PJhJbfzfWdJTFm4cTakgMTE3ZOHrCrHsxDzbub9PqFyTK6hd1fpzzSdXyulosKfTtTqBGprq3lXTjrhtapcaerqKzOtEpVIW8lNUdzSM1IVNtrRTGVgjUW29PodQrPNGaFAY33XpVXLPF2XtOjSNCYJUlM\\/UCmrVIp\\/BcQwpLVOl1EHz2nmainMea6RnHNGKfKm2pYnDjFMMphKnLukIo4Ini2Rp2lVm0uzSXEm5DtPRIfmjKLHNceH9ilIl8jr8rMVR0WPbVJQZlAdDmRKN5ErQRple86GqjvAtkDhDo7aOmjBb7sjhBhdh7hPSW5NEpU6rSKbIyFUqUu0ULQblu6oKduGvuJU23lNXBWKi\\/wDRpzeGoIZXbpLYfW6HpejOTN2VBsFKUUtPk9NSscztUmUBCkfiuyMtPoIzz4xrPxVxupNuUp278ZMS6TQKLLKXnWL2uWSo9KZc2anPJ5I1KalpNMwtIUGpKntB+YUQhphbiwiNQ+OfLPaPNgmbpWENCuDGqutJLbVSaD1mWM27qDIrrFakXLhnjLvZBbcjbPkM4htXk1YSgtPqgGG8CbS9qNQceoNBr2KJx9203VnS89KJdOUXn69UltSTTnG03OJcVrlSqxtYE0jCGEJdtNbq0hINtoBbp0sEtOFOmjMjLJcnHUaWC2mUIGYZiDaJA13aRWId0baXk5xFsU5wFIlqIVtTZRlkA9VnFqnSv62apRck25l+xZZZa5se9NzRu0ehUDinipSE3S2HFrsyhvLum+pqZW3tENTFDpapuaprkyFAtztwuUinrKhrzyR50ReMeOU50s8dRN05y+v1M7TmQ639yuFqZq2G3ZZwLbLVSuPyubuypJeYUGZ2WdrjdJmlFSxSpcKDaNfpL0y6pSi6+++6palErdeedcVrKUonWW44tRUpSiCtRJ6DHX2AvIdnHizPbScUJlW7pWqh4Ys\\/NEaKKJmtTzJl5dYtkcblafOIUCS1OpKQTW9a24ycohcrhGioFgUioVNPZouNM6JJhwuO3GqHJiabIsO0l1XKRvT0gOW2xCuIztE0dLHkcPKaVOtMXve7clc94PNBWbM1JW4EO2nQX8vNcYqSrzZKc8ltLOsnTXiNiviPi9cDt0Yn3zc99153aBNQuWrTlTXKtOELVLU9qYcVLUyRBSnZyNPYlJJoJShlhKUIjg5C0arOBK3kCRaORzmAdqQd+aZdOS0qyy3OlrM88fb0+1KVI6rjjZnHk79pM5KRnx82X\\/YwOGWvtFg5+dluPZODdnWzXZkx2OEMN06Rmi32b1SQ357WJkEDMJmsTanpxTajdRlkzCZdtSldlLtpOWKNxDjOvYjcK6zVpmdSFZm5VKw1JNHgW5RkNyyFAWSXA2XVADOtZF464kKRUamQZSWcU3nveX9Gwnfv+kXklRGWSkt66xwyHGPtZGz5ZnJc88ZpYyOybzbYGXEFQ1XXN\\/A5tD8ZKuMfZEgAJSkBIASAAAMhuAy3bgOaLFrCBmfQOmJW\\/U5h70W\\/yKTwQbr9bhAI53SEWiJrmFq0T6A7t\\/8Ajb\\/ZaEm2mJZsIabbZbQMkobSlCd3EAJyzJ4EneSMzCK1lZPMOYd\\/X0xRSis5n0DohFS+IT2E93s3xhgHeo3Ud5Ovv4nmeiwAVG3tMVWrLMD1+Of3dvDcbyEGiUdKrlCcMn65SxUMOsAUnHi+xMstvSMy7ZtQkkWJRphEwFS01864hTtuvzdNdQ8Z+gU2vp2KmGZh1rW5gJo0Y\\/6Ud4t2Do+YSXvixdKlS5m5K0qK\\/OSdFl5uYRKsVG5q64WKDatIL60NOVq5arSaSyT9POIG+PQR5ELkz7u5OzAa+DjGLZex6xruak1u8UWxUDWZC2LQtumKlrNshysGRlWp6q0uoVe66rXJmlvTNFXOVliSp83UJemtVOcnWCMPTFVrEnMOS7qqbKvCYfmFNqDC1S57RpgLNkLU48EJW2kk9nmURbQ7elySpiYauhRZQoLdXlOQ5PSCCrddZsnLe+Uk8CY3cQQQR0hE4gggggggggggggggggggggggggggggggggggggggggggj5W7bNtG\\/wC3apaF+Wrbd62pW5cylYte7qFS7jt6rypUF+T1SjVmVnabPy2uAstTUs62SAdXNOcfVQQlSQoFKgFJIIUlQBCknQpIOhBG8budxpAQCCCAoHQhQuCORG4g7iDwiNjpjfJvdGrF5dXu7RaueoaOF8TSnpwWbPInLxwdqMzqaxl5anzMwq7LJE3MkrcmqPWa3RKYyfJqTZbbCGWERUdLbk0NMvQompyYxtwfrSLIYmTLy2LNlpdvHCyeDky5LSbi7tpTBbt1+pLaUunUi9JS2bhmGsnBRkbhHp+Qxm5SWn5aakZ6WYm5KbYdlZuUmmkPy01LPoWy\\/LTDDyFsvS7zK1NPNOpU282pSFpUDFeV7Znh6sZ3pRs0ecVc9rJoSZZSuBdkiUtW1\\/qCpcqJusrtaNHN0CTmLqZBlXDrdsXaPi0SABwAbUgdxjyJEPEZBW8dPP6uf3w5BBGsk5jmI8bj1dsehDpecgloNaTZqlx2RbM3oz4mTxffTc2EErKS1mTs84UlLlw4UzWztV2Wbzeedbs5yxKpPTTxdn6vMpa2Ji66XHIQ6dui6KpcdtWfL6ReGlP2r\\/3XYNNTlWuGSkUIW5tq\\/hjMIF5ybjbTUw9OP2\\/KXZQqay2HJ2utF1CTS9c2dYkomdwS30jJpuRM08KeypFtXZYDzlqwN1qDa2k2\\/bTEXm6PPShJU0XmwL9qxdxNt\\/pJAC0WG8qTlB0CjYmNNgX0+vv+yFOyEZhmZkpqZkZ+WfkZ6SfelJuUm2XJeZlZqXcUy\\/LTLDyUPS8ww8hTT7DyUuNuILbnngxQKI4eqICpsgkWKSDax5jeOYI4g34erVw7C+n1\\/Z47IUB5x6IaBYPHd29\\/6IUBI4GGFN91j7uvCEFF92ndw+6FZhmWnGjLz0sxOS6hkpqYabeQrdlvQ4lSSRnkCRmMvNVuj5eWs9VDq0tcdhXHcNiXHIObaQq9u1Sfp83Iv8Q7KzMnMylRknAoJG0lJ9oJOeqlRCRH0wWOfd1+PthQHnB7CO+FNzD7CVtoWQ06lSHWVhLku8hQyqQ6w4FsupUk5VJWhQIJBGsetPvy60racW2pKgpJSoiykkKChbS4IBBGoO4xlJhjyjmmPg8ZWSvBdGx3tWUTsyi4ZfY3Q3LbUOkMXLSG5WrvThG0T5XXqdc4QlRQNZDbITsiwf5W3Rpv8sU7EJq4cFrgWoMOs3LJv1+2TMLVqhuXuegSjkwylJBD0zXaDQpVnLznAk6x0fpeUNyvOHTz90cdU6DQ66koqVOlZpWWrtVo1JlII1ckTLZbfQBln5rgA83oOdVYo2KbKcYFx2fwumgVFy5NWwe6ijO5jclblLLb1EeUtRzOrMg28s3\\/ACqSoqi0cPbZMa0Hs2jUDU5VACfNqoDOJygABKXlLROISlN0pQ3NobSmwyEJFpjmF2NjFQkGrowexPkavSJhQUmq2PdEnWKLMrySotTXzXNzVOmFgpzXLTSXCjZ6qkJUkkZe2npg31SdmzdlKpV1y6cgqaYCaFVFbslqU7KMu0xYA89LTVMl+f6Xhs4AtFtu6LDrCbkwqv8AuqwK83lsp2h1qpUqaCQQsMfOVImZKdTLk5a7LxmkODWS4haMozNw95S\\/TMwoDUrfErbuNVBZDaNvW6Y3K1xplBO+Wr9rppkztD\\/fZu4aNWnSkg62YKo5rxb5G1Re7R\\/CGI6JiNs3KKfWmlYcrYB+qwzMZpinzS0j6zip2QQqxIbB9GLmo+3bC9VCGsR0Z2QeICTNSpTNs3sn0lA+bzbKTuyNedqB3k65Z4dq6U2FdxbNqfqM9ak6sBOwr0osSxcO5QaqUj5bJJaSeDk65JlWWYQI+xvnC\\/BHSAt9EjiDY+HGLdvLbeblFV6i2\\/dsvKF1B2jtKqEyzOuU2aTuW3NU2ZlpxlxKXmX0KQhcREcKuWI0c7uVLyGJFDvLCKqLWhD8xPSRvK2GFK1gUpq9usCuktrTqrXM2hKNIC0rUvVLpb2ZYS6QeH9\\/Ibr2C2Ldv3A6GW3nXbIu6XVVpJtZCkIqUjITbdWpbgUQVStTlpR1Cstownn5gxRsV2g7P5pM3UqJibDDssvMzUuxeVItuj0QZWuU5ZkysaekzOvKF0q3EXsWTfwdilpTVIrdPnu2SM0jMKbcdWk5TlXITQZm0oP\\/AGrKhcFO8G3f2M3IbaHWIapiew7XfWB9ZdCltNWtXHbntZT6yorenKBeqqvUEoKidnLUi5aLKs5FLLCGvMGqjGHkFNKCzlTc5hFe+HeMtKZP6zkX5l\\/Di8Zvn\\/8AkVX3Z+0mAjfrKcvxKs\\/qtnPdudtnSnxWt8IanajI3RKNlKNjXpFKplLe8EIqFOVJTTi937LNuTpJyPVGQtt6Y9rTuozdNt1ihvKKU+UUuYlq1JH8ZxxLvzbNspOZ+jalpxYH4StxGxoe3Pbrg3I2zXF4mkWbAStdDVazgFNkqm5gS9cIy3TlbqAAB1USEqiJVvYvhqoZ1\\/RLcq4rXt6M6ZNQuD9WUsZS+oOkqrUb7GIS2LeidpL4DmaXi3ghiNZVPk3nJd24KjbU\\/NWmtxrPaJlbxpSJ+157IJ2gMjWJhJb+kBLZSqMewsHju7e\\/9EejXbmMOGt16iaJedGemF6oRJzcz81T6lK5kSNWTJzTpTl52yZcTuyzMdLYq6C+h\\/jXt3cRdHrDOrz82pxyZrtHoaLNuebU4clGZu2ynreuOZzJ1mg9VF7Jxbi2tVa1qNyUHy2ktKalscYAnJVzQOzlAnQVk6X7OkVZMuU2+t6VYVobWH1jVFW2DTDRUaVWgD+bL1aVWyRu+tNSwcJ32uJEAaHUHSABF4cWngo9h3j28PREtDFTkDNG65lPTWFOJuJmFc8844pMnVk0nEa2ZZGebSZWQnEW3cZKTmHFTd4zxWNTINqC1va4sTuQf0tLTMzNYdXXhdixINrWJWUYrE7ZVzzCEJ1m1u025ZRNty20\\/Y9T7sX9VwbyWwXYvjDnlNbGMRhtCcWt0OZXa8riSTmqSW77u0nlodpA1uCU1FVtL2BBiuqlsuxrTSpRo655pN7O011qdzWtfLLoUmbO\\/QKlk3NwLkGNKAfP4SR6N3vz94hQPIPOR2juzHrjJ\\/E3Qb0v8HTOLxA0dcUqVJU9RROVyl21M3bbEuUEJzcuqzjXrbDSifoXk1VTTu\\/ZKXkcsV3W3GXXGHm3GX2VraeaeQtt1p1tZQ4240sJW262vNDjawFIUNU7+F1UusUauS4m6LV6ZWJUgETVLn5WoS5zWKbPSbrzZzA3TZWosRxtCJqSnJFwszspMyboJBammHZZwEGxBbeShQsdDpodDD0EHeCD2b\\/dFwJHAn17vVwjjovDix+EfTv9+cbGMWH+urqPaO7KLtp0j2wx26ucJ9o+Ji8Pp50kdmR+IhOVPL7PhBDzXT1jtHdnF2sk8493vhoHWz+F6we7KLwpJ4KB7CDHmQd8EOcweBziuZ6T6zDaK5kcCR6Y87Pv933wQ511dPsHdBrq6j2juyhtrKHOfTv98V11dPsHdCey7k9er9ceZRyHshzrnoHt74Nc9A9vfDfXPQPb3wa56B7e+POy7h1br1Hnr5lTyHX6vjzMOdp1e37INp1e37Iba56B7e+DXPQPb3x52PcPaev1HuuZE8vefnDnadXt+yKa56B7e+G+uege3vg1z0D298e9l3D2+HXqPrMqeXxhxrnoHt74oVq6h6O\\/OENc9A9vfFNdXT7B3QBruHr9Xj1fnr7lTyHXXVzDjWV0+6KZnpPrMIayjz\\/D3RTMniSfTCg34DwHh4dAeosOQ9nXIQvFNZI5x7\\/dCEUKkjioDtIEe9mOJ+z5x7CxWnrPo78ooXOgevu+2G5dQPws+wE\\/ZFhfTzBXpyHxMKCEjv8AGCHJWrqHo784oSTxJPV43Q1L6uZIHbmfiITLiz+ER2bvdl7Y9AA3AQQ8JA3kgdu73xYXUDnzPQBn7dw9sM4prJHOPf7o9sTuF4IcF88yR6Tn7Bl74TLi1cVHsG4ezj6YR2g5gfd3xYVqPV2QoIUe7xg66+PLfaFosKwOG\\/x0\\/phInnJ9Ji0rSOfPs8ZQoIHE9ddCDrwhUrPNu9sWE85PpMJFZ5t3t8eqLSSeJzhYAG4QQqVpHDMnnyPX2d8JlZPUOrxn6oSU4hPE+gb4QU8o5gDLr5+70wsJJ7hzPX3d8KCSeFhz9m758dbmHJITvJA7YRU+PwRn1nh6uPuhuSTvJJ7YsKwOG\\/s+P2ZwtLfrPu68dO6FhAG\\/X4ff1pCilqVxOfVzQmVBPH1Defs9OUJlZPV2d\\/dlGRuGuh5pUYwiWcw20fMWbpkJtSEMVuWsiuSdsqUs6qUruipykhbjG87y\\/VWkhAcWSENrUnGqFSpVGlzN1ip0+lSid8xUZyXkZdNrXzPTLjTYsN\\/paDW9oypeVmZtwMyku\\/MukaNS7Ljzh4aIbSpVvAd0Y5lZPDcPbvy5z9mUJlQSMyR39Q5\\/VG6XDLkIdNa8y0\\/fT+GGDskSPKGLlu9N1V5I3Z+SyFgStzUOYUPwg\\/c0mCAfPGQMbIMK\\/k9mB1DXLTeMeN+I2Icw2lpxdNsuk0PDmjLmM0l2XmnJ833WJuTSkKaSqUqFDmnVhD+1YBVKxTGI\\/Ka2J4Z7RDuNJSrzKL5ZXDcvM1wu2ANkTsk0qlDQ+iXag2FH6pNlETSnbNcaVLKUUV6UbNszlRW1IhF9xUy+tM0e\\/JLqKdCbAiImSnidyRkOnn9HRzR3JhTo44+Y6TCWMH8HcR8Rkl9Ms\\/ULWtKtVWiyTpWGz8519qUNEpTaHCEuPVKoSjLRIC3EjIxOewm5N7QfwW2DtmaOWHczUpdDJRXL4kJjEqtImWyCZ6Vn8QZq5HKVOvLTrqco3zc23tXGJVpiWPk8ZS1e\\/MPrMl2pKqXJQKQiSZRLs0th9pUxKyzDYZaYYpEgHplphptIaaaalghKUhCRuyigcQ+XNIFTjGCcBVCfWrRmcxBPNyuXcApVKpKZ9bwVfTLVWSkWJuSQmwqVsLnXSg1WstIJ1VL0uVdmVkcQH5gMZSNNfNXAToDuJiC4O8g1pmX+uVmsSp7DvA6kLca8rauC4UXldiJZ3JSn5Gh2N87UF9xCSNeWqV5UZ8E6hSMlFG2XBfkBNE6x1Sc\\/i9d+I2ONUYXrTcg7ON4b2VOBITuNHtaZfu5hW01iVDEBbZa2beyGqpbuy64NK2zaeFt2\\/SazcD6SdVx7ZUeQWOCSHnxNT28\\/grpqO0Ex0bcGk7iJVw41SjTLbl8sgafKCbnSk5+YuaqRm29bL8OXlpVYyGrvJzo\\/EPlG7dMYBbSaunCki7cGWw+03R1JBAAyzxM5XmyBcDJPpGu64BFqUXYth2QyLVTfPXE2s\\/WHy\\/cgg+lKoS3LEaAWXKG269iqMpcKNHPR00cqYtOE2E+G+F0s1LlmbrVFoFLptYmpZSgpRrV1zSF1+qj8HaVerzagkBvWCEoAfXJpB4Y25rtIrpr822VAylvM\\/OIUpOYOrPKXL0tSQoAZtz7iwf73zxqmxRxttu1ZL7o8ZMVaJbtPSXCzVMQLwkaRKlSAFFiRVXJ5hDiyAA3KyQU44ShLTalLSkawMW+WH0T8P0TMnZD92Yx1loBDSLUo71Ft5L41ipM1cN1JpThZABAmqPSK2lTikZFSNotqK4d2WbRdpM8uap1IxTi+bfc\\/ZFSQzOTMv2l7Wna3PKVKt+lcFc1NMk2IuALCZzKMJYVYSirVemUxttIKJBosS67BKSQzJMpcmXU5SD+QYB1Tuum8hW59Ky4JwLYtWhSVGaOaRPVN1dUntUZ6q22ECVkZZYz3IfTPpz3HP8HGXEPGCpu0ubr+Jd\\/tU235IGYnZ2461JUC25BIIVtXtu\\/I0SSTu3urQyMk\\/W4RE\\/xf5Z\\/SSvYTchhhQ7SwbpTy3djPScsm9bvRLrC0JZdrNxSwoAKW8iX5O0ZOYQ79K3MtDVQnWNiNjDili9VfnvFHEG8L9qKFrWw\\/dFfqNXbkQ6c1s0yUm5hcnSpYnMplaexKyqASlLSEjOOrcD+QvjKd7GYxbV6LhKXNlOS0qDiGtixBWhfYusUxor3BxuqTgSr0lMLCEpVBaptqwtTMzeHaNMVN5NwmamP2BLEm1lpW6H55xNwSW1S8tfQBaSSUyrsZuVo0SMKROSFvXNVsYbilto03TsOJATlGEwlJ2PlF41Zym287JLOQdm6FN3A60jzkSjqjqxqPxp5ZvSRv7yum4VUa2MFKG6Xm0Tcky3el5lh1GzU27X7hkkUVg6hUpt+mWpT56WcUFszpUlDkajZGl1KpKCZGRmZgH++IbIZG\\/LznllLSd\\/MVg9Ufa0\\/D2ccAcqc21KoG8ssAPvauXAulSWkKz5xtxuz\\/AAsk9ZYR8mHYpgUtTE7SjiuqNWV51il5FTT2n1lZKKw0xSchXqjzmQmXUABPnCjmUqpK\\/tfxhWM7f0mmjyytPNqOlUq5YWABm87s+TYAKCZhDaiSezAsBxl8YiX7iZXHbkxEvS6r4r7wKFVe665Uq9PpaKitMuzMVKZmXJeUbUohmVZLcswnzGGmkICY4OQodUqZBlJR5TZy+mWNixlv\\/vrpSheXOEFav3Otq5dwSNtUSnBJZlEvvJy\\/XE3k+4SOdKFJDLZ\\/dIaQeyObzAHQBu+wReQqsrKMNylLkWZeXZQlphpLTcuwy2mwQ2zLMBKENpA9FAKQNBltpFXvTy3VrcUVuuOKK1uvKUpa1KNypZJKlKJ1JUq5O\\/WOuqfYSRqrqc2VHcdhKZhI6lPOJzI4ZhDSMt+S9+Y+ylKbT6anUkZRlk5ZFwJ1nlDnBeVrOqz38VEDmEPlKJ3cBCalZbufxxjXuzUzM\\/tzqing2DlbtuF0JsDw+tc8ybmMNbi1\\/WUSOW4ewaRUkAbz3nx6oRJJPuHRFCc95hBbuWYTv4ZnmHV05\\/b0Q0ATu68YRF63AncN6ujo6\\/HwhopRUc1H18B9kbXNEHkXtPfTFVS6za+E03hZhrUFNrOKuNiajYVsPSK0h4T1ApE1Tpm9Lvln2w4mTn7YtmpUR2abMtNViRyddalRaH3ybjQ3wJcpdz6QlTrOlVf0mETC6dcUq5Z+EUhNgBaTL2FSqjOVK4PJ1Fcsv7sLorVEqTYTNuWvIO6rLUxouCa9WMrjUoZWWUR+y53Mw0Um2raCkvPA30LTSkE6KWnfGwlaXOTeVTbRS2SPyrp7NBB1ukkZlix3oSoDjEK3Rg0G9K\\/TNr4oWjhgreGIMszOJkavdrMm3RrAt55WxUtFw37XXKbadJfaYdEymmzFWFXm2Ao0+nzjmTKpWmhd8l9w0tByk3lpwYmOYqVqWcZm3cH8KJyrW1h0HEFtRkblvuYl6ZfVzSjqVLS63bklh86y8lJRVZ+WzS5Kpte07XsagUu07Ltq37PtWiSvkdEtq1qLTrft6kSgcW6JSlUakMSdOp8sHHXHSxKyzbW0ccVqlRJP00W5RdnNFpuV2evVZlNj+WSG5VKgATaWBVn13h9x1JFiEJMSWVocswEqeJmFixsRlaB\\/tQSV2Ol1Gyh+YN0dUYQ4J4R4A2XT8OsFMNrNwtsmmHWlrbsmg06g05Uypttl6oziJBhldUq02hlJnaxU3Juqz7qdtPTT7xKj2vBBE\\/bbQ0hLbaEttoAShCEhKEJAsEpSLAAcAAABwjdJSlKQlICUjQJSAEgcgBYD1QQQQQuPYIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIwY0qeTi0NdMyVm3cc8Eraq92Py62ZfEy3G12fidJLSwiXlHVXnb5kqpWW6ehDfkVKuZVft9vU8+kOtqcbXGl0rPkyOJtsmp3Jod4wU3EqlNLmX5bDHF8Slp3w3Lh1IlZGkX3SpdNl3LUVIWVuu1uk4cSDaGFuJffeWiWE0GCIvWsG4dr4Uqfp7XnCt05LfsabB0spTrYAeItoJhLqRwTfWNfN0uRnMynWQlxX9Va\\/JuX\\/SJAyrP90Ssd1gI8pbHbRf0iNGK4Ra+kBg5fuFNVdeeYkHLqoMzK0StGXceadetq5pcTFt3PJpcYeSmet6q1OScDSlNvlIzjooKI6x0Hx9nVHrZ3fZln4g2\\/UbSv207ave1as15PVrZu6hUu47fqbKgdZmo0asys5TZ5kjMlualXW94IB35aO9J\\/wCTw6DWOJqNZwnaufRjvSb2jzT+H7xuLD5c26pSlPVDDi5JtTbEugHVYptnXJZck1qpybOSgupKzsen2c7lEnmp5sXKZWdtLTNuCUPpBl3Vn9JYlUxHJrDcwi6pV1D6d4bX+Tc4aBR\\/Jq46lTfKx3mAoFA9R6D8OmLwSOBjeJpOfJ9tPXAYVGtYeUC3tJayZQTMy3UcKJxbF7s09lbiWlVHDS4jIV6ZqcwhCVil2PM36UbVATNOlLpb0rXTaV22FX6hal8WvcVm3RR3zL1a2rrolTt2vUuYACjL1Gj1eWk6jIv5FJ2UxLNryVmRFU1Sg1ajuFqp0+akiVZUl9ohlwjX8k+nMy8ORbWsab9CY0D8s\\/LqyTDLjR4BaCArvSojKod6SRe4vcGOHCxz7uvx9sKA84PpENQsHq7e+LgSOEaUt+I8R19sYpQOGncevnD1Lyk7j5w69x9ffnC6XUq58j0H088ceF9I9I7v0ReCDwMNlJG8evr7YQQRvB674a1S26FWQRUqXKTK1ApD5aDc0ARq5JmmiiZRzDJDwGYyHNHwjuF7UjOsVW1a9Vreqcm4JiRmWH3S7Kvoz1XZSclnJWflFgE\\/SofdcQdbV1tbVT2Qlak8Cew7x6oXD4y84ZHpHDq3cR7Yy5eoTsqkoZmFhsgpUyuzrKkkWUlTLgW0QoaKGTUaHSHW5h5ogtuKTYggXuARuIB0G4ai3jH39haZenRg0WWaXiXP4iUKW1U\\/NF7Bi+2XGmglDLPldZS3eUs0ltISlml1mXaSnzVBX0ZjNrDnlqJiUeYp2N+Bz8o6kteWVjDqqLaeQjPVdUxaN3KbVrZBSm0u3kgKP0alDUDka7AoH6pz7Dv9m8Q2m5KTn2ixPSkrOs7yW5yXamU7wQcg6lQCj+CUgFOfqgmINmuy\\/FhcViDAVE85cvmqNCS7h6fKzb8s65S1sNzbv99IcQoAJUlQFon1F2pY0oeRMrW5xbKLAS804J1gJBF0JZnUzCG0nW\\/YFki5KVJVrEiDDPlIdD7E0S7MtixIWXVH16nzTiRKTNmOMKUBq7es1BCrUOsolILFwP6qgdfVSUqXsBsXGCttU6Wq+HWIr03RHgFS0zbdxN1SgTWqEgltEnNTVImkpBAyUh05HgdYxCjqeFto1DWUzLzVJeVv15CZXswrPMHyeZEwylJ+rqMoaGX1dVXnDi6JaWJWHlQNawvxJrts1NtSVtTdBrdZtOqeac0pE7RpwF1SchmXVNIV52aU62rFI4h8kTAtVDhw3jGqUcruU0\\/FFMlqzKKJ\\/qQnJJUgWGbkZXHWppxIBzBZNxa1J8oecAQ3XKJJTiNEqclXHZJdha61NvCeYcXvJSky6FEi2QAgz+aBpbYnUvZt1hmh3IynV2jk5Iqp08tIH4L9KclZRCiB9ZynuZZ5nduHdlA0x7Um9RFyWxXqM4rJJdpsxKVuVSrLepwumkzLbZA4ty0y4CdXM\\/ssQNrM5QjT0wpDbNQuo4gUmWWlQk75tymXW2sBQK1TFwUZNPupbToCUq8puFOp\\/e0sPLVr5e2Dy2061spPFbAqXdWlwJmatYNzuShQkLAWhu2bjkZtRWBmr6S6msyNVSc1ayefsT+Q\\/jpgOP0mmUDEzIUSH8LV5uUdDWhCjJVU0xouAC5aZRMm\\/otqXfWwqftb2d1UJEz55R3VWzF+VWtkKIGiHKaucSUXJAW600NMykoibnQsecJ7g1USV7UqVfVwarKpihEL47Pa1dmSl1k56o2DziVq81krO6LL3wXwJxpl1TGIWFuFmKDL8v5Iio3RaFq3Y6llLezSJSqVGQnZiWWwlQLExKTDT8s4A7LrZcQ2oRa7E5VvQ2vVUu1UryufD2cmMktSt92hU2AhxR\\/Y36naxuqiSgA1iX5qqS8qn6pe1lJQvN3DbSFwuvV5qYwpxosq4J57ZqS3Zl90iZq6MirUS9J0ypGpSzqTmdlMMtOjiExz1XNg+PcFTCpt2n41wo6wSW52cpVRl2xZQJUzVpZMs0UAgErZeWkFIuCL2lzDmEcQN9jIV2kVFLlv2IuYk5pZJNgFyqlJdSTc5Qtm51sDcXzRxD5HTQMv4OOSWGFaw5qDillypYdXtcVMUraZBAbpFfm7ktmWSyQotiUoUuTrFL+1CWUN4PX98n0sSbcmXsLdI276A2CVSdNv6yqLd7jgzGq1M1m3anY6WjxzfaoToJG6WyJ1ctqNj\\/i7Q9REve1SnWk5JLVYRK1rXSPwVTNTl5qa7VofQ6cx9Jlnn2tR9MG+ZUITW6Bb1XQkAFyVVUKTMunn2i\\/KZ9jWJ\\/3uTbA37hluepm0Xyh8LZRR9oVVqbLRAbZqk+3W\\/QuPQ7PE8pPNpTYWCUPegLBCkgXjR1HZJhWfKi7QKWVK1zSIcpq81gM37CVKpKt5OYqCj9bMTeNC998hPpi20HJi0K9hBiRLhL5ZlaTdNVtysqLIzaS9K3Xb9JpDSpoKyaCLgmEJcC0vuMICHncOr45NnTpw\\/ccbrejNiTUtkUjaWPISGJbbgcb2qVtKw7qN0a6S3uOSQ4y7mw+hp8FoS\\/aRpi2nMjVrdrXDS1EJzVTZiRrDKVK3q1jMOUd4Np5loZcWvnb35js2laSWENT1Um6nKc6sn6GrUuqywbAKR58yiTekhxyA8rJ37wdxNg07yv8AbvRMrdcwdQa+2gHtHk0udYm1WKbHzijVEyKE2vc\\/R9txFhcRBKhsBoLhUZZytyKtLJbeYnGUAWv6Lkut49xMzYbra6ef9dNiXvY80ZK9bOuuz5xKw0qUum3avb80lxaVrS2WKvJSjoWUtOKCCgKIQo5eaY+Wj0aZa9bBudhclLXRadblptpbD0kir0meD7Tmo24zMSSph1a0LC0pUy8zk4Fp80giOpLv0P8ARTv5D33W6OWCdZemR9JUXcOLSlq0QWw0C1W5GlStYaCmktpBZnWyQ2wd+yQUzqneXvJoUhnE2zGqSKhbtHaZXG5lSr2zFEnUKXTii19EKnXL8XBpELndgU23fzLETKzqUtztOdlrHSwU41MzJVe2qg0m28JO6PPyBI4EjsOUV11j8JXpOfvibZd3JDaAl2IdU3gq\\/as88dY1G0L8xApa2UkP+axTJm5Z+3UDXfS6CaMXApmXY1\\/J0qYONN1cgpoqVRDy7VxHxytSdcLhYbmq1ZtxUhgFExqJEi9ZNPqjuzfXL5lyvAuMMKl9zz6ZlqyKV5b+xefCRPNYwoaiQFmoUOWmG0brqC6RVKktSAbgEtJWbftYNwIvNbE8ZsX7FVInRa483nnGyeSbTctLAK3aZikfpGIle1c\\/G9g7ortl\\/uT2juIiSdcnyfFlWu7aOlI8jzxsJC5MJUP5tqdH7LVaZiDL6qmmvxaOUvO7s5dJzRj\\/AF3kC9JyUQtduYuYF1nUSlQbqs9ftAedGydUtLQl7Jr7IdLqUNNbZ9ppzaKU8+wG8l2FTfKl2B1MDsdokhLqNgUVGl1+mZSbXBXUKVLMqtxU24tH8a5tEfmNl2PJY+nh6YcG8GXmZCaBt3S804odwKQe6NGW3VzhPtHxMV25\\/FHrMbWq7yK2nlSFOCQsywroShbaUuULEi3ZdDwWwHVOt\\/dK5byg204fJnQ6hp0vnWaadlv1wenK\\/wAlnp+24lw1DRuuaYDTTDy\\/mG5bAuslL7wZbDaLXu2rqecC8lPMshx5hr9cTCG2PpBOJHbJsjqRSmT2nYCdWvLlaViuhsvnNa1pd+eafvrYjs7gkAgEiNG\\/g\\/FkvcvYarqEp3r+ip5Ten\\/aIYU333za2JvGBO3\\/AHH8r7INv+4\\/lf1Yyhqmgvpn0hSxNaK+PrxbfMsr5rwsvGtjagLJKDRqRPh1jJs\\/rloqlidUB7NxvX6wq+AOPVACzXcEcXqKG5oybhq+G1504InBttaUWZuitBMyNg9rMnN0bF3zfo1ESqUxVhWft5jifD87fd5pWabMXva1uxml77nde9tLxq3qVU5cXfp0+yObsnMNjTeCVtpGg38uPd1bt\\/3H8r7Iptz+KPWY5iftO7aUuZbqdrXFTnJJJdnET1FqckuVQlrarXMpmJVssIQ39IVOBA2eSidTfHzm06vb9kbxtbbyQtl1t5JAOZtaFpspIUNUqI1BuOYsdxEYSkqQbKSpJBIsoEG437+UOi+rmCfTmfiIoXl\\/uR6O8mG206vb9kU2h5gPf3Q5kVy94hPXw69vrc7Vzpy9A+IMWlaz+Er15e6ENc9Xj0xTXV0+wd0e5Fd0HXW6FySeJJ7TnFIQ1j0n1xTMnic497M8+ur9biF9ZI5x7\\/dFNdPb6O\\/KENYdI9cc3JW7cVU8mNMt+uVITjjbMmZCk1CcE06tzYoaljLy6w+4479ElDWuoueYnzsoSstNDM64ltPFS1pQm++11EcLnfuBhSUqWbJSVHTQAniBw17o4kuDmB9O7vi0rV1D0d+cdoU7A3HGsh1VIwYxWqqZcoD6qfh5d08GC5rFsPeS0d4NlwpVqa5Traqss8o7Rp2g5poVZYbldFTSCZJdaaBqWEl8UZsrdJCfpKzRZJvUBH0z2tsmAdd1baY0s1ifC0h\\/R2JMPyVhqZys06XFgEk\\/t0ygaBaCeQUOYvms0upzH9D0+eetb9qk5hzU6fmNq4pPfobDQ2xdzJ4kn0xaSBxIHV43xnpQeS40\\/rmcbbkNG28JdTrrrSTX6zZVqt67DJecLjt0XPR22GygFLLrq22ph4eTMLcmCG47hoXIsafNXLIqGH9mWsHTLhaq9iZZ74Y2oJcU79zNQuNShKkakxsQ8SSPJhMJzVEXntseyOm3TO7TsAsrSLlkYsobj4F7aMMzzjx1zD0WzqkjfoNoxg\\/FcwAWcN11xJtZaaTPBGoBt2imEovY3+tpxOovqoKwM8gT49fsi3XV1Dx15xvKt\\/kCtKudSy5cWKGA1vtuhla2ZKs33XZ+XCwovtPs\\/cDS5AvsHZpAYqcww6S4RMgNp2vfdt\\/J6ai4lDl4aU0lKuDIOSVt4Svz6Dm0grKKtU8QKeU6j5ebSDRlbRpCHtZhS1MNwmo+VJsCpYPnG0emPEfm06nV6qknklVNpU0gg6WUVhG85gBG6l9mGOpm3Z4emUXsbzD8lKgAgb\\/OZlo3F9Ra+h0vpEbckniSe2LFOITxPoG+JaNrcgJowyCQ5eOLOOFzzCACEUqfse16etREwHC7Ku2hcE8dy5ZbIaqjOo6w4XlPtTCWWsl7R5G3k\\/7XGtOYQ1e8ppJAam7uxDvyYKSVPFX6xoVwUClO5tvNMkTNOdITKsKQG3\\/KH5ivar5cGxGn5vM\\/wvrpGiPoygNS6Vm4AOas1KlKCN9zkKxY2QdAZDKbFMZTGXt\\/oqSBFyJmeUsp7j5mxN3PAWNr\\/nDfEJEvn8EevuHfzxzVBte6Lunfm+1rdr1z1AqaSJC36RUKzNlTpKWgJSnS8y6VOKQtLQDZ2pCggRP7s3Qn0QbBS19ymjRgjITDKkqZqUzhzbNZrDZCmlAJrdbptSrOqlbLTgbM6U7VsPEa51o7uFdsCy5JumN1W0bWp8ohewpjU5R6PKMJJ11IYkWnJZtClH+9tM67iiPNzIBrapeX9SSpbWG9mNWqCzcNuVOuy8ioAn0VrlZGmVUuX0\\/JpmkbxZ3SJTJbBJ1ZHnmIJZo2GZElT3pok31SFvTEqQLblFs6\\/mRBHsfk6dOPEQy5tvRgxYZbmwwqXmbrt04fSTrcwtKGHkz1+v21JiWcStLomi\\/5OlhXlSnBK5ujMuwuQo027q2K7pewkwwYVkqYaue9363VG05pCkNS1h0W66bMPgHPUerMq1qpX+uNbUSqV5U9ILCmllSV3Y3Ouo1glqmSVSn9pq55hL7MoqSOZI1FLmUIWTxyScuuqrpa2dL5po9v3HVHE7kqm1SVLl19JS4JqoPnj+HKN8wiBVLyy9uFZCkUHBVAoTStUPu02ozU0kHcRMVSos09YSNxMgASBe49GJlT9gdDRZU0\\/Wp5Wl0qcYk2FbvzUy\\/ajjqJgD13I0v2B8niorYlJnFTSYqs8tSEGco2H+H8pSksOhQLyJW5LiuGsmZQU5hp5205TVUQpTKvqxnRh3yJ2gTYy2XaxZF7YnzLLaEtv4h4gVhTYfSoEzLsjYybHpcy6oBSFszlPfkSFFSZRLiErR3dVdLa6n9dNGtqiUxCtYBVQmJ6rPNpOerqLZcpLeuP98XLrQQNzXDLrSrY+4qVcqSu65uRazVqtUmXkqblnlwmZdhM7kN2W0mllOZKQPOiuqrtZ8ovFGYVXaDU6S0u4UzSJqVoBShVgUA4Zk5RSwBoO0fJKbBa13VedU7ZFhWRylug00qFrmfU7USSBvKZtcy1e+pACU31AFhbM7DvRp0bsFGpebw1wUwmw9epqApFeotk21TK0kBYUl2duXyIVqZdC1IAmp6pPvJ1WkJXqIQlP2NaxiwzoBUKhelHWtJKVMU6YXWH0qHFLjNIbnltrz47RCMugc+nHEjHSxbOQufxbxete3SlKnzMX9fVMpj7maVr12TXqo3MPrWkKLbbCVvPK8xtKl5JOC9\\/cqpoWWMHWpfEmo35PtKIVTrBtWt1bIDMJU3VqpLUS2HgopWlIYrri0jVUUobWhR1VH2M7QsezAnG5TG+MJh6wcnZOm1SpA3JJL1UmEzjSUEkkuPrQm+85jcyB1OE8Ot9jPVmj0pCP+qpdkpJQsEizcsFlxZAsCEMFQTbSw0kN1rSwsyT1kUOi12tupz1XJjyakSTg5il5xydnBu4hynJ3b+qOna5pV37P66KNT6JQGiVarmxeqc6joG2m3EyainfnnTd5IBERZcROXLo7XlEthPgTUpzWJ8lrOIl0StMCB5wBmLZtqUqqXSSEkhF2NgAKBXv1k4HYjcrVpm36ZpilXjbmGVOmUFtyRw+tOnMPBrcRsq1dCrpuGVfzCVKmKdVZF3PWCdRpZajoTCfkM7S6n2Tk7QaTh9lWVXnGJ62h5wtm1yZCjiquJXbc1MSsuSqwcLYIUIrPbVdndMzCXVO1l1N02k5NzIVC4spyfVJslGmrjKXdCFJC9RExy7MXLvqEnNz13X1OtUqXbU9POz1VFHosu0NULdmWWVyNLZaTnkpam0ga31s98YAYmcopodYUqmpavY123X6rLAhNHsETt\\/Tbr4yUqV8rtaWqVEkpgDWC01SrU5LS0qbdcQ\\/qNKh5XzitifibOqqGIuIl733OKWF7e7rprdwrbUMwgMCqTs0mXaaB1GWWEttMN\\/RtJS15g+TkaTVqkUiRkJyaCiRrssuqaGRyOu6QGmwMtUFSwCoZAE5x01hjyFcOU9DbuLcZzcw2MpckcN06Uo0uhSQklvz+fVUVOtnVJUmQlFlJ9EoUM0Qaqbe53Kpuh0CRkUahL1QfcmlEEEBYl5YSTbSwLEJU8+kEalY0EiXFDlx7WldvKYNYJ12srOumXruJFckqBLtqTuC1W3bZr8xOMuKBUkG56Y6EgFaULUptOuHFTlTNMvFHymXZxHYw2pEwokUjC2ks2wtgZgJ2NyTDlVvNopGtmW7lQlSlLUtH1dXCiRw3uGZ1Vza5WnIPEPP7Z4Dm1WpbaoJIH1VPpIz87z4+vksNaUzqqnZybnVBIBQjVlGSd2fmpLr2Q4JyfBA54v3DexHYbgstuU7CFKqU61YidrCXcRzJcRbK8g1RczJSzoIBSqTZlgk+kkAkk1dWdp+LqvnTN4hnG2lXHm1OKZBnKb+grzJLKnUa7n3HSdMxNhbq6v3HcN1VR+t3RXq1clZnDnNVev1SerFTmTmogvz9QfmZp4gk5FbpyzVmeELSFs12okeTU2Y2assnn0iXZI46wW\\/qJUMsstQqPDNIXw78kaHR6YAZKnSrCkgAO7MOP7uGb7uu8T1lwk8+Zjkivo9f2eOyLRVXkMtpZkZNtlptIQ0lQShttCQAlKGWQlKEpAsEpXlAsAABEBcqClKUoJKlKJJW4oqUonUlVjcknUkqJMdRyOGr51V1OottD8JiSQXlkHLL6d4NpQoZb8mHBnuCiN5+ykbQoFPIU3IpmHE5EPTijNL1k7woIWAwlQPnAtspOfUlOX0pIGZUfSTDdbxO5O4dPOe7xw4Rq3qlPTNwt9aUHelv8mi2mhCLFXgoqMYqnnnd6yB\\/F9Ee61\\/AkwoVIaAQAAAAAhKQAABkMhwA3dZ35w2WtSzmeHMOYfb1\\/CLScsyT1kmElLJ4bh7Yxko1uNTzPX36x4Ega7zzPX398XKUBu4n3dvdCZOe8\\/oh3TabU6zUJGkUanT9Wq9TmWZGm0umSkxUKjUJ2ZWlqXlJKRlW3pmamX3FJbZYYbccccVqoQte47gtGHkH+UV0lzTKtO4VM4AWPPkr+63H2bmbIm0sJQp1RYw+YkqriY66+gITT3Z20abSZ5yYZyq7EsmYmmNvT6RUKm6GqfJTM4u9lFhpa0ovbVxYGRsa\\/WcUlOv1rQ+0w8+rIy046rTRCSoi5sCbA2HebAcTGmwrz+rw6e6Oy8J8FMYMeLrl7HwVwwvvFW7pnVUi37CtesXRUWmSHFqm5tmkSk0KfIMttPvTNQnjLSMrLsPzEzMMsMOOJnC6LXyZ7Q+woVIV7SJvC89Jm6JYtvu0Rwv4ZYXodSlK0Nqty26pO3fU1MPkjaz99pp1SZQgzFvtocdlzv+wtwdwnwPtaWsjBrDWxsLrRkyhbVu2Fa9HtSkKeS2lryualKNJyiJyfdQgGYqM2H52ceG1mJl51a3DZFI2WVN8odq801IN6KMuxlmprhdJWlQl2j\\/ABkuP96L2tupbD8y5YzDiJdPFI\\/KOHjb0TkTfcDnVY6lNt8JbRS+TIaUOJa6bcGlTiBaujtarv0s1ZtuuyeJmK77aUNLQxMfNE4nD2325tDqkN1BN13RPSTzDqZy2zkjOTxok8kBoE6Gy6bV8NsF6dd+INOQkt4r4wOy+Il+iZafbeZqNMXUZOVte0ak0Wm0CdsW1rWfLOu26te2mC7tAgi0qPg7D9FyqlZFD0wmx86m7TD+YWstBWns2VXG9htvvvEglaVJStilrtHBb8o9ZxQI4gEBCTv1QlJ1te2kEEEESiNjBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBHReNOjdgDpG0P7ncd8HcPMVqYiXflpT7tbXpVZqFHamCnbuW\\/WpmXNbtyaJJUmdoVQp84jIqafSqO9IIbdZafbU082280sZVtuoS42tO8pUhYUlQNtQQRCVoQ4koWlK0nelaQpJ8QQQfWIjTaR\\/yaHRav41Gs6OWJd+YA1t8zb8tbVdzxWw6bUoFySkJRmsz9Kvqlsl3Wln6lPXtczjLCm3mqZMPSy2pzQjpF8g9yiOAK52fouGVPx9tOWcSG7gwLqrl1VFbbqFOspcsCpSlExDcmAlKkTQpVs1eny0yjZCpvoclX5j0R4IgVW2Z4VqmZbcoumPq\\/qtOWGW77xeVWlyVCb7w000SNMwsLaeYoNPfuUIVLrOt2VejfvbVmQB3ICPGPJBuS2rlsyt1C2bxt2u2nclJfVLVSgXLSKhQq3TZlByXL1Ck1SXlZ+SmEEZLZmJdtaSN4zzjhQecH0iPVsxi0d8BtISi\\/c\\/jhg\\/hzitSkMPS8q1fNoUW4Zmmtvk7RdFqM9KOVOhzIWouNz1InJCcadUXmX0LBVGkzSC+Tc6EuJip2p4MXHiTo516Zc15eSpFUViRYLBWhzauOWxekyq6lKXMKbeQ1JYi0yRl2g9KsyaG1sGVrGq7HaxLhTlJnpWooGoZeBkpk7vRGZTsuogXupT7YJGiRuGjmMNzjdyw41MJ4AnsXDfuWS3bvLo4G1r2gkBZHX29\\/fnCgWk8dx3dnXw5vVG\\/nHn5ONp34YKnKhhNO4a6RVAZLq5Zu17jYsS9VSzAQtxyetnEBdHoLTi0lRYlKPe1fmXyypCW9uuXZe0zYv6OePmj9VBR8cMGsTcKJ5bhblRflmV625SoZFxIcpFSqcjL02sy6iy6GpulTc7LO7J0NPK2ajFbVTDNco+Y1KkzsogG3bKZUqWJ5JmW88ss\\/2jitNRprGifkpiXP5eXdZF7ZlIIQToNFWKVbxqkkX3m8dQg84PqPxEKJdWDxzHQd\\/t9\\/TDQEjgcouCzz7\\/Z49UaIoPCx9x69cYpQRu193Xth8l9J+sCOviO+FgoK4EHsPv6I44LSefLt8ZRcDzg+o\\/EQggjeCPGEEEbwR4xyQUoc\\/oO\\/7fbHHz9JpFUGrU6XIT2Yy1pmVZdWkZADUcWguII+qChaVD8DpFyXFp58x0Hf74UD\\/wCMn0g\\/A98epJQoKQpSFDcpCihQ8Ckg8OcegkagkHmCQfaI+CqGFFnzusqXYnKWtQzJk5pZRrEg\\/sc4mbbSD+I3qDVz1dU8Pip7BSaQraUivMrIOs2ielnGFIIzKT5RLLmM1awA10y6CAPqnm72DqDz5du6FAeg+o90bNitVWXsETri07sr4S+COV3ApY9ShppD6ZuYRoHCRyVZXvIJ98fC2tilpe4TpaRY+LOJdOp8tubptIvio1GhgISUI1bcn552nryRub1qWspTmBqqCExkTbHKt6a9ilhq6J+2L0aZTsdlfuH8rT1uJGY+kmbPVZky66lOSUvLdccc1UvP7Z1S1K6yC1DgT8fXFSoKSUrQlSVDIhQBBHOCDmDn2RoKrRMF4hKlYkwBhGsurvmmnKRJtT2v1iJ7sFzSFHiW3UXtzsYktNxxiak5RI1mpyqE2s1LT800ycpuApjtFsKSNfRU0U6nTU3zus7lvqw0ltnEDAGmzyl7IPVKzr3mqVs8tz626NW6HWS9rDNbDaq8wG8i0tx3X2jWU1o8sjorV5DLdx0bFOyJoj9cLqVs0qtUxpRdSkFiat6v1KovtpaVrqK6PKqzS4hLS1Bou6S521LWqJKpyg0xxZG91Mo0y6ejN5hLbpyO\\/erp6Y+RnMIrMmgfJ0VCnEghPks8txIJ3jdPom1KSDxAUCR+FredFdVLyftg9XKlDDFZw86s3U7RqzPLQDYAFLVQmKjLt20slmTQi4vluSDO6ftxxtKZUu1FudQkABM9ISboFiD6Tsu3LTCzvF1uLOU2FrC0oC1OUG0M7xUymk6QFlySnlpCRdiazY6UKU4GgHl3nS6CywlLm5Tri0tBv9c6\\/k5LkZT2Ljdalwlr9TXFu3q2pQ2jH3DX7TaipWaHHytr5gqr5IDYedJQPqBSvqhUQrpzA5s5qp1wrSOZuckUrz\\/+7sTDfON+Uudx5tU63y83g1dbGZl3aVPJzzAamnWVkZHcpEzLsoSRkeDqhv8ArRX9T8j3Z1UErRRtoNakEqHoorlMkKolJG7P2SaChdr2NinT6pA3TOT8oeo+iKhRaTMi4ziWenJC4sAQDMefgKOt1WUNd2ms+6nY24s0vVMrflfd2ZSR84voq4OWrlrfO7M8HB5uatpr62XDzlA\\/cU\\/Slxbk9TymfotVyA1vL6LLtlWQQCo\\/Na6bvVlmdQoHnq1R9TVgA0S7NJywMl2tfmLdsFoEpFp37cUpkAHCQG6FWslgpccSW0hSXA4tOqsOOIV21RtPbTksnVLGNt\\/p2RUc7spNGugDzXUKLn3ZUCsBeqHnCNqFZKDS8tdhrZVxVfIKmJrP9EYnwDVyfqLnqXMUtxd7WCnJFmsrRzJSXDvtexiTyu3jDb4T59huaaJPpGTmJGeIBy\\/VLgkSo7\\/ROQbtd9p68jph3c3kaladuTR3Z+QzFTp+sd5Or5RMVLLM6mWWuU5K+sVDV+vk9MmnqyFQsWdlzvzVJ19mbJIAAVqPUmSKdZesCnNeqN+srhEFy3+V30xqMtpdRq2Ht2pbUlSmrgsWVlUPAOIcKHfuUnbZXqrSlTStk42rUWrUWl0NOo7ponLZ42MFv7pMH8LatkWdr8xzV22\\/tEhS9sEeXVi5tmXAUBlSg7sCFqUh4qShutKr5AWOGirsKDhyokHRVKxRNSoOotkRUjTU6gXGZA1Mb2X2vbPJgAvN1SSJNrPyKiU95EnMzKSO4Enutvmyyml1h69umqNd0orWVkUydImmgkJBBUU1pt7WUrWTqpYUMxvXxKfppXSfwlmMg9VatI57MfrqiT68gs+dn5Eic\\/YeLmWeY3tbSIaFG5cSTWhtFwaOE2y4nZB2Zo2KDU0l3NZDzjcjPWJKKY1GykttqqExtV5pW62nzh2pReWywGe2YuDCfF6mZ7TafMqbOrgQeDIbE7ctvBYcHnOFQb2ZzShL2etFd1DyG9pUqFFWBa+kDQGnYgoFQuBqChLM\\/OLNwbgFIIvYpzGw2rO0LZtMkBvECWlGxs9K1KXCSbaFb8ihvQ8cxA1NyBeJfctpBYQTQSWb2lE6y9X9c06uSfnZbyozVMZCU8PPUEo4+dwjmpfGTC6YSC3f1tJzVqDyiqMyiicgcymZUyoJ3\\/shyQD+FvMRMabyxeiPPJR5VK4s0cqYbeIqVl0t1SXFBJMso0i6KonboJUF6ilS6tRWzmF+brdg0zlWtCOfIE3idWaIFS4e1qlhzf7oS4SgGUV8zW7V1F4BaySlJlsml5TSvow7DJ3yPdokrm\\/+TNo4sdeyor1RN9P3hT1XvuFhc8NxjZtYowE+oJaxXSkk2A7eelmBrbeXg0m99503A7olTNYi2BM64l76s58oA1tlc9Fd1db6usUTqtXMjtgnaxYVelEs1GqWjWpEuB5DE7O0apSanWtdAeQ3MOOsqdbBdQHUgKRmpPOc4xcnylehFPNNOs480lCH1FKBO2piFT3B9IWyXWp60ZV6XQVJzKn20BSMnEqDagpX1ctp86G82+2wzpCYepddOSVTU7OyLIUE5naTU7Iy8qzkBxeeSCfNHnqCYjjvkvY+lFBZw9tDk1NkqzO4NrTa28ls5BMuyUlN9TcZePOMkVTCDwyIxVh9wKsnL9K0twHNYJBHnRvfhvvyMSMJuyMIK1KJl6haOG9VknNR5LE3QLYnpRxSRmh5Lb8o60rU3hC9XdwB3xxrODGA8wpSJfCjCN9aU6yks2JZzqkp4ayg3SlEDPpyiP6nTX0RnFIbGkbhCFKUlKSq9KO0jNRGRU67MpbaQSclOLKUJT5ylJTH0X9lhor\\/AJSuj\\/8Anlw8\\/pFGMrYTtGlEhtM1juVSslSEKw9XWkn6oJyiabCiBlBItw3aCPQxhR8lSarQXikAFQdprtgdRch\\/TcbDQb7XuY30\\/qGYJf4HcLPzfWl\\/8Ig\\/UMwS\\/wADuFn5vrS\\/+ERoX\\/sstFj8pbAD882Hv9Ior\\/ZZ6LP5S2j+f\\/PJh38LhENHYntJH\\/8AlcbfyFXhy\\/8Ar\\/D1AR75hhf9\\/UH2U\\/u\\/7bw90b33sFsCpfVExhLhKwV56oesOzmtbLjq7SlJ1sics4fU+wsHaKy61TLKwzpMutZefRT7cteQZU4lOqXXUy0ky2VpQlILqxraoG\\/LhoT\\/ALLPRX\\/KWwA\\/PHh3\\/SOOCmNNjRIl33WHdI3B5TjSy2pTF9UGbYUpJ37KZlZx6XebJ3h1l1xsj6ilCFp2F7R5pJaM1juZGilITh+uuptcWUpHnblrXFiQY8LGFGLLXVKAySbBRcpzfiAS8N\\/EA6++JEchP4f2+y+KVPWbRZZxQemRT5miU1hxxPmpdfTLLZbWpKTqhbgOWZJzz3KPYh2FLpSX74tCXSs6qS7ctFbSpX4oK51IUd2\\/Lee2I3s5p76G8i+WH9IfDpbgSlZVKVJ+oy\\/n8AJmnys1LFX4yEuFaPw0pyj5ed5SbQikfKdvj3QXPJdfamTtu+6jrlGet5N83WnM+V55Zo8l221\\/vWvnD7XkxY\\/nFdp+D20OcUvKorawdWnFLCgkJVm83eK7mwSddLAawn6TwewMqsVYfaCbpyGq0xsJtYFIBmhlI1PDXfcxJUmcXcMpbX2l+WwrZ5BXk9WlZviQPo\\/JlvbUZneW9cZc0cLM4+4SSusXb0kl7LV1vJpCszp84jV1fI6c\\/tMgrz9TX1D9bLVMRk6hyrGg9JONplsV6rVQsFSnKfhxiO0hrI5BC01W1qa4VKGSk7JDqCn67iVHVjr+ocsbogySUGVRitVioOFSKdZUi2psthJSlRq1yU1BL2Z2ZQpaElKw8ttAQpchkvJA2jTVicFbSNf69Qpim79dfPpBNvqnfzSTvRnx3cT4CYNnMV0lVv6xPysxuy7ix2ydb\\/G1yFESjZnSZwnYJ2VaqU7qqyzlqHU0BW766fLWJM6vMAdVef4OXH5ya0tMPWQRLUm75teSSFGSpTDRzPnArXWS6FAcMmFJO7zuOUU2s8tvo\\/sj\\/cDCjGGqENIUn55ZsqhpU\\/tCHGleQ3ZcRQ0loJUl8JUtbilN7BCUB1fWVY5cyjNh5Nv6N9TnCS4lh6s4oytNCRqfRPPSslYtV2mq7kXJZM03rIT5k0hROrM6d5Du06aylGBMROAm16hX6BT9BluVB+ekSnQ6+iCNbC+ka93aBs1lyUuYhS4U6\\/k5SozAO63pSsgtBueRsQRciJbE3pf01skyNkVCZG7VM3XJaSJ88kghmmz+XmEKOWv5\\/mZ8XI+TndLq5nARTbUoUocsx5dM1CfAVqkZqDDlNzBVqkjWTkjzNY\\/WiHjXeW+xlmNr9zODGGNIBCgyK7UrquLUXsAEKd+b6ha+2CZnWdIQllRZVsNZCkmaV0xcPLDaYta2hps3hnaQUVEC3rGM0GwstlKWzdVYuY6rYQsNhZWrJ9wL11JbU3YVK8gHHr5QX8P4epyja6qril+ZSi9rBSacupoJ11yNqHInhqX9ruzqXBLSKpOEG1mJFQKtd487flkW8cpO4iJpM9pQYpTh\\/W8xQaZmScpGkJdySTmEp+c5ioHJPDNWtv3x8VUMbcVqnn5Te1Xa1h53kHklJ\\/i\\/NUtJav8AxMucxB4uTlHNNe69c1HHy55FC0qQlFs0u1bSDaFhxOq25a9ApDwWhLqtR5TpmApLbm12jbak9BXRpA473sXBd+NWK9zNuhYWxXsQ7sqksG1mY1mWpWcqr0szL\\/rqaQiXaaQyhEw8202hta0xaNG\\/9n3Vm8hqVdwPTiLZlU6lT9ZcRe1wlc7K0lSzr+mnNbfoI0kztzw61m+j8NTz9rZDNuSUmSLDVRa8\\/KeBASXPdE5+9sZKPQkbTEjFWmUZt1KXC5e18StOQtKy4lKyuvVRkLS4pxxKTnktSlZ\\/W3Yp3XygGhrZu1+d9IjDucDIGt9yk\\/N32CAjX+jFjSVwl46o3pZ1zr+Z9fNMQuUMT1QdcW0xNzrzjiluKQ27MurdcOupSylK1rccUoqKlZqUTnu5ualbOuibALNCqOqeCn5dUqDuBCkma2IUkhXmqB1Vf8VUWpS\\/IdwdIJQmu49q0wlNs6KVTaVQU6WPoedvVsJuLWJSrXUg7ojs5t\\/qtiJCgUqTFxlE5NTM5lHG\\/YfRwJPAjKAOB3xKOu7lldEW3xMN0FjFC\\/XWypEu7QLQlaXJPq2YKVLeu+tW5OMMFZ1VKNPdfSQtSZRSdUrxUvHlznClxiwNHttC882aneN9qdSRv3OUOiW8web6yLiOX4pjR5LYW3Y\\/kXWJKTzOWUzOtqKRmRmfJBNDLIA7tY6p+rrDVH0Mtg\\/NHUM7XJZrhtESsq5M55cUoW67LZbs0pWps5HztQ\\/VixaV5MOwGjZVTdPn8QON2KV1SvVF26kgC6maKabLLBO9C2FNEn6mkQ6f2141mgoIqspIJVcFMhISxNlcEuTDc28m3BSHEqHFRjPC9eWK0wboUsW9O4eYctecGza1lMVOZShSQlG1evmdu+Xccb1dcOIk2G1rICmSnVbTh3e2mBpQYipW1eGPWKVSk3CpTlMlbtqlEozqlHW1naLQX6ZSVlvPJrWkTsElSWtRClJU1lMJ7eZOtNTNRnFAZFBdZYazzG\\/Jpna59jxGRO7nT9LK2Pakin6OjSThG8qnA5OkkccxNreSN\\/EBIHQAnOLNpGEtlWGChVAwHh6Ueby5JtmhU\\/zu6bWKqhMtrn1WuSCp1ViSQRqTCKjjfEFTzCfrtZnEqvdpyemBLjMAFAMdqllAIAuENAG2ojGBTk1UZha1eVTs28pTri1ByZmXlqO9xas1uLWokKK1Z5nIbhHPSVm3PP5FiizqEqP15pCZFGRJ87OcWzrJyzJ1AVE7k6+YjKFpMrKJKJVhlpOf1WGkMozGeROohIPFRTkD17otU4pXPkOgbvX0xK3MTukBLEm02AAAXFlwWAAtlQGrbtwUQOfCI0qeUfqtgd6lE6+q3xjoqUwtrC987PSMmM8tVvaTb4HFRKUpZZGWe7J46xzPmc\\/1ElhfRWdUzs1OzyhlrISW5ZhfDPzEBb3HhqzG7j50dkkgbzw9\\/ZCZX0es93f6o1ztaqb9wH+zSeDSEt28F2Ln\\/nhhU0+r8\\/KOSQB77ZvfHCyVsW\\/TtVUtSZNCkbkuutCYdB6Q7MbVwK38QoExzWvkAlAyAAAyGQAG4ZAbhlze6EySeMWFYHDf46f0xgKU44czzi3Vc3FqWfaok\\/PlDBUpRupRUeZJJ9pi8niT6YsKwOG8+z7YTKiePDo5vVCS3Eo3cT0Dm7ej39UAF9AI8AJ3QoSSd+\\/4dg\\/RCK3gNyfOPsHf6PXHY+GWDOMWN9dbtjBzCzELFO4FrQn5mw8s64LwnmkrITtZmXoFPn3JaXQFaz0xNBqWl283nnW20qVG4\\/AL5OryiOMCpKoX5b1h6PNuTKWn3JvFC7ZWfuNcoteooyln2C3dlRZqCACv5uueZtZZSPpJholCV7mnUCr1VQFPp05OAm2dphZYSb2Od9QDKACd63EjnGUxKPvmzTLjpG\\/IhSgN31iBYbxvIGo11jRApSlHMkn3DsHNDiRkp6qTkrTaVIzdTqU683KyUhISz05Ozcw8rUaYlpWXbdfmX3FEJaaabW64ojVB3ROg0ffkxGiTYnkdT0g8VMTsf6sy4y47RKIljCCwphtJDkxKTlPok5cN9TAURskzcjiBRVlguK8kamFtqlt5+Amh1otaMEkiSwBwFwxwucDZYmKxbdsSCLrn2lJWkoq95zzc5d1aRqqWlHztWpwoaOzR5h3WHS9lNZmMqqnMytNQbEtpPnkwkaXBQ0pEuN4FxMqA1JFhru5fD825YvKbl08RcOrHglBybubg4Dw8+nRz5EPlH9JJ2nzdOwIqWElqTqpQrvPHqZVhhTpWWnCSxOi2alLTWI1SkyykzHlFDsmqNbEtKKz5RKB\\/f9o2fJc8FraTIVvSpx2u\\/FGqJbS\\/M2RhTIS+HtnMTIdGvJzt0VhFfuy46ephJPlFNk7CnkvOJCSlDBM3KwgixqXs3w3T8q32Xam8m3pzq7sg31yyzQbaKSNMrwetzMblihSTVi4FzCh\\/XFFKL8LIRlvppZZWCbm262LWjzoV6J+ilINSOj1gFhvhg+1KOSTlw0egNzt71CUdyC2KziFXV1a+a80ctyKzcM+AMgCMyIylggicssMSzaWZdlphpAshpltDTaRyShASlI8AI26G0NpCG0IbQNyUJCEjholIAGgA3cIIIIIdhcEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEcPV6NSrgpk5Rq5SadWqRUWDLVCl1eQlqnTJ+XUQpUvOSE809LTTClDNTTzS2yQDlnkTzEEeEA6EAggggi9wd4N+B4jjAQCCCAQRYg6gg79ONxobxqzx05Gfk5se1Ts7XNHG18P7gnQFi5MF35rCmbYe1QhcyKFarkpZM5NPkpXMvVa1ag5MTJXNPlyZWt5enbG35LxbswqfqGjppP1ilHaOKptp4y2fK1ttSVb0NTV92U7RXZdLJIQFow8nFvJzUShSMnpasERepYKwtVsypyiyfaL1U\\/LoVJvlV75lOyimFrVfi4V33KBBIOufpNPmLlcs2lR1ztAtKv+kezKQo96grhe9hHnaY1cg5ykmDnzhNSOEFIxjoNPWUmu4MXfSLnVNI1QpDklaVaNsYhzQWMxqMWe4tCkELCddgu6scQcKcUcJKw7buKeHF+4aV9hamnaLfto1+z6q2tOtrJVT7gp9Pm0lORJBZ3Z7+iPWZj5y5bVti86PN25eNuUG66BUEas7QrlpEhXqPOpAJCZul1RiakpkA55JeYcA5gBuEDqOxqkvZlUyqTsko3siZbanWQdLJBT5q6AddVLdPsAOofwwyq5YmXEHU5XkJdSf4oKezKRusbKItc5jHkma6uo9o7sovDg5wfHqj0lMYeRx5N7Gwz0xcGi\\/ZNp1mdDikVrCZ+sYTzEnMuJyVOtUqw6lQ7Xm5g\\/WWmrW\\/UpZx1wvuy7rwDkat8WvkwGj\\/XXH5rBPSOxWw5cc13G6diDbdsYpUxteaimXlnqM5hhU5aUUS00lc3NVaZaGu8t2a3IEFn9kGJpa6pNVPqSN6QzMGXeItfVE0lpkE2AsJhQud43xqXsNz6L9mll8E6dm6EG1wNQ6GwCBrYEjkSd0LUKSefv9Ryi4EjgSOw5RIQxV+TW6ddmbWaw5uzBHGGQBcDEpS7rq9l3K7qHcX6beVAp1uMJcCk7It3jNHX2qXUtJS267rVxU5MPlBMFhOO39olYzsyVPK0z1WtO2HMSqBJoSSlUxNXDhs9dtCZlMwEibcqHkpWUJD5U63nC57CGJKcT53Rak0hN8zqZVx9kWAJJflw6zYb759QCRuNtU9T5xi5dln0AW9ItKKOH9UAy8Tx3CMHA6sc+fbvi\\/bnnSPQSO+FKpTKvQp+ZpVbplQpFUk3FMzdMqsjM0+flXknJTUzJzbTEyw6k7ih1tCknm54YbTpHtiPKbWklJBCkkhSSLFKhoQQbEEG4IOumoEYmVXCx5EEd3Hr5vg+nnBHti8OIP4Q9O73xx+unrHaO7OLtZPSPXCLHkfZzjyxG8H2RyGYPAg+mLsz0n1mOOzI4HKK6yhwUR6THkeRyOsrp90V11dUcftFj8I+w+8Rdtl9XqjzKOQ9kEWzFMpM4CJylU2bCswRMyMs9nmN4UHWl55jLcd4y5o4GYsWzZkK2luU5OYyPk7apQ5EK+qZVbJSfOPDL8HI+aNX6Lbq50j2j4mKh\\/pT6j3w83MTDVuymH2rbuzedRbwyqELC1ptlWpNt2VShb2GPgX8KLJdz1JCblc8\\/wBgqM0rLPLh5Ut\\/6uRyzz4nPW83V4Z\\/Be2l6xYqNaYJzIDjkk+hOZBASPI2llKd6ci4pZy+scxrdsbcfin1iDbj8U+sRmIq9URbLPzOn6bhc9va57w4mZmBudX61A8v0r9X746TfwQlVZmWuKYaGeeT1Naf3ZHIEtzsv52fPlwzyRzxxbmCU+AdjXpNZy3BySfaBO\\/JOaXnvN3DNW8j8VUZA7dHQr1Dvg26OhXqHfGSjEVYR\\/1vNbdnYlz7w0Cee+HBOzIIPaXtzQj\\/ANIMY3O4L3Gk5s1Giup1SfPenmlEjMagSJB1BzASQorRvV52qMlQxXg\\/dyMsjSnM88widcGW4ZE7SXb457ss+EZP7dHQr1Dvim3H4p9Yh9OJ6onephf9syP\\/ANVJ91oUJ+Y5oPikD4Edd0YsKwnvNJKRJyiwDuUmoSwSdw3gLUlXPlmUjfDU4X3wCoCipUASApNSpOqoA5BSdaeSoBXEAgKyy10pjLHbj8U+sRQv9CfWe6HRiupDe1Jq0tq099j4+XdCvpF\\/ilo7tSF6buS+vhiUvDS928tahOEqzy1J6mOZZZbjs51eXHdnlnzcDCf6nF7f\\/MF\\/\\/OZD\\/rUZcbc\\/ij1mLdsvqHo7yYV+FlQ4sSd+5Dw93bnrXx9+kXv0GvUFjl\\/H8fXr44k\\/qcXt\\/wDMF\\/8AzmQ\\/61CiMM73cz1aE4Mv98nqY0TnnlltJ1Gtw36pOUZYl1Z58uzdFpWo8VH1wHFlQ4MSfrQ+f\\/8AuO\\/refSL36Df+Kru\\/j+OnhrGKgwvvglINFSjMgFSqlSckgnIqITPKUUpGSjkCrVzKUqEOBhXeBISqVk0DnUahLlI47yEKWrq3JJ4boyhzJ4nOKaw6R64ScVVI7mpMeDTx+L5jz6QfO5Df+Kr1fn\\/ADjGdGE11rz1jTGwMstecWdbdzbOWXwI362X1t2tvh41g7caiNtP0ZsFOZ1Xp11aTuIBSZFtPUSHCPxdaMiitPWfR35RTadA9sIOJasrd2CfBn\\/1rVHnnsydwQP+78yet0dCNYMz5y21bk0Zg57OUfdyPNlrOs5g85OWXQY5BnBdof8AhFwuLzAOqzTEtZE71DWXOu6w5gdROXHI55R3SVq6h6O\\/OKZk8ST6YaVX6woW86SgfxWGL+Fy2T7D8THnnU0f6oE+CEX4cct9PH43jqhvB2gJy29Vqzh357JUm12blSj+XXxzP4sco1hdaDf1paemDv3vTzqc8xln9AGTuO\\/m4x2CSBxIHbFNdPb6O\\/KGjVaovfOzHL0FBsf5sJ95jzt3zveX6iE8v0QP1H1x8qxYtoy+WyoUodXht1TE0eOt5xmnnirf05jLzQNXIDl5ehUWUAErSKZL5b82ZGWbUTkBmVJaClKyAzUSVHIZmOQKzzDL2xaVE8TDCn5tz9smX1339o84u\\/f6Sjf1mElazvWs+KlH4nuhQaiAEp1UpG4BIAAHQANwihX0D1+O6EC4lPFQz6BvOfo4enKElP8A4qfSruHfDWQDU3J7\\/j1f1wmHJUTx9XNCZcSnioZ9A3nP0cPTlDQrWrio5dHAekDLOLCQOMLAtoBBDhT5O5Iy6zvPq4D2wkpSlcST2nd6BwEJFY5gT7B3+PWtKys7UJliRkJWYnp2acDUtJybDsxMzDquDLMuylTzziuZDaVKPMOhxLalEDW5IAAFySTawA1vyHHdvghMqSOPqHjdzZZ9ucJlZ5t3v7vfGaWFfJxaeONSZZ\\/DjRLx0rFNnEhUpXapYdXtG2ZoZjPye6rxYt+3HiN2tsqmrVz35Djstwo+TbcoZfamH7\\/cwZwPkyGVTUveN\\/G7a6lDhydTJU\\/DClXpRJmZlxvcbmrop0uvIbKbUTu30jhav1DKZOjVF9KrZXTKutsHke3dS2yAe9zdv0jJakpt+3ZSzywfzg2rLqLi6yAkXGoudeER\\/Secn0mLCsDhv90TQ8IPktGENNckpvHjSkxDvUbMuTlEwqs63sOmETOWaGG7guqaxKenJQKCUvOCg0mamWgpLKZFzVfTtLwZ5EDk0MFzIzUlo30XEityDjTqqzjPWq5iYJ5TIyQJ61q5PLw+cbKs1ust2cw07rkPsrbQ0hqYyGyrE81lMz5jTkGxIfmO2dAI4NyiX0EjcQp1FtdY2bOHqi7bOlpgH+uOAqtpuS0HNTfQEpNwQbaX85izrGvrEetsW1h9Zt133cU2pKJW37Mtyr3PWplS1aqUy9KocnPTz6lK3JDcupRO7LMxs8wT5DzlL8b\\/ACWblNHaqYYUOZW2hyu42VilYZ+Rl3eFTNrViYViEpCUDWdMrZszs8tVX0pQ2r0Y7Jw+sDDOis27hvY1n2BbzASWqFZVsUW1KO3qpIRsqZQpKQkU6usQNRkFIJyO\\/f8AaxNKfsgprRCqlVZubIsS3KNNSbdxY5VKcM0tQ3XKezJ7jrG0Zwy2NZiZWu+9LKEtjhpmX2hOo35UkjSwOsQ6MD\\/ksdYdXLT2krpTU+TbQUCctXA20ZmoLeSSnamWxAv4UsSqhkptoO4ZzSXAoPKLez2Lu5PAjkKOTSwLNPnU4DtYwXDTnAv7ocd63PYiidKcskT9mOCm4XTTaSFFSVWEkrBIdK0pTq7hIInNPwXhimZTLUiVU4nc7NJM45m\\/SSZouhCv7mlAHKNuxSafL2ySyFKFjmdu6bi1jZZKARYEFKUkHUa3j5a07MtGw6HK21Ylq21ZduSAV5DQLVodNt6iSQUlIUJWlUiVlJBkHVAVspdJOqM8yY+pggiTpSlICUgJSAAAAAAALAADQAAAADSNgAAAAAABYACwA5ADQCCCCCPY9ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggjr2+8KcL8UpFNMxNw2sPEWmI3op192fb92yKCNfLVlbgp9QlwfpXN+yyOsrmJjAPEnkbeTSxSXOPVvRRsO3pubMw6mbw2nLowtTJvPqBU7J0zD+vW5Q0hg+dLyrlJep7IyaRKFklpWz6CMCbpdNnxaep8lOAggialGJga2B\\/bW177eO6xFoZdlpZ79ul2XTzcaQs6aDVSTqOB398RxcQ\\/kzehPcSXpjD7FDSAw4nln6KVertnXpbzCMjuTIVSz5CurVnkNZd0qSAMtnnm5GCeIXyW\\/EiSJcwq0trIuQLBUmTxAwyrtklg+fk0alblz3\\/wCVjLZnbilyROuoCXyZzdmTQRGJvZ1g2cuV0VhlRN80o7MygHgiXebb3cCgjja8a9yh0xz\\/AKtkNrXbccRYXvokLyX7yg6abo8\\/u\\/vk6\\/KSWc6+m3LcwixVQzrllyxMVKZTfKilsrCWU4nU\\/DlTa1qyYBfDLYdORd2Gb8YbXzyUPKQYdzExLV7Q7xsqDkqt1Dhsa2xigwVMuLaVsJvDObu2VmkqUgllcq88h5BQ8yXGXG1q9M2CI5M7HcNO3MvN1WVJvZIfl3mxxHouS3aabv20XFxv1jCcwzJquW3phBJ3KLbiQNNAMiVcN6lq4co8nK8sG8YcOFvN4hYU4lWI5LkiYbvSxbotdbBSclB5NcpUipog7iFgZZ9Mdb656B7e+PXVjpK8NHDR3xFcffxBwGwYvl2aWVTTl44XWRc65ha\\/KEuF9dboc8p5SxNzQcK1LzEy+VZB93OPzGxNJN5XEHP0JinX10t+UbnBwAB\\/JcORtGGvCx\\/qc2g3O5bBRYafnJcXc\\/8AdHz8pjadXtg2nV7fsj0xbv5KDk4r3W6us6HWCUkp0vrX9yFsnD5CdulkubFuwpu222QnYIDIYS2mW1nzLhoTEwHMbLs5AfkwbmU8un4I3NZD8xtVLmLSxdxQyDrj4fW8zJ3VdV0U9jIBUs3Ly8k3JNML1WZVpSW3GtI\\/sYr6LmXqFIfAO5bk4wrhw81dTfXcVjTW9zaMReGJ0XyLllgaizjqVEX5FopH+Pv0vxjzztcdB9nfBrjoPs74nY3F8mj0BasXHKPfek3ajyxOKl2aZftgVGRadeSDKh9ivYU1aemJaTUkFLLdUlX30LdQ9OFSmHmehbh+S54JTRdNqaVeKdFSQzsU3BYtoXOpCgoB8vGm1G0Q4l0ZhoJDRlyM1mY4HUu7JcXNmyJeSmBp6TU+0kHQH+rhkjfbUDW9tLGMdWHqkncwlf8AavtA6W351IGuu48eHCGRrjoPs74NcdB9nfEtev8AyWOotpcctbTYk5paphOxkrgwBfkUNyhSsrW5VKdjDUlTD6VagShNHYaWFqzcbLX0nUdY+S86RbCpsUDSZwVqYbP+55q9u31Q1TSAtHnTfkUlcKZJWoVkpYXUciEpCvOKka9zZnjNskGiOKtxbnac4Du1GSbJ15EA67hpZhVDqSN8o5w+otpfK+qFK1HEfC8RhNcdB9nfBrjoPs74kd1H5MVpvNLbFJxo0Vp1soUXVVG6MXKWttQO4NtSuDVYDqCN+up1kgkp2astaPgZ75Nlyh0pOPy0vW9HSptMuajdQkcSbpblJpII+ml01PDmnTyUHmE1Jyz3Psow14Bxc2SFYfqBINjkQh0XsDoWlrBHeCRckXvuQaRPpFzJzB14IKjwO5NyBw1A490aAtcdB9nfFNp1e2N48z8ne5SpiYfYas7CmcbaedZbm5bFigpYmktrUkTMuicYlJpLD4AdZE1Ky0wG1gTEuw6Ftp4ipfJ7+U2kWEPS2GOH1YcU6lpUrTcX7EQ+2haFqEwpVWqdKlyykoDaktzK5jWdRqsqa2i22fwJxUL\\/APy9Vjbf+xHTy5J19XM+pv6NnR\\/1GcP\\/APrvHlyR69O\\/ujSftOr2\\/ZFNc9A9vfG5j\\/uAXKjf4C7Y\\/PPhF\\/TGKHkAuVH5sC7X9OM+ER\\/\\/AOyEAwVir+DtW9ck\\/wB38XrXvg+jpz94zn\\/hZj\\/0Rpn11dPsHdFNZXSfXG6+m\\/J8OU6n23VTOFtgUUtuJQlqpYv2E8t4FOsXG\\/merVZtKU7knbuNOZnJLZ4nlG\\/k7\\/KXrcQhVmYWMpWtIW85izbxbaSSEqcc2LbzxSj6ytk085q7w2onVhQwViveMPVQXtvk3RvtzSLa8+XhChT53S0jN915V4H3ouPXGjuKEgcSB2xv3Y+Ta8oi88wy5VNHiVbeeaaXNTGJdxLl5ZDiglUw8mWw\\/mZlTLKfpXRLyz7+zGbLLq\\/MjsGQ+TEacbj+rVMZtFGTlS2SHpC7MX6k\\/tsxqI8nmcFKS3s1J1ipwTeaClOTa9bzchGBMWuEAUKfBJA9JtLY1tqS4tATv1JNhxMOppdRIuJN8W4FBT7AqxPqERxtZI5\\/j7optBzA+7viTvR\\/ku+kq+Jf5\\/0lcDqZrzKETfzPRL+rmwky4kLflzO0m3vKplLWutMo55I2t1KWjNoSsuo7dofyWGtOpUu5tNmlSCkTDeUtQ8AJurB+UGqXVeWVDGKiGVmCraNJT5BONNjUfUpzzmBmt7N8ZOWtRHRe37ZOU5sDjc55tO7xPIXOkLRR6mv6so5fkpTaPV6a0j374iUlZ5t3t8eqLdZR5z7vdEzehfJbsHJZTRujSyxNq6A8svot\\/Dq1LaWuXLeq2005Uq5daWHkPDXcmFNzKHG\\/o0sNK+ljvS3vky2gdTGmVV\\/EvSfuec1G0zG3vbDikU115DmspctJUvClqelkvJybU07V5xYQFKbdQ4RlsmdlWLVkBUrJMd7s8yoDQH+o9srjwHxuXk0GpqvmYS33LeaN\\/DItfjrb4RBSKkp4kDtMJl5A4ZnsGXvy+MehpanyfXkvrcKTVcGryvkhp5CTdeMWJ0tk4p9DzcwtFmXLaDZdl0JMs2hSDLLYeWZiXfmdm+jJK0eSN5Neyn2ZijaHOD845LupcbTd1KqOIEssomUzQD8vfdVuWWmkF1CULammnWly+vJrQZRxcudqxsexAvV+fpLI00Q5NvK4XuDKNp0vp6ZvY7rRkIw3PqsVOSyAd4K3CoepLRSf8f1x5mhfUeAA9p+A9kfc2jhfidiE4hmxMO78vd11RS23aNoXBcq1qSXdZLbdGp86VFOwe1gkf3l0\\/wB7Xn6mNo6K+jFYCkfcJo4YDWSppOohVo4Q4f20UI1HEFtJo1uyRSgtvuN6gOqUvupGYWqMgI3MvsYVvmq+BoLol6fc30Js67NiwGoH5K50JtaxykYYWdXJxCddyGVLuPEuIt7DxjzC7K5LHlF8QFsooGhpj5J7cpS25eNiVLDuXUSh5wLMziELYlktFMu5qvLcSydZgBWc1K7fNCw\\/k7fKZXhMMMXBYmF2FrTpQHZy\\/MW7YqEtKBa0pUqYGGH6o82oNhRUsSsrNHVQvVCl6qVehJBG\\/ltkOHWrGZnKpNKFtO1lmG7ggn0W5Yua2sB2uiSQNdRlt4alE6uPzC9RoktoSRyUMilEHTcpJiFth78lpxlqLjRxY0sMMrRaCW1ONYeWBdOIjizmsusNvXJVsMNjrJDQbmlS7oSXlqVJK2IS\\/nXhz8mE0OaChl\\/EvGjSAxFqDKmlOs0SdsewLfmyhSi83MU1NrXVXkofyQlJlbsl3WUB36Ra3G1y8l6CJFKbPcIShBRR2nlA\\/WmnpmZvYW1bdeUyf8nbmOMZrdDpjdv2P2hH5zjjir+KcwR7EiNUGGnIkcmPheiTVI6L1t3dUJUKLtVxKuS9cQXJ9ZUVByco9zXHP2unVSW20tSdvyktqoSosGYcede2EYd4H4L4RMrlsJsIcL8L5Ysplyxh5YNp2UwqXQEBtgtW1Saa2WUBKEpbKShOoOPAdrwRJZSlUyQAEjT5KUsAAZaVYYNhuuWkIJNtLkk773ub57UrLM27GXZaItqhpCVaC1yoJBJtxJJPEwQQQRnw\\/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBER35RfXa3SMc9HhqlVqrUxp3Ce4nHW6dUZuSbecTeDw2jiZZ5sOKyATrLzOQA3RHV+7e8f\\/K25v8A0\\/U\\/+uRIZ+Ug\\/wBvfRz\\/AIJLi\\/1xfiOFHC21iamW9oWJEImJhCEvyWVCHnEJTemSKjZKVAC5udBvN98U\\/iDWsz\\/92H+rb+QjZtyTV03PP8ohowyc7cdenJV+77gS7LTdXqMxLvD7gLtUA8w7MKbdSFBKiFpI1hlE\\/qPPq5I\\/9sY0XP343B\\/qBd0egrF6bAHXXsJ1VTrjjihiF9IU4tS1BIplLNgVEkC5JAGgJPOJhgz9z5r+\\/D\\/qGYIIIIvWJhBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBGtvlcpqbkOTp0m5yRmZmTm2LbtBbM1KPOy8wypWJdkpKmn2ShxtRQtxOaFbkqy3gxskjWxyv37W\\/pQ\\/vYtH+c2yI0WJyRhrEKgSCKHViCCQQRIPkEEHQgi4O8HcRGBVf3LqX94Tn+zuRAa+7e8f8Aytub\\/wBP1P8A65B9294\\/+Vtzf+n6n\\/1yPm4I+d3n05++prh\\/1h7u\\/j93VhFK2HIdfqHsj6T7t7x\\/8rbm\\/wDT9T\\/65B9294\\/+Vtzf+n6n\\/wBcj5uCDz6c\\/fU1w\\/6w93fx+7qwgsOQ6\\/UPZH0n3b3j\\/wCVtzf+n6n\\/ANchWXvy+ZR9qalb0uuWmZdxLrMwxcNXafZdSrNLjLrU4lxpxJ+otCwsHhw3\\/LQR6J6cG6bmhu3TDvC38bTdw58hHu7dp19w9kd72xpU6T1kPIfs7SMx0tZaFqWfmDFm\\/KS2vWLRcQ8zJV5hp9p8ssh5l5DjbyG0odbeQBlmdhfyzHKGYYuSzYxxXiFSmFIK6JihbNuXa3NBOruma+afIXrqlILagxdEuVBWtudIcjV1BGzkcUYkpiguQr1XlCCDlYqM22hRHBbYd7NwW\\/NWkg8RvvktTk2wQWJqYaI3dm84jx0SoAg2FwRY7iDErbR6+UY21Un5CjaUGCM1bS3Vpamb7wdnnqzSGluhCA9NWDdE43WKfJS60uOzExI3jcc8WVhMvS3nWcpiQNgbpH4G6SlpovbA7Ey2MRKBkx5YaHO6tXoj74UpmUuS3ZtuVr9tTy0IUoSVfplOmVN5uobUzk5Hmhx2VhDjPingJfNIxKwdvi4MP70ozmcpXLfnVS7jrCnG3H6bU5NwOSFZo87sm01CiVaUnqVUGkliekn0EiLawtt3xDTnWmMRst1yRulLkw22zKVNlFwCtCmktysyUJ3NvNNOOqACppJJJkchi2el1BE4EzjWgKiEtvoAsLpWkBC7DWziSpR07RO+PTmgjR5yZfLA2dpcmkYMY2opGHukWiXSxR3ZUqlLQxcMswtx9+20vlaKFdqGW1TE9aMxMPNz4S5P20++0qaotE3hx1PQa\\/ScS05qq0abbm5R0lJKbpdZdSAVsTLKrLYfbzDM2sAlKkuJKm1oWqwZKelqgwmYlXAttWhG5bawAS24nelabi41BBCklSSlRIIII3MZcEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEERDPlIP9vfRz\\/gkuL\\/XF+I4USPflIP8Ab30c\\/wCCS4v9cX4jhRwdtc\\/6RMS\\/3eR\\/3VIRT+IP3Zn\\/AO7D\\/VojY3yR\\/wC2MaLn78bg\\/wBQLuj0FY8+rkj\\/ANsY0XP343B\\/qBd0egrF8eT3\\/SjVv\\/uOY\\/3ZSomGDP3Pmv78P+oZgggiMDylvLgPWvVK9gVoVVmQmqpILm6ReuPaWJapSUhOtlcvO0bCyXmm35GoTMovXlpu+pxmcp6XA8q1JaZAkrlbtbE+KqNhGmqqVZmOybJLcvLtAOTc4\\/a4ZlWbp7RVtVrUpDTSSFOuISbxIajUpWmMdtNLte4baTYuuqG9LaSRe1xmUSEJuMyhcX3r6RWmbozaKNN8vx1xdtezJ56VVOUy0kzTtbvqtNarwacpNlUNqoXHNSjz7SpYVRVOZo0tNONJnqjKkhY0g4yfKO8PaXMT1OwF0ernu9tBLUndGJ1y0+y5RTiUDWmk2tbspdk7Oyansw01MXFRJtcv9K81KOkyzcUy5rnuS9K\\/VrqvCv1u6bnrs45Ua3cVxVSdrdcrE88Rtp6pVWpPTE9PTTmSNaYmX3XFJTmTrEGOHjl3EG3jFFQdcRQmZWhSlyltZbbn59SebjsyhUqkqFjlblLtk2Dq7BRgM5i6ovqIlQ3JtXOXKlLrxH8ZbiSkabsjaSDeyidY3mXh8oM04q++v7m6DgbYUoCkMtUiyq9WpwJSokmYmrpu+tS7zrpVqKUxTpNvUDZbZS9tXXepHeXJ5Rxbq3EYuWswlxxxxLDWE+GymmUqJUGmi\\/bbruzaBDaNs667qg7R1xXnRqOgiBO7R8dvLK14prAKjchubUwm5NyAhgNoSL7kpSABoLCNKusVVZuajOg\\/xJl1sf4qFJT7o3RW3y+HKAUN6XdqdYwkvFDAa2svcmGsvLMzeo+l1flH3IVa1X07dsGXc8kdlvoXHCzsZnZvt5m4W\\/KRLwl3JaWxr0araq7SwkTdZwuvGqW44xmRrvS9sXZK3SJwqTmEMO3bJZHjMHhEZCCMuS2p4+kXEraxJPPAZbonRLzyFAWukibZeKQq2pQUq5KB1h1qu1dkgon5hVuDyg+D4h4OX+PEax6AmjTysehLpQTcjQrXxPbw+vmohpqWsPF+XlrHr03MvKabakqTUn56cs+v1F193ZMUqgXPUas\\/s3HUSAa+ljZZHlnxua5PzlkMbdFOpULD7F6oVzGfR+S5J05dIq0+ufvrDynJLcuiasOvVF4vTdMpsulJRZFamVUdctLNyVCm7XW47Mu3Lg7b01NPNSGL5RmTLiktoq8iFiVSpRCQZ2UcU440jiuYYddSCbmXbbClpk9NxhmWlqptpQDYedMhQCTuu616Rsd5U2dODVtROWgjq\\/CPFzDjHfDy2cVsJ7rpt5WJd0kJ+i1ymuLCFpClNTMjPSjzbM5S6rTplDsjVKRUZWWqVLn2HpOelmJlpxuO0I6OZeamGm32HG3mXkIdZeaWlxp1pxIW2424klC0LSoKQtJUlSSCCQYnKFpcSlaFJWhaQpC0kKSpKhdKkqFwQQQQQbEaiNaHKLcotSOT3pGFdWq2FdSxRRijUrup7DFPu6WtRVHVaktb804665NW\\/XjOonTXkoSltMqGBK\\/34veZq8++T7N\\/JKub88NK\\/wBnkHyk\\/wD8TdEr982MP+isPIigxzDtN2nYww1jCoUikVBiXkZdiQW20uQkn1BT8kw86S48ytwhTi1EAqNr2GgFq9rtdqsnVZuWlpvsmGixkR2Esu2eWYcV6TjK1m61qOqja9hYAWmMaPvL52rj3jhhPgtKaM1w21M4pX9bVjMXDMYo02qsURy46nL01FRdpzdjSK51uUL+2XLtzkst4JLYfZ1s4kMR5zfJ2f3d2iN\\/lAYY\\/wCtFPj0ZIsbY\\/iyt4uolUna7MtzMxLVUyrKm5diWSlkSks7lKGG20qOdxRzEE2IG4RvMMVGcqLE0uce7ZTTraUK7NpuySgkizSGwdRxBI3DSCCCCLciUQQQQQQRj\\/pPY5S2jTgFifjvPW6\\/dsthnbaridtyVqTdGmKuhM7JSQlGqm9JVJuSJM4HNquRmhm3q7Lzs40G\\/fJ9m\\/klXN+eGlf7PI24cqn+16aVX8Gq\\/wDT9Ejz0Y572wY\\/xPhGtUqToU61LS81TDMvIck5WZKnvO32swXMNOKSMiEpypITpe1zeIRier1GnzrDUnMdi2uVS4pPYsOXWXXU3u60tQ9FCRYEDebXN4lfffJ9m\\/klXN+eGlf7PIkO4J4ks4zYNYR4wS1Jft6VxXwysLElihPzqag9RGL6tSk3Q3SXqg3LSbc85TUVRMmudblJVubXL7YS7IdDQ8ySPSJ0F\\/7iXQ6\\/yWNHz+aW0Ye2O48xLi+pVmXrs41NNScjLvS6W5OVlilxx8trJVLtNqUCkDRRIB1AhzC9WqFQmJpucmO2S2yhSB2TDeVRWATdppsm45kjlHT3KGaeVK0AsN7HxFquGlQxNavW+FWW3Sadc0varlPdFAqtcM+5NzFEraJlsppapcS6Zdles9tw8dmG16lfvk+zfySrm\\/PDSv8AZ5HZ3yjr+5nwG\\/h2c\\/m+uyIecaDajtLxfhjFszSaPPsy8i1KSLyG3JGTmFBb7AW4S48ytw3Vc2KiBewtpGDiCuVSSqb0vKzXZMoQyUoDEsuxW2lSjmcZWrUk6ZrAGwA0iV418pNslTrYe0TLpbaLjYfcaxcpDzjbYVm4tpo2Awl11KRmhtT7KFqzSXWydaJCOBWOeGmkfhdamMGEtwS1x2Xd1Pbm5KYQtoT1Mm9RAqFAr0k088aTcVFmlrkKxSXnFOys224G1PMFl9\\/zMo2ccmVyjF36CmKSZWsrqVzaP991CTl8TLJaededpC3HGJYYh2fJqcEuzdlGk0BE5JEsyt10dlVGnnmJpqiVii63BG3Cr\\/TLcrjGYYfpc5lZE63KMSy6a8VWQ+4JdtAdlVkhMyFJUtoBDzZAQ426zScVTaJoIqb3bSztkFzsmUKl1X0csy2jOjg4CCoD0kbihc\\/iCPjLFvm0sTbPtjECwrgp91WXeNGp9xWzcFLcU5I1aj1NluYlZtkrQ08ypTKtV6VmWWZuUmA9KTjLEyw8039nHVqFocQlxtaVtrSlaFoUFIWhQCkrQpJKVJUkgpUkkEG4MWMlSVJStKgpKgFJUkgpUkgEKBBIIIIII0I1BgggghUex1VjZiSzgzg1i5jBM0l+4ZXCjDK\\/cSX6ExOpp71bYsW1KtdDlJZqDktONyLlSRS1SaJ1yUmm5RcxtjLvBotGPF98n2b+SVc354aV\\/s8jeXp0f3EumL\\/ksaQf80t3R5u0UDtix5ibCFSo0vQp1qVanJGYfmEuScrMlTjcwltJCphpxSAE6FKSAd9r6xDMUVWoU5+VRJzHYocaWpaeyYcuoLABu604RppYED12IlfffJ9m\\/klXN+eGlf7PI3waJmkFK6VWjzhpj\\/I2xM2VK4k02r1Fm2JqqNVyYpPzTctZtwtO1VmQpjc4ZhdGXNBbcixskzAYAUWtsvzYY9Ankgf2t\\/Re\\/exd385t7xj7H8f4oxdXKnJV2damZeVpRmmUNycpLFL3nks1mK5dptShkWsFJJTre1wLM4ZrNSqFQdYnJntm0ybjqU9iw3ZxL0sgKu002o+i4rQm2t7XAtsngggjoaJzBGtjlfv2t\\/Sh\\/exaP85tkRsnjWxyv37W\\/pQ\\/vYtH+c2yI0WKP6WcRf4Cq\\/8Au+YjAqv7l1L+8Jz\\/AGdyPP2gggj5yRS0T8tDfQ30Qrn0Q9FO5rm0VNG64biuLRuwNrlwXBXcDcMKtXK7XKrhha89VavV6rPWvMT9VqtUn5h+dqFQnX5idnZyYemH3XXXXHIyX\\/sF9CX8jvRY\\/wDofMJf6IwaC\\/8AcS6HX+Sxo+fzS2jGU8fRKjUakKpFKUqlU1SlU2QKlGRlSpRMq0SVKLRKiTckkkm+tzrF0ysrLGVliZdgksMkktNkkltBuTl1PfGLH9gvoS\\/kd6LH\\/wBD5hL\\/AERhnNaB+hHNsPSzuh7owIamG1NOKlcCML5CYSFghS2JuRthiblnSkjUdlnmHmzvQ6ncRlnBGyNEopFjSKYQd4MhKWPj+S+7nD\\/mkr+9pf8AyLf\\/AKe4eyNa19ckVyd1\\/wAu+3UNGy1rfmHdZTc\\/Y1Zu2xpmVd1Uth2Xl7YuCm0tSkpGrsJumzUoV5uLli4I1d6Qfyc+x6lLT9W0Yca67bNVS2t2UszGGVl7hoE4+oDVlWL0tiQplZoUoAPNVN2tdswtR+lfG90SbYI0FW2eYLrTa253DtMSpQ\\/oiTl0SE0DwUJmSDDpy6WStSkcFIUk2jCmaHSZpJDkiwkkfXYQJdYPA5mQjMR\\/GzA8QRcHzVtJHRRx80S7zTY+O+H1Vs2ozKXX6JVlFmpWtdEmwpKVz1sXPT1zNHq7LQcaM1KsTQqNMU8yxVpCnTLhlxjxHpkY6YC4U6SeG9fwoxktCnXjZ1eYLbsrONpTP0ioJQtMlXrdqaf15Q7hpqnVu0+rSC2JplSltrW5LPPS78BvlA9B+89BPHSew3rUzM3FYtwy79xYV327LeTouq1TMFlctPBoCVl7nt19bdMuORYKUIeVJVSWZapdaphXy3tK2VTODAKrTHnqhQHXUtKceCPO6c64bNNTXZpQh1l0+izNIQ2O0IYdbQtTKn6\\/rmH3KUQ+ypT0mtWULUB2jKjuS7lASQrclwBIJ9EpSSnNhNSqpUqHUqdWaNPztJrFInpSqUqqU6Zekp+mVKQmG5yRn5Gdl1NzEpOyc000\\/LTDC0PsvttOtubRAidnySnKEf2bOCr1vYgTkqjSAwjl6ZSsQUNJblvu2ob6TL0PEmRk2whhp2qlhchdcnKJ8kkLjl3JyXlqZSq9RKexBBjMbQD0oqpog6VOGGMTMy83bLNWRa2Jcg2tepVsNboel5G6WXWWsjMv0lryW6KTLrybVcFBo7jo2aXI02zHGj+D8RSynXimjVJ1qUq7KlHsktLVlangm+jsktRdUpIKly5fZAu4LY1Dqi6ZOoWVESzyktzKPzSgmwctwU0SVgjUpzI3LMejVGkfTk5Zq3NCnH2q4E1LACs4gzNLty27hVcsjiFIW7LvpuSSVOIlE0t+0KytC5RKS2t4zq9tx2TW6N1UnOS0\\/LSs7JTTE3KTbDMzKTcs82\\/Kzkq+2h5iYl32VrZeYeZWh1l5pa23G1hSSQd8HLl5f2wm8P4NMMP9ALjqTaviWrYWwqmq0SYRLzhqcpLdothmYSWXm5hSx2byFo1LaCFZb2GhsTefYlnpqQp7b8m92TipltsryNOXQpp1RGVxDidSlJBAB037xGyn75Ps38kq5vzw0r\\/Z5B98n2b+SVc354aV\\/s8iKDBHNX469of9lpX+Sqb\\/ADbq57rQT8Jq5+\\/j\\/wCGk\\/5v1c91pX33yfZv5JVzfnhpX+zyD75Ps38kq5vzw0r\\/AGeRFBgg\\/HXtD\\/stK\\/yVTf5t1c91j8Jq5+\\/j\\/wCGk\\/5v1c91pX33yfZv5JVzfnhpX+zyD75Ps38kq5vzw0r\\/AGeRFBgg\\/HXtD\\/stK\\/yVTf5t1c91j8Jq5+\\/j\\/wCGk\\/5v1c91pX33yfZv5JVzfnhpX+zyD75Ps38kq5vzw0r\\/AGeRFBgg\\/HXtD\\/stK\\/yVTf5t1c91j8Jq5+\\/j\\/wCGk\\/5v1c91p+XJycpPRuUL\\/Vk+acJaphd+pF+p75R85XhK3Ya793\\/3cbLYGVt6g+QClmyndoHPKjMioI1dh5MS7k3pkaSclohaN+I2kRULSmb5lMPDZ+1tWSrLdBmar91d92vY7ezqz9NqjUqZFy5UVJRXIP7dEoqXBZLweZ0FfJpf\\/q0\\/\\/wAXL\\/8AXxG0rlqv2srSX\\/8AM7\\/6wGFcdG4dxRWahsoexTNTDa60ih4nnUzIl2UNiYpj9Vbk1mXSgMENplWQpJRlcykrBzKvOZGem3sNrn3Hc02mUqDoeyND8owqZDSuzSgNeiG0aZMqrekDc31t\\/fJ9m\\/klXN+eGlf7PIPvk+zfySrm\\/PDSv9nkRQYI5y\\/HXtD\\/ALLSv8lU3+bdXPdaDfhNXP38f\\/DSf836ue60r775Ps38kq5vzw0r\\/Z5B98n2b+SVc354aV\\/s8iKDBB+OvaH\\/AGWlf5Kpv826ue6x+E1c\\/fx\\/8NJ\\/zfq57rSvvvk+zfySrm\\/PDSv9nkH3yfZv5JVzfnhpX+zyIoMEH469of8AZaV\\/kqm\\/zbq57rH4TVz9\\/H\\/w0n\\/N+rnutK+++T7N\\/JKub88NK\\/2eQffJ9m\\/klXN+eGlf7PIigwQfjr2h\\/wBlpX+Sqb\\/NurnusfhNXP38f\\/DSf836ue60sukfKPrQrFXpdJRooXKwuqVCRp6H1YvUt0MmemmZYOqbGHqNoltT2tqayCoJIzy4SZY8vSyf\\/HK1P3z0H\\/ScnHqFxfGxzGVfxfLV52vTTU0uRfp6JYtSsvLBCZhqaU6CJdtvOVFpFiu9sulrm8uwtU56o+feev8Ab9j5r2f5JlvL2nnGf9pbbvm7NP1r2tpa5voM0ruXPtnRc0g8TcAp7Ryr94zmG9XkKU9csriXTqJL1Zc9QaTXA81S3rLqjsollNUEsELnZgqLJdzG12SegPvk+zfySrm\\/PDSv9nkaXOVw\\/bGNKP8Afjb\\/APqBaMa5IqDEe1\\/HdOxDXqfKVOWblZGs1OTlkGmSCymXlZ59hlKlrlypZS22lJWolSrXUSdYjU5iOstTc003OlLbcy+hCfN5RWVCHVJSm6mCo2SkC5JJ3kkxK+++T7N\\/JKub88NK\\/wBnkH3yfZv5JVzfnhpX+zyIoMEab8de0P8AstK\\/yVTf5t1c91sb8Jq5+\\/j\\/AOGk\\/wCb9XPdaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/2eRFBgg\\/HXtD\\/stK\\/wAlU3+bdXPdY\\/Caufv4\\/wDhpP8Am\\/Vz3WlfffJ9m\\/klXN+eGlf7PI+1sv5R3gFUZ1lrEHR7xbtSTcWpDs7atetG+lsJIIbeVKVN+w1Kaz1Q+G3HHW2i4WmppxKWXYhkELb23bQUKClVKTdAIJQulyISq1rgltltdjrfKtJ10I0hScT1sEEzgWB+aqWlQDu3lDKFcOChvPdb0T9GvlEtD\\/SvelqVhFjFRJi8n0BX6nl1tTVm34pzVU47LyFBuJmSNxGWaTrzUzaUxcEjLgpLs4FbhnDHlpS0zMyUzLzklMvyk5KPszUpNyrzjEzKzLDgdZmJZ9pSXWX2XUpdadaUhxtxBW2NaJV3I+8rhdN93TbmidpS3K7cFfraWaPg3i3W31rrtarCAUymH9+1F5SvniqVVrVZtW55woq1TqbYotYmKvV6vTJoXDgLbYxX52Xo2I5Vim1CaWlmUnpVTgp8zMLIS3LutPKcdk3nVEIaUXnmXXSEXZUpAXJ6RisTTrcrPtoZdcUEtPtkhpazYBDiFFRbUogALCikqVYpQADEn+NcnKJ8oLSuT\\/tDDi7athfUcTkYiXJWLeZkqfdcvai6Uuj0xmpLmnX5qg14TaJhL+wS22yxsyC5tlA6sbG4jYfKR\\/7T2jN\\/CXev+rFNizse1aeoWEa3Vqa6lmekpdlyXdU228lClTcu0olt1K21gocULKSbXuLEAjeVyZfk6XNTMuvs3mw1kXlQvKVvtNq9FxKkG6VEapO+4sbEfOffJ9m\\/klXN+eGlf7PIPvk+zfySrm\\/PDSv9nkRQYI5N\\/HXtD\\/stK\\/yVTf5t1c91q6\\/Caufv4\\/8AhpP+b9XPdaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/wBnkRQYIPx17Q\\/7LSv8lU3+bdXPdY\\/Caufv4\\/8AhpP+b9XPdaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/wBnkRQYIPx17Q\\/7LSv8lU3+bdXPdY\\/Caufv4\\/8AhpP+b9XPdaV998n2b+SVc354aV\\/s8g++T7N\\/JKub88NK\\/wBnkRQYIPx17Q\\/7LSv8lU3+bdXPdY\\/Caufv4\\/8AhpP+b9XPdaV998n2b+SVc354aV\\/s8giKDBB+OvaH\\/ZaV\\/kqm\\/wA26ue6x+E1c\\/fx\\/wDDSf8AN+rnut6mEEEEdwxbcEEEEEEEEEEEERDPlIP9vfRz\\/gkuL\\/XF+I4USPflIP8Ab30c\\/wCCS4v9cX4jhRwdtc\\/6RMS\\/3eR\\/3VIRT+IP3Zn\\/AO7D\\/VojY3yR\\/wC2MaLn78bg\\/wBQLuj0FY8+rkj\\/ANsY0XP343B\\/qBd0T+67W6XbVFq9x1ucap1FoNNqFarFQf1thIUqlSb8\\/Pzr2yC3NlKybDz7uzbWooQchnmYvfyfVBOEKuVEADEUySomwSBTKVck7gANbnSwJJA1iYYNIFOmySABNqJJNgAGGbm500Gp7gTEfbl0uUCqWDNlyWibhJX3abiTifRFVTFKv0mdCJ60cM5\\/yiSYtlh6XO2kK7f62pgTSi4zOSFoyj6TLrbu2mz0rDyjvTSexyr2kppA4s45XEp0zuI15VStyco+sLVSLdbc8gtS3kKBIUzbtsSdIobCyVLcap4cdU66tbsdFxzztCxbMYwxJOVBTqjT2HHJWksZjkZkWllKHAi5CXpqwmHyL3WsNhRQ0gJhVXqK6nPOzBJ7IEty6DuQyknJpwUv66765lEbgACM2NFDk8tKrTLmBM4OYerTZjM0qUqGJ15TKrXw6p7zToZmG01x+XmZuvTUm6UonKbaNMuKrSQOtNSDbQ1oyn5Izk6ZfTXxTqt6YmS06nR8wmnZBd2Mykw5Iv35dUwkTtLsCVnGVImZenKlE\\/OV3ztPW1PSlIckqfKzEhP16SqUnOOty3LetCgUe1bToVItm2rfp0rSKHb9Ap8lSaNRaXIspZkqbSqZIMy8lISUoyhDLEqww0yy2kNtIG\\/Od7NNkJxVKortdffk6M4tQk5aXAbnKh2S8q3u1cStMvKBaVNpWlC3nylZbLKQhxe3oWHFVJAm5pa2ZQqIbSiwdfKSQopUoEIbCgU5sqiohSQE2zRGawu+TeUFqVl5rGvSWq83POJBnKHhdZknTJWUWG1DZy1z3bPVR6fSXShQectGnDUQUbDXd2jWUsr8ni0HJaUflnb10kp951Than5y+8P2puW2jQbSJdElhRJSJSytJeb28lMHarVtS80W2kb44I6Gk9luAJJsNt4ZkHbJylU2ZidWq4sVFU288cx1IIsU39HLE0bw9Rmk5RItrva6nFOOKJFtbqWQL21CQE\\/xYjiXz8nC0f6gy4nDbSHxhtKZLRDTt80SysQWW3yE6rq2KDIYYuOshe8sJmGlqSdXbp3E6hdKHkT9MrRzp1Quq3qNR8erEpzb0zN1jCkVOcuekyLAcUqarVg1GUl6+Qhptb8wu11XZJSUv9NOzzDe1Dc7WCNRWNjGBaowpEvTnKPM2PZzdNmHklKvzc0s+t6VWkKsSA0hZF0pcRe4xprC1JmEkNtKlXDucZcWQDwu24pbZHMJCCQT6QNiPLNIIUoKRkpJIIIyOY3FKswCDnuyPN1bzdEt\\/lqeTEta6bLu7TIwIt1ih4gWoy5X8a7QosilimX1bLWsusYgycjKNBEreNAbJql0PNoRK3JQmajW5xSa\\/TXXK\\/EgjkvGmDqlgqsLpU+UvtrR28jPNpKGZ2VKikOpQSotOoUC2+wpSi04NFuNKbdcrqp01+lzSpZ+ytAtp1OiXWySAsC5KTcFKknVKgRcpyqVuR5HflBqtom4207Cm\\/q6+dHrGSuSVKr8vPTDi5DD69Z1SJChX\\/T23DspCTmJhcnRr32Pk7c3QVy1YnDNTFr01hc5+PLPj0D+Sk0jZvSZ0IcI7urs45P3rZUpNYTX1NOu+UTE5cFgCWkZKpzbxccdmKlXrTfti4ao68lpaqlVZsoa2OxddvjYJi9+aancIzzqnfMmTUKQpxRUpEr2iG5uTBP9Taddafl0alIdmACG0ISmW4PqS1drTXVEhCC\\/LXP1UhQDzQudxKg4lI3HtTuIA1XfKT\\/\\/ABN0Sv3zYw\\/6Kw8iKDEr75Sf\\/wCJuiV++bGH\\/RWHkRQYrDbX\\/wBIdX\\/valf7tloj+Jv3cn\\/GW\\/2KWjMzk7P7u7RG\\/wAoDDH\\/AFop8ejJHnN8nZ\\/d3aI3+UBhj\\/rRT49GSLi8nr+lmt\\/4dP8Au+TiTYK\\/oae\\/u7X+rMEEEEX\\/ABNYIIIIII1+8qn+16aVX8Gq\\/wDT9Ejz0Y9C7lU\\/2vTSq\\/g1X\\/p+iR56MckeUN\\/THQv8CK\\/2+ZitsZ\\/ujLf3kj\\/XvwR6ROgv\\/cS6HX+Sxo+fzS2jHm7R6ROgv\\/cS6HX+Sxo+fzS2jGR5O\\/7s4j\\/wZKf7UqHcF\\/0XO\\/3uj\\/WRqC+Udf3M+A38Ozn8312RDziYZ8o6\\/uZ8Bv4dnP5vrsiHnEU24\\/8ASBO\\/4Ppn+zCNbir92pj+5y\\/+pRBBDyk0ufrdUptGpUsudqtYn5Ol02Ta1Q7OT9QmG5SSlmlOFDYdmJh5plGutKSpY1lb91atSapQKrUqHXKdO0etUWoTtJrFKqcq9JVKlVSmzDsnP06oSUyhqYk56SnGXZeblZltp6XmGnGXWkOoIipOzXk7UIWW83Z9pkVkLgAUWwv6pXlIVlBzZSCQBrEesd\\/Ddfhr4fDfG5zkkOU9n9D+8WcGcX6jO1HRrvmsBan1EzEzhHddUelWVXfTUqJeXaE6Ef8AfnQmN7RIuejMmpy9VptyTcaXVKbWqbTq1RajI1akVaRlKnSqrTJuXn6ZVKZPy7U1I1GnT0q67KzkhOSrrMzKzUs85LzMu4y608ptQMeXLEivkauVQOENRoeifpF3IUYUVidbkMJcQK1NOrThrWZ59tEvZlbmndYMWBWJt3WpdSfcbZs6qPFqbULYn3Zm2+iNj208U9cvhPED9pB1aWaPUHl6STqzZEhMLUdJNxRtLOk2lVkNL\\/Y60ql5lhqv+bKRT51z9jKIEu6s2DCidGlqJFmVH6pJs0reQ2SUTBYIII6tixYxY06P7iXTF\\/yWNIP+aW7o83aPSJ06P7iXTF\\/yWNIP+aW7o83aOUPKI\\/dnDn+DJv8A2pMV5jX+iZH+4O\\/6wQR6BPJA\\/tb+i9+9i7v5zb3jz9o9Ankgf2t\\/Re\\/exd385t7xi+T1\\/TNW\\/wDAR\\/3hJxjYN\\/dV\\/wDwe9\\/tMnGyeCCCOuYsyCNbHK\\/ftb+lD+9i0f5zbIjZPGtjlfv2t\\/Sh\\/exaP85tkRosUf0s4i\\/wFV\\/93zEYFV\\/cupf3hOf7O5Hn7QQQR85IpaPSJ0F\\/7iXQ6\\/yWNHz+aW0YynjFjQX\\/ALiXQ6\\/yWNHz+aW0Yynj6S0X9xqT\\/gyQ\\/wBlai8JT+hJX+92f9WmCCCCNnGRBBBBBBBGp7lktGOQ0i9CnEGrydP8pv7AqUncYrKnG20+WJlLclFuX3RQoIU+\\/KVeyk1Z9NPZIVN16k26+G3nZNlo7YY4ms0im3DSKpQqzKM1CkVqmz1Iq0hMAql56m1KWdkqhJvJQQtTMzLPusO6qkENuHVVujV1qly9bpFSpE0kLYqMnMSqwoXyl1tSUOJ5LZcKXW1DVDiErSQpIMY05LInJWYlXLZX2lt3P5qiPQXx1QsJWk2NikR5csEc7dtCctW67mtd5e0ety4azQXnCQdo7SKlM05xQKTqnWVL55o832mOCj5vONracW0sWW2tTaxpotBKVC4uDZQIuDrvikN2+PQd5KrGJzG\\/QH0drnnZsTVbt2zzhlXtoVLmUz2GFRnLKknZ1xRUX5yqUCjUetPzAcWqYNUDrpRMF1pqLvy8v7YTeH8GmGH+gFxuf+Tt3Q9VdDjEu2pkvLVaukJcipJSstg3Ta7YmH08iVaOuTrt1NqrTLx1Et\\/rtnV1nC7lpg5eX9sJvD+DTDD\\/AEAuOocf1BdU2K4ZnnVFbzy6El5ZvdbzEpNS7yzcnVbrK1HXW99L2id1h4v4VpbqjdRclkKVe5Upph9oqP8AGUUEq4XJsBaNNUZY6F2h\\/fGm5jE7gvh9c1qWnX2bPrd5Gq3kqropHkFCm6TJzEqDRaXVp3yt5yrsrYylSyUtu7R5J1NfE6N4Pyfn+70nf4CsRP8ATVlRQWC6bJ1jFdBpc+2XZKfqLEtMtpWttS2lk5glxtSVoJt9ZKgRERpzDc1Pyku7ctvTDbawk5VZVKANjwNuMdq\\/e5GlR\\/hu0f8A\\/PMR\\/wCgkH3uRpUf4btH\\/wDzzEf+gkTGoI65\\/Eps8\\/sTNfyrUv5z1c91rF\\/BKkfozH+XP\\/piHL97kaVH+G7R\\/wD88xH\\/AKCQfe5GlR\\/hu0f\\/APPMR\\/6CRMagg\\/Eps8\\/sTNfyrUv5z1c91j8EqR+jMf5c\\/wDpiHL97kaVH+G7R\\/8A88xH\\/oJB97kaVH+G7R\\/\\/AM8xH\\/oJExqCD8Smzz+xM1\\/KtS\\/nPVz3WPwSpH6Mx\\/lz\\/wCmNNvJMcnJinyf\\/wCr9+qXfGH95nFr9Ss0T7hXLicFO+4E4jipfOnz\\/Q6J\\/wCF\\/dlIeRCT8pzEtOeUBghkPdictV+1laS\\/\\/md\\/9YDCuNp0aseWq\\/aytJf\\/AMzv\\/rAYVxu6zRKdhzZ3iKjUllTEhJ4YxL2DS3XH1J84k56adu66pbiszzzihmUbAhIsABGbMyjMjQ56VlwoNNSE\\/kC1Zlem2+4q6rC\\/pLVbkLCIDsEEEcCRUEb4MN+QB0lsS8PLDxHpWMmBkhSr\\/sy1r3pcjUpm\\/wAVCUp12UORr8jKT3k1lzEuJyWlqg01Mhh99kPtuhl51sa0fbfe5GlR\\/hu0f\\/8APMR\\/6CRKZ0TP7lbRn\\/yfsGv5ubbjIGO2ZXYvs+dlZZxdKmVLcYZWs\\/SlQF1LbQpRsJgAXJOgsBc2AizJfCtJcYYcUmYzOMtrVZ4gZlISo2GXQXO6Icv3uRpUf4btH\\/8AzzEf+gkH3uRpUf4btH\\/\\/ADzEf+gkTGoIf\\/Eps8\\/sTNfyrUv5z1c91nvwSpH6Mx\\/lz\\/6Yhy\\/e5GlR\\/hu0f\\/8APMR\\/6CQfe5GlR\\/hu0f8A\\/PMR\\/wCgkTGoIPxKbPP7EzX8q1L+c9XPdY\\/BKkfozH+XP\\/piHxQfk7WlHSK9RKq9jXgE83TKxTag801M4hh11qSnGZlxDYVY6U7RSWylJUtKdYg7zuiYPBBEvwxgygYPRON0GVdlkT62VzIcmn5nOqXS4lopL7iyiwdWCEkBVwTqI2dOpMnS+280Dg7fs+07Rwrv2WfJa4Frdoq\\/PTlHn1crh+2MaUf78bf\\/ANQLRjXJGxvlcP2xjSj\\/AH42\\/wD6gWjGuSOE8Y\\/03Yp\\/+465\\/vOaipZ\\/+jp3++5n\\/XLjPTQT5PnE3T6rOI1Ew1vOxLOmMNqZbtVqrt8LuFtifZuWbq0pKIp\\/zDRKysvMLpDypjylDCNm62Wi5k5q7IvvcjSo\\/wAN2j\\/\\/AJ5iP\\/QSO0fk2f8AbA0rf3nYV\\/6bvSJZMdBbNdmGDsSYNpVYq1PfmJ+aXUEvOon51hKhL1KblmrNMvIbTlZZQk5Ui9io+kSYmFDw\\/TqhTWZmYS8XVreSoodKUkIdUlNk5TbQC+uu+Icv3uRpUf4btH\\/\\/ADzEf+gkH3uRpUf4btH\\/APzzEf8AoJExqCJ3+JTZ5\\/Yma\\/lWpfznq57rbf8ABKkfozH+XP8A6Yhy\\/e5GlR\\/hu0f\\/APPMR\\/6CRrm0veTL0rtCqmS10YrWtRK7h7OT7VKbxJw6rD1zWdL1J9QRLSVWM5TaLcNvqnjqJpz1w2\\/SZOovOCTkJqYnEPSzPoZx0zpA2DbOKWB2LuHd5ykvPWzd+Hd30SrtTaCptEvNUObDc81qtvPNTdNmUsVGRmZdtc3KTkpLzUoC+y1GprewzB8xTpkUhucplQQy6qWf89fmWS8EgtpmWppT12SU2X2SmnAFFQUbBMY83hGnGXdMsp9p9KFKbUpwOIKkgkJWlSdUq3EpII36gFJ8zWHVLqdRolSp9ZpE7M0yrUielKpS6nJPOy87IVGQmG5uSnZSYaUHWJqUmWWpiXfbWHGnWkOoO6GsEcbJUpCgpKilSSFJUklKkqSQQpJBBBBAII1B1GtorXduj0jNC\\/HdWkzor4G44zJbXVr9sSmzNzCXZQxKpvWjOTNtXuiTZQEoZk27wolabk2hls5ZDSeoaVPlI\\/8Aae0Zv4S71\\/1YpsZZcg1UpyocntacpNvqcYouJ2J9NpyDwlpFyuIrC2AeGqqo1afmMs9ypg7t+UYm\\/KR\\/7T2jN\\/CXev8AqxTY7XxVUHqtsZeqcwbzE9hujTUwrQ5n3nKet5WgA9J0rUO48N0WbU31zOEy+4SXHJWRU4T+cvt5YKV\\/3lAnjv8AWYj0fWYe2bP4jX9ZGHtLmpSSql93fbNm06dny95DKT9z1qRoknNTpl2n3\\/I5eYnm3pksMPPBhDmyadc80\\/Jx3povf3TGjr\\/DthF\\/ODb0cZ09pD8\\/JMOglt6blmVgEpJQ48hChcWIulRFwQRvBBitW0hTiEncpaUnwKgDG6L73I0qP8N2j\\/8A55iP\\/QSD73I0qP8ADdo\\/\\/wCeYj\\/0EiY1BHan4lNnn9iZr+Val\\/OernutZ\\/4JUj9GY\\/y5\\/wDTEOX73I0qP8N2j\\/8A55iP\\/QSD73I0qP8ADdo\\/\\/wCeYj\\/0EiY1BB+JTZ5\\/Yma\\/lWpfznq57rH4JUj9GY\\/y5\\/8ATEOX73I0qP8ADdo\\/\\/wCeYj\\/0Eg+9yNKj\\/Ddo\\/wD+eYj\\/ANBImNQQfiU2ef2Jmv5VqX856ue6x+CVI\\/RmP8uf\\/TEOX73I0qP8N2j\\/AP55iP8A0EgiY1BB+JTZ5\\/Yma\\/lWpfznq57rH4JUj9GY\\/wAuf\\/TBBBBFsRJoIIIIIIIIIIIIiGfKQf7e+jn\\/AASXF\\/ri\\/EcKJHvykH+3vo5\\/wSXF\\/ri\\/EcKODtrn\\/SJiX+7yP+6pCKfxB+7M\\/wD3Yf6tEbG+SP8A2xjRc\\/fjcH+oF3RMT5Ui\\/pvDXk\\/NKe5ZCY8mmZrDV2y0TGakqbTiZWqPhu5slpKVtzCmbqdSw4lQU08tl0jMCIdnJFMvP8o1ovIYZdfWm7LofUhptTqgzLYdXlMzLxSlJIbYYZcmHl7ktstuuryQiJTvLkzE2zyceLzcs++2zN3RhNLz6GVFKJiUGJdsTSWn8vrMJn5WSeAV5vlDTBPnhJNq7K5hyT2TY8m2jZyXcxA62QSLON4dklINwQdFAEkEG31SDrEhoKy3hytLSSCPOspG8K8zQAf+6SD6ogjwQQRzHEGj0IeSvwUpuBWgfo+UCXlGJar3lZdOxauuYbSUzE9cOJsszdQVPkqJXOUqhT1DtsqSEpTL0OWZG9srOw+On9H3U\\/UFwR2Wps\\/1IcNtjq6upqfcbRMtXV3aurlq5c3VHcEfSajSbNPpNMkZdISxJ0+TlmkgAWbYl2203AAFyEgk8Sb8Yu6SbSzJyrSAAluXZSABbc2nXxJ1J3kkkkkwQQQRsoyoIIIIII4uoSEjVpCepdTk2J+l1OUmZCoSE20iYlJ2SnGVsTcnNyzgU29LzLDrjL7K0KQ404pKsxnHmtaUuEzeBWkjjlg\\/LFaqfh3iletr0Z1wkuv29T69Ot27MO7TftJqhqp0w6M1+e6fPcPnR6XMefVyuH7YxpR\\/vxt\\/\\/UC0Y598oaUZVh6hT5SPOJetKlG12FwzNyMy88m++xckWDbd6MQrGjaTLST1hnQ+tsG2uVxvMR7Wk8DrrprfXJErH5Nvfr8za2lNhfMTCzL0ev4Z37SZU7ZTe2uOnXXb1xTKckeTsrQ3alsNua7qX5kLZLbbqJR4sRToke\\/Jv3XRjjpHsJdcSyvCi133GUrUGXHmLvCWXVtnNKnWkPvobWoFTaH3QgZuril9jsw4xtEoAQdH\\/pGXcH6Ta6XOKt6loQvhqgbxcGL4cWW61IkfnLcQRfeFsOp152uFAcwDwjIH5Sf\\/AOJuiV++bGH\\/AEVh5EUGJX3yk\\/8A8TdEr982MP8AorDyIoMZO2v\\/AKQ6v\\/e1K\\/3bLQrE37uT\\/jLf7FLR3Fo64u\\/qB474R42fc991n6leIFsX19zXzt8xfP33N1RipfNYrXzZWfmvy0sbAz3zVUPJgrb+SPZFoyNvvlr\\/AIFn\\/ON\\/7B4izwRFsPY8xXhSVfk6BVfMJaYf85eb8xps1nf7NDWfPOycw4n8m2hOVK0o0zZcxUThyVWqFOQtEnMdilxQUsdky5dQFgbutrI000IB4xKY++Wv+BZ\\/zjf+weD75a\\/4Fn\\/ON\\/7B4izwRIPxybSP4R\\/6HoP\\/ACuM38J65+\\/v\\/wAaT\\/m8SmPvlr\\/gWf8AON\\/7B4Pvlr\\/gWf8AON\\/7B4izwQfjk2kfwj\\/0PQf+VwfhPXP39\\/8AjSf83iQrpU8vL\\/ZM6PeKuAw0VRZX6ptsKt37qv1cPuk+ZQqekp3yz5jGD1A+cwPI9n5OKxIAlwK2w1dVUeqCCIjiLFVexXMsTdfn\\/P5iWYMsw55rJSuRkuKdyZZKXlkK9NalZlpUrW2awAGtnZ+bqLiXpx3tnEIDaVZG27IClKCbNIQk2KlG5BOtr2AAI9InQX\\/uJdDr\\/JY0fP5pbRjzdo9InQX\\/ALiXQ6\\/yWNHz+aW0Yunyd\\/3ZxH\\/gyU\\/2pUSjBf8ARc7\\/AHuj\\/WRqC+Udf3M+A38Ozn8312RDziYZ8o6\\/uZ8Bv4dnP5vrsiHnEU24\\/wDSBO\\/4Ppn+zCNbir92pj+5y\\/8AqUR2Vgx\\/bjwl\\/hMsT\\/WelxK15ZfkszjJTK1pX6O9tKdxcokl5XivYFElCuYxRoci202q67fkJdBU\\/f1AkkFVVkWmy\\/d1Dl0+R69zU2Wk7milYMf248Jf4TLE\\/wBZ6XHpzRK9jeG6ZivC+MaPVGgth+cpqmnkhPbycymXmwzNyy1A5Hmio20KXEKW04FNOLQrPwzIMVKTqstMJulSpQoWLZ2nAJnK4gncpN7EblJKkqulREeWfBEl\\/loeSyNnzVx6YejnbRNqVCYfq2OOHVBkipNqzzxU9O4l23TZOXCW7YnnQuYveRQT8wVF9y5WB8xTlW+56NBFOYswrU8H1h+kVJFyn8pKzSEkMT0qokNzLBJOirFLjZJUy6lTaiSAoxuoSExTZlctMJspOqFj6jrZJyuIPFKrajelQKFAKSQJXHIv8qd90jFt6HOkZcafuhk2WKLgXiLXJ1tHz7JS7aWZDDC5ajOTGs5XZVtLclYk8vM1mWSzbD3+60tRk1iTxHloy8y\\/KTDE1KvOy01LPNzMtMy7jjMxLzDLgcafYdbKXWXWXQlbTra0ONrTro3iJoXI+cqQ3pOW\\/T9HTHeutjSGtWlKRa1zVKYIexmtmlS7z78w65sG2lX5btPl9eusqeXN3JTmXrmZL0yxcKpPofY\\/tQE+iXwniGZPn6AGqNUH1389bSLIkJl1RuZxtItLOK\\/olADKj5wlvziZ4Zr\\/AGnZ02dX6YARKPKP1wLBLDh\\/T4MqP17dmfTydptF06P7iXTF\\/wAljSD\\/AJpbujzdo9InTo\\/uJdMX\\/JY0g\\/5pbujzdojflEfuzhz\\/AAZN\\/wC1JjExr\\/RMj\\/cHf9YII9Ankgf2t\\/Re\\/exd385t7x5+0egTyQP7W\\/ovfvYu7+c294xfJ6\\/pmrf+Aj\\/vCTjGwb+6r\\/8Ag97\\/AGmTjZPBBBHXMWZBGtjlfv2t\\/Sh\\/exaP85tkRsnjWxyv37W\\/pQ\\/vYtH+c2yI0WKP6WcRf4Cq\\/wDu+YjAqv7l1L+8Jz\\/Z3I8\\/aCCCPnJFLR6ROgv\\/AHEuh1\\/ksaPn80toxlPGLGgv\\/cS6HX+Sxo+fzS2jGU8fSWi\\/uNSf8GSH+ytReEp\\/Qkr\\/AHuz\\/q0wQQQRs4yIIIIIIIIII6R0jcWKfgTgJjFjFUZmXlWsOcObtuqUVMFGpM1al0aadoVNQlxJbdmatWxT6ZJsKSrbTc20yctqdVp99qWYemHlBtmXacfecUQEoaaQXHFKJ3BKElRO4AG8IcWlptbqzZDaFLWeSUJKlH1AEx5v2MMwxN4tYpTUs6iYlpnEa95iXeaKVtPMO3NU3GX21DcppxtSFIVx1D07x19A666+64++644444p5155RcdeddUpTjjjilKUt1a1ay3FZrUo5nfBHzTmXRMTD74TlDz7roTe+XtFleXxGaxtpyAiiybknmSfbEvf5OFLTaNHzSEnnJtS5CZxkpEtLSO8plpyTsqlvTs0Eq+jznGZ6QaJR5\\/6wG1yGyjU7y8v7YTeH8GmGH+gFxvn5A3D+bsvQFkbhmmlNfqq4vYh37JF1BQtyRkUUDDZsgqVmphUzh\\/OLbGQQSsqSDrF1ehjl5f2wm8P4NMMP9ALjpDF8s5K7CsKNOAhSnqTMAG\\/1Jxufm2t\\/\\/ZvI04bgALCJrUmy3hKlpIIJfaXrydRNOg25ELBHMEWtGmqM3eT80zDoK49PY3HDj9VPa2JcVlfcz92H3Eanz\\/PUWb+c\\/no2teGsJUUctGT+agXw\\/tDNM7Itu4RQRzrTajO0iflanTnvN56SeTMSr\\/ZtO9k8jVK+zfbdZXb9FxtaTxSYhzLzku82+yrI60tLja7JVlWk3ScqwpJseCgQeIiUx98tf8Cz\\/nG\\/9g8H3y1\\/wLP+cb\\/2DxFngiwfxybSP4R\\/6HoP\\/K43P4T1z9\\/f\\/jSf83iUx98tf8Cz\\/nG\\/9g8H3y1\\/wLP+cb\\/2DxFngg\\/HJtI\\/hH\\/oeg\\/8rg\\/Ceufv7\\/8AGk\\/5vEqai\\/KRjWK1SaSNDIS\\/zrVJGm+Uf2RG22AnptmW2oZ\\/ULYDpZ2mvqbRBWAUbVG4iUVHl6WT\\/wCOVqfvnoP+k5OPULi\\/djGLsRYsla+5iCo\\/SC5J+nIlVeaSMp2SZhqaU6LSUtLBeYto1cCynL6JSCQZbhapz1S8+89f7bsfNez\\/ACTLeXtPOM\\/7U23mzdmj617W0tc3I1Y8tV+1laS\\/\\/md\\/9YDCuNp0aseWq\\/aytJf\\/AMzv\\/rAYVxY2Nf6T8Wf\\/AGxX\\/wDdczG+qv7l1L+8Jz\\/Z3IgOwQQR87opaJKeE\\/yh84XYWYaYaf2IBrn6neH9m2L89\\/2QHzZ88fclbtNoBqnzcME5\\/wAgFQ+bxO+Q+XzoldrsPLJjZKed7F++Wv8AgWf843\\/sHiLPBFmI2w7Rm0IbRiLKhtKUIH0RQjZKQEpFzTCTYAC5JJ4kmN4jElabQlCJ2yUJShI83lDZKQAkXLBJsABckk8TEpj75a\\/4Fn\\/ON\\/7B4Pvlr\\/gWf843\\/sHiLPBCvxybSP4R\\/wCh6D\\/yuFfhPXP39\\/8AjSf83iUx98tf8Cz\\/AJxv\\/YPG4Lk49Pj\\/ALoFhlfmI36lBwl+4q+02V8zC+vu9+cyq36XXfnP5wFn2YZID50Mp5H5DNjKXL5mvpdk358sTDPk4v8Acz48\\/wAOzf8AN9acWNsr2jYyxJjCVpdarPnsg5Jzzq2Po+lS2ZxlgrbV2spIsPDKrWwcCTuUCNI3WH63VJ6ptS81Ndqypt5SkdhLouUNqUn0m2ULFlAHRQvaxuCYkSQQQR1JFgR59XK4ftjGlH+\\/G3\\/9QLRjXJGxvlcP2xjSj\\/fjb\\/8AqBaMa5I+dWMf6bsU\\/wD3HXP95zUUlP8A9HTv99zP+uXG+zkJtJzATRqvLSMqGOuJ1t4aSV12zh1J26\\/cSp1LdWmqVVbrmKgzKCTlJtWco1PSjjxWGgA+3v3kRJC\\/7qnyen5VWGv8evf\\/AASPPRgieYU2x1rCdCk6DJ0qlzMvJKmVIemTN9sszM09NLzBp9CPRW8pKcqR6IF7m5jb0\\/Es7TpVuUZZlVttlZCnUulZ7RZWQSh5CdCo29Hda97a+hd\\/3VPk9PyqsNf49e\\/+CQf91T5PT8qrDX+PXv8A4JHnowRIv\\/eGxH\\/YOie2f\\/nMZn4Z1L97SP8AiP8A848ehr6Ez3Kqcnqy246vSpw4Uhppx1SWhcMw6pLY1lIaYYoTjrzikjJDbTa3XCdVptShkdUXKMct9gpV8IL6wT0SajWb9urEKg1Kzq3ik9QqrbdqWrb1blXaZcS7fl7lkKZcVbuOZpz89S6fNoo1NpNMVMpr0hWKi\\/KSks9E2gjVVnbtiuqU+YkJeTpdL86aWy7NyiJpc0hpxOVYYU9MrbZWpBKe17JbiAczSm3AlYYmcWVOZYcYCJZgOoKFrZQ4HMqhZQSXHXAm4JFwnODYpUCLwQQRsv5MHQAunTexxpYrFLqElgFh\\/VZCrYu3bsnmpSoS0u43Oy2HlEnAWg\\/ct2BKJV\\/yZ4u27QHp64H0qfbpchVano1Hnq\\/U5OkU1lT85PPJZaQASlOY+m86oA9mwyjM6+6r0W2kLWdBEelpd6bfbl2EFbrqwhCRzJ3qP5qUi6lKOiUgk6CJanJF4ST+DfJ+aP1ErUkJKvXdRKvifVWlMpYd1MRa\\/Ubot1Uw1qIdEwzZ89bUq+JguTCHmFNHZNNtyzGt35SP\\/ae0Zv4S71\\/1YpsSPpKSlKdKSkhISjEjIyDDEnIyUmw1LSclKSzSWJeWlpZhKGJeWlmUNsy8u0222022G2wEgARwflI\\/9p7Rm\\/hLvX\\/Vimx2lj2nNUjZVVKUwSWabRqZItk71IlX5BhKjqTdQRmUSSSonUxZ1bl0yuGnpZJuGGJNoG1irs35dOcjmsgqPeTER6Pt8Lb1\\/U1xNw6xFFN+exYN92jepo5nfm351+5a4KfXBTPnDySf8g8u8g8k8s8gnPJtrt\\/JHw0GXPiII4dZdcYdafaVldZcQ62qyVZXG1BaFWUFJNlJBspJBtYggkRVgJSQoGxSQQeRBuDrpv5xKY++Wv8AgWf843\\/sHg++Wv8AgWf843\\/sHiLPBFlfjk2kfwj\\/AND0H\\/lcb38J65+\\/v\\/xpP+bxKY++Wv8AgWf843\\/sHg++Wv8AgWf843\\/sHiLPBB+OTaR\\/CP8A0PQf+VwfhPXP39\\/+NJ\\/zeJTH3y1\\/wLP+cb\\/2DxIA0Q9IU6VujhhdpBfcf9wYxJptZqP3JfP5ug0QUq563bYZ+f1UW3fnDygUbywufM1P2XlJl9m7si875s8egTyQP7W\\/ovfvYu7+c294t\\/Y3jvFeK65VJOv1Xz+WlqSZllvzGmyuR\\/zyWaz55KTl1q\\/JuLTlWpSNb5bgESHDNZqVQqDrE5Mds0mTcdCOxYbs4l+WQFZmmkKNkuLFs1tbkXAI2TwQQR0XE5gggggggggggggggjqPGzGvDTR5w0ufFzFy55G07ItORcnZ+oTrjflM5MhtSpOjUaTUpL9Xr9XfQmSo1GkkLnKjOOMy8u1mVKQ0++zLMuzEw62www2t1551aW2mmmwVOOOOKIShCEgqUpRAABN9IStaG0KccUlCEJKlrUQlKUpFypROgAGpJ3REU+UN3zKXBpk2HaEm+t42BgXbctVWi+S3KVy5bpu+vuMJlwpTbTi6E9bsyt8Bt2YbmWm3EFqWZcc0LRkBpWaQNwaUukNirj1cbC5KbxDul+oU2lKeS\\/8AMNsSDEvRbQt8OpAbfXQrXplJpTsyhDYnH5V6dLTRmCgY\\/wAfPTGlZbxBiqu1dglUvOVB4yy1CylyjITLyqiLDKVS7LaiCLgqsbkXNLVKZTOT83Mo+o8+4tFxY9nmIbJHAlASSOBuI2vciJR5qpcpPgTOy6fobdpOLtZnjsyoJlX8Hb6t9KlEEBpPltdlAHFnV\\/vQ+ldQDLF5Vmw5zEfk89Ki3ZFC3H5HD2WvkttDNzyfC+6LfxMnTlroBSmUtGZU4cyQ2CA26Ds1R\\/Pk5+FL9f0i8asYJiTLtKw5wqlLPlZlaihuWuTEi45SblHWBmjbPooFjXFLOghxqXaqILrW2dlXRLyuK36Tddv12167Jtz9CuSj1Kg1mQdJDc\\/SKxJP0+oyTobKVBuZk33mHNUpOos8SI6c2P0TznZhPybwyIxG\\/XBmUCoFqYlW6OV5T+aPNFCw0Va\\/50TvDUoXaBNMqOUTy5xKTyS4yiWJvxsptW69iCN4jy7YI7s0lcD7h0bMesVcDbmTMGpYcXjVqBLzswytk1qipeE1bNxMoW0yTK3JbsxTK7JqLaNaWqDStVOYMdJxyHNyr8jNTMnNNqamZR92WmGlCym3mHFNOtqB4oWlST3iK5WhTa1IWkpWhSkLSd6VJJSpJ7wQQY9C7kvsYadjboH6N9yykyw9Urbw8o+F1xMtulyYlLgwtZRY8184I11qZnKrJ0WQuLUWEBcrWJWaabRLvMpGwKIP3I1cotS9ELEmr4Q4v1VUjgDi7U5Oberb5dMnhniClpmmyl2vobCtS3a\\/IMylDvBeopUmiRoFcDzElRamifm10uqU2tU2nVqi1GRq1Iq0jKVOlVWmTcvP0yqUyfl2pqRqNOnpV12VnJCclXWZmVmpZ5yXmZdxl1p5TagY7v2aYslMVYXp7iHkGo0+Wl5GqyxUO2amWGg0Hygkq7GcS327LmqSVONZi4y4lNt0CotT9PYAWDMS7aGH2zYKCkJCQ5a49BxICwoDLmzIGqSBy0EEEWDG7gggggghjOTktIS01Ozs0xKSkow9Mzc3MvNsSsnKsNrefmJh95aGWWGWULdeedWhtttBUogDd5rWlhixL466TWPGL8hmKViDirety0FKgErbtubr04LZae3DWfZoCKa1MOaqNq8h14tNawbiU3y03KVWxhRhvdWiZg3cMnWMYcRaVNW7idVaLOpfbwusepILFZoszNSqlNs3td0ip+jGklZnKFb03P1GdakZyct5x+HPHJ23nFknUZyn4ZkHkTApLrs3U1tqCm0Ty20ssyoUn0S7LMl8zASVBCn0tEpdbcQiuMXVFqYfZkmVhYlStTykkFPbLskN3F7qaSFZ7GwUvKfSQQCJUnybawX2qTpTYovsPCWnqjhnYNGmdmnYKfpUrdVxXIztMitTjbdZtJ3UQUIbQ79Kh4vNeTxW49AnkntG+c0ZdCLCi1K9T102975ancWb9lHUbOYlrhvsS81TqfOS6m0OS1RollydqUCqy7hdW1UqTNJ1tmUNtx\\/YVR3KhjVNSyEy9DkZqZccscgmJxpcjLNEg2zrQ9MOoBuLS6yNUgxiYTllPVZDwHoSjbjqiRcZlpLKE+JLhWn+0J4WOrT5Sf8A+JuiV++bGH\\/RWHkRQYlffKT\\/APxN0Sv3zYw\\/6Kw8iKDGv21\\/9IdX\\/valf7tloxsTfu5P+Mt\\/sUtHamBOE1Sx4xnwvwYo1WkaDVcUb4t2x6bWakzMP0+mTdxVJimy87OsywMw5LMOTAcebl0l1SAdUKOQO+n72+x3\\/KMwk\\/5O3j\\/0EajuTs\\/u7tEb\\/KAwx\\/1op8ejJEw2PYBwti2h1Odrsg5NzEtVTKsrROzksEsiTlncpRLPNJUe0cWrMoFWtr2EbLDVHkamzNLm0LUpp1CEZHFIACkEm4Tv1iIZ97fY7\\/lGYSf8nbx\\/6CD72+x3\\/KMwk\\/5O3j\\/0ES84Itz8Suzv+wz\\/APK1V\\/nkSX8FKN\\/Wnv8ALufOIhn3t9jv+UZhJ\\/ydvH\\/oIPvb7Hf8ozCT\\/k7eP\\/QRLzgg\\/Ers7\\/sM\\/wDytVf55B+ClG\\/rT3+Xc+cQmtJHkLsX9G3A3EnHS4MccN7io+GtvLuCeoVHoVzy1SqbSZyUkxLyb08hEs06XJtK9o6oJCUKO\\/n0aR6F3Kp\\/temlV\\/Bqv\\/T9Ejz0Y562xYUoeEqzSpOhSq5SXmaWZl5C5mZmSt7zt9rMFTLrqkjIhIypITe5tcxDMSU6Vps4yzKpUltcsl1QUsrOcuuovc6gZUJ053PGCPSJ0F\\/7iXQ6\\/wAljR8\\/mltGPN2j0idBf+4l0Ov8ljR8\\/mltGJX5O\\/7s4j\\/wZKf7UqNngv8Aoud\\/vdH+sjUF8o6\\/uZ8Bv4dnP5vrsiHnEwz5R1\\/cz4Dfw7OfzfXZEPOIptx\\/6QJ3\\/B9M\\/wBmEa3FX7tTH9zl\\/wDUojsrBj+3HhL\\/AAmWJ\\/rPS49OaPMZwY\\/tx4S\\/wmWJ\\/rPS49OaLL8nX9zsUf37Tf8AUTUbzBP1Kl\\/bSnwmI46dkpSoyk3IT8oxPSM+w\\/Jz0lOMNTMnOyky0piYlpmWfStiYlpllbjMxLutuNutuFtwFJIMKjle+S9nNFS657HzBSivzOjletZJqtGk2VPrwcumrTLrgo0w2xLJblbAqs06GLPqLqimlTK27WqTzcyqgzVcm0R8leVm2viHa1xWPfFBpt02hdVJnaFcVv1qXbnaXWKTUGly85JTkq4gpcbcbX5qhk40tKX2VNvIaWLaxxgqn42o7lPmghmdZC3aZUMmZySmSlI1sQpcs9lCJlm9loCVAh1ppaZJV6SzVpYtLsh5u6pd62rayNQriW12AcT3BSbKSkjy\\/I5i2rkuCzbiod22nWalbtzW1U5Kt2\\/XaPOPyNUo9Xpkw3N0+o0+clloel5qUmWmnmXmlgocQCN8bK+U85OO6dBbFAVK3kVK4dHnECoza8MrvmAqamqJNIaTOTWH14vttJal7hpLSnVUefcDbF2UOXNVkkpqMjcVLouryOE6vSaphqrTFMqDa5Oo094AlClCyklLjMxLupylTbicjrDyCCUlKhlOgqSYl35N9yXfQpp5lVlJPAjVKknilQspChopJCgbERMYwV5Syg6cHJyaYln35N0yiaSdgaI+Par2oTKJemyd9UhGFV3yzOIFoyAeOsw5lLN3dS5JtLNv1yYaW1LylGrFGREOeOUodw122ZyYqFAq9Ros9M0ev29MzdLm3pKYmKHdVDqFsXLSXnpdaFu06vW9VqnQ6pJr+gnaXPzklMpcYfcbPFxu8V4yn8Xy9CNUTnqFIk35F6cBFp5CnUOMzDiRoiYy3RMWGVxaQ6MpcKEZc\\/U3qi3KCY9J2VbW0XbkqdSVJKVrv+fYEKVc5iMxsSYI9Ankgf2t\\/Re\\/exd385t7x5+0egTyQP7W\\/ovfvYu7+c294s3yev6Zq3\\/gI\\/7wk43WDf3Vf\\/we9\\/tMnGyeCCCOuYsyCNbHK\\/ftb+lD+9i0f5zbIjZPGtjlfv2t\\/Sh\\/exaP85tkRosUf0s4i\\/wFV\\/8Ad8xGBVf3LqX94Tn+zuR5+0EEEfOSKWj0idBf+4l0Ov8AJY0fP5pbRjKeMWNBf+4l0Ov8ljR8\\/mltGMp4+ktF\\/cak\\/wCDJD\\/ZWovCU\\/oSV\\/vdn\\/VpggggjZxkQQQRxVRqdOo0lO1Wrz8lS6XTJV+dqFTqM0xJU+QkpVtT0zNzk7NONS8rKy7CFuTEy+6hlptsOOqSAFR4SBqSAACSToABvJO7220ueEBIAJJsBqSdwHMxysRgPlAWmzTZW3aPoT2BW25qs1Weot6Y5mSf1\\/mqjSBl6zYtiT5QpTJm6vUTIXxUZNwIm5OUpNpzIOwrKge6eUH5cXC\\/Caj3BhZokVemYp4tTDM7SZrFGSDNRwzw8fJflXp2izziHZPEW4pTVD9LFNRN2Sy45Lzk3V62JWbt6Yh+XJclwXhcFauq66zU7kua5KnPVmvV6szz9Rq1Yq1Rfcmp6o1GemluzE3OTcw64++++4tbjiySd2\\/nLa9tQp6adNYUw9NNzk3OpVLVadllhyXlJU6PyTLyCW3pmZF2JgtqcbYZLzSj26rNQbElfZUy5TpFwOqdGWZfQoFtDd\\/SZbUNFqXucKSUpRdHpKUez4iOWty363d1xUG07bp01WLiuetUu3qBSZFpT87VK1Wp1imUunybKPOemZ6emmJaXaSM1uvJA4gniYkEcg3oRTmK+Mb2lfflIcGG+Cc+uVw+TOy58muvFl2WzanpTaJUH5LDqnzTdYeeyRs7on7YclX31U2qMM88YTw7N4qr9OokqlX7KfSZl5IuJWSbIXNzSiQUgNMhRQFWDjpbZF1OJBhchJuT82xKtA5nVgKUBcNtjVxw9yEXV3kBIuSAZWOjVg1T9HvADB\\/BSmlpbOGtgW5bE3Nsk6lSrMlTmjcVYBUlBzrdfdqdXcybQnaTrmqyykhkQ2+Xl\\/bCbw\\/g0ww\\/0AuJzcQZOXl\\/bCbw\\/g0ww\\/0AuOptuLDUrs+lpZhAbYl6rSmGWxuQ0zLTTbaByCUJSkeET\\/FraGqNLtIAShqal20AcEIYfSkeoACNNUZfaEOh5dOnDjS9gtaN30GyaqzZdcvM1m5JSoTtOMrQpyjyj8mGaWFTPlD5rDS23NVTSEsuZlI3xiDG8H5Pz\\/d6Tv8AAViJ\\/pqyo5ewVTZOsYroNLqDRekp6osS8y0lxxkraWSFAONKQ4g8ihSVDnECprDczPycu6CW3phttYBKSUqUAQCNQbcRHfn3t9jv+UZhJ\\/ydvH\\/oIPvb7Hf8ozCT\\/k7eP\\/QRLzgjrv8AErs7\\/sM\\/\\/K1V\\/nkWP+ClG\\/rT3+Xc+cRDPvb7Hf8AKMwk\\/wCTt4\\/9BB97fY7\\/AJRmEn\\/J28f+giXnBB+JXZ3\\/AGGf\\/laq\\/wA8g\\/BSjf1p7\\/LufOIjtC+ToY50it0Wqu6RGE7jVMq1OqLjTdu3elx1EnNszKm2\\/odXXcDeqnWIGZ3nMRLiggiW4Zwbh\\/CCJxugyjkoieWy5Mhc1MzWdTAcS0QZl10oyh1YISQFX9K5AjZU+lSdM7bzRC0dv2faZ3FLv2WfJbMTa3aKvbffuEEaseWq\\/aytJf8A8zv\\/AKwGFcbTo1Y8tV+1laS\\/\\/md\\/9YDCuPca\\/wBJ+LP\\/ALYr\\/wDuuZhdV\\/cupf3hOf7O5EB2CCCPndFLRIBwy+T8Y14nYcYf4kU\\/H7C6mU\\/EKyLTviRps7b92PTchKXXQqfX5aRm3GGlMOzMoxUES77jBLSnWyWyUEGPvPvb7Hf8ozCT\\/k7eP\\/QRJy0TP7lbRn\\/yfsGv5ubbjIGO25XYzs9dlpd1dHfUtxhlxR+laoLqW2lR0E2ANSd0WdL4XpDjDDimnsy2Wlqs+4AVKQkk2vpck6boiGfe32O\\/5RmEn\\/J28f8AoIPvb7Hf8ozCT\\/k7eP8A0ES84IyPxK7O\\/wCwz\\/8AK1V\\/nkPfgpRv609\\/l3PnEQz72+x3\\/KMwk\\/5O3j\\/0EbtuS70Erv0CsKcQ8PLyvm278n7yxDTeUrULYkarISsnKC26PQ\\/IplFVbQ6uYU9TXXittOz2TjXn6xIGz2CNzQNmuD8M1JurUamuy08006yh1c\\/PTCQh9ORwdnMTDjZJToCU3G8WMZUlQKbITCJmXbcS6gKCSp1axZaSlV0k2NwSO6CCCCJ5G6jz6uVw\\/bGNKP8Afjb\\/APqBaMa5I2N8rh+2MaUf78bf\\/wBQLRjXJHzqxj\\/Tdin\\/AO465\\/vOaikp\\/wDo6d\\/vuZ\\/1y47Kw2wVxkxmmKrJ4P4SYm4rTVBZlJiuS2GthXVfMzRpefXMMyD9VYtelVR2mszrstMtyjs4GETC2H0tFwtOgdtf2DOmz+R7pUf\\/AEPeLX9D43h\\/Js\\/7YGlb+87Cv\\/Td6RLJi38C7G6Zi3C9Or0zWZ6TenVTqVS7DEuttHms9MSiSlbhzHOlhKyDuUpQGloktIwyxUpFqbXMvNKWp1JQhCCkdm4pAIJ11Aue8x5uf9gzps\\/ke6VH\\/wBD3i1\\/Q+Ogr1sW98NbkqFm4i2ddVgXdSfJTVLVvW36ta1yUwTsoxPyJn6FXJOQqkn5ZIzUtOSvlMs15RJzDEwzrsvNLPqExpM5Yjk5GdLXC9eMuFdES5pD4T0OYVJS0i1qzmJtiyPlFRnbIdSnfNV6lrdnKtZTnnuvzkxP0HJxFZlX5DPxNsEFNo03PUGqTlSn5RHnAkH5dpBmmWwS8iXLN1GZCPTZRYh0pLQstaSHqhhEy8q4\\/JvuzDrQCyypCQVtj6+TLqVj6wSfrAFIuopvCCiraC4423tGmwtxDanHiQ03rEDaOlIUUtpz11gJUdT1RR1p1h1xh9pxtxtxTLrLyS26y60pSXG3G1JSpDqFp1VtqyWlQyO+COb\\/AKqtRqk6pNxuO48RxB3ERCYkr6IPyfitXg1bGImk5i5brVjVeSptw0qysFKq3ck7dFHn22p6nuzuIr8mm3qbTKhKrYmEO2rJXV850qcbcp9epEwUusyiMJMHcNMB7BoWGGEdn0exbGtyXDNMoVGl1oa2nmJmJ+oTbq3p+r1afWgPVGs1aZnKpUZjOYnJ2YdO0iMjyGXKOqolRpOhLjVXs6PVZpTWj3dFUmEg0qszb7r81hROzb58+Srky8ucsTbOJXK1hc7arDk0mr23T6fK\\/juLZRJYLVh9irYWp6JaZfQJeqLfdM1UmZtsIW9KPzKwFBrMUOtJZQyw80pp7sUrUUptXDbNLMmiZkWsryh2cypxXaTCHEhJU2VkABB9FSA2lCFJyqKAq4BEbD5SP\\/ae0Zv4S71\\/1YpsST4jYfKR\\/wC09ozfwl3r\\/qxTY2m1X\\/o\\/xL\\/ekv8A7fKQ9iX9xJ7wl\\/8AamIiPR9fhzZk3iPiJYmHkjOsU6dvy9LXsySqE2h12UkJq6K3I0SWnZllnN9xiUen0Pvts\\/SKbbyaGvuj5CO9NF7+6Y0df4dsIv5wbejhSntIfn5JhwZm35uWZcTcjMhx9tKhcEEXSSLggi+mtiKnbAU4hKhcKWkEXtoVAHXwvG8n72+x3\\/KMwk\\/5O3j\\/ANBB97fY7\\/lGYSf8nbx\\/6CJecEdr\\/iV2d\\/2Gf\\/laq\\/zyLR\\/BSjf1p7\\/LufOIhn3t9jv+UZhJ\\/wAnbx\\/6CD72+x3\\/ACjMJP8Ak7eP\\/QRLzgg\\/Ers7\\/sM\\/\\/K1V\\/nkH4KUb+tPf5dz5xEM+9vsd\\/wAozCT\\/AJO3j\\/0ESRdCjR\\/rei1ouYSYB3HX6ZdFZw5pVbp0\\/X6LLTUrS59VUu2vXC25KS88lM42hqXq7cu5tkozdZcUMkEZ5XQRIsN4AwvhKbfnaFIOSkxMy5lXlrnZyZC2S629lCZl91KTnbScyQFWuL2MZshRKfTXlPyrbiXFtKZJW6pYyKWhZACjYEqbSb79O8wQQQRM428QKsGOWq5QDB1mQp81inTcXaHIABukYx27K3XMvo1s1icvCnPW\\/iBP7TcNeoXbMqaG5kpBOexyw\\/lJNyMMNy+J+ixRKrMZN7Wq2HiZULfl0aqcnS3b9w2nci3Q45mtsquZoNIzaIfJLpjEQRwJTNp+O6SlCJXEc862i1m5\\/saknKNyAqfamHUotpZDibJCQkjKm1OMVyrSwCWp9\\/KBYJdKX0gWAslL6XAAABYAADhaJfdO+UeaO7sulVV0fsaJKbClZsU+pWLU5fUGezWJp+s0l5SlAnWb8jAb4h5znYVr5SBgWwnO3tHHFmprEu6cqzcln0FCplIOwZK5Fy5FBh05FyY2anGPwJV8kERE4I35237QMthUJEH9IUyTvuHAtlI3H822u6Mw4prRFvOUA23iXYv46tkX9Vu6JJOJ\\/wAo9xdqzE1K4PaOdg2Q4428yxVb\\/u6u4hzKFKzQ1Os02iU\\/DuUln20HaNy0zM1WWQ\\/q7YTbGsy5pH0j9L3SM0s7hauDHnFCv3t5E847RbeWuXpNnW4XUbBaqBaFIZkbfpj62cmJiosSAqtQQhBqM9OOZuRjdBERruPMXYkbLNYrc3NSxIJlEBqUlFFJzJzy0m2wy6Un6qnULUN+a+sa2bqlQnhlmpt11F79ncIaJFrEtNhDZIsCCU6G5FiTci0AlSQlGalEAADM5ncEpyBJOe7Ic3VvCkvLPzcwxKyrLszNTLzctLS0u249MTEw84G2mGGmwp15150pQ002hbji1aiN5iUnySvI71+k163dJ\\/S6tR6jTNCmpWt4T4KXBK7OqCqy5RNSF7Yj0p9JdpnzW8WZm3bNnWm6maoy3Urkl5FmSl6VVGsJYQq+Mao1TqYyrswpKp2fWhRlZCXKgFPPrFgV2v2LCVdq+v0UAJC1o8p1OmalMJYl0E6jtXSD2bKCdXHDuAAvlF7rUMqAVaRtW5JDRKqOiTog2rRrtpSqVijijUHcUcR5OZYDVRo09W5OTlbdtWdKyp5l627ZkqazP09RQ3IXFOXAhtsKddde2iwQR39SKXKUSlyFIkUFEpTpVmVZBtmUlpASXHCAAp11WZ11dhncWpR1MXFKyzcnLMyrQs2w2ltN96rD0lq\\/jLVdaraZlGwA0iOxy6fJ+VLGOzZPS0wjoL1SxGwzoxpeKdvUqTXM1G78NZEuTMrc0qzLgvTlaw\\/Lk0qos+TuzE9aM3MPmZbRaclJz0PaPUtWhDqFIWlK0rSpJCk6ySlW4gg8UnnHBQ6REW3lMuRDnqrVLjx50KqJLOO1B2arV66P0r5PJJTNOkvT1WwjBSxKNtPqK5uYw\\/mXWgw8JlNnTLjTlMtKV5\\/2v7LZqpTL2KsNy6piacSFVimMJBffU2kJE9JtJALrxQAmZYRdx0pDzYW6p0KhuJcPuOuLqMi2VqULzUugXWVCw7dpI1WVD9tQkZs35RIVmWUxZI2GaIHKg6WGhkzKW7YN3S14YYMvrcXhPiMxOXBaMqH3lOTRtp5mcka7aDry3ZmaDVvVeTo8xUX3J+p0iqOKdS5gHWqLWrbq1QoNw0mqUCuUiadkarRq1ITdKqtNnWFFL0nP02eZYnJKZZUCl2WmGWnm+C0xx8c102q1agzonKZOTdMnWVFBcYcWy4MqhnZdTuWjMkBxl5CkKtZaDuiDsPvyrodl3XGHU3AW2ooVbik2Iuk29JJuDuIMS6cK\\/lHGCVVl5VnGfADEux6iEMtvzmHVXtrESkLmAEoem1t19\\/DupSEotWbwlWU1qYlm1eTh6cU15Q7ksxy+egE6yy4ufxflVuNNOLlnsNlF2XUpKVKYdMvXJhgvNE7N0sTLzKlpOyccaJdEICCLRlNuuO5ZoNuuUmeUAB201TsrqrAC6hJPyjVza6rNDebWFrb5vFdYQmynWXSPzlsICvX2YQD7PG8TML8+URaIdCln02HhtjhftVS6RLpm6NadnUJ1CdokLcqs5ddVrDKlkNqbQm1ns2nFl4tOt7B3UVpScu\\/pX45U+oWrhNIUfRus2fbfl5h60KhMXFiXNyj6Q25Ku4h1CTpiKWgZJWxNWjbNr1lpZeQusvsu7KNIkEais7XsdVplcuuqpp0u4CHGqUwmSUsKFinzoFydSm1wUomUhQUoKzCwGPNYiq80ktrmi0hQspLCEMkjUG60DtbEGxGfKRvB1hWbm5uozc1PT01Mz09PTL03Ozs2+5MTc3NzDinpiamph5TjsxMTDri3XnnVqedeUpxxWtxSgjb7yfPJC42aYNRoN+4gydXwi0dnXGp6YvOpSYlLqvynpKFqk8NaJUGFqmmZ1Ci0m8qnJi2ZRBfekfuinZNykuQyiUKsYmqDdNo8m9OzbpzKyA9m0gqSFzE0+qzbDKSbreeUkXISCpakpOrlZWYnHksSzSnXVnRKRoBcAqWo+ihAv6S1EJHEw+5HbQBqOlnjlIYpX3RHzo94M1uUqtxTM4wtNPvy+Kf5NU6Bh3JuuJLU2w267IV29G0bZLFupl6XMplXrpps0idLHVuEWEWHWAuHVr4U4UWvT7QsW0Ke3TqLRqe2SkJJL0zPz8w8VTdTrFTm1uz9Wq0+8\\/P1Kffem5t5191ax2lHcuAMFSuCKGinoWiYn5lSZmqTiUkB+ayBIbazDOJaWTdthKrE3ceUhDj7iYtii0lFJlOyuFvukLmXRuUsCwQi4B7NsEhF7EkqWQkrKRGN+Un\\/APibolfvmxh\\/0Vh5EUGJX3yk\\/wD8TdEr982MP+isPIigxyvtr\\/6Q6v8A3tSv92y0V5ib93J\\/xlv9ilozM5Oz+7u0Rv8AKAwx\\/wBaKfHoyR5zfJ2f3d2iN\\/lAYY\\/60U+PRki4vJ6\\/pZrf+HT\\/ALvk4k2Cv6Gnv7u1\\/qzBBBBF\\/wATWCCCCCCNfvKp\\/temlV\\/Bqv8A0\\/RI89GPQu5VP9r00qv4NV\\/6fokeejHJHlDf0x0L\\/Aiv9vmYrbGf7oy395I\\/178EekToL\\/3Euh1\\/ksaPn80tox5u0ekToL\\/3Euh1\\/ksaPn80toxkeTv+7OI\\/8GSn+1Kh3Bf9Fzv97o\\/1kagvlHX9zPgN\\/Ds5\\/N9dkQ84mGfKOv7mfAb+HZz+b67Ih5xFNuP\\/AEgTv+D6Z\\/swjW4q\\/dqY\\/ucv\\/qUR2Vgx\\/bjwl\\/hMsT\\/Welx6c0eYzgx\\/bjwl\\/hMsT\\/Welx6c0WX5Ov7nYo\\/v2m\\/6iajeYJ+pUv7aU+ExBBBBHR8TqOn8ccEsOdIvC+7sHsWLfZuSyLypy5CpSSwGpySfQrbU+t0WdKFrptdos8hmp0ipNJU7JT0u05quIC2XIAmnfoQYkaDGNE9h1d6Xa1ZtaM7V8LMRGpYy9Pve1W5lTKVuIQtxmnXPSNdqTuigLdLtOnXGZyWVN0WpUepz\\/otxirpfaJeGGmdgvX8HcTpQttzJVVbRuyUYQ\\/WrDvKWlplmkXRRCtyXDrkoZl6WqNNcmGZWt0l+dpU2623N+UM1htK2eSuNab2sulpivyLZNPmyMiX0A5jT5pQveXdVcsrVmMq+rtEjs1vocj9eojdVY7RsJROspPYr0AdSNewcO7KTcoUf2tZJuEqWD5vMEd\\/6UGjNifolYyXRgtitSvI69QnhM0qqywK6Ld1sTbrwot2W\\/NaxD9Jq7DSlpbUryymzjU5SKkzLVOQnZRnoCOH5yTmafNTElOsOS03KvOMTEu6kpcZeaVlWhQ5gg6glJFlJJBEVU42tpa23EqQ42pSFoUCFJUkkKSoHUEEEEQR6BPJA\\/tb+i9+9i7v5zb3jz9o9Ankgf2t\\/Re\\/exd385t7xe3k9f0zVv\\/AR\\/wB4ScSnBv7qv\\/4Pe\\/2mTjZPBBBHXMWZBGtjlfv2t\\/Sh\\/exaP85tkRsnjWxyv37W\\/pQ\\/vYtH+c2yI0WKP6WcRf4Cq\\/8Au+YjAqv7l1L+8Jz\\/AGdyPP2gggj5yRS0b8cHOX3xnwbwiwqwhpWAmF9ZpmFWG9j4b06rVCvXYzP1WQse16Xa8nUp5iWdEu1NzzFLbmppqXSGUvOqS0EtBIHZn3yDjv8Ak54Sf8orx\\/6eI4UEWEztW2gS7LUuziJ5tlhtDLSBJUw5G2kJbbTdUkVEJQkAEkqNtSTG3TXquhKUJnnUpSkJSAG7BKQAAPQ4AARI9++Qcd\\/yc8JP+UV4\\/wDTwgv5R\\/j1s3A1o64RJWUqLanbgvNxKXMs0qW0maZLqAfrIDyCv\\/fU7yY5MEO\\/jb2ifwlf\\/wDA0r+Yx79P1n9\\/vf8Ak\\/8ARG8q\\/PlBmnJdEu5KWrRMD8NEqSrYVC3LHrdbrSCtpga63b4u656I6ph5DrssE28ylDbxamG5sMpcTrJxz0ydKXSVW4nHDHG\\/r9prk0qdFtztXNKs2Xm1KURNSlkW+1SbPkn0khLLspRGFNNgMtBDSQmMa4Ij9VxpiutoU1VMQVSbYXm7SWVNuNSq8xBIVKsluWUNBYKaITqAADaMSYqM\\/NgpmJuYdQbXQp1fZ6CwPZghF9L3y3vrBBH01l2Le2I9xU+0MPrRuW+bqqjgbp1t2jQ6ncVcnlqUhGUtSqTLTk695zqAtTbJSgq+k4xIR0K+QFxKvaco996YtUVhlZ2s1OIwktipSVSxHrrQycZYuKvSK56gWTITKSy48xITFeuZTKpinzUpa1SQJlow3g\\/EOK5lMvRac9MIzBLs4tJakJa5FzMTawGkEAlQaSVPLAIaacUCkElTpyoOBuUYW5qApdrNN34uOGyE2GticxH1UqOkay+T85PbFTTtxMlqTRJaetrB+26jJfqpYpOy6BI0KnrCn1US3hM\\/Q1q86rLsrZplNl25lmmF5mq14S9LSBMz3cIsJrDwLw2s7CXDGhS9t2LY1Hl6LQaYx56kNM6635ydmSA9O1WpTbr9SqtRmFLmahU5qanJha3phZLrDDCzDvBexqBhthTZ9DsOxbZlBJUS3LfkxKSMo2pZW\\/MOr1nJmfqc8+tybqtZqL83VKxPvPT9TnJudmX5h7saOzNnuz2n4GkFhK0ztZnEI+kajkygpT6SJSUSr0mpRs6m\\/wCUmHB2rpTlaaZs+i0RmktFRIdm3UgPPW9EAWPZNXFw2FWJJ9JxQClAAIQgiDJy8v7YTeH8GmGH+gFxObiDJy8v7YTeH8GmGH+gFxG9vP8ASKn\\/AA3T\\/wDUzkYGMf3Ka\\/v1n\\/UzEaaozN0D9MaqaDWOL2NlHsOn4hzj1kV+y\\/ueqdembelgzXZyjTi54z8rTaq8XZZVHS2iX8lKHNvrF1stDWwygjj2m1GcpE9K1Knvebzsm6l+WfCGnS06g3Svs3kONKseC0KHdFbMvOMOtvMqKHWlhbawASlSTcGygQbHgQR3RJn++TMQPyUrO\\/OpW\\/6FwffJmIH5KVnfnUrf9C4jMQRPfxv7Rv4SOfybRv8Al0bb8Iq1+\\/3P8mx\\/wu748zEmf75MxA\\/JSs786lb\\/AKFwffJmIH5KVnfnUrf9C4jMQQfjf2jfwkc\\/k2jf8ug\\/CKtfv9z\\/ACbH\\/C7vjzMSZ\\/vkzED8lKzvzqVv+hcH3yZiB+SlZ351K3\\/QuIzEEH439o38JHP5No3\\/AC6D8Iq1+\\/3P8mx\\/wu748zE8bkvOUkr\\/AChf6uPz7hRRsMf1IU4ZiW+abqnrlNb+7\\/8AVA24e8rotH8hFMNlM7PZ+U+U+XvBWzLA2nOctV+1laS\\/\\/md\\/9YDCuNWvyaX\\/AOrT\\/wDxcv8A9fEbSuWq\\/aytJf8A8zv\\/AKwGFcdGUisVGv7GKjVqtMmbqE3hjGPnEwWmWS52C6xLNfk5dtplORhlpv0G03y5lXWVKM4lpl+bws\\/MTDhdeckKnnWQkFWQzSE3CQlOiEpGgF7XNzcxAdgggjimKtiRThb8oTvnDDDLDrDWW0Y7UrDGHlh2hYzFVmMTaxKO1Ri07ep9BaqDsoiz30Szs8mQTMOS7bzyGVOloOuFO1j7775MxA\\/JSs786lb\\/AKFxGYgiyEbXNobaENoxG4lCEJQhP0dRzZKEhIFzTydABvJPMk6xuU4grCEpQmdWEoSEpAbYsEpACR+1X0AtqT8byZ\\/vkzED8lKzvzqVv+hcH3yZiB+SlZ351K3\\/AELiMxBCvxv7Rv4SOfybRv8Al0e\\/hFWv3+5\\/k2P+F3fHmYkz\\/fJmIH5KVnfnUrf9C4PvkzED8lKzvzqVv+hcRmIIPxv7Rv4SOfybRv8Al0H4RVr9\\/uf5Nj\\/hd3x5mJO9D+UdX7V63SKSvRWtFlNUqlPpxeTinWlqaTOzbMqXQ2bLAUWg7r6pUnPVyzIGUSuY8vSyf\\/HK1P3z0H\\/ScnHqFxf+xbFmIcVS2IHK\\/UVVBck\\/TkSylS8pL9kl9qbU6AJSXYCs5bQSVhRGX0bAkRMMK1KdqHn\\/AJ4+p7sfNezzJbTl7TzjPbs0IvmyJ33tbTjfz6uVw\\/bGNKP9+Nv\\/AOoFoxrkjY3yuH7YxpR\\/vxt\\/\\/UC0Y1yRyzjH+m7FP\\/3HXP8Aec1EAn\\/6Onf77mf9cuJM\\/wAmz\\/tgaVv7zsK\\/9N3pEsmIm3ybP+2BpW\\/vOwr\\/ANN3pEsmOw9jH\\/RzQf7pVv8AfM\\/Fl4V\\/cWX\\/ALpMf65cEEEEWlEiiIny43Jw\\/qf1+oaZWCluluxbqqDZxxtqkymTFoXdUphLUviHKy0snZytvXfOPMy1yZoQim3c+1UQ8+3dSmqXG7j1Drmtqg3nbdftC6aPT6\\/bF0UepW\\/cFCqjDc5S6xRKzKO0+qUqoSrms3MSU\\/JTD8vMMqyQ406pB4+bAU5TbQEuDQWxzmKXSmahVMD8QHahXMILqmQ4+43T2nm1VKxa7N6qUquez1TLEs5MBSvnuizFIryUy8xPz9NpfJW2nZ39FTLmLaOxamzro+lpZpHoSM66rSbQlIsiVnFk9rfRqcWLEpmUIbrfFFF81dNQlkWlnlfl0JGjLyj9Ycm3if7VDl0iwWhI1vy0zMyUzLzklMvyk5KPszUpNyrzjEzKzLDgdZmJZ9pSXWX2XUpdadaUhxtxBW2NaJ0nJFcojLaZeEX3AYjVVn+yJwnpkpK3aH1obmMQLYbDMnTMRpJnNJdnHHSxTbwZYRqSddUxUdWXk7gkZRiCxHbuAWOmIejbi5ZONOF1XVSLwsirt1CULm2MhVZFYMvV7drcs06yqdoVw0x2ZpNXlEuNLdkZp1Uu\\/LzSGZlqvNnWOJnBFcTNHtHaROltirSaCLrYCiUTLKSQkzUoSpbd7dqhTsuVID2dOlo1UcpU2HRdTDlkTLQP1276KSDp2jZJUg7\\/AKyLhK1R6acRsPlI\\/wDae0Zv4S71\\/wBWKbG6vRC0q8OtMnA21sa8OnwyzU0fNl22y9MJeqtjXtT5eVXcFp1VSUtlT0i5NMTNOndgwmsUOdpVbYZal6k0hOlT5SP\\/AGntGb+Eu9f9WKbHV20mclqhs1r07JvNzMpNU6TmJaYaVmbeZdnJNbbiFDQhSTu3g6EA3EWDiB1t\\/D808ytLjTrcstC07lJVMsEEXsR3ggEG4IBERHo+0w0vR3DbEjD\\/ABFYkGqs9YV8WpejFLemDKM1N21q9IV1qQcm0NPKlm51cj5Ot9DDy2Uu7XZuEbOPi4I4VZdcYdbeaVldZcQ62qwOVbagtCrKBBspINiCDaxBFxFUglJCgbFJBB5EG4PqMSZ\\/vkzED8lKzvzqVv8AoXB98mYgfkpWd+dSt\\/0LiMxBFjfjf2jfwkc\\/k2jf8ujc\\/hFWv3+5\\/k2P+F3fHmYkz\\/fJmIH5KVnfnUrf9C4PvkzED8lKzvzqVv8AoXEZiCD8b+0b+Ejn8m0b\\/l0H4RVr9\\/uf5Nj\\/AIXd8eZiTP8AfJmIH5KVnfnUrf8AQuD75MxA\\/JSs786lb\\/oXEZiCD8b+0b+Ejn8m0b\\/l0H4RVr9\\/uf5Nj\\/hd3x5mJM\\/3yZiB+SlZ351K3\\/QuCIzEEH439o38JHP5No3\\/AC6D8Iq1+\\/3P8mx\\/wu748zEkC\\/fk3+Nkg+9+phpHYWXVL5qMsb8tm7bAfP1iUPC304ltpKCnUDzZVtctqWmsy0NV2M\\/J441YGTs3I3bdGF1Qdk1NNurt2tXZOIUXZqalE6iqnZNIWobWUdKtZKCEFtSc1KUhJBE7x3gfC1Gmi3TaX5sjKTl89qLwuFKH9Xm3TwGm7ujLrdPk5MrEuz2eVagPyjq7ABNh+UWrmYwbqtPfpVSn6XMqaW\\/TZ+cp8wphS1Mrfk31S7qmVLbbWppS0EoUtpC1IUVFDavNhpBBHP7yQl1aUiwStYA32AWoDU6mwAFzrEbP2D3gRl9gVoTYq6QU3SpKzLgw+pjtYYkn5dVz1W45JCG56nTNVZD5pVp1pSVJl5V1LgQh0B5SEJWttanEbrcJ\\/k396zD7ExjlpIWvRpZpTRmaLhPa1WuZ+bASlUyyxc94KtJunavnoYmHLRqu0Oq65Kt72oII6C2aYJwvXJj\\/AOK0tM4EtNuhK5ufbQV5Aq6kMzTaVgnehYUgjQptpEnw7TpOeeQmaZ7UFSgR2jqLgAkfta0cvXxvG8PRV5M\\/RC0Q3pes4YYcprV\\/SrakDFDEWaZvC+0axGa6bOPSUnRLZdKUhtbto0G31PNKcRMbYOLCtgUEEdR06m0+lSrcnTJKVkJVsDJLyjDbDQJABVkbSkFarXUs3Uo6qJJJiymJdiVbDUuy2w2NcjaEoBOgKjYDMo2F1G6jxJggggjOh6CCCCCCMNdJvQN0VNLmXWvGrCii1i5hKiUk8QaJtLZxCkGmw23KoRddGVLT9SlpIIHkdLr\\/AM8UWXBcCaYQ88F6K8Zvk37ipmbntHrSLaTKOOPqkrYxktxYelm8gqXTM3xZTS0za\\/O2bqm8P5QAfSgOHJoEEQTFmCMKV1iYnKpRJN+cQ0pXnbfayk0spKcvbTMm5LvPgcEvLcSLmw1N9HVaTTphl6YdlGi+E5u1TmaWpVwLrU0pBcNtLrzcOQjR\\/pJaCGLui3WKzRL\\/ALjw4rE3RF1Ruacs+r3NUJZZo6spjyddatC33VhZ\\/YNo0zr\\/AN9DcYWwQRxHiSRlZCe7GUa7JvKo5c7i9yiBq4tat3frvOsVTMIS2+6hAslK1BIuTYA6C5JJ9ZjtzCPBS6sZqs3RrXqFAkJpycMklyvzdSlJfaiUenSpSqfSqq4EFphxOsloq2hQNTVKlDeTgt8ncxnvKWpNdxT0gMMLOtypSzFRbRh\\/Rbqv6tuSb7aXWWVt3HI4dSEjMuZqaccS\\/UWpUEPIbnDmzBBFk7MMJ4fxDMyqKxTxOJWFKUkzU6yFFLuUXEtMM6ZQARuI3gxuKDJS07MhuZa7VBWgWzuI0JAIu2tB4843W6MnI4aE+jZMyNwLsecxnvyQUxMM3bjG9I3NLyE6g7RUxRbNlpCnWZJFp8Iep8zPUSq1unqZZLNbLwdfe2stoShKEISlLYGolCRkEpSCEpCR5qQAAAEgAAADdBBHXVJo1JocqmUpFOk6dL2BLcow2yFqAtndUkBbzhG911S3FcVGLSlpSVk0dnKsNMI3kNoCSo81q+ss96yo98KwQQRtIyI1U8p7ydVe5QWjYQUih4pUnDNeF1UvKpTL9WteduVNYTdcpbcq00wiTrNHMouSNBWta3FPh5MyhCUt7JSndRf3tliD+VdZv5qq3\\/TWCCK1xHs\\/wjX6tMVOrUjzuddQwhx\\/z+py+ZLLDbTY7OVnWWRlQlKbpbBNrqJJJMbqFIp01Nuvvy\\/aOr7POvtn03yNIQn0UOpSLJSkaAbrnW5juvRs5A69sBsf8HcaJ3STta5JPC3ES1r6maBK4cVamzNYZt2rS1Tcp7FQduybbk3ptLJZTMOS0w20pWsplxPmxJfggiQYTw3RcMykzKUOS8yl5iZEy635zNzOd4tIaK882\\/MLT6DaE5UqSjS+W5JOfSpGVkm3UyrXZBxaSsZ3F3KU2Bu4tZFhppbvggggiVRtYIIIIIIxu0tMDZ3SX0ccWsCqdcUtaU5iZarlvy9xTlPdq0tSXPL5CeE09TmJqSdm0DyXZ7JE2wo6+e08wAxxvvbLEH8q6zfzVVv+msEEQPFmCsM4mnJaarlN8+flpbzdlfntQlsjJdW4UZZSbl0K9NSjmWlS9bZrAAaGqUySnX0OTLHarSyEJV2jyLJC1qtZtxAOqibkE677Wg+9ssQfyrrN\\/NVW\\/wCmsSacBMNZjBnAzBfB6cq7Nem8KcJ8OMM5quy0ouQl6y\\/Y9oUi13arLyLkxMuSTFRcpK5tuVcmX3JZt8MqedUlTiiCFYTwZhrDEzNzFDpvmL00yhl9fnlQme0bQ5nSnLNzUwlNla3QlJO4kjSF0qnSci46qVZ7JTiAlZ7R1dwFXAs4tYFieFjGGfKY6B1a0\\/MLcP8ADuh4kUvDV+y7\\/XebtTq1tzdysT7X3OVmiGQblpWsUpyXd16kJjyhTrqChktbHNQWnTF97ZYg\\/lXWb+aqt\\/01ggjBxJgDCWIKq7UqvSfO51xplpb\\/AJ9Upe6GmwhtPZys4w0MqRa4bBO8knWGKjSafNzS35iX7R1SUBSu1fRcJSEp9FDiUiwAGg146x9LY\\/ydW+7RvSz7re0o7SnWrXum37gdkmsL6wy5Nt0SrylSclW3V3i6htb6ZVTKHltrCNdKltrAKTKlggjc4SwtQcLtTrVCkfMUTbjK5hPnU5M9oppLiWzecmJgoyhaxZspBvdQJAtl0qQlJFL\\/AJq12XalvP8AlHV5sgXl\\/bFrtbMrda99b2FiCCCJfG3ggggggjADlA9AbDfTzwnatK4Zpq0sR7Vcfn8M8TmqcqpTlrT0wqWVVKZP09qcpxrNtXBLyzcrVKc5NtFiYRKViSynqc0h7Rp97ZYg\\/lXWb+aqt\\/01ggivcUYBwjiGoJqNXozUzOrZS05MImp6UW6hq4b7YSU1LoeWhJCEuupW4G0obz5EISnQVOkU6afD78slby0hKlhx1sqCNElQbcQlSgPRzEFWUJSTlSkA+9ssQfyrrN\\/NVW\\/6axIm0M9Hyd0V9GbCjAGpXPK3lPYc0ys06ZuaSpj1GlKoqr3RXbiS6zTH52oOyyWG6u3KFC5x0rVLqeCkhaW0EEO4UwVhnDM9MTdDpnmMxMSpl3nPPKhM52e2acyZJybmEJ9NCVZkpSrS2axIPtLpkjJTC3ZZjs3FMqbKu0dcuguNrKbOOLSLqQk3Avpa9iQcpIIIInsb6CMW9MzR8ndKjRmxXwBptzytmz2I1Mo1OlrmnaY9WZSlqpF0UK4lOvUxidp7syl9ukOSgQicaKFTCXipQQptZBGJPy7M3IzkrMI7RiZlX5d9vMtGdl9tTTqMzakrTmQpScyFJWm90qB1hmYbQ7LvtODM26y62tNyMyFoUlQukhQukkXBBG8EGI7P3tliD+VdZv5qq3\\/TWD72yxB\\/Kus381Vb\\/prBBFSfil2ffwf\\/ANK1v\\/mURX6ApP70\\/wA\\/M\\/8AGg+9ssQfyrrN\\/NVW\\/wCmsH3tliD+VdZv5qq3\\/TWCCD8Uuz7+D\\/8ApWt\\/8yg+gKT+9P8APzP\\/ABoPvbLEH8q6zfzVVv8AprAPk2V\\/gjX0rrPCMwFFOFNaUpIzAJSk3sgFWXAa6Bnvzggg\\/FLs+\\/g\\/\\/pWt\\/wDMoPoCk\\/vT\\/PzP\\/GjtG3vk2Nnyr2vdeltctblgoLLVu4O0u13tiQnNG3qWIt3o2uZX9LsNXz0\\/RHZna5m4WcgtoE2A\\/Jz10UrE7GGbYDSnGMQb6VI0dybDY1nE0zDyl2MtUpt1bVuRqE7UmwlKGJpycaDofIIlUlsywFTlIXLYYpylIKcpnA\\/UQDmBuRUHppJVcCyiCRuvaNu1h+jMqzIkGlG4P5VTr6dP4r63E25i1jxEbUcKMDcGsDaILdwcwusTDSkKbCZiVs22KRQV1BTISlL9VnJCVanaxN5nNU7VJmcm3T57r61+dHbcEEThllmXaQyw02wy2kJbaZQltptI3JQ2gJSlI4BIAHARt0IQ2kIbQltCdEoQkJSByCUgAeoQQQQQ5CoI0F8oHyNF16a2kbWsdqRjxb1gSVStW1aALdqVi1OvzTK7cp65NyZNQlrlpbTiJs5uttCVQpnckuOfWggiO4ooNJxHTBTqzK+eSfnLUx2PbzMv+VaS4EL7SUeYd9ELV6OfKb3KSQLa2qSkvOSwamW+0bDyFhOdaLKAUkG7akq+qtQte2t7XAthT97ZYg\\/lXWb+aqt\\/01g+9ssQfyrrN\\/NVW\\/6awQRXf4pdn38H\\/wDStb\\/5lGh+gKT+9P8APzP\\/ABoPvbLEH8q6zfzVVv8AprB97ZYg\\/lXWb+aqt\\/01ggg\\/FLs+\\/g\\/\\/AKVrf\\/MoPoCk\\/vT\\/AD8z\\/wAaD72yxB\\/Kus381Vb\\/AKawfe2WIP5V1m\\/mqrf9NYIIPxS7Pv4P\\/wCla3\\/zKD6ApP70\\/wA\\/M\\/8AGg+9ssQfyrrN\\/NVW\\/wCmsH3tliD+VdZv5qq3\\/TWCCD8Uuz7+D\\/8ApWt\\/8yg+gKT+9P8APzP\\/ABo2wcl7ybFwcnsMcTXcVqNiccXzhmZX5ptWdtn5k+4A3+H9v5ZWawZz5zN7MlrZeT+TinuhzbeUoLOWWnHo21DS80W8T9Hel3bKWRPYhGyhL3RUKU9W5SmfcriJaV8OB6mS87TnpkTrVsuU5GrON+TuTTUwQ6hlbLpBE\\/kMPUeSwurDkrJ9lRVydSk1SXnE05eXn1Ta5tvzhx9c2O1VMPHMHwtvPZpSAlATv5eTl26WuTQ3llixMI7PO4fReU52gzlRc9LOrXNcX9EiwtHt+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf9NYIIgH4pdn38H\\/APStb\\/5lGg+gKT+9P8\\/M\\/wDGg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf8ATWCCD8Uuz7+D\\/wDpWt\\/8yg+gKT+9P8\\/M\\/wDGg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf8ATWCCD8Uuz7+D\\/wDpWt\\/8yg+gKT+9P8\\/M\\/wDGg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf8ATWCCD8Uuz7+D\\/wDpWt\\/8yg+gKT+9P8\\/M\\/wDGjkaH8nFv2k1uj1ZWlRaD6KZVJCorYThbWmy8mQnGplTSVG9FhtTgZKErIUEk6xSd4iVzBBE2wlhWg4XRPN0KQ8xROKl1zI86nZntFMpeS2bzkxMFGVLixZspBv6QJAtt6TISkj5z5q12XaFrP+UdXmyBzL+2LXa2dW61763sLRytMfkMrx0otJjFXHum6Q9s2fJYlVmm1eWtuew9qtYmqUmQt6iUIsv1Ji6ZBqZU65TFTIcblGQlLwbKFFBWrGr72yxB\\/Kus381Vb\\/prBBETn9mGBp6fnp2aofazM3NzE1MO\\/SVYR2j8w4p15eRuoIbRncWpWVCEoTeyUpSAI1r9Dpbj7zi5W61uuLUe3mBdSllSjYPAC5JNgABwAEbRuTD5MS4uT8uLF2uVvF2jYmN4m0e0aRLy1KtGetpVJVbM\\/XZxx592crtXE2maTV0toQ2hgtbAqUtzaJDe4SCCLBw7SKdQqTLUulS\\/msjLKfLLHbPv5C8+4+5+VmXXnlZnXFq9NxWW+VNkhKRvadLsysm0ywjs2k5yE5lqsVLUpRzLUpWpJOp04WEEEEEbuM6CMXtL7RYw70xcC7twSxEl0sy1ZaFTta5mJduYqtkXnT2nvufuykBwtkv09512XqEml9hFZok5VaJMPtytTfUCCMaclJaelJmSnGG5mVmmHWJhh1IW28y6gocbWk6EKSSOY3gg6w2602+04y8gONOpKFoVuUlQsQeI7iCCDqCCAYjrfe2WIP5V1m\\/mqrf9NYPvbLEH8q6zfzVVv+msEEVF+KXZ9\\/B\\/\\/Stb\\/wCZRE\\/oCk\\/vT\\/PzP\\/GjYNydvJb48aA+K1Suim6TNs3thneVPVSsRcNfuArVHarjkoxNOW5cFKn3LrqMvS7it6feVsJ1ynzaJyjT1Zo7qWlT0vUJDILlOOT6rnKA2VhdalExOpWGb2Hdz1y4ZidqlszdyN1Vus0mWpiJZpmTrFIVKOMKZ263VuPBeeqlKSM4IIl8thOgM4XnMNIknPoR5RC5Fc\\/UXUhK3WnlIafdm1zTDZeQHezZfbR2hWsJzOOFWzbp8ommPyQaPmqlpUWi68QD2jbnorLhcQM6QrKlQTmzG11Kvp3+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf9NYIIiH4pdn38H\\/9K1v\\/AJlGs+gKT+9P8\\/M\\/8aD72yxB\\/Kus381Vb\\/prB97ZYg\\/lXWb+aqt\\/01ggg\\/FLs+\\/g\\/wD6Vrf\\/ADKD6ApP70\\/z8z\\/xoPvbLEH8q6zfzVVv+msH3tliD+VdZv5qq3\\/TWCCD8Uuz7+D\\/APpWt\\/8AMoPoCk\\/vT\\/PzP\\/Gg+9ssQfyrrN\\/NVW\\/6awfe2WIP5V1m\\/mqrf9NYIIPxS7Pv4P8A+la3\\/wAyg+gKT+9P8\\/M\\/8aD72yxB\\/Kus381Vb\\/prBBBB+KXZ9\\/B\\/\\/Stb\\/wCZQfQFJ\\/en+fmf+NH\\/2Q==","base64":true}},"images":{"part1.09070206.09020504@gmx.ch":{"name":"part1.09070206.09020504@gmx.ch","type":"image\\/png","content":"iVBORw0KGgoAAAANSUhEUgAAATYAAABkCAYAAAAMjRzhAAAABmJLR0QA\\/wD\\/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH3QwUDCIHSDOifwAAACZpVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVAgb24gYSBNYWOV5F9bAAAgAElEQVR42uy9aZxdVZX\\/\\/d17n3PufOvWnFRVKhMhA0kIMg9qVHCEdkZRVBS06W611W5pbe2\\/sy2KorZDN43d6qPtgIIiIIITKDIEkhAyz6lKpSqVGm\\/d6Ux7\\/1+cW\\/fWJcGgT0Cefmp9PvdFcm\\/tc85ee6\\/9W2v91jriwn9sNszKrMzKrPwvEkuI2UmYlVmZlf9lho1ZyzYrszIrs4htVmZlVmblGY\\/YZidhVmZlVv63IbbZOZiVWZmVWVd0VmZlVmZl1hWdlVmZlVl5uhHbrGWblVmZlVnENiuzMiuz8kxHbM\\/MGzPGIAADCAQ6lOhAgjaEriFR6CBuKdxKmXRGIYRLPB6iwzKKEN8LyedDgs4YoTJoCcqeHg9m+XuzMiuziO1psmY1S4YuGZzQxu+XxHoV9uhcYm6StpzGkXlaspAUAiuXAulTKBTJWJJk2iLhpJDSQVlxAuMwOaUZNwFHSuP05ctMJDWqKboUTFu6WZmVWfnfg9ieIbvaYMAHa0DR4cfpyKZIVEokcoK2eBrVPUHCGSEmPRypsWSAtAShthAyhmhrwZIxhFAoFEJYGGFAGTqTEAiFkG0YJRmZ0hzxYjw6NEG\\/GUE0G8SsdZuVWZlFbCfS5dSTFqlCnG7XYmFOkbVCYtLFabWwYxrHniRmeyRsQVxK4lYcISL3EplAY2NkHCFsQEVGSoDRgtAYQgPaGHQI+NDraLqSHsvbc4y6rWw94rLp8CHK7W7koc66qbMyK\\/8fR2x\\/wT2sJxXxwRxzrGZak+N0tk3RGvdIK0HSTiBSGismcKwEjspiCY0SPrYKkZYGpdBKgogRCgch4ijh4Ac+SkXGLfADjNEEoSYIA8LAEAYGY1ykF9Aqbc7vSHJu50p2DuZ5oDjImDOFsCVCzi6QWZmVWcT25HxOdMVCHoqxkGbaUiXmNhXIJSQZJ0nKiePYEifmoJSPNB5al9CeTygNRoJwbCyZRMoUloyjlY1SDkZIEAGW0ugwwLYsYrZNEARgBGhFYDRu6OK6ksBVaC3wgjKjY0Msam1hUec8do9U+M3Bg\\/g9QXTPswBuVmZlFrE9gT1D+wbZn6az0k5TbIIF7RU64xUyMUHGaSbjuAgFrvQpBy7GVdhGEZopwEWJEG2liFtpUiSQMo42MaamPLLNTSgpQYCjDFJrgtBDodF4gAcCLAJsBzKOg+toihWBloKB4RFWtDTjeIc4Kd3EvBWn8\\/uDfWyLDaASs9BtVv7\\/LeaJujaKZ+a5Ly75RNtT22iyOro5rOk+0sbcuKY97dOaSpBOpsklK+gEiCCDHRwmH\\/jkRY6xcZvdA3nmZPKct8JBVnwcqYjlLKRMIq0MoRMjFs\\/ga4XlxEFopNIIXUaERYQAowMqlRJKCiwl0SZKFNiWwhhBxQ0JjM1k0cfzBGFg8D0XPwwJrCQHJhP8rnCAUrZSpYk8U1fejAVo\\/shCPNaiFDPCiuL41zEAup5VbhhjFt0+I9fFUbp9sno0YHS0now2DetKSBBSIJ6Bun9qKw+MQWtQ2zTzXejpKNCWSDInmSKdyBGmBYUACmMVsokxXAQP9GW4eZONl1xAGChyepBkYpiVbXmmUj1MHT7I6nkOQjko20GgAAslEriuR9+BA8ScCrbKk2tKk5+aJJWM4aRiSAVKGoLAJzAaKSTJlE2pUqEprah4Bi+QVMoh0tMQTNGmSlw6Zxn37t3LvrY8WJEyn3knqsFoCAPDvJZFaB0t2ieSklfkyOQQUoFQAqVEdaHyxAkUYyLkHUDGyZFNNANQdPNMVkYR1ixH8JkEsbSmwWrNVOuT0aOpGrXAM7Sl5nLe8rUk4xkwBi\\/wmCiOsXtoKwfH96IsnlGJN+upPCq0D3Kz5Fkqgd2hcHKGVEsX6\\/cI3HiG0d0HyJTHec6pTcTMGIOmix9un09p\\/hpaQo944jArMxnmtQwzRjefv3mYUxbHWLE4iaMFRlj42uAoGx0GEIa05ZrIZnNgbEId0NKcwxgfKQ2WpdGECCtECTBhicA3JGwHXwgcJXH9KPBYEhKpNI4KmBjbwnM6srSXe7hvZD\\/OXOsZt3kNEPiG5624mPe\\/9r3HB2siTqAtJgoTbNr7CL\\/f\\/Cvu2\\/5LrJhEWiAxx3xGHYJf1nzpnTfSkcsBMDAyzJVfej2OlAhr1qb8pVeC0ZFBCn1DZ1MPb77war5y26fxdBmhnpwekdEYXkVz6flXcsWFr4fKPRCOARJkFmGtYty9jMs+exkiJVHPLMT21OwyoyG9w2ZxvI3mhKbFSSCTHfz44QobBpqxHRtdnsvLlseIJ1xUxcIzNiLZTRgkkfl1XLFakxV7SLRPYVHg\\/7w2Tbq9mVAngThSWBijCXWZUAdgPOIJn8CrIJWPwGDCEKUEge8iERgBU4Uy2XQMWyjcoEKgwQ8k2oAwhpiVQNsWSAHCJ9ecYWx0jIUxh6S\\/lHvG9yFanzmvijAmQmdB2bAwNYTf\\/+InGYhwaLI6ee78M1i7\\/DVsH3oT1\\/7gXzhS7kc4AiEMMxG9MVGcNCVaaC5\\/AH9qPwDeeJKgAnYsggazgO0vuBZ0hMRCV\\/CG5\\/41lz7nZYjCN\\/nsVBmZADlt2P6IHq0YKBkhtRVzTueKC7oIB18OJjjqekEpiV8x2InpA\\/N\\/qWEzpspN2zSPnImTyXhk0yGF7Bx+tE7SFy4ityRNZcojaU5i68A61iw7wkkZRZc2nLuon98PZCipRfzwzrt563kp+vsnaW7P0N0qUYWAIF7CszQySGLFJPnCOGgXSYAldBRrExLbdgh8gRAhUlhgQowxxKWF9jQVHTJVMBwa8xkc0biBpiOr6JnjkE3HkH5IWUh84ZDKtCCmDpOLH+RsZy73jx5EtcpnjCKnT9eV87J\\/wh95GL+f0O+HqVs4OXk2X\\/nbL\\/D+G\\/+Fvont2DEBaob7YiJXd8W85RBuqA1z\\/7Y8OjS1hT1r2P5SayDiahrP4hvv\\/RGdzu8Jh99IoQLlYkAqVvUx9fH0aDBa4FcMLzttFeHY554wrvHInjJUyx+fSRTQE\\/vOA2PQgWL8sR6y9HCoNEV3dytjpe0MDQ9wWms7b1s6QDo1ycFRg7Yy9DYFZEUZU7E4NFHm4MEypYkRMmaCdNxjw8gwBJrsoYDdE2VyrYKOXDNtTZqYKkAlwJIBApAIhJEIYai4JXzXw2iQUhCPRbw07VfQQUjJ00wWAh7b61JJXcCr\\/uY6EAJbGtb\\/+PU0Z\\/K0pCRFJZgyEpFIYIsO3PIEKX+SpZWlbBvZj93u8xfvkGIMOjTI0Ka3dRLCP28YXX6QuPdOPv3mj3Hll67BD6ewlIkCb9X4GsCczHjD6T0wEUdaJYRiluD8l3VCCX3DkrZTaPc+QFjcDcD63UTxtqr1Oa4eBejQEFYEz5o3FJ2aVRnPazYfCJnbKpnfqdh12MeKyUj38plzqp0wxBZlSwRT\\/V1MectAFlnUO4+frd\\/FWYsynHdyio54Hq2SGG1zSusEsdBn\\/8QYgSPJCIsxP8umvYYpdZAXXHAaLzrnZaw+bQ2ZbAtCKCYnjrD90T+wddO9hLu3sqhT0dokSCchYQmkUgR+iOMIbGlhtMQYQ+AF5F0fO2YhhKJUCRga1zy8vcKKtR\\/g5W94P1JGlI4ND9zO5NgAqjNOTIaohI0ykokAgniawT3j6OYmAqlIF5bjtW4Bpf+i+jQmipks6V6GbfbX3YTQ4fJPjhHLSCy7Gj02kYfdlhV05QRnLVGcvbweGDPhGJnKp7jsOW\\/iG7\\/+CkpJhDQgogNCWoLJwjZGpxRag5Sw8WABJ6GQKlrYM+fCHDM9++e5qydqrBN5T0+9bs2Tus\\/pbHjoGk5qT2H8LbXvtg8IlCWQCqQQGMkf1aOQgtAz9LYtJi031w7K8SnBJR8tYRISOy5w4oJEWuIkZZUQL55BiO0EiQ4FfQ8upFDswU3FiXklDh0O8Zw2VvUaLDnBVGhBUCDXZCGEha8lbdlW+keGGCpZ7Ng\\/xnuueCVvveLttDQ3H3WNuV3zWLbiWXDZO9ny6EPc\\/M2Pkxrew+JuaMsJkk6ELELfoKTBUpErpUMIjKJUMAyPltg7WGFML+Y17\\/oSp5x6Xm183\\/e4+6aPcN6iOBIJBNiWxnE8EknJVBlamhdy+7ZJek9ajC5JOounczi9DtRf9qTWgWFpVxPo3bX\\/339YcqAiyGYklpTTwAsMHJwwPHzY8MN1Hmf1elz7tiRW9RlMMMRLVhX47q+zhGEBaVcPYgnKFtyzX3PXZg\\/tg3IgnlE4cYGczqhianE\\/bUwjpUDUx6rTTMQff7pjjFWjJlTHQXKcet8\\/5Z7EHx\\/j8RQK8UTXPvbv68\\/8xN8\\/\\/l553PNGVTGipn+qh5vvGk7ubITsuwajAyn6G4MQx9ZjLC1xEtH9BL5h2fwOCB+pjfPzdT4qK0m1qyhMIUEpgbIA0UAaOe78NejwKeBRnTDENrUtw+h4jmQ8hz6sCdpa2Z2fwpss8t+\\/zaO0ojK5n3e+cTktYoyYCSgqQ6GYZ2isjGut4SNf+y865857Utc75dSzWHbdT\\/nFrd\\/mV7dcx5xMnt4Oh2zSQkkP2wYdFgFBpaIZzfv0D\\/t4zhLWvvw9POeiS1Gq0Rr98mffoDN+kM5cEkeGCAFhELm5tvTI2AE9J0sunrean\\/1mgoVz0wwd8rHoJVze9xc5rWondQCLO7yGXfLgzgKpZkWy2cKKN1CTok2jIZ7VrD8S8rHvVvjEm+O1v415P+Ocpedy7+67okUs6otRWYJYMkK4liOw4gLLjjaOqWblQt8QeoY1C8+hu6UXx4phMJS9EvsP72Ln4GNIJ0ISQhrksTKwuk5hCT3Dqvln0tu2iJgdR5uQqfIkG\\/c9xHhpGOUIpIqSHQ2IsRp7qt2TPz3OQhwrBkJQrOR5bP8jDOUPYjlRgD2ivYgG5BQF5g1hEM2dEKCsyEggzTF\\/H\\/gGHUR6kjL6vbQECA1G1MYzOrqmrCbcdQihZzh32fPpyM3FkhYVr8SDO+9lvDIczZuKkLQJo2fzSppyXnPKvPiM+1A8uHWSRKdF6Msa3+zxepQ2WLbAhILA01TymoWtjetp16CDsPz6YWIi3qcOozlQFqAMUv4RXc6YD6Gq81ddAycypHNCSqr8vMA+3It22imbBJ1dnZjKAIVyiGhZxY4wgVPYzsVnx5iXNaR8RTFU7MoPs7fPY+X5f89lb\\/3gUYbm8RKGYcNvlFK89JVv5QUvvYzf3vUjNj98N3sf+B06mMSyDFob4skcvUvOpW3ByVz+jsuZv3DpsQ1zfoINv7qeFz0rRTalsKQgCMFzK2itkb5HUsfxjGAeB0m0z2frVJnVrZ245TIDow663XvaDZuoJg5CT3PqgqaG7w5NxnESpZrhebyujYk2mRCCe\\/b4bNgVctqS6bTZFKvmlvj1FoNORe5r6BsuWPpirnntJ5k2c1\\/48Ue5Z8dttbF1AH7Z8IqzL+cNz7uKlBpAeztBlyJXRTYhYlcwWUnyP7++kdvX\\/wArLhCWqfMDTbQRwmp275IzLuN1z72CXGwc7W2pjiURag0i9j4e2rWJf7\\/jc4yUB7CcqkGqut1GR8YsIZq4dO2VvPBZl5C2htHeNtCFyLVTKxDxv2Pv4VG+fvtn2T60ATsmImrEjNMgDAxLO07js1feUJvDb979VW5e902s2OMMapX\\/9dI1r+fqi\\/+xupMFH\\/3Oe9nY\\/3ukOvZ47\\/y3N7Hr0FbedOHVvOqCN5JkB9rfC8ZDyCbe8ZJ3cMv9t\\/HNX30JOxFdM3Dhyue\\/j1ecf1mU4Dn8Fkx1KUpnHvf9z++QCHYd2s57brwcIeA5y17MNZd+qqbH6276CL\\/c+DPe96qP8MLTL4nCG5M3oPObavf2iWt+CrINIeDrP\\/kilz7vclqb2gDYfOBRPvCtq3ASxyhFqB6+ftnwdy\\/9EC858xW11fuZmz7IA3t+iZInFrT9v0JsxkSnSuXhDHtKFYopmwW5kIoehlgT2aZOJvw4PiVOahvhxash6+WpeEkOlzWPbg+4+A2f5SUvf\\/NxDdqP\\/+er3H7TV+jqXcq7P\\/gV5nbPr6OLWJwXXXI5L7rkcowxVCpltA6xLBvHiT2pk+COH32eFQtC5rSnSSYFnu8ihcLgowMfSxlCH2SYIQa8YuUY39nSxe27DKd3hsSHcpTahp\\/2wnlddUGSVpa5TUdgRkZ+\\/d4SKhW5iJGr9jijKEDYApMUJHKKe3fEOG1JfYDl3YrAMxHiEYKgbJifGsPvO7fmSoX5BGEIypio7rakueZV\\/8pzT3IJRy\\/FD8eOed8pq5Orn\\/\\/XrFrwWT590\\/uJpas8qKobFniGOakFfOztX6Qz\\/jB68ir84NAxRpKc3vZ8vnjV9VzzXx9ksLgHUTUyWkPgGnqblvHJt3yOrL4dPfa6J7yn3thpXPvm93Hj3Xdy6yPfxUlMoyswRhBUDIuakvh959cP9VGL0I+Q6\\/ScTqNor2xYkj2Af6A+X+5EnNCP3MGgwlHj2eUuvv6uH7Ig8wj6yKvx9cTjlObw6jVXYYJ38617voyyBV5Zs7JlE37fV6ZXRX2P+vsJ+59NiKE8GMMvRSjvKD1OxKlMaVZk78Pv+8xMbF+P2Q68vP7cRyTyyC\\/wJ\\/MAdJnVuAWNZasa6qwj5kif3ZmTuHDx\\/hnPaxgf8tChQDknlmEgawGGP+cDFB\\/QNHkBZy\\/oYZnI85LsDtZ2bCVmduB4W1mTWcc5qYd45TJDuy5T0nH6vIB1+wZ51Vs+\\/6SM2rUfvpzdv\\/8cLz5dcnLTHr5wzVpu\\/PKHmBg\\/eoEKIUgkkqRSGWKx+FFGbXRkhHK53BCUHRzYR9\\/W77N0aRvJ1hZ0IolIZjBOhkpFIqRCSkPoBCBLqOAIXe4eXtXdh9+0iPUTpxNkVjN6IF0PGjxdn6phWzpvKTKsJw7cIMZgIYxcRCWqKOboj6jGzey4YP+o0zBXudghdFB1wUKDVzas7EpWl2tEa1+3PY8JI3pA4BpeuuZ1PHveQwSjn8I8gQGJ4niHCUY\\/zrldv+fV57wVv2Kq7ooh8AztsV6ue+snouze6GcwxzRq0SbWxV+SzP8917zyatyiJgw0OjQErmF+03Kue+sHSE\\/9DeHkjX\\/8ntwNhENXctXa5ayZd37VqNeRn+9qFrf61WePPnsOaUxoZpQiiZor6ZU0y+bYtfkyCNbvHI\\/mU3PUeIY4H3n7J+lVnyEcvx7zeKNWpeiE41\\/jktUeMZ0h9CMk3ZEcmnFfR+0iQLN+b5EwMARlzcruRj0+tHUS7Uta4v0zxjFHzfX0Z\\/sBn90D5dq\\/0\\/YoKkwQVmk\\/jevT4BY1b33Bq6D449rfbNgbsG6frocPTuC++LPfK2owuIcMiWFDc4tPWD5Mt\\/LpCYfJuRKjCpx6RguVMKStLUWz8hFCMRoEbDlY4jkv\\/z+84KWXHfc637nh46ix37JmSZZcNo7vG1qSgu1bvsPHr1nP52+4AyEEYRhSKZdJpdMNRnEqP85A3w42PvwLNm3awMiE4MZv\\/rTB4N36w0\\/xrDUtZNubIWGjjYOuuCgjQOZx7ADP89BArFKgbMro0KEj2ceLWjdwy+Dz+cNwhrg7l1j2B2TavKepcWW0iMLAcFKnDaZS+2Zbv8FyRBT4l38E5c8wbpOVGFCpbY64oyJeVLVWkECxsK1Y2zuuH2dwYpympIXW0eJ9zZkd6MK\\/14afKGhu+UPAkSlDzILnrVKsXlTPWeniHbzm9L\\/hlvscQttDSAjLin958zUkp67BhEfqKCGEP2wJ2Duk6W0XrF1tMx2ZMOERemPf58xFa9kwcA9SQZPVyb+++b2o8fdgdKE2TqliuH2dT\\/+IQQm46DSLFfNVbfOGox\\/lb1\\/4Ya786h9QtkFVWfhBxXBKT6IhfvXwrjyxDificlfXlK5u5qTK0J4arqHosak4Ja9ErprEefx40momXXp\\/7ZlH85rfbwmZKBguWKFY3F0Pw1il7zGveR67xrYglWDPwS1kY4LO5gQx26397uCwxogobrh1MEAqQegpFraVHqfHEk5asu\\/QbhIWpOMWzZm6kRzLQ6GsI8oUsKm\\/zKa9gjULq8tIH6G3bT6HvJ1gZqQ1TISa18w7lzO6H8WUgpq3928\\/97FjElVNTp3IHfPnx9hCqGwImZtyMLpEQm2hc24LoQqYyFucMS9NKhjhzvGlrAhGaO9OUXB9+o+M09L9fF72yrce9xLrH\\/otm351Pc8+LUvC9rBEHCk1LSnBonab0UMj9Qzgvj28\\/dWnsvLkFjo62hDGpVQYIJPRNLdKjKWYmlB89BMPNRi1LY89QOg+QNf8dkzCwklnKBXHUIk0SsZoag+YGt1HzLJxfE0llGgEgSwxpWKcPXc\\/G8cPsTE4mURQZvf2M1lzzn0I++mxa0aD9gxL5zZ+tWFvBSsuozT\\/cQqURXVTHhX01SO1gnqjDYvmnIzNvtrXm\\/b7SDvKuBkNuVgHreKOOs3gQMjVXy8jMhZOQqBD+NEjHufN9\\/nM2xI11yMV3MTJc1awc2wjxhhedvpr6bH+E+PWjdp9WwI+d6vHRChQdoQOb7jL5\\/qr4nS1yiriepTlHefw0O7IF7zyNVcQn\\/pQg1H7xSM+X7jNJ3AkVkygQ8NNj7i88RzF37wsVvtdh\\/w+Zyx6No8O3YtU0e+Sdpa21OGaoRotxHBNkaRdz6jWpi6AFb2nIMI67eKhnUUsJ4rdGQ2ZWPOM8QQmGIjivWXD9T9xuXubxklItDZ89U6PT78hwYWnT1vyEm0p2DkqcBLwDz8KGOvzufuza4lxb7RFjc3LPzpGsl2RzCmclEDZsCB3tB5VXBJLS971A5\\/8YMA\\/veZ8XnHmxtpvPvNDwe\\/3VEhkJVYMZEox6TpANZhnKizsyHLwgKkFf42J5sEtat5x+UWY0rW18e58xKevCE1zZDVj+wzJipb2BeRc0PGAioiTwafVAydpWN6Zx3ECTLyZ\\/r5WCuPDLO8uMVFQ7D2S4WMf\\/uxx416e5\\/HFf30\\/LzillXRiEikUxSLYKg5hCEGAperxoKamJtYsljzv1BKdLcM0N4EdTyKTmjKaDXsCzum+gnm9i2dkakJ+cednOe\\/cHMm5MdLxDnS5hIwJYnYzZS3RqRIJNZfC6CQVfxzfKqN8RaxgKKbyGOPTmhjBFC+gEuwkUGczMbKJ1q7C02DXBEZrAt9wSk+y4buBCQc7Fp3QyOPgx6rha0o3AXX3xwtiDUmBZYvaQNc3xGN9AXZcRhs\\/MMSlBF13GcfD56Jjd9PUpoilJRhI5iQPDYX85AHNK8+tGqRwhPZUE9sOGwgsLj2zBePWDcLvNgf88w88snMsWtKRsQ48w9hIyOduCbj+qroLPb+liF8xLOo8mfMX7MAUx+tx1HU+194RkOmwSaejjKzRkGjSfP\\/hgN72gJedZVVjU7tZ0dnOIwdMZAADWLngFES4uTbeup1F7HhkaKWckTyoJhpO6ohcx9rhO6Kw49FvA9+wvHfpDMMXGYTD45p33uiSV5KW+Q6WE829sgR9k\\/OA+vx6lWGENFhxRTwD8xd0kYvvqfHOBkYU6U6LpjlWNP\\/C4BYMy3paG\\/S4qc\\/HSQpiaYkdB79kOHN5ZsY6kzw6UCDXbZHIRrShypRm73BjiVVnphR1qTZVtFZ1t1+45pXMT96BcaNnrHiG\\/\\/xtQDJnYSdklIU+wQ7On1154O+zSCqN57mk4laVAGgQUmGMAyQQOkPoJxjKtzBemWRv\\/zgXveLjNOVajzv+9276MQ\\/tLoPMcXJrjK6cBSrDmAdToc\\/4kVHcGeQx33OJp+J0NsdZ2G6RzvmYmCCMW0xNhhwczfCO93644Rp\\/+MNPaJ+7nzmLeonrDAmZJB9Mkm3qxvNDrLTG8tNIspTECAlhCHURIw1lCcoFVIG4CogbTSUZR5ssfTvPpbX7bp7yPi5GozU0xVtpTQ7MSBwI1u0tolpVddGI47qzRsOCOc1APU5XqNRrC0PfsKi10hB3GZiwsWIBssoVPDI+BKZONTh\\/VZJvfez7fP32z7FnZBMqJnDSkoyG9QMBr8TB9cENDIdGt6FDOHfJs8lxW+0qfghfvMOjqcuKaCsRQwOrSkHZMqzxQ4Gtor+YnHiM0De84tznQvG7tXvZcTDkc3cEZOdaJJsUyqlywQxISxH6hh\\/8wfCys0TtGXubpwg8QxhGhmpRmz7KUFnxKkdM1DMHxkTztaK7EbZvORiinMj1j8YzDeMZAx\\/8jkvBUWRaJXYiMiKBC1ZccvL81gbDtneogIxVjaoUnLZ0GYTra9\\/fv71APKuIZSNCbRiADjWL29wGPR6acLDjIZYjCIShKZNlbq6eiMqX43hWieZshOqi54Otg2UMKUT1h3OaIjqMmYFajWtzxdqlGPf22vW+e69PUUmy6aobKk98z6M\\/C7G5YxoxHscXU1gKpDRILLSRhFIQSLB0lClLxGz2lDo4MDJKSc3hhRe\\/4fjjuy6\\/ufUrNLV2sKm4lMdKEqs\\/AARlmWRSGRjt5yUrs7VN67ol0k5AKl1GJiR2wiKMQwHYflCz8ox\\/IJutk34rlRIPPPglnvecDLGglZa5GRQlmhM9QCuOmqIUDmEn46DixLIulWITwiox4Rbwk1lkoYylXZqKB1jb+iseGlrKEVIMybM4sHUdC06ZeEqNmzECHWhWzV8G4aN16kolTsEv0+xMJw6O79KGvmHpXNmw4Hf2D0ccraphW70w1wDzHto9hdVpIy2B1FDWmtEpTWtmOn52F4viI1x\\/1T+zezjgtnU\\/5JebbsWKCzaOwEuudwmCKKNoJwVGG85cGGtIFNz5SEBeKHLZKtpR0bWFMMRSEt1quO4XPlNTmrxrOFwCgeKCxSORta3Kjb8KSbQqkk1VYzTD9VGOxklK+vtCDDEEUawyqSaiGGOVU7aipzG5svlgGHVDUfVWVrUsoGtY3lOPJYbGYtvgFE3zImOn\\/aPHu3N9QF9J0NRVdRuViPC76fEAACAASURBVGKbIkqqrJzfNEP3FgfHpmjqsRHCYEJY1FZhZlp8aCoR0X2qiDKsGqQn1KMS4BqW9S5DhjvrIaHdZZykqHZ+ie5JOQIfQ8WPk7Aj7+SkudnImOlq8qSiufSCt5HT36+tqtG85gfrNKk5Vl0PTwEBVNarV5\\/kB0NhvUQYn0rgg4yaNkoSGOngAb4xuNpD6yksNc5YJcYj28dZ+1dXY9vHDz7dddu36ZRbefN5E5w2f5h8toX+9lUM5ZaTT51EKX0yhdRJzF14aj2z2b+LXFpilI8RAaEyeFIxMAF7D\\/fw\\/Ive0XiNu\\/+ThQtdurrnsGP7BL\\/8+X483YxvuRhL4WMhrDRaJhGOg06HFFp9\\/FgaKWIor0TAFH26h13FDAuTe8kKgxNL4qZayLuLq4vyKfpg0CaioCxo9cD4DQsxQhIzGgA+wUfriNxLYHH+io6GOdp2CGTVsDkiQVd2ZIbxTFDUkRsmZJXsmVJ8\\/w+NXD5TWY8\\/eDkL7a\\/y9y88j\\/\\/nvb9g7YqLkZYg3qLIzlWkOyR2QmBCyRkLGxf5Lx7VxLMy4ropalHm6YRHPKt4eEywrSwZCBWuEizpXkpKrKu7xAXFI\\/2aeEainIgoO3MOhIhQlxOzQSYaNr2p1uEGnmF590xDZbN9qII1jThmUFXCwNCS6iRr99VR0ZiNcCKdGGPw3cbxAH70QEAip7ATohZCMICpjpeLHagbrUkLrOh3ET1Gs3JeqjFGva8cIURVrU4JDbaIH1OP0p5ufQWL21VDImrnkMCKCZSqJx6lig6k3Yfq666ruRIRkkND4EFGtvGaM+INB9W\\/3+VjZaIyrOkSvKdif8g\\/KYsKeJMGNaLwq+1+4ok00giUjAM2rtYUAh83DChXxmhtVbgWTJSaOW\\/tK46fkwhDfvuTG+hKSVpK21icmqRUKDMeOBR1HB2ksCoWpjjJBeeeVYflOx9jy0CC0eJckjKFljZjJc36bR4XPPcjOE49MDw+foQd279GU1MrX\\/7uQX6yIc4N\\/1PmN\\/f04xkXEcsTSxriiTZi8bmEpInF20iKTpLZHoa9ZkbLHawbWcZXfruCR721\\/HLXEkaEwRaamJ+gNL6SUt7iBGexZ3xEDWmtfFx8bedhgR2XDbGfJ9InROTeFz7rYtLioYZxHj3gYTvRdZZ0L0Pp+sZav6eMU01OKEugHEEiK7l1i+EXG49ub6Mr6whGPkxm6u2876XP5bNvu5Hu3HwsW0ZIQELaydLs7JgR43PYejjESVZrHWc+i4yMhBMTxDOSZE4Sz0qUJTm5qwXC+ub95aMeTkpGc1INVB\\/NXDL0zulFzNjQk4WJmpvekuwgax+YYagspFOd4xkbHhMZojWLVoAeqv3+ge1TtXgkWtCa6mwYb3TKZt8ExFJRXa+sIm1BlGFdOf9k0IN1N3NbKRrPqiZ3AslJc4IZGeQYByeDKDMuBQKBCWFJ17H1aFVfxKlryL0uu4dpQKZCRmjSigk2HagfZDF5mNZMB6Fv8Euay9e+Ebvynfq6HAj59W5Doik6qGrNTZ+C\\/SH\\/JJAAVPYKrDDE91yUnSBEoYSNUjah1hRdn3wxYHzSw3cF2g3wqdDde0bUAPI4snHd7wkGHyNlF9jm9\\/CDR6ASNCNCD08HlFEEfokkE5x3Zh2x3XX\\/Th48tJCRKYEVMxRdw8EjkoJ3Juec02hQb7v906xY3c6+sUUsXPsFei76NBdc8UW+e+cYA33NhAaE4xOEARqDERB3sqRVE32VZv7jnmZ+vqWXm7aeyUT6YipIdvmrKNlJpDTYJsSLL+DIgU6eKtA20+VZ2tW4EA+MKKxY9dT\\/IweiMQbtG\\/yy5PXn9WBmGIPBccPOUY1yoozg0rlpMMUZpzg1VAgRCrLiknSr4gu\\/1nzkhy79R\\/Qx+GuHCI58kOWpb3Htmz9FWrWiq2U5TYkMQh+uX+OQwopLrOobwx6\\/FqcTH7JaoC9khEAToq\\/BpR4uZrATom7UHjfOdPZu9aIFDUjl0JiLkNHzr1q4FMLDjzNUjWNO+6KBB6t6ZEPnjMF8AruqEx0YVi5oHO\\/ezWVi6ShTK1TjvYU+9DaXGjtxTDrRb2VksHpaFpCQ9YTArkMGFasjasN0uOEJ9KhEjUj7eErLpr7pbK6oH9SWwHIEk+4MDywcp7etC78UkXFfuOxItbojuv5X7vRJNqsqWnvKwFqt08+T\\/rXRwJBNxStjtEYbTRiE2I4DaEq+S6Hkki94VCqCqZKFmy9BWOGkpaufVAXAXbf8J7mMYUB18qODKzhgPwdL5EhVprB0iUCXCMtDvOyCVaSSEVI5MjLK3Xtcwq5lBMLG1zEmyxYbt4W85JJPNVx3\\/4FtDAzfwcO7FXL+G2k+5VTiXXOpdHTTffon+cQnHuFQn0RIgR+WEKKEFXepGJ\\/RuMXmUcWIWsack3KkFzgU7SnsMECKcWR+EulPYBI+I3aSkalT0aF4yiybDqAj20Xa2tuwEDccKFRrJ8UTuqKGaRKp4XUXvI1O51eNbtH9Pk4mQiQ6hKVzGgur9x2xUE49sRBUokJ85UjSbYr1Y5IrvuHxL9932bDn6D5Kunw\\/6eIHeNWZr8EvVw1bMt6wefcOW6hY1aWe6e5Nl5G5hvZ4L24xIg+HXhS8dlSjoS94iWiDq2O45jOY8WtPaW4wiCMFL0qMBLC0UzfErw7lE9jVmNPMGm4dGLSnOH9p0+PQb+QWRrxDWNjaGA\\/rm0jUjK8U9QNpOr63al6mYbxNByqRsZHRNZf39EA4Wvv+kb2VBsNLtU7zWHqcLh\\/ToaEp3kpL4mDd5Z2w0Zas1gKLGhFZVkMBe4dnjhcwNyMoTYa87aJXQenmhsz29nFBIquwHFmNrT11oRoZsX6P\\/wHwRg3euCLvaoxSoCsoGSBjNlrDmOtSKGs8v0wldBnxLLpTZVIyINPadlyjlp+cYOO6n5NP9nDrY4s4OLmY0LLxrDIBMULfQntjeBOHuOLVL6lvwtt\\/jY6fhBfvoe9wiOdqdh0ISeQu5uSTT5+x6Q0\\/ue16Dnm9nPXSa5m\\/8llY0sESFqFIUWxaiF56Bd\\/46j0Yk0E4GYwPXhDihzbJRJLVvW10ZiZ5dJvH6JE0niNRgY3te5yR28eZzgZivoUTJBk1K5gcSdQqIk7kZ5qYe0rvYphBYh0txPBEvSj9qL+b3sxhVLu3pG0Nbzwvh\\/HrXUGmSoY7t2jiaYWU1cB5d2Nh9cYDeZQV0SDeddHH+crbbua\\/\\/\\/ZObrj6VoSEZLOiZZ7NpinJNTcHXP6lCvdtDR6H3oY4r3cQr6ijrq9+vsGwhGa6Y4iou99imiyrWXvyy\\/nK2\\/6Lm695gO+++ze8dPVl1aLyyYbrKLul4YUjM+diuiywu2kRK7sb\\/+7+nW5ECQkNJ3U0svA37i9XUXGVw1Y1kL5reN7qF5OzN8xwCx0OjAe1sqvQM0fFwzbuL0eGsjretI6NNuhAsLSrfv1AO+wbq48XBLCwtdyY6ZyM1d1Hotrb4Bh6fLRvKorDVV3VlfOXQzhQ+82DO0pR0sZmhi4iI2fZgi0Hy5gZTYJyTolTq2Tc6UMqCOGG3wSkmqfpLid+Pzz+86QRmxBQ2S3QOoxiO6FGSYVlxZDSphx4VHyPihdQqWgCbQhCn8AbJ2UZuuZ2HNew\\/epXd7K3nOOW7T3sl8+CRHt0CobVcpvAJyyOs2JunHPPOLVmrH54+\\/2YRA7htLC5zzAwlmTLDsXFr\\/5IYzB1\\/T08uH4z51\\/4CRItq1C2QhuP0C\\/je4KynyVoO5nDphk\\/7OF\\/fngvSgcEQQltxpHGoidZ4HXn97DX76YQdBMrTmJEiIdDEA6zqLWPiihiyRw2OcqlphOPuTE1N3Jxu8fMzpIP76ovxOnY0fRnZucNt6hZ3LyaT13+N5D\\/asM8\\/ddvfEQ6WoTGzCCSzjCeftX18yuaXvtXtLkfIjV5FbnS+8iqdoSEWEaSbrNomWczlbT4l1sCrr\\/FbbhWRq7Hr0TPM1H0GhzNXLq5gWeHqLbnCQzlvOaSUzrx+i8iOPhsrJFX447eEnXFMI3NFDpzcfRRrYbqY7lFzdtf\\/HqE+4e6qzcKgyVTRayGnpZ6kNzXcfonAqRdj9dN17c6YYYrX7CqIWC+b1ih4jJKxBjQgWBJp98QD+ufDKpUkBlGl8i17m5ZQELOaEc1LCMka9cN5eMbIKzbU6y6taLWASTjHK1HT0SkXYQh8A3zmysNiaiBSacay2tE\\/0JGiaVAaCp+fEYZnubdr34RpvTr2v\\/d8oDPqJHEsrKWzHgq0dqflDwwGsy4he9Gr6GTUmKkTSyexgsNU26ZslshCAzG2JRcjdYeujJGu3QjPH8cue03G9nuns9Y9jQqsRYCFEJIdNTuAeNXCPMH+ad3vKbWGPKh9ZvZsL+EiCcphzH6prq5Z7ugd\\/Xb6Oist0AKAp9rv\\/Yl1rzkH4jNW0Y5BgVPU5ywKBcFlYpLwfWY0Dl251dxxfse4ge\\/KLFpex9uIcQv+hRLE1RKeVZ17uCNFw0hGSKuHYqyRCACKmGcYHKcuDlMaOXRAvZtXo32T2xgFCGi2ky\\/MR4SuRbVALWJXMgwiDJdvhchNLegSZl2rlp7DZ99y3tQE9c0LORH94fcsd2QyCmUExm2FfOWIcJ6hm\\/drunAtST0YPjwIxhvR7SZg37OWnQ2fiV6zaEVE8QyklSrItNh8aOHQwp+vYGBMGW0jlpLj0yNN1Qnnr3yFByRRAfV\\/mmm7j5fcvob6ErcV4OfoT\\/BPVsKCAVHJhvJ0S89+1Rk4BD69d5mppoN9oqGS8+7ijO71je4wT992CNWdcUxikwsX6cKBW0gq2itWhcauIagqPjn132CnP5ew\\/Uf2V2sUVW0hp7WhcRnxMN2Dxms6dIi1dheXQeGZd1d1ZeoVOd\\/dykitlpR9ZsJJD3N9e\\/LfoLxiq66odOZ2ifQYyIyWiAIfRoQHcBjB71avLYh6VJtVmnFJLsH6\\/P2vLNOZWHTbTX0OFUyfOeBkGSzqiZPZiLwp+7zpEuqtCdg0sb3CoRGY8vo7evCjlOs+FQ8Hzf0kaFBKokIISiUkLZHc1OA6xaPmw39w+bdkOjBUnPxhY+UIeioUE\\/7IaY0ylmLmnj1y15Q+7trb\\/g+JtlFoDWe53Ak6OXODX1874PvaRj\\/xz+9FdXzV3g9pzPolUkUiviFFoqTFhMTNuNjYxQm8lTGxwms1WweLiNiLfzkt3fxmrVLsEnhmWFKQYAsVlibCbivdYQHJiyEaYFAcXgyzZEwzjxrHzvEXDxsLNlLGNpYwj+RBLao44YnWdTuNtQ9J9Jncf7yOPH0dLBXELcTJGMZOprmcuqCs+huaYLC9wiHr4+O8qocntB88lafVJtNLBmd9NqHBa1hA5H0wJiFHfdrG3vrwQKnzZ\\/2x3ze9vzV7BzaQ39he9TGRkYuFcBfv\\/ZvyaQfxlSBW75YRKooq1pBMzwBndUcU4oHeNcr\\/5Ev3\\/HJaiNIgV\\/WXHLam7jigoWY8R\\/W7unXmwPGPIglJQ\\/srRCEiaitOdBm38sHLv04X7jto3jGQ1ZRmFc0vHXte3n5mhjh2DfrsbW85vbNhkSnFW16Y7BEvubpJRNpOnNdlCvDCKmj7sVtq\\/m7yz5It\\/wapjzQWAWSj2PHSkgJfmBY1tMFYZ2O8sieSkTxsEU99jTj1XeLW4OG4vaByenxBEFg6Mx2YZv+OhIrtqD1eK0nHsIQuPrYeqxWp5jQoH3Bsh6r9pyBdtgzkqd5vlOnyEzzxKpZacsRPHbAZVVv9P\\/NzjqMW88G\\/\\/dvfHRSEUvJKv3o6XnD8pN+r2iQN0hpMGjiiQTSEtiJFBXfIITEC2U0OTogEJLAD8gkY5jAI2MdYWD\\/jj86fsV1GT5SQLTYeFRIBwGBjOOJavTWm0JM7uffv3FdDa3de\\/\\/D3PHgHuyOswjDANcLGJ2C9139YdLpOjQvFqf40a3fwTn9Q4xONaOHEjhOSFC2KEz4jI7mOTw0xOjAPoqDW8hPjDBZlGi\\/wN0DJeZkDjE6XuGs1e1gNMZPoP1DnDa3k\\/uHXWKigDZZimEHw16RxNROmlrmkVfdBHYmyoyeQBLidMfc+R1LiIl9DbTEt7\\/yddTesQYYo0EXMXoUgiNo91OEh7Yd9cahkbzhn37g46ctUlVmfuhHjRKXz23kHm4dCLBiAsuJKgC2DARAnWzqlL\\/Ol6\\/+GtsHSzy48x4qfpm4leTCNZfQlXiEcGzzDINUwklGVAwnbbhjg8tbn2dXgdgYF528iyW93+OXG36GZVlcuOZi5qW2Eox9po5QPPjmfSGJbIQK\\/Irkt1t8Llw9XR7Vx7k99\\/Lff\\/8TbnvoZopuno5cF2tXvZis\\/gnh2L81sP+vuz3ArtZW6gCM0LieS6I6DZYZ5Jv\\/\\/A3u2ngfCM3pS85lXi4kGPs0prxluvVaPQSyv4RqmiY6w6JWt8FQDeYdrFil2l47WivTYYPAg5XzGuk8G\\/aXsHLVeJyB1nQCdD3O2tu1lO985HNICzxd4R+\\/dQWBZ1h2LD1WkaTvQ3tmLilZL8k6cESiYnJG4kU0rEEpI\\/1HNaNuVWd1ozYworl9q6Gpx6qjvqepG+uT7u7h9tu4gU8l8PC9kKZUM1YihUokqJRLhIGF0CAI8IxASIuSq8nFHDKVIQ5uewhjnrhLZhAEKLeEdsfwU3GKKKSO6jKMV0SPH+Dav7+UU5YtqVYaeLzzo19FZLrQKkRXXLxynsXNDm+6rLG64Y5bv4x0NCXXUBgcw5\\/oAinxvBEmRg9xZN8eDu\\/dytIOyamntXLaqrOYO2cOtrQoFd9C\\/77H2Hrvg1z7X7\\/jtS9upT0bEs\\/EaW6WSMpIkyJUeQwORyo2PXHoMfvYq5upOFkCL1YrOzlBgA0dwrKeNghnGjaNP\\/zeP3m87QdDPvGzkFJM1QK8QpgqU92wvMduIKbuGJ4i1+ugbImTNGw8FPLo\\/pBTF0w3qcwTDL6JkxPnsfTs00FmQE+hSx8jHNs6o2TLcPMGTTxrYccFCa342WafV59jyCaqhmDqx\\/TG9nDVcy4C46JLnyYY3dwwF5\\/5qUfBUqSzUS+wZE5x4+9CzjzJ0JQUtSqIVGUTl535KpAdEAyj81cSBoMNc\\/H1u3w2jwsynVH760Aa7IRkc98kZy6uGko9iTN+FX91yl+BkOjKJ\\/EHo3sKNUyW59OSirhiFT\\/OSHmSlnYbiCpFVs9vzHCu31\\/BaoleiDLdSXi686\\/Qit7WQs3YVPw4R8qTtHaoGq8vX+xvMJS69Gt6YlEDg8GJcbxiSFAxrHgCPSIixLayd1EDkly3u4idELXKhaNoNirKjO47cuy3B33tbp9ES4TWatnep0metCsac2JMeOMoS2LZNsqxiadTaCkJjSAIDSoEhEZXyaOWnQAChPLY9egDHDp0kO7uY7f+TqdStHc1s7dSRPsGGabQwsP4k+jJPt504XLefVXdYH3yy\\/\\/N9iMC2ZQh0BVwK+iRPXz0ur9rqG44PHSQ7etvphCcQmHKQ+hBpDOK79tMju5g7MA6LjljGVe\\/72rmdc859sOfdx6XvfGv6e\\/v57rPvJviWB8L5nZwzyaAHBWZiNjdwSgtXQHSa6KtWOYgASVLMra\\/k2zr3hOG1qY3dO\\/jMmF\\/qowXDN++1+eO7YZ0u0WqWrYUxWUExmhaMu1krAO1jXVoTKHiKiJ+WmDHBakWi8\\/dFfDJVwoWtMvaneryfVC+75jXLruGD\\/7Ao+QoUqmoIsARAr+i+NBNHtdd5hCrBseNu5HQ3Xj0YRjCdbd5rB8RpDuiUikhIZZWFL1o\\/M+\\/wSEREzU0EY5\\/7dj348Hnb\\/O4f1CQ6VA4yQjJWEYQTwtuvDfkWQuj921Gxm2CMP\\/txqx+yfCuL5f4+j91ApFh29IfRC87qXYAEUh6chM1O1T240wEeXKOqruh9RJeFnWdhG3qa2d6PFmNxykbhscqTBYtmlIzEJUbdb7dsi9CiS2ZtmPqUTlEJVkGepqnGhJRh4sJnET9JcszbYWg2tLdEmzuL2FINhze6\\/eEPDwkaO6JdCue5neCPOms6OSuMHqYUOMIC8tKEIg4vrHxAp8QH18KPG1jTAypBSbwCHyfWAjNiSLfuuHzT3gjSin+9s2vIZwYxhobRZSGCKf2EhzZxIfespYbrvtwDe3dfc\\/9XPvNu5DpDoSykIFPUBzh2afM4eKLntMw7s3f\\/ijt2QQTrsfoeD+HDo2zf98e9my4g5b8Nn7+xffzqX+88omN2gyZN28e1\\/\\/bj2le8ir+43cB9wzGIxVrgwwMbSkbJZIMjkGTOEAuNYQThnim6YRle4SITj5lQaG48UkrOgyjjbfjYMhN9wd85CaP1\\/2Hx28GJc3znAipJRqDxFIJ3HCEwKvzmh7aVyDRFGW3lJLVsiaJm7K4+jsBX\\/q5x+C4fmLk78OdGwOu\\/rbPwVCRbFE1vpUdEySbFQcDxd9922fTgfAJEeu9WwOu+obH\\/cOSTIdFLFmtglBRwXeyWTGI4upv+\\/x8Q4D\\/BIC57BpufjDgiv\\/0eHhMkp1jEU+ralOHKJMZSyuGteSa73scmTz62UINP98QcMXXXfp8xdTkA3W+2aEKiaxCVrlbyjEUpurttjceKBJvkjWyLTPeSSClYKq0AxPmjxrPcmQtNqnSiv\\/z0+CY875rJKKFuHr0mHq07Op9WVAqb2qY401DxcgoW433VudSRgDm1JP\\/b3tnHqdJVd7771mq3rXX6e7Zh9mYYV9kX1wTEyPEqCjucYvmJjHXG1Ev3iTe3Ot1SyRi1LgE0SSKS4wmIkpUQGQRkJ2BgWFgYPbp6X15l6o657l\\/nOq3e9imBxGReR8+9elp+q16zzl16qln\\/f1ORZuefc793BUZlV7Tap1SSv3KM6H7PCdv+qcl83rlb\\/tKJ83JEVxSp9hRpdzTT\\/fAIrKkTm1iL9THwDVQroEg2MhQMZ6uAhgsDafZNer5xJd\\/xuFHHf+43\\/PPX\\/93vnTJZYhWHHvEGv7sLedy+Pq1s27T\\/Vt4\\/hs\\/wLhdgip2BeieZBI\\/uJFffPvvOO7ow2c3we0388+fehv3jvcxUYgpVU5iy1g\\/tbH7ee9rzuDdbz+3Fa87EPHec9br\\/pxrtyhMpUxqOzA2obM8gZtyHD5Q4NTCDVzTPIxt9jAKE9dyyu\\/d\\/FQF2PBeSOuh5KE+7khqIeb2uJIXVIYHAaJiePijnEYttF7NKYJltr6rOeWpjTuSaY\\/WUOw0FLs0cSublvMKJEJSExqTjvqEZ1WXsH6RppSXODUz2DEm3LlLiCqGYqcO7UOFWXQMycsvsobQmPLUxhx91nPMMkUlr9kab8DND3vqWlPqMhSruhUnmlub5rNQt9WcCmukm8JxS2GgU2F1QA3ZOiLclY+n1KmJZ8bzGNdKG0J93NEYc5yyHBZ2hozx6DTcvFVIrCKuBEDqtBHujzJQ7AjjjIrBCm5OexpjjsZ0oGwsVDXlLkNcmVNSka9plkJz0lEf9yQ1jzbhJVLqmn0JiQtja0x4pkczjuiDRZ0K54U9NcXWusJWNOIC1FBSe\\/R9RIWsbiPfTy4NWdpyt6bYMUfpztmDAVFYmBzMuPDNf8Uh5uMtM\\/OHt2Z85nqhe6kNSQPz9CQM9tnyf3jR\\/BTbyHUVBm8ZD8mAri5K3Qvo6F1A0qxRG98LzXG0byBpA200pWKRSCf0lDTGC6kukU2PkhVW8KHP\\/4RlK1Yd8GA3bLyfs975N+zOFqBLfWAMuIRsfCtvet4qLv7kB\\/cpxj3rlecyOjXMtmQ5v7VyE4et6uHCS2M+8YF38qZXvXS\\/33ff\\/Q\\/yj1\\/5OrXhnZx+8nG84Y1vJo5DkPzm2zbw\\/Nf9b+K+VdQ6urAeVleHoNkEVWZtfB8P6BXs8UeRbb+Os9959VN207yfVSZZGur8kCe6jarVXznDhKSNmu39ewyABRFmGaJyZqGZc03eyzjzTpjpBPAu1NZlSYDlDg3R4QMz8RgTh1YcG81Swu3LQ5pX22cz1\\/FkibSAOrRR2AIBeTXO+w3N449\\/poE9a4bDZ4KX2cp5G8+OSZtHjwcCIq64sN5pfh2XSg55lM8nb1+Sme4DN8tipaNZVBKfSou5ijksV621eIx1cPk6Kj33emH9Z+KtLvVkCWRN36qsmhmXztHJveMx72Pr5ZQGUAXJeUbNDIuYmR3TTKmMz4TGhOP3jngjbznxbqR5R26RC3\\/4+QS\\/IKLSa1ovzadb7HxVqS7FZF6hlUZU4AEID9jswogPm8ZgQBnEa5zXlI2Ayqh0xExObeV\\/vuVM\\/vxvvsKpz3vxvC2kL3\\/ze7z3b\\/+VRmkJttKLVxEKh0+niRuDfPj8j+9zznd\\/8BN+vNkR9xxL0TQZH5lgsKPGhef\\/Da+bh1L71Bf\\/lfM+9iVkwSLKLuH2ay5j48a7+fjffhKlFCccdyTHr+\\/njpGMVDXocjV+79C9NNPt\\/Od9R3ND7VQaVYvLDIYST+UrS+vAeqy1whYPIMymHsnlyOOOSylQJjBHmWiWe0\\/BHMIaNVvvqsPDIDYoHqmGrN4MifhMcWeruVs\\/9veHPkRB5W5WXNZhb8lcLtFcCei5I3js8WuTI3cUg6U7gwjcar7WTzweyBuq7axSDS+SudawyrsFZtLC6tGcpTO\\/x6pVqPvo+6Eedx1an3\\/EvQvKM5RY2RikombXXO+rqFscpo+6j8zupwKP+V0+V2YdUS\\/DU0OkdeGkQ17Em5+7Ahm7pHWZr1+XUS8Yujr0HKX29PNS2nmzKqkYrSOU5GCSBHPXZVngSlWhZkqhSZ1DZRk2tqG4FqGgPOiIaldMeXKED533Bpae8VbO+7M\\/Zt3aVY+ZLW0mCd\\/7r6v4+Be+xd07G+iuVdhCJ17ZUDiepsjUXs7\\/o5ezeOFsZ0Oz2eQvP\\/ZlVGkRmS2SOsXPH4542avexete\\/Yr9TvXCL36VD37qq5yypsJkPMV9tRXE9NgHfgAAIABJREFUySHU9l7HTTddzymnnBGU29FruOWKByjWC5y2aCNr4o1sHOmm6RYwHnegXBPiCK\\/0U8xelT\\/Ov\\/I34YEyN+SfN3MMyEfw6M4v3a\\/mWC7yOIpLzXudjA7X0cyhTjqg8cyOSfKA+ZMbD09uPZ\\/MunOg83v8\\/RTauoSi7+Izb\\/omzQyc91T1fWSD57U+t3fc8+93CNUleTGu5imH\\/J63Ypt3Tk1ZRGtwoZnNOY9zGZnLQlpaKbQJSB9eaUQ0ggo8oCpDi0O0piAZrncJe6f7+OnVW\\/jyj9\\/Niu4iv3368XR3ltFakTrHtl2jXHHDBmoUUdV+ogWLwRRRxoL3uCxFmpMsLjf4i3fuW97xjxf\\/Gw\\/tFeJewac1atPTvOT0F\\/PWP3z7fqd57Y238p4Lv05H5yKKbOTdrzqNf74JttxWxOpJrrv2ck45JdCHrVm5BGo3sTJOeMlqoZqOMjm9mCztpMNOs6g4xM6Gpq5\\/mdzlb6jMPFDqUSHCJ3cdnsLrqGfAeH7V6\\/4UjmumXayoyvidLyXSFSIM2Rw0GBH4u8sy4m5DXDF58bb6ta2L3beJ7vElzQJvZMHY4GML+5w6U33jnEdZRU9XN2ljPCfxsogG4zMio7h7uMg96gii3kXYrMFgJlxy9S6cNBDTCGax6oaudZjIgC4g2qCUyd0JQfkUmd7DX7\\/\\/tVQrsw3FI6NjfOjz36DZsxgVa3Td0m8n+ccPz49n4U\\/++tOo\\/nVkUScb6yUu+tLl\\/PFf\\/D6Xl\\/q44xf3MLB6tnJ7zSHL6GSQF67bQ5Vd2CyiUirQUdxG\\/8A4K+Id6G2aXdEU813ntrTlmSYhpgalOA6F3W70UZ\\/5+nUZGyc0nYtMi3UqBAp\\/XYptnmKMI9KWmIQIAQfOW7yy+MxR1AoxFi+GSpQik1NUKhatDU40ymc0bBc37e3lnuRopLQSrz1KW1QceCkNgujQyaCwSG5fKx16RlEKEYf3HprjHLO0yFte87J9xvmhC7\\/EpO4hMt0hU1jbzgfPO4e+Bb37neNFl\\/wH949oqgu6AMtk1MODcizf+tpVvOuNz+U7chTXXHE98pfBQo2U5\\/cOHeKozgY6HWXSOboY5LcG7ufuoWm2R4tZ3f0Ayzu2tJ+OtvwGa7bwY3x6x6NsQBH4xvUZX7tD6BwIbGS\\/LvdzX1d0nho1TVN0iJyiUWSZw2UOfN4QryJq0kMz8ZTjvfgoQSKLRoOZZMz3c+f2XrZyKFPlZWjjsKSgYtyMf5+nt1TemKaYrcJGQPAgDp01SCd28P8+9BfB1c3l\\/ge28NlvXYnuXY8yFtWYYM1AxNtev3\\/k3nqjyd9d\\/D1U1yHoqIgXBZRp+gU8NLiZ+x\\/azZknL2NBtdqy\\/B54cDNpY4LUFqljqJuUnVKl0bR09a5k+1BGsb6LdWv72SFD7QekLb+xms1EsHe6weevFhYUITYwPAU\\/2+wZFU3ngKVQnUUTFvkNUWy6UsfEPUgzAa3wPsNnWXAL0TgxuLiPhCYwiljBa43OFInuYNNYN1vMEYzFizBWUyRDSwmvJMBZtTCaNErrfZBnnShQgheP8o50eojfPWkVv\\/PCM+a8OYT3f+RzqOoSdFxCeY9vjPG+\\/\\/EqCnG83\\/n9y79dyu56jK1UERPjReO9peY6mIwP4V8vvYtzXnoEfQtXtM5pZJ56WqBnog6qwV7Vz+SI55jFo\\/zn5lEq3etomm6Sxsiv\\/Ua3pS1PPm4XSkPiDs2VO4W04UNJiFFEVUtHSYWCYZvH1Z4Be93O1wfuWJoyWaggyXSO6+5wWYrzKcZDpA3WNCkVG1jt0K6I9jF4YefUQgZZyGRcQHSTYiZYUyZTZZRqYMiYQetTmpxV2wTMLEBLKPlQEso79PROPnb+hfvEzH567U384Mb7MX2HokyEZNMU\\/QSvPnv\\/JSXOOf7pG5djq31oGyHa4MXgrSWRXib9cmR6nJuuv4vXvePc1nkb7tnMtqlOdqcpVWVJVJWGK9GcGqNUOpQ9aZXanjqV5vBBmD1oy7NJsyktOY+GUOzIs2F5ic9sWYl6xuzzeSs2tCedKfnQDklT0rSJcw7vFZEyxH6IzjJoByaJUSZmAsu2RieTuoTPEkq6QNHFSASN0jSRBIstYNaHldLahARC7oo6CQkDcQlS28tbX3YGh69bs49i+ssLLsJ2LkJHAZ\\/MZQ1efOqRdHRU9zu1a2+8lXu2T2IHlgIKUeBRKKvJsgJTqpemLOS2Tffxdyec2frOmzdsZXOyhr\\/fXKRcWM4i30W5qBis72WcpQzpw1nXP46Kxmjh9LSlLb+Zqg20YLR6dAnP3DKaZ4jMu9zDi9BwjrKOcqJeR5okCJBmDh110FXfTRwX8SrGmAwRxfZmN9LZR2Mkw3gLOiZTFqUyrGQYXcBg0DY0AWtj0cogSIv1J2DHOLK0RtWN8r\\/P25dK76vfvpTbHxzDLliN6JxTLqvzvJNPm9fcLvrG91GVBYixKCRA\\/SgfyliMwesy06qXQ098BQMDoad02\\/adbNjZQPWvZUitR2eGUWnQm0ywo9HB3uoA1j5Mb2eBysoexhluPx1t+c33Sef8mI3APfPEyjzLEKKiUBqoIztCdtJiaGQZaEPqhIYU6GxGKF3GlTQ+G0EoMOg6mRhrkqURoi2JychMRkEZ4qwcFJrV2FypiYQeO6NsUC54dAqeFD81yHvf\\/gr652Q4p6drfOjTl6A7B1A2zuN9GZI1OGrd\\/tu2xscn+P7Pbkd1r0fmRD01HpHwM81SXGOS157z+pb7+93v\\/Qcd8RhVO4iugZS6qUnGbl2k0y9jiRpjLJvk1jv3Eq\\/cTLld7tGWtjyNrui8RdA2oUEZT0rJZkwnioYyKBwuqTFpO4l8jYITHAW8L7Nk8XK2bB5HvMeaGk2vUKaEQqNVhtEao0N1uDEejEGboDyVBIIJwZPWxllayfjTt75mn1F96otfZee0wXZ1oIgQb1A+QL92du7fDf3BFddQkyKRKQCGTNkctVehAS8O15hkScXxB7\\/7IgCyzPHz667k9adELO7YhksSrtm7nHpSpqB2s6ZTIf2d\\/OgezdHre6l2FvA02rvt2S4SWgp9FrhagbwPVbfX5mm32GS+90zRf9gIW7d1kXooaIUShziHVeDq4+hqmSxtEMcRCoh9ChO7MNJNKgbvwOq8uNbYkBHVEcw0Z2uD1jPUXAI+xLsyl5BODvLB\\/\\/UmSsVZTPZdewb55Fe+h+lYFRIGM61GIoh39HR17nde37\\/y51DsDDE1D\\/jZYmPEo9ImamoP7\\/nTsykUQnb1qmt+zqW3DFLu7SWKoFIpkzY93R0ToBQbkgi3tcRqm7G0a4Ra2sSY9mZ7tktSE6K6Y7H1rOiGVYs039wI3j59yLFtaSm2+btIptREbA2XKJQ2WOXQLkWTYfBMjQ1Trmqmm46uoqUodRaYCXqK\\/eyZ1iAG45qgwWPwWphB3FN5o1roJw59fV4Jmc\\/IamMctbyDV73sJfuM5\\/9c8AUatgcdlxCl0Urw4kJ8DsXo+PgTzifLMq6\\/9V6wi3OlKAgZWnToUXQpUh9mVbfjHW98Za7ghb+\\/6Nu4jsOZtP14ZRhNNGXVpDZWxxQMWaHCYtnDiw+7l2217ejYt8s9DgaDzQlvO0lx+IBloFvTTIWLbkjp7JwFCG3L0yN6Djvbfo+o6Cn113DaoLSlaDWxAu19nh0VpmsZKQUa3qDxRM1h1i4poHUTj8e6BOM9IhF4i\\/YeLRlz8BBCK31es+aTBo3R7Xz0\\/D\\/ZBzvtrrvv418vvQ5d6gUd5Q28EmpDlCDGkmX+CSc\\/Nj7B9j0joAJpolIBNFK8C1ZlcwI\\/9jCfOP\\/tFAsFAG64+Q5+cvND2Kgbi6aiIfYJTVcgKfQxFfVTSgzHL9hFMnYXDV2bRVVoH8\\/qQ8eKT1zl+fY1gbjnnq0Ob+ZiO7WPp+uwB\\/IiEYGOQyYY2TZA5j1FrWmQ4cQj2oDzaK2pJY7YKrzyRDQoNB8ijsrUJEYjZM7hU4hwWOPQAuIMylpajqAXxGUkU0P87inrOeXE4+aMQ3j\\/R\\/4B27UEHRfx2uSwOIISlRcUFvjp9Tdz2knHPb65ag2i5oD7iQ+WmjgkrePGd\\/CmFx\\/LWS9+PhBKPN77kc9DxxLSqISyGocDBZFOSWnSYWKe23sPa5I7GLVd6BXJ7MZuy7NajA3QP2ccGULXv9jiKVZt+97\\/Oiy2A1GESkH3sgYUHF7AiqegQ82IxlPUQuQa6LSBUYDLsKR0+VG6S5osy\\/IGd9CqiUqGMOkEZA20min4lfzwJPVpsrGd\\/N\\/3\\/bd9YhQ\\/\\/MnPuPauHehSN1g7y1MoAsqHgsG4zNU33cUTudpGG0pWkCznPXUZyqWoZBqZ2MkxCxWf+fD7Wp\\/\\/x4u\\/wW2bBokLEdYmaJWhlKAwiHd0S8y6aCuHlW8hnd7NmGQQS\\/uFfbAcHqTuOGx5sNLu2iHYgmqvy6\\/hsOIPOJJAz5FD+FtKiHIUjMFrhZOUss4ouDqIQaUe7+toHVNgKhTMmQJZ2gDTwGUJ1XiMxX2r2TmeBhgiG0HmQvO7a1Ib28Mbf\\/9MVq5Y1vr2NE356wsuwnYuREfFwBKk1BwFFlADVVTk6tvv58677+XYow5\\/zJl0dFR5\\/VnP4+If3h6KDG0MWRM\\/tYcTV3fx\\/X\\/5e0qlUPB718b7Of9T3ybrWomKSwiC8R6NRokFrVncs4UXHnIXjd17SCqLqC\\/2ATfOH3xvTJ8JadOT1kMLjo11wNgvaLwLMNvNaU+hogMnwByMM\\/EzcNeOpB4AK6OSotSpicohueRnEG0bnqQeGNuLHYHGDwlIt2lDWoQzCkWaCGnNk9Y9tqApVDVZ09OY8kQFTalbP2EG0yWe+oSnORVuaFQKFHg2VsRVjc+EI\\/qhECmm68IDo9BZFmpjjqQWvrPcpbHFfb9jPvN1mSfL55Q1w3yjgmrBn6MCDHmxM\\/A1HPTJgwM\\/RdG1usnIwwXsaIHINxET0DmsT\\/GmgBKDadZBO4yfpKgdncWl2PESmeqmLKN0pns5tLqHhelORuUo9rhKYKaUOpqMZi0hzkZ5\\/7vets+3X3zJd9m8t4ntXoTKG+hDDEshSuVoqxqtS+jKIt7\\/4c9x+SWfetys1IUfPp84+gSf\\/9plYGJWLV3A+973Wt72hnNaDfbDo2Oc+2cfwpcWI4VunLbEzhKpMcROk2Qd9KkJjunZhR7bhLaekZKGBenj4nc9q5WaFzq948TFsLIbjlxhmWzAe76X0bU4Iq17Xr0ezjkx4rLbHV+9x1HusUCA8Z7a6zhlkfAHv2NY0R8s\\/NEp+O4tGVft8JR7DeXUc3yvsKgCx640eOADP\\/GBV7QprLIZZ52oGWnAP28Q+opw4oCwskdx9CGW3ePCed9MeOfzDGcfH7F1WPjADxzVhY+dwUybHjOW8e7TNCetjWgkwr3bPUkG944IP9srJHXhyBXh3FsfdDiB6lTGu07VHLsyYtuQ8LErMpyNckU+z\\/n2GHrEc9JSWFKFNYs0SQYf+k7Cn\\/5WxAmrLUrBz+7xXHxzSqHfYqKDu8REPxk7TxmhctwUdV3AK0NRCyUFBoVojdVC5FNSX2CUhWybWs3OHRWsT4EhllXGee6qYQ6tDhJno3g8SebI0pQ0aZDUJqkPb+e9b3slPd2zxMfjE5N87IvfRFcHwBTyTGYek5MAiRwMN4VTBordXL1hFxd+8WuPuwClYpFPf+yvmNz8U0buuoxN132Hd\\/zhuS2lNjo6zu++4TwenIiQchdFVaMkU2TRGDVjIe2hN9vNmSvuZX11iIJP8X4BY8X0oA8aT9YFLcKiHs2hizWrS4JrBoukrwyxVZyxVtOYDLHNpC40d2f81YsUf\\/XymI3bPa\\/+h4TXfLIBHt79kphT+gJpTMmCzTxnn2hZu1hzx4MBaUZ8sJDOPkxz5uGWAoHNPjJQmxJOXKNZ1KO57e6UP3+u5jWnRVSKisOWaKr4x5yHiFAfdbz\\/tw0vONLy\\/y5p8KpPNqk34IVHWwaHQlN4c9Jx2tqwb264J2NVWfjsGyP6y1CKFUcs15y2TJGlcmDzrQdo9OFhz6nrDGsWG8bGPF94R5HpunDFbRnVouasEyx\\/dHJYz4M+kSMSFvlADgQKCxz1HiHVBWLtKauQOBCtMKpBQXsaqovN9SX8fMdiprICBkGbaVZ07mR5+jAdjWFQMVPTTbzLEJeSJgmN6XGW98Db3vDKfZTQ3376YkaaBZQtIaIAj8r9PKUDU71ugbWbgLjbuYzz\\/+E7fPzTX37CeFuxUHhUX+kdd9\\/Hc8\\/972zYA6rSj7Mx2htiAYVHlGcg2sk5x45wRv8mzMhmXGYZkiLRct96KA62QykYU5rrRzUf+ZFjx1C4R6evUTRrHltQfPYaz9V3ZSRZuF0uEbKhlI+9wnDKOst3b8j4lzuFBYfGFJfG\\/PjOwFByzomG5pRnr9N86xbfInnZsNNjSxqXCYWG45R1wRm59WFPVFIMe82lGz3TeZ10VxFOWm\\/5o0\\/V2bTTc8XdGZMqf88\\/ak5Aw3Pkco0I7JqGBasjLvhJRjMVdk4EQoYo9axaFD7z0FbHBW8ucMGlCW+6sMFITtvXbIbn50DnO6o0P7jX00zCHj5yteW9X0v4wi3wuRuE6+4Onz9xtaY+4Q\\/KfTf30E9WKSJCccU4dbEoZSiovHtAC7H24DIavsC2qRKTlQoUUpRukhGTTWcUGw4jXdSlQiIR4j0uSUibDRrjg\\/z1f3\\/zPnBDD2\\/dzue+cTm61IPSGtWqgRO0eMR7vPcILig7rcAadLGC6T2ED\\/7TD3npm\\/4HDz60bb9m7EPbdvDO932Yk855D5sniqiOPpSN0crg6MFRppxGrIt384Yz93Jo4XpkeBdCTF0vY2ig1gIPPVgPbRVROfB0fv+W8NC94AhLfdwFcumi4oFBz61bHLaomBzKePfzDeuWGLYPeb74c0dHvw3sTQYSFx7orrIibYR\\/H71MUSoGsu7bd4R4WnPK89vrNdaEluHbtvlAhqKgGsHi3gCr85LTC3z4eylDHRHv\\/6HjszdDqds8ppGNCIkT0lwJv+0FEfUJT9RtuO5Bz6gofCYctzSwZo2Me95zboEvXJHy872aww+19PcEhXf3rqAEn8x8l3VDX3dwMT\\/\\/44S9saFzoaXSa9g67FufV07ayQOedGBb0bOqycT4FI0Hq8RuDJ2jyirv8R6UVfQv6GJosol4i8fg6GTPkCVZosiMZlKK1J3CZQ7xiswlnHb0al720t\\/a59s+8NHPkBUXYOMiwelVufJwofYtx2wL6ByCarEaabwtYruW8dN7Rzn8Je\\/kpWccxanHHc6ZJx9LZ0cV7z279gxxzU23c\\/OGzVx1y2Z0ZQDTvx5lS6AtCoURaBbq2CxjSfIwJ5fuZdnkMNn4OJO+xChFdpYNdqm0yGQPdolKmusfzHinwEC3ZlEBagkkk56zT4z4P99NUcZwVJfneXmZxD9dkVDpjwI1nAfXhP6OvKskN8jThufwxeEhf3C3J4t0cAdHHOe+MgJg+5BnUjS9WpE0PCeuCOUYSsFVd2dsTzXVfrNvT7d\\/7L0ed1iu3OA46wTL846yXHNfk5tGFZ+7BXTF0px2HLkiKK8F3Zrr7\\/dctV0RlxXH9wa+0aFxz7Yp6Ch7juqSA5yvcPKycJ2JaeHKB4SelWH+WSIc0h\\/+PToloefZH9z7zv5SFdEClcOmGd\\/TR7euUEjGQ4+WDu1NOqvRVxym7PpJtUaoIhSxHRFNWwY9yVSWkRGBB+8dzjlOOuE4brjlzkCsCGzZvodLr92I6V4ewoKSxxCY6ecMhblaZt+wM21RgoQWLRujq334YgeXbxjj8luvwH\\/xMpTPseBMjLJFiMtE\\/evBFnKFpnOcKUFJipgMskmWVbZxwqIaZjJj2vcx4ZskPb3UFo3ktTFtrZa\\/V9jdgKEJT3+X5ugliqt2Zjx3pWL3mPDQtEIZzytOzWOak54bd0DPISrcPQ\\/1CccZhwVltWlHcC2bU54TTw0P8w2bHHFZUx\\/3vPwoRU9H+P8\\/35RRqGoEIZn2HLM6JzTO4Ks3OEr9EfPtCShWNRdfn3DmYYauiuI9Z8f80cVNUq3RUSAjPm19hFKwZ9Tz+WsyqstiaqOO448L47n+XkehqmlMCq94wYHP9znHhOtceVdGodOgdEjUNCcd65cG7+bOhzxxRR30nQ72l52\\/jiE6cpKpmw1lrdGZR1QRBxR1QinZQUEqpGoBYlKM8WTe08yEMhHNRCHKtiCKxMR86utX8Q9f\\/j6ZS0K3QVxGdywEE+eKK0AKzeQ\\/5uZCZjoYFFkosxAfFJMG8TrgtdkSqtiNFj\\/L7YgGTCg01jqozBav4mzrV5R2U\\/GDVNUkxmumXMKQeHzUwQ41jVhP65S25Gznhps2Oc46SbOmD753c8bbzy3ytz9IKXUbJnZnHLEiPMg\\/ui0j7jCt\\/ZAlwqFdwuIF4T5fdqcjKhmmdrvWOXftCIvdnWWce3qMzwl\\/79omRMUApNCY8JyeK4sr70yZspqq3b9VnTUFlwV+Uum0fPw\\/m3zk9UVKBcU7zrRccH3I6PZoYUk+xi9dmVJYYNE6JBROWBu6Vm7b6olKhvFdGUesKMx7vnHJMLEn47jVQXnd9rAnroTC37Thec5iRV9XsBYvu8u1\\/nZwF+jmBLJP9gCoLG4yvUTR9GVEKxpKEymP18IWtwTRHkuGokBEzN6kl22+nyldZdx1oX2CRkhMsKx8sQs6FhL1rMB0rcCU+9FRNbh3TsD5vKxDtZIZwUAKDL3Ke7ybjbt5L4HkFo1SGq0MSkdoU0DZIhIVIY4hti0IJaMFrTwqvybiibzBi6dTtnLCkoRmNs6QGJx085Cr0Byogfrl1vPZeERFxd07w4th3WLNWYcpHhrybBwLZMAlA+VCeL0MTedFrTlz+fSw41Un5pX8mzLuGA7u5GF9UCoomqlw5zZPbSTjf50dcdVNCVoHVrWbNjt83VGfcCwpCQs6g7L40QZHsSOPp+1n7PVxx18+T9EYzYhKittHNFfcHmKGZxxhyKY9WdNz3PLg4tabwtUPCFE5JDLW9kC1FOKAN25yqKYnSv0BzVcZxapO6KpoMifcul3QkcJlwuSg4w2nh7n8dEPG\\/VM5I\\/1Bvuf0UxKpA\\/qPmWakq8yI7iY2nqIkRFooRBHG1yiZKSLdRCSjFg1wz\\/AS7hxaw9B0OdhcMwF\\/QJQJ7qyJwUSgo1B0+wha7Zkspyev88ip+WZIX0Q8CkFJKJRVIigvQVkp30pAhL\\/nVpkIAQVuThY4n2hiEgoyRq80qPqMrCE0GjFDNGms3xNqk9pl3486TKy4c3vILi7r17zj7AJf+GlGuVujUNQyaOTZvomp1nuExpTniA7P84+2DI57PvHjjEqPJkukFV+7Z4tjfMTzFy+y7Bry7BkLe2PjQ45OLXzhXIvUHM9ZEdzQkUnPhr3MsrE\\/wSEeGpOOwxdp1lZCQXCpS\\/PvN6YtG79ooDntOTbvNrjh3oyoQ6PzuNjRS3VrPL4hfOYcizihkcMazWu+TeGYpWHfb9oe4ol4oTbqOftQOHqVZetez2d+mlHuMbMew8Fd7vHLa0cEtIXq88aY6ilTV2VAYyQhSofoiA2Rb2L8BFo3qYllLF7JpmQdDdWNMVGwuJygRYXUQK7AHB435z9PhlMO8W5WmflHpHtzK00ky38KgssTDfKIQr7cmc2VXrimBx9S5j63+tAaJYaBZCfrK9vwYtnuFrPZwe5FdTDMywI4GA+lFbunhOmG0FHRXH57xl6vMXmVf7HDcO3GEE89fV1w1cZ3Z3TVMj746gI7hj3nXZKQVi0m1rhUODxXGAULH35txNErNB\\/9z5Sj8jKPvcOeT\\/9xic\\/+OGNqGk5eGz5\\/1V2zrt9+x+6hakInwbknW0a2pUwNOxZ3hr15705Pw4T418nrwga48UFPXNEtkuGjc4W3e6\\/nk28v8O83ZWSFA5tvMu05cU24\\/q2bMpK6Z2xnxondjnedVeDBXY73fSuBbouxbWtN5ECY4Ofj1xqhevw4gzcMYL0mNlP4ShM\\/pjFY4kAmgDKamk8wBYsREOdQ2qCVx7cC\\/wrRkveoqlZ91Ey2USGt5ILWBFDKGc0SoiOIaJTyzPBdiQDah\\/YpIc+shvSpVjNZ1hzASELSQZglfbWqyaFsZ1nvAm6ejBnrG6Jj5TTRMw\\/y\\/ZklIqAUo1PC+LTwlRs9HUtta80KVcUXr8\\/orsDzj7VcUA2JhecfFfHjOxwXXZ8R9ViiUrjHxsKO8bDaR6y2yFbH+7+VYnotjTwb+MKTYj77o4Rf7IFiRXHMyqAYfrFNiMt6XvfKe2FFv0ZrOO0IywUF2LTT88rTYjY87PjY5RmlDk1vh6enqnFeuHWnYHrDOLWBel5n99unxPzLz1Iu2wSdi2w+X7X\\/+Xohm3YcszLEB19+ZkxcSjl0ieHIFYZvXZfylZscpT5LVFDtPTgT2335Rwae4rUQJraXGN9aoGRTasowsqsT5ys0007Q3ThlccbjdYaSGPGh1xJtgjKayWlqTQDrUK03rMoj0kqpnKJvLjoHrSyXaynIkJpTeQ5VFEj+u0hOIjPzhKkZb1ZaD6NS4e+iLSob4vlLdjC0M2aH7OaYFz+ItcKjQODbsm8APvGYoZQv\\/0mR9361yW5jict6nz2TJaFjYGlRWNylSZywcbfgi5pip877H8M6e+eZGnY8ZyGMTwubJ1RwwRRkE45jFyo27fFMW0OxU5E1hNqYx2dCqdtQ7NDzAn4UL8RNR7cSHt7tOHaloVqA7WPC5vHwnTYOFltt3KEUlLsNhUrgxXWZx004juqDzYPCpNGUOjXaqHnPN0s9y9OMC99aJE2Ft\\/x9jXVrLLUU7t4pqKqmWNVo20bpfYRi63\\/KlbwIPHz7AnZt7aRSmCCuNHFYRnYdglILwJQCn4FKyYjwOchkUEC6ZWGhzSxn6Q3wAAAGSklEQVQqbstqU7PptjktVfuqVj+L7qZmz0c0XpG7lbmVqWYUW0iPZjJrsQVrUIPSGDwqnaDppugpbeb4F2xpkcO25ZGWTgBdRAV3bnIw46Mvj7j9Ycd37oVKj0Hpx1IkQZl4P9M8onhEWHXf7\\/Az9yggMM+4jzP7JFDC\\/XL7OGTWZy248DIMnJpKz+\\/8xxvPfObbmPCcfYjwjt+JuW+b413fTOlcaPPH4\\/HX52AX+6tCdl1x7DBRqcGW29fiBmt4DKnSmEKCQmG1zbOUKgTz\\/cwu0jlGms4rLGYZ4WctMGao4+couVk3VBBE5xZavqlEgNwtFe\\/32XwzG1fya0mu0Lz3eQLCkziPFs\\/aVbdxyGF7UTOJjrbt\\/ygrpzbqOWUJbBv03Lvdc\\/4fRNQT4Vt3eDoGbCtz\\/OjXbHi4Hwmj\\/lifnVEEj\\/yM0nPo4J6C+zNXeRmj9juuxzr\\/ccezv\\/kKNKYcpx4a3PabH3AUqxoTHfg42ortKZRFa6coVu7ngRuXMzGhcGR4lWCUDtwGgFIeLQqvVLDcZtxJyQJ3AZpZIy1XUCIoFdzKAFu0L3O8Fk9QYXl8TdRsfG6mj3RuLE\\/NxNaESFIyFZN5gxBhJUOlU0TpKOuOvZWFKyZAz8Tz2hvoUZaUg2MGhA++ooAI7B7xjNaE9\\/1bSmWBRWnVfhDn+YJoTnpKdcfhKwLPx8M7PUkNovKjlVtb9hWz\\/oXlv\\/mV+bkKitWUvhWjNIarJHWF8x4RhVYBN82omURArrA0aHFo5VuWWDDO8iC\\/BpX7kUpJrqjmJDDyujZR+9h4LZc2dBAE6wvxocJEcksOyd1iDd5jpYFtjlKxW1l7zO0MLJ9um\\/3zcN8mxzwvOizEvH5yp+Pj\\/xUKVm3cXrz5KzY4bRl89LUFrFF4gees1axfpLjuIcHY9ho9oe75\\/f\\/b97S8P72DXRv7eOjuARqpJsNSKFWwNkJpm8fT8kGJIOLwRAh2TqBXtUJrGo0oHWo1lJ5VXF7lfQJ+HxegpfgQlPK5faZCp4EE286jybRBZ3VKvkYxG6N\\/5f0sP3Ivus0yNW9J657auMdnoRWpUNXo9oN4wIqtMempjztcmscSjaJQDcmF9ktif67o06VBDSw5YohyT42H71jI9FQnjfo4PiqibREbF3BKo7UNNWetpnY\\/k6BsYa2plhcoKAeiHVrpcI6EoIiZyQ4o8jhZ7oZKiJt5CS5s6EjI6+GUw2Y1itToKDzEmtO2UO5Ood3PfmCbqqTpLD0CJba9LAcmGopdmmLXY2co2uu5nz34tK6Qgq7FNY7s28Lww10Mbl7I6ERoPWm4FFsok80UZuhQXa1weYYy9IGKz9t7xeXKyhOIgHILTmzoCxWZVYIz2dQZy0+HmJz3LudKCKxU1idU4kEGVj7E4nUTs\\/Zeexe1pS1txbYf3YaJYGDNOAtWjDP4QB97Huil0azQbGZ4HWOiUgB3y0NvWmlmmtCF0Ceq8t81Hp85lFJoHeGV5BwDs6UhJldOLYw0FfCztBJ01iSWhFJhhN5lgyxeO4SxtJVaW9ryG+2K\\/hofXGOFxev3smjdECMPd7B7ywDT011keTuK1sVgk+vZerRgnIWSDYXgfZNKoUA9aeKcxyvJa3tUQHlQak7fJygcWgSfJEQGSoVBVh65ne7FjVluU9XO3LWlLW3F9kvZb+FH78pJeg+ZoDYa0ax1MvxQN\\/V6L\\/WmBbF4UXgJSQa0DoUcCpQUSbTBKY+SUBPnRBDxASbcB45BI4Jknoga3cVpoi5PYWCYvjUj2BZFXrs3qi1teZa4os+sp7jUnVLqHqZ7yTBpfRu77+9jalc3mbOk3iA+dAI4LEpbtAJpegoCIllog5EoYOH7BpFOiOMmpaKjWE7pXaipLhoji8dRVlo4WG1pS1ueVYrtmTWguUnsqJSw\\/JiduMP2kDUU0zt7AEVjuEhjvIIoE5IM4gMvad5LWijXKJSbdC+LMEbjy4NEVY+oDGVmwMRpA0K2pS3PWlf0N2CQJnaYGAqde5\\/c+Y+hNNs6rS1teTYrtnaUvC1taUvbFW1LW9rSlrZia0tb2tKWp1ex+bZia0tb2tK22NrSlra0pa3Y2tKWtrTl6VVsbb3Wlra05dmn2NrlHm1pS1varmhb2tKWtjyz5f8Do0rRt3XbCQgAAAAASUVORK5CYII="}},"from_email":"sebastien.fauvel@gmx.ch","from_name":"S\\u00e9bastien Fauvel","to":[["info@i-pricing.com",null]],"subject":"T\\u00e4st html","spf":{"result":"pass","detail":"sender SPF authorized"},"spam_report":{"score":2.6,"matched_rules":[{"name":"FREEMAIL_FROM","score":0,"description":"Sender email is commonly abused enduser mail provider"},{"name":null,"score":0,"description":null},{"name":"RCVD_IN_DNSWL_NONE","score":-0,"description":"RBL: Sender listed at http:\\/\\/www.dnswl.org\\/, no"},{"name":"listed","score":0,"description":"in list.dnswl.org]"},{"name":"HTML_IMAGE_RATIO_02","score":0.8,"description":"BODY: HTML has a low ratio of text to image area"},{"name":"HTML_MESSAGE","score":0,"description":"BODY: HTML included in message"},{"name":"HTML_IMAGE_ONLY_08","score":1.8,"description":"BODY: HTML: images with 400-800 bytes of words"}]},"dkim":{"signed":false,"valid":false},"email":"info@i-pricing.com","tags":[],"sender":null,"template":null}}]', - ); - } -} diff --git a/tests/Composer/Test/Autoload/Fixtures/classmap/MissingSpace.php b/tests/Composer/Test/Autoload/Fixtures/classmap/MissingSpace.php deleted file mode 100644 index 2b646371c60d..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/classmap/MissingSpace.php +++ /dev/null @@ -1,6 +0,0 @@ -'; - } - - public function test_simple_string() - { - return 'class FailSimpleString {}'; - } - - public function test_unicode_heredoc() - { - return array(1, 2, <<<öéçив必 - class FailUnicode - { - } - öéçив必, 3, 4); - } - - public function test_wrapped_in_curly_brackets() - { - return ${<< { -} diff --git a/tests/Composer/Test/Autoload/Fixtures/hhvm3.3/HackEnum.php b/tests/Composer/Test/Autoload/Fixtures/hhvm3.3/HackEnum.php deleted file mode 100644 index 4b8dbfd40f70..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/hhvm3.3/HackEnum.php +++ /dev/null @@ -1,6 +0,0 @@ -'; - } - - public function test_simple_string() - { - return 'class FailSimpleString {}'; - } -} diff --git a/tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongHeredoc.php b/tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongHeredoc.php deleted file mode 100644 index 11f87546de7f..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/pcrebacktracelimit/VeryLongHeredoc.php +++ /dev/null @@ -1,464 +0,0 @@ - array -( - 'handler' => array ('midgard_admin_asgard_handler_preferences', 'ajax'), - 'fixed_args' => array('preferences', 'ajax'), - 'variable_args' => 0, -), diff --git a/tests/Composer/Test/Autoload/Fixtures/template/template_1.php b/tests/Composer/Test/Autoload/Fixtures/template/template_1.php deleted file mode 100644 index a6e6c9e4d68f..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/template/template_1.php +++ /dev/null @@ -1,6 +0,0 @@ -/* - * class templateClass_1 - * interface templateInterface_1 - * trait temlpateTrait_1 - */ - diff --git a/tests/Composer/Test/Autoload/Fixtures/template/template_3.php b/tests/Composer/Test/Autoload/Fixtures/template/template_3.php deleted file mode 100644 index 7f20be82f71a..000000000000 --- a/tests/Composer/Test/Autoload/Fixtures/template/template_3.php +++ /dev/null @@ -1,10 +0,0 @@ - -class leading { } - - - -class inner { } - - - -class trailing { } From e8530699c36a96e89d91439f61b1f24734501a1d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Mon, 20 Jun 2022 13:57:20 +0200 Subject: [PATCH 127/618] Add --strict-psr flag to dump-autoload to fail the process if psr violations were detected, fixes #10241 (#10886) --- doc/03-cli.md | 2 ++ src/Composer/Autoload/AutoloadGenerator.php | 5 +++-- src/Composer/Command/DumpAutoloadCommand.php | 12 +++++++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 4a6a8d3732dd..039e6a8bd854 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -921,6 +921,8 @@ performance. * **--ignore-platform-req:** ignore a specific platform requirement (`php`, `hhvm`, `lib-*` and `ext-*`) and skip the [platform check](07-runtime.md#platform-check) for it. Multiple requirements can be ignored via wildcard. +* **--strict-psr:** Return a failed status code (1) if PSR-4 or PSR-0 mapping errors + are present. Requires --optimize to work. ## clear-cache / clearcache / cc diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 60b7388d7d07..8a51596d6aab 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -12,6 +12,7 @@ namespace Composer\Autoload; +use Composer\ClassMapGenerator\ClassMap; use Composer\ClassMapGenerator\ClassMapGenerator; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; @@ -161,7 +162,7 @@ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface /** * @param string $targetDir * @param bool $scanPsrPackages - * @return int + * @return ClassMap * @throws \Seld\JsonLint\ParsingException * @throws \RuntimeException */ @@ -445,7 +446,7 @@ public static function autoload(\$class) )); } - return \count($classMap); + return $classMap; } /** diff --git a/src/Composer/Command/DumpAutoloadCommand.php b/src/Composer/Command/DumpAutoloadCommand.php index 9ec6abed0dbd..888ef347a4c6 100644 --- a/src/Composer/Command/DumpAutoloadCommand.php +++ b/src/Composer/Command/DumpAutoloadCommand.php @@ -41,6 +41,7 @@ protected function configure() new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables autoload-dev rules. Composer will by default infer this automatically according to the last install or update --no-dev state.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), + new InputOption('strict-psr', null, InputOption::VALUE_NONE, 'Return a failed status code (1) if PSR-4 or PSR-0 mapping errors are present. Requires --optimize to work.'), )) ->setHelp( <<getOption('apcu-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu') || $config->get('apcu-autoloader'); + if ($input->getOption('strict-psr') && !$optimize) { + throw new \InvalidArgumentException('--strict-psr mode only works with optimized autoloader, use --optimize if you want a strict return value.'); + } + if ($authoritative) { $this->getIO()->write('Generating optimized autoload files (authoritative)'); } elseif ($optimize) { @@ -91,7 +96,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $generator->setRunScripts(true); $generator->setApcu($apcu, $apcuPrefix); $generator->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)); - $numberOfClasses = $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize); + $classMap = $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize); + $numberOfClasses = count($classMap); if ($authoritative) { $this->getIO()->write('Generated optimized autoload files (authoritative) containing '. $numberOfClasses .' classes'); @@ -101,6 +107,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->getIO()->write('Generated autoload files'); } + if ($input->getOption('strict-psr') && count($classMap->getPsrViolations()) > 0) { + return 1; + } + return 0; } } From 805b7f12f926d56b7f678194055c57e8b3250151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Reker=20=E2=9A=A1=EF=B8=8F?= Date: Tue, 21 Jun 2022 21:16:04 +0200 Subject: [PATCH 128/618] No alias functions (#10864) Primary functions shall be used instead of aliases. --- src/Composer/Command/InitCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 173b77def55b..408eba903f82 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -523,7 +523,7 @@ function ($part): string { explode('/', $packageName) ); - return join('\\', $namespace); + return implode('\\', $namespace); } /** From 4714fd5a7bb94d7118f370376b316e0efc7052c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Reker=20=E2=9A=A1=EF=B8=8F?= Date: Tue, 21 Jun 2022 21:17:47 +0200 Subject: [PATCH 129/618] No useless return (#10877) There should not be an empty return statement at the end of a function. --- src/Composer/Command/RequireCommand.php | 2 +- src/Composer/Repository/Vcs/VcsDriver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 9c69ba20f825..a04bb0c08044 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -470,7 +470,7 @@ private function updateFileCleanly(JsonFile $json, array $new, string $requireKe protected function interact(InputInterface $input, OutputInterface $output): void { - return; + } /** diff --git a/src/Composer/Repository/Vcs/VcsDriver.php b/src/Composer/Repository/Vcs/VcsDriver.php index e53b9bd237e0..74fcfd76c27c 100644 --- a/src/Composer/Repository/Vcs/VcsDriver.php +++ b/src/Composer/Repository/Vcs/VcsDriver.php @@ -181,6 +181,6 @@ protected function getContents(string $url): Response */ public function cleanup(): void { - return; + } } From 279b51851840067c00a076e6e9f5b7687d09bedc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Reker=20=E2=9A=A1=EF=B8=8F?= Date: Tue, 21 Jun 2022 21:19:09 +0200 Subject: [PATCH 130/618] No useless sprintf (#10878) There must be no sprintf calls with only the first argument. --- src/Composer/Repository/Vcs/HgDriver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Repository/Vcs/HgDriver.php b/src/Composer/Repository/Vcs/HgDriver.php index f99790223e5c..c448c21e249f 100644 --- a/src/Composer/Repository/Vcs/HgDriver.php +++ b/src/Composer/Repository/Vcs/HgDriver.php @@ -89,7 +89,7 @@ public function initialize(): void public function getRootIdentifier(): string { if (null === $this->rootIdentifier) { - $this->process->execute(sprintf('hg tip --template "{node}"'), $output, $this->repoDir); + $this->process->execute('hg tip --template "{node}"', $output, $this->repoDir); $output = $this->process->splitLines($output); $this->rootIdentifier = $output[0]; } From b025971bb815acc7468444a836b82a21cacd1453 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 21 Jun 2022 21:03:34 +0200 Subject: [PATCH 131/618] Add missing strict type decl, closes #10863 --- src/Composer/PHPStan/ConfigReturnTypeExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index 574d7f921a4b..9c769d736f18 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -1,4 +1,4 @@ - Date: Fri, 10 Jun 2022 00:30:11 +0000 Subject: [PATCH 132/618] chore: Set permissions for GitHub actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restrict the GitHub token permissions only to the required ones; this way, even if the attackers will succeed in compromising your workflow, they won’t be able to do much. - Included permissions for the action. https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs [Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests](https://securitylab.github.com/research/github-actions-preventing-pwn-requests/) Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/workflows/continuous-integration.yml | 3 +++ .github/workflows/lint.yml | 3 +++ .github/workflows/phpstan.yml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 76da0e4fe6ef..d5258667ae72 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -12,6 +12,9 @@ env: COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" COMPOSER_UPDATE_FLAGS: "" +permissions: + contents: read + jobs: tests: name: "CI" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3058417b3663..23c84d71d3f6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,6 +8,9 @@ on: paths-ignore: - 'doc/**' +permissions: + contents: read + jobs: tests: name: "Lint" diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 849c2cb1f6aa..c05edab82c12 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -12,6 +12,9 @@ env: COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" SYMFONY_PHPUNIT_VERSION: "" +permissions: + contents: read + jobs: tests: name: "PHPStan" From 5c68c2c86d837682e29562ea5a87871b67a57b85 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 08:50:55 +0200 Subject: [PATCH 133/618] Fix case where branches cannot be listed in GitDownloader, fixes #10888 --- src/Composer/Downloader/GitDownloader.php | 4 ++-- src/Composer/Util/AuthHelper.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index 33ff7922a839..2866ae59d5b2 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -458,7 +458,7 @@ protected function updateToCommit(PackageInterface $package, $path, $reference, // check whether non-commitish are branches or tags, and fetch branches with the remote name $gitRef = $reference; if (!Preg::isMatch('{^[a-f0-9]{40}$}', $reference) - && $branches + && null !== $branches && Preg::isMatch('{^\s+composer/'.preg_quote($reference).'$}m', $branches) ) { $command = sprintf('git checkout '.$force.'-B %s %s -- && git reset --hard %2$s --', ProcessExecutor::escape($branch), ProcessExecutor::escape('composer/'.$reference)); @@ -470,7 +470,7 @@ protected function updateToCommit(PackageInterface $package, $path, $reference, // try to checkout branch by name and then reset it so it's on the proper branch name if (Preg::isMatch('{^[a-f0-9]{40}$}', $reference)) { // add 'v' in front of the branch if it was stripped when generating the pretty name - if (!Preg::isMatch('{^\s+composer/'.preg_quote($branch).'$}m', $branches) && Preg::isMatch('{^\s+composer/v'.preg_quote($branch).'$}m', $branches)) { + if (null !== $branches && !Preg::isMatch('{^\s+composer/'.preg_quote($branch).'$}m', $branches) && Preg::isMatch('{^\s+composer/v'.preg_quote($branch).'$}m', $branches)) { $branch = 'v' . $branch; } diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index 305746f179a4..71019803ca4d 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -192,9 +192,9 @@ public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $ // fail if the console is not interactive if (!$this->io->isInteractive()) { if ($statusCode === 401) { - $message = "The '" . $url . "' URL required authentication.\nYou must be using the interactive console to authenticate"; + $message = "The '" . $url . "' URL required authentication (HTTP 401).\nYou must be using the interactive console to authenticate"; } elseif ($statusCode === 403) { - $message = "The '" . $url . "' URL could not be accessed: " . $reason; + $message = "The '" . $url . "' URL could not be accessed (HTTP 403): " . $reason; } else { $message = "Unknown error code '" . $statusCode . "', reason: " . $reason; } @@ -210,7 +210,7 @@ public function promptAuthIfNeeded($url, $origin, $statusCode, $reason = null, $ return array('retry' => true, 'storeAuth' => false); } - throw new TransportException("Invalid credentials for '" . $url . "', aborting.", $statusCode); + throw new TransportException("Invalid credentials (HTTP $statusCode) for '$url', aborting.", $statusCode); } $this->io->writeError(' Authentication required ('.$origin.'):'); From bad3eb2cd9578dd5000e822b3749c61110a2c2ab Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 09:49:09 +0200 Subject: [PATCH 134/618] Update deps, update baseline (1958, 103) --- composer.lock | 108 +++++++------- phpstan/baseline-8.1.neon | 5 - phpstan/baseline.neon | 207 +------------------------- src/Composer/Plugin/PluginManager.php | 3 +- 4 files changed, 57 insertions(+), 266 deletions(-) diff --git a/composer.lock b/composer.lock index c1f0ad6c589c..1c8da260e838 100644 --- a/composer.lock +++ b/composer.lock @@ -1100,16 +1100,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { @@ -1124,7 +1124,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1162,7 +1162,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -1178,20 +1178,20 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "433d05519ce6990bf3530fba6957499d327395c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", "shasum": "" }, "require": { @@ -1203,7 +1203,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1243,7 +1243,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -1259,20 +1259,20 @@ "type": "tidelift" } ], - "time": "2021-11-23T21:10:46+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -1284,7 +1284,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1327,7 +1327,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -1343,20 +1343,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { @@ -1371,7 +1371,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1410,7 +1410,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -1426,20 +1426,20 @@ "type": "tidelift" } ], - "time": "2021-11-30T18:21:41+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -1448,7 +1448,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1489,7 +1489,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -1505,20 +1505,20 @@ "type": "tidelift" } ], - "time": "2021-06-05T21:20:04+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -1527,7 +1527,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1572,7 +1572,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -1588,7 +1588,7 @@ "type": "tidelift" } ], - "time": "2022-03-04T08:16:47+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/process", @@ -1825,16 +1825,16 @@ "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.7.8", + "version": "1.7.15", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a" + "reference": "cd0202ea1b1fc6d1bbe156c6e2e18a03e0ff160a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a", - "reference": "2bf3d43015d56abac4d002a4d2d6c3a7d6fa627a", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd0202ea1b1fc6d1bbe156c6e2e18a03e0ff160a", + "reference": "cd0202ea1b1fc6d1bbe156c6e2e18a03e0ff160a", "shasum": "" }, "require": { @@ -1860,7 +1860,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.7.8" + "source": "https://github.com/phpstan/phpstan/tree/1.7.15" }, "funding": [ { @@ -1880,7 +1880,7 @@ "type": "tidelift" } ], - "time": "2022-06-01T13:43:17+00:00" + "time": "2022-06-20T08:29:01+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -2034,16 +2034,16 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "1.2.2", + "version": "1.2.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "30f12aeab960c7f324eee3b39645655cf8a84146" + "reference": "85be852a17fd5a6b67d4fc6daed21e794f935b2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/30f12aeab960c7f324eee3b39645655cf8a84146", - "reference": "30f12aeab960c7f324eee3b39645655cf8a84146", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/85be852a17fd5a6b67d4fc6daed21e794f935b2d", + "reference": "85be852a17fd5a6b67d4fc6daed21e794f935b2d", "shasum": "" }, "require": { @@ -2099,9 +2099,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.2.2" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.2.5" }, - "time": "2022-05-28T15:18:51+00:00" + "time": "2022-06-10T08:44:35+00:00" }, { "name": "symfony/phpunit-bridge", diff --git a/phpstan/baseline-8.1.neon b/phpstan/baseline-8.1.neon index 72a234af4733..12bfc559b027 100644 --- a/phpstan/baseline-8.1.neon +++ b/phpstan/baseline-8.1.neon @@ -245,11 +245,6 @@ parameters: count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php - - - message: "#^Parameter \\#1 \\$string of function strtolower expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Parameter \\#2 \\$handle of function curl_multi_remove_handle expects CurlHandle, resource given\\.$#" count: 1 diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 9e8614240005..77096b19d5f1 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -710,11 +710,6 @@ parameters: count: 1 path: ../src/Composer/Command/RemoveCommand.php - - - message: "#^Offset 'require'\\|'require\\-dev' does not exist on array\\{require\\?\\: array\\, require\\-dev\\?\\: array\\\\}\\.$#" - count: 8 - path: ../src/Composer/Command/RemoveCommand.php - - message: "#^Only booleans are allowed in an if condition, Composer\\\\Composer\\|null given\\.$#" count: 1 @@ -1750,11 +1745,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/RuleSetGenerator.php - - - message: "#^Only booleans are allowed in a negated boolean, int\\<0, max\\> given\\.$#" - count: 2 - path: ../src/Composer/DependencyResolver/RuleSetIterator.php - - message: "#^Return type \\(\\-1\\|0\\|1\\|4\\) of method Composer\\\\DependencyResolver\\\\RuleSetIterator\\:\\:key\\(\\) should be covariant with return type \\(0\\|1\\|4\\) of method Iterator\\\\:\\:key\\(\\)$#" count: 1 @@ -2530,11 +2520,6 @@ parameters: count: 1 path: ../src/Composer/IO/BaseIO.php - - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 6 - path: ../src/Composer/IO/BaseIO.php - - message: "#^Instanceof between Symfony\\\\Component\\\\Console\\\\Input\\\\StringInput and Symfony\\\\Component\\\\Console\\\\Input\\\\StreamableInputInterface will always evaluate to true\\.$#" count: 1 @@ -3575,11 +3560,6 @@ parameters: count: 1 path: ../src/Composer/Plugin/PluginManager.php - - - message: "#^Only booleans are allowed in an if condition, CapabilityClass of Composer\\\\Plugin\\\\Capability\\\\Capability\\|null given\\.$#" - count: 1 - path: ../src/Composer/Plugin/PluginManager.php - - message: "#^Only booleans are allowed in an if condition, Composer\\\\Package\\\\PackageInterface\\|null given\\.$#" count: 1 @@ -4033,23 +4013,8 @@ parameters: count: 1 path: ../src/Composer/Repository/RepositoryFactory.php - - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Config\\|null given\\.$#" - count: 1 - path: ../src/Composer/Repository/RepositoryFactory.php - - - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\IO\\\\IOInterface\\|null given\\.$#" - count: 1 - path: ../src/Composer/Repository/RepositoryFactory.php - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Repository\\\\RepositoryManager\\|null given\\.$#" - count: 2 - path: ../src/Composer/Repository/RepositoryFactory.php - - - - message: "#^Only booleans are allowed in an if condition, Composer\\\\IO\\\\IOInterface\\|null given\\.$#" count: 1 path: ../src/Composer/Repository/RepositoryFactory.php @@ -4785,7 +4750,7 @@ parameters: - message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" - count: 3 + count: 2 path: ../src/Composer/Util/Http/CurlDownloader.php - @@ -4903,11 +4868,6 @@ parameters: count: 1 path: ../src/Composer/Util/Http/CurlDownloader.php - - - message: "#^Parameter \\#1 \\$str of function strtolower expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Util/Http/CurlDownloader.php - - message: "#^Parameter \\#1 \\$string of function strlen expects string, string\\|null given\\.$#" count: 1 @@ -5073,21 +5033,6 @@ parameters: count: 1 path: ../src/Composer/Util/HttpDownloader.php - - - message: "#^Offset 'info'\\|'warning' does not exist on array\\{warning\\?\\: string, info\\?\\: string, warning\\-versions\\?\\: string, info\\-versions\\?\\: string, warnings\\?\\: array\\, infos\\?\\: array\\\\}\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - - - message: "#^Offset 'info\\-versions'\\|'warning\\-versions' does not exist on array\\{warning\\?\\: string, info\\?\\: string, warning\\-versions\\?\\: string, info\\-versions\\?\\: string, warnings\\?\\: array\\, infos\\?\\: array\\\\}\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - - - message: "#^Offset 'infos'\\|'warnings' does not exist on array\\{warning\\?\\: string, info\\?\\: string, warning\\-versions\\?\\: string, info\\-versions\\?\\: string, warnings\\?\\: array\\, infos\\?\\: array\\\\}\\.$#" - count: 1 - path: ../src/Composer/Util/HttpDownloader.php - - message: "#^Offset 'options' does not exist on array\\{url\\: string, options\\?\\: array, copyTo\\?\\: string\\|null\\}\\.$#" count: 3 @@ -5658,11 +5603,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Autoload/AutoloadGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Autoload/AutoloadGeneratorTest.php - - message: "#^Only booleans are allowed in an if condition, array\\ given\\.$#" count: 2 @@ -5678,11 +5618,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - message: "#^Parameter \\#1 \\$expected of method Composer\\\\Test\\\\Autoload\\\\ClassMapGeneratorTest\\:\\:assertEqualsNormalized\\(\\) expects array\\, array\\ given\\.$#" count: 3 @@ -5693,21 +5628,6 @@ parameters: count: 3 path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/CacheTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Command/RunScriptCommandTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Config/JsonConfigSourceTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 1 @@ -5838,31 +5758,16 @@ parameters: count: 1 path: ../tests/Composer/Test/Downloader/DownloadManagerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 6 - path: ../tests/Composer/Test/Downloader/FileDownloaderTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 3 path: ../tests/Composer/Test/Downloader/FileDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/FossilDownloaderTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 4 path: ../tests/Composer/Test/Downloader/FossilDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/GitDownloaderTest.php - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Config\\|null given\\.$#" count: 1 @@ -5873,31 +5778,11 @@ parameters: count: 3 path: ../tests/Composer/Test/Downloader/GitDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/HgDownloaderTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 4 path: ../tests/Composer/Test/Downloader/HgDownloaderTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/PerforceDownloaderTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/XzDownloaderTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Downloader/ZipDownloaderTest.php - - message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#" count: 2 @@ -5926,11 +5811,6 @@ parameters: count: 1 path: ../tests/Composer/Test/InstalledVersionsTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/InstalledVersionsTest.php - - message: "#^Parameter \\#1 \\$path of function realpath expects string, string\\|null given\\.$#" count: 1 @@ -5946,11 +5826,6 @@ parameters: count: 3 path: ../tests/Composer/Test/Installer/BinaryInstallerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Installer/BinaryInstallerTest.php - - message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Composer\\\\\\\\Composer' and Composer\\\\Composer will always evaluate to true\\.$#" count: 1 @@ -5961,11 +5836,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Installer/InstallerEventTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Installer/LibraryInstallerTest.php - - message: "#^Call to function is_array\\(\\) with array\\ will always evaluate to true\\.$#" count: 1 @@ -6091,11 +5961,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Mock/VersionGuesserMock.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php - - message: "#^Dynamic call to static method Composer\\\\Factory\\:\\:createConfig\\(\\)\\.$#" count: 1 @@ -6106,16 +5971,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Package/Archiver/ArchiveManagerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Package/Archiver/ArchiverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Package/Archiver/PharArchiverTest.php - - message: "#^Parameter \\#1 \\$sources of method Composer\\\\Package\\\\Archiver\\\\PharArchiver\\:\\:archive\\(\\) expects string, string\\|null given\\.$#" count: 2 @@ -6211,11 +6066,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Plugin/PluginInstallerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Plugin/PluginInstallerTest.php - - message: "#^Parameter \\#2 \\$capabilityClassName of method Composer\\\\Plugin\\\\PluginManager\\:\\:getPluginCapability\\(\\) expects class\\-string\\, string given\\.$#" count: 2 @@ -6256,11 +6106,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Repository/CompositeRepositoryTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/FilesystemRepositoryTest.php - - message: "#^Parameter \\#1 \\$path of function realpath expects string, string\\|false given\\.$#" count: 2 @@ -6281,26 +6126,6 @@ parameters: count: 1 path: ../tests/Composer/Test/Repository/RepositoryManagerTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/RepositoryManagerTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/FossilDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php - - message: "#^Offset 'reference' does not exist on array\\{type\\: string, url\\: string, reference\\: string, shasum\\: string\\}\\|null\\.$#" count: 4 @@ -6321,36 +6146,11 @@ parameters: count: 1 path: ../tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/HgDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php - - message: "#^Parameter \\#1 \\$repoConfig of class Composer\\\\Repository\\\\Vcs\\\\PerforceDriver constructor expects array\\{url\\: string\\}, array\\ given\\.$#" count: 1 path: ../tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Repository/Vcs/SvnDriverTest.php - - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Repository/VcsRepositoryTest.php - - message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" count: 1 @@ -6386,11 +6186,6 @@ parameters: count: 1 path: ../tests/Composer/Test/TestCase.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:getUniqueTmpDirectory\\(\\)\\.$#" - count: 2 - path: ../tests/Composer/Test/Util/FilesystemTest.php - - message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertInstanceOf\\(\\) with 'Composer\\\\\\\\Util\\\\\\\\Http…' and Composer\\\\Util\\\\Http\\\\ProxyManager will always evaluate to true\\.$#" count: 1 diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index a2da6b9bd791..b93164168956 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -638,7 +638,8 @@ public function getPluginCapabilities($capabilityClassName, array $ctorArgs = ar { $capabilities = array(); foreach ($this->getPlugins() as $plugin) { - if ($capability = $this->getPluginCapability($plugin, $capabilityClassName, $ctorArgs)) { + $capability = $this->getPluginCapability($plugin, $capabilityClassName, $ctorArgs); + if (null !== $capability) { $capabilities[] = $capability; } } From 567423e9f74dd7ce7d7e1a4a22837a652fbb3e97 Mon Sep 17 00:00:00 2001 From: anzago <36794130+anzago@users.noreply.github.com> Date: Wed, 22 Jun 2022 12:29:36 +0200 Subject: [PATCH 135/618] Removed blank line in missing extensions hint when having no php.ini loaded file (#10839) --- .../DependencyResolver/SolverProblemsException.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Composer/DependencyResolver/SolverProblemsException.php b/src/Composer/DependencyResolver/SolverProblemsException.php index ea8c86af511c..1a28f288b155 100644 --- a/src/Composer/DependencyResolver/SolverProblemsException.php +++ b/src/Composer/DependencyResolver/SolverProblemsException.php @@ -113,8 +113,12 @@ private function createExtensionHint(array $missingExtensions): string { $paths = IniHelper::getAll(); - if (count($paths) === 1 && empty($paths[0])) { - return ''; + if ('' === $paths[0]) { + if (count($paths) === 1) { + return ''; + } + + array_shift($paths); } $ignoreExtensionsArguments = implode(" ", array_map(function ($extension) { From 81043c5691352d3a0eb291982be3d864f089bd5a Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 13:03:36 +0200 Subject: [PATCH 136/618] Add git version to diagnose command, and warn if <2.24, closes #10832 --- src/Composer/Command/DiagnoseCommand.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index ce548829182f..97ecf1c6b975 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -21,6 +21,7 @@ use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\ConfigValidator; +use Composer\Util\Git; use Composer\Util\IniHelper; use Composer\Util\ProcessExecutor; use Composer\Util\HttpDownloader; @@ -225,10 +226,7 @@ private function checkComposerSchema() return true; } - /** - * @return string|true - */ - private function checkGit() + private function checkGit(): string { if (!function_exists('proc_open')) { return 'proc_open is not available, git cannot be used'; @@ -239,7 +237,16 @@ private function checkGit() return 'Your git color.ui setting is set to always, this is known to create issues. Use "git config --global color.ui true" to set it correctly.'; } - return true; + $gitVersion = Git::getVersion($this->process); + if (version_compare('2.24.0', $gitVersion, '>')) { + return 'Your git version ('.$gitVersion.') is too old and possibly will cause issues. Please upgrade to git 2.24 or above'; + } + + if (null === $gitVersion) { + return 'No git process found'; + } + + return 'OK git version '.$gitVersion.''; } /** From d132b9e6fd320523447f2e3cb74ced611e696cec Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 13:09:13 +0200 Subject: [PATCH 137/618] Fixup --- src/Composer/Command/DiagnoseCommand.php | 8 ++++---- tests/Composer/Test/Command/DiagnoseCommandTest.php | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index 97ecf1c6b975..bdaa4d5671fb 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -238,14 +238,14 @@ private function checkGit(): string } $gitVersion = Git::getVersion($this->process); - if (version_compare('2.24.0', $gitVersion, '>')) { - return 'Your git version ('.$gitVersion.') is too old and possibly will cause issues. Please upgrade to git 2.24 or above'; - } - if (null === $gitVersion) { return 'No git process found'; } + if (version_compare('2.24.0', $gitVersion, '>')) { + return 'Your git version ('.$gitVersion.') is too old and possibly will cause issues. Please upgrade to git 2.24 or above'; + } + return 'OK git version '.$gitVersion.''; } diff --git a/tests/Composer/Test/Command/DiagnoseCommandTest.php b/tests/Composer/Test/Command/DiagnoseCommandTest.php index 0f071ef5cfc8..5ca6702655ad 100644 --- a/tests/Composer/Test/Command/DiagnoseCommandTest.php +++ b/tests/Composer/Test/Command/DiagnoseCommandTest.php @@ -29,8 +29,7 @@ public function testCmdFail(): void $this->assertStringContainsString('Checking composer.json: WARNING No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.', $output); - $this->assertStringContainsString('Checking git settings: OK -Checking http connectivity to packagist: OK + $this->assertStringContainsString('Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK Checking github.com rate limit: ', $output); } @@ -47,8 +46,7 @@ public function testCmdSuccess(): void $output = $appTester->getDisplay(true); $this->assertStringContainsString('Checking composer.json: OK', $output); - $this->assertStringContainsString('Checking git settings: OK -Checking http connectivity to packagist: OK + $this->assertStringContainsString('Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK Checking github.com rate limit: ', $output); } From 5730c24c9258e05ca85035ca41170f806c43066e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 13:30:39 +0200 Subject: [PATCH 138/618] Rethrow path repo init failures with path information, closes #10845 --- src/Composer/Repository/PathRepository.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Composer/Repository/PathRepository.php b/src/Composer/Repository/PathRepository.php index 3335f0a79e15..bd32d3612d6c 100644 --- a/src/Composer/Repository/PathRepository.php +++ b/src/Composer/Repository/PathRepository.php @@ -213,7 +213,11 @@ protected function initialize() } } - $this->addPackage($this->loader->load($package)); + try { + $this->addPackage($this->loader->load($package)); + } catch (\Exception $e) { + throw new \RuntimeException('Failed loading the package in '.$composerFilePath, 0, $e); + } } } From 690ab5166a2a5ef6db7125ca8346970c9832590e Mon Sep 17 00:00:00 2001 From: Marek Stipek Date: Wed, 15 Jun 2022 18:01:53 +0200 Subject: [PATCH 139/618] Ignoring passed arguments for @putenv, closes #10846 --- src/Composer/EventDispatcher/EventDispatcher.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index 74ec3459d158..dd68cc0cc3ad 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -243,7 +243,14 @@ protected function doDispatch(Event $event) } } else { $args = implode(' ', array_map(array('Composer\Util\ProcessExecutor', 'escape'), $event->getArguments())); - $exec = $callable . ($args === '' ? '' : ' '.$args); + + // @putenv does not receive arguments + if (strpos($callable, '@putenv ') === 0) { + $exec = $callable; + } else { + $exec = $callable . ($args === '' ? '' : ' '.$args); + } + if ($this->io->isVerbose()) { $this->io->writeError(sprintf('> %s: %s', $event->getName(), $exec)); } elseif ($event->getName() !== '__exec_command') { From bbcadcb35e4f036b8f992660de8089e298976627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?imme=C3=ABmosol?= Date: Wed, 22 Jun 2022 13:47:15 +0200 Subject: [PATCH 140/618] Hint at improved merge conflict resolving (#10840) --- doc/articles/resolving-merge-conflicts.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/articles/resolving-merge-conflicts.md b/doc/articles/resolving-merge-conflicts.md index 2733a186ae89..5a433556aea8 100644 --- a/doc/articles/resolving-merge-conflicts.md +++ b/doc/articles/resolving-merge-conflicts.md @@ -47,6 +47,12 @@ php composer.phar validate php composer.phar install [--dry-run] ``` +## Automating merge conflict resolving with git + +Some improvement _could_ be made to git's conflict resolving by using a custom git merge driver. + +An example of this can be found at [balbuf's composer git merge driver](https://github.com/balbuf/composer-git-merge-driver). + ## Important considerations Keep in mind that whenever merge conflicts occur on the lock file, the information, about the exact version From ef276d26d6c55b50cee73b98650ccfe6f85987f8 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 14:01:08 +0200 Subject: [PATCH 141/618] Add upcoming fixes, refs #10871 --- .php-cs-fixer.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index ed2e6cf2bae8..28db75b8bcb1 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -65,6 +65,10 @@ // TODO later once 2.2 is more stable // 'array_syntax' => true, // 'list_syntax' => true, + // 'regular_callable_call' => true, + // 'static_lambda' => true, + // 'nullable_type_declaration_for_default_null_value' => true, + // 'explicit_indirect_variable' => true, 'visibility_required' => ['elements' => ['property', 'method', 'const']], 'non_printable_character' => true, 'combine_nested_dirname' => true, From 4131f7cf4c44f5dcefaea7ab5d09837084ec2962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Reker=20=E2=9A=A1=EF=B8=8F?= Date: Wed, 22 Jun 2022 14:19:18 +0200 Subject: [PATCH 142/618] Static lambda (#10854) Lambdas not (indirect) referencing $this must be declared static. --- src/Composer/Autoload/AutoloadGenerator.php | 14 +-- src/Composer/Command/ArchiveCommand.php | 2 +- .../Command/BaseDependencyCommand.php | 2 +- src/Composer/Command/CompletionTrait.php | 10 +- src/Composer/Command/ConfigCommand.php | 100 +++++++++--------- src/Composer/Command/CreateProjectCommand.php | 4 +- src/Composer/Command/DiagnoseCommand.php | 2 +- src/Composer/Command/ExecCommand.php | 2 +- src/Composer/Command/GlobalCommand.php | 2 +- src/Composer/Command/InitCommand.php | 8 +- src/Composer/Command/LicensesCommand.php | 2 +- .../Command/PackageDiscoveryTrait.php | 6 +- src/Composer/Command/ReinstallCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/SelfUpdateCommand.php | 2 +- src/Composer/Command/ShowCommand.php | 6 +- src/Composer/Command/StatusCommand.php | 4 +- src/Composer/Command/UpdateCommand.php | 4 +- src/Composer/Command/ValidateCommand.php | 6 +- src/Composer/Compiler.php | 2 +- src/Composer/Config/JsonConfigSource.php | 18 ++-- src/Composer/Console/Application.php | 6 +- .../DependencyResolver/LockTransaction.php | 2 +- .../DependencyResolver/PoolBuilder.php | 2 +- src/Composer/DependencyResolver/Problem.php | 10 +- src/Composer/DependencyResolver/Rule.php | 2 +- .../DependencyResolver/RuleWatchGraph.php | 2 +- .../SolverProblemsException.php | 2 +- .../DependencyResolver/Transaction.php | 6 +- src/Composer/Downloader/ArchiveDownloader.php | 6 +- src/Composer/Downloader/DownloadManager.php | 6 +- src/Composer/Downloader/FileDownloader.php | 6 +- src/Composer/Downloader/GitDownloader.php | 6 +- src/Composer/Downloader/HgDownloader.php | 4 +- src/Composer/Downloader/SvnDownloader.php | 2 +- src/Composer/Downloader/VcsDownloader.php | 4 +- .../EventDispatcher/EventDispatcher.php | 4 +- src/Composer/IO/BufferIO.php | 2 +- src/Composer/IO/ConsoleIO.php | 2 +- src/Composer/Installer.php | 2 +- .../Installer/InstallationManager.php | 18 ++-- src/Composer/Installer/LibraryInstaller.php | 6 +- .../Installer/SuggestedPackagesReporter.php | 2 +- src/Composer/Json/JsonFormatter.php | 2 +- src/Composer/Json/JsonManipulator.php | 10 +- .../PHPStan/ConfigReturnTypeExtension.php | 2 +- .../Archiver/ArchivableFilesFinder.php | 2 +- .../Package/Archiver/ArchiveManager.php | 2 +- .../Package/Archiver/BaseExcludeFilter.php | 4 +- src/Composer/Package/BasePackage.php | 2 +- src/Composer/Package/Locker.php | 4 +- .../Package/Version/VersionGuesser.php | 2 +- .../Package/Version/VersionSelector.php | 2 +- .../Question/StrictConfirmationQuestion.php | 4 +- .../Repository/ComposerRepository.php | 6 +- .../Repository/CompositeRepository.php | 2 +- .../Repository/FilesystemRepository.php | 2 +- .../Repository/InstalledRepository.php | 2 +- src/Composer/Repository/PathRepository.php | 2 +- .../Repository/PlatformRepository.php | 2 +- src/Composer/Repository/Vcs/GitDriver.php | 2 +- src/Composer/Repository/Vcs/HgDriver.php | 2 +- src/Composer/Util/AuthHelper.php | 2 +- src/Composer/Util/ErrorHandler.php | 2 +- src/Composer/Util/Filesystem.php | 2 +- src/Composer/Util/Git.php | 6 +- src/Composer/Util/Http/CurlDownloader.php | 2 +- src/Composer/Util/HttpDownloader.php | 8 +- src/Composer/Util/Loop.php | 4 +- src/Composer/Util/PackageSorter.php | 4 +- src/Composer/Util/Platform.php | 2 +- src/Composer/Util/ProcessExecutor.php | 6 +- src/Composer/Util/RemoteFilesystem.php | 4 +- src/Composer/Util/StreamContextFactory.php | 2 +- src/Composer/Util/Svn.php | 2 +- src/Composer/Util/TlsHelper.php | 6 +- src/Composer/Util/Url.php | 2 +- 77 files changed, 206 insertions(+), 206 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 8a51596d6aab..a5b85e4d867b 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -284,7 +284,7 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro $mainAutoload = $rootPackage->getAutoload(); if ($rootPackage->getTargetDir() && !empty($mainAutoload['psr-0'])) { $levels = substr_count($filesystem->normalizePath($rootPackage->getTargetDir()), '/') + 1; - $prefixes = implode(', ', array_map(function ($prefix): string { + $prefixes = implode(', ', array_map(static function ($prefix): string { return var_export($prefix, true); }, array_keys($mainAutoload['psr-0']))); $baseDirFromTargetDirCode = $filesystem->findShortestPathCode($targetDir, $basePath, true); @@ -543,7 +543,7 @@ public function parseAutoloads(array $packageMap, PackageInterface $rootPackage, { $rootPackageMap = array_shift($packageMap); if (is_array($filteredDevPackages)) { - $packageMap = array_filter($packageMap, function ($item) use ($filteredDevPackages): bool { + $packageMap = array_filter($packageMap, static function ($item) use ($filteredDevPackages): bool { return !in_array($item[0]->getName(), $filteredDevPackages, true); }); } elseif ($filteredDevPackages) { @@ -797,7 +797,7 @@ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $de ksort($requiredExtensions); - $formatToPhpVersionId = function (Bound $bound): int { + $formatToPhpVersionId = static function (Bound $bound): int { if ($bound->isZero()) { return 0; } @@ -812,7 +812,7 @@ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $de return $chunks[0] * 10000 + $chunks[1] * 100 + $chunks[2]; }; - $formatToHumanReadable = function (Bound $bound) { + $formatToHumanReadable = static function (Bound $bound) { if ($bound->isZero()) { return 0; } @@ -1224,7 +1224,7 @@ protected function parseAutoloadsType(array $packageMap, string $type, RootPacka $updir = null; $path = Preg::replaceCallback( '{^((?:(?:\\\\\\.){1,2}+/)+)}', - function ($matches) use (&$updir): string { + static function ($matches) use (&$updir): string { if (isset($matches[1])) { // undo preg_quote for the matched string $updir = str_replace('\\.', '.', $matches[1]); @@ -1298,7 +1298,7 @@ protected function filterPackageMap(array $packageMap, RootPackageInterface $roo } } - $add = function (PackageInterface $package) use (&$add, $packages, &$include, $replacedBy): void { + $add = static function (PackageInterface $package) use (&$add, $packages, &$include, $replacedBy): void { foreach ($package->getRequires() as $link) { $target = $link->getTarget(); if (isset($replacedBy[$target])) { @@ -1316,7 +1316,7 @@ protected function filterPackageMap(array $packageMap, RootPackageInterface $roo return array_filter( $packageMap, - function ($item) use ($include): bool { + static function ($item) use ($include): bool { $package = $item[0]; foreach ($package->getNames() as $name) { if (isset($include[$name])) { diff --git a/src/Composer/Command/ArchiveCommand.php b/src/Composer/Command/ArchiveCommand.php index dcd37f1ea58f..a4843e75d15a 100644 --- a/src/Composer/Command/ArchiveCommand.php +++ b/src/Composer/Command/ArchiveCommand.php @@ -173,7 +173,7 @@ protected function selectPackage(IOInterface $io, string $packageName, ?string $ if (count($packages) > 1) { $package = reset($packages); $io->writeError('Found multiple matches, selected '.$package->getPrettyString().'.'); - $io->writeError('Alternatives were '.implode(', ', array_map(function ($p): string { + $io->writeError('Alternatives were '.implode(', ', array_map(static function ($p): string { return $p->getPrettyString(); }, $packages)).'.'); $io->writeError('Please use a more specific constraint to pick a different package.'); diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 2d4dea40feda..6361c7e28df4 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -91,7 +91,7 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo $needles = array($needle); if ($inverted) { foreach ($packages as $package) { - $needles = array_merge($needles, array_map(function (Link $link): string { + $needles = array_merge($needles, array_map(static function (Link $link): string { return $link->getTarget(); }, $package->getReplaces())); } diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index ffd414b39a2e..fee0fca1a63a 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -105,7 +105,7 @@ private function suggestInstalledPackage(bool $includePlatformPackages = false): $installedRepo = new InstalledRepository($installedRepos); return array_merge( - array_map(function (PackageInterface $package) { + array_map(static function (PackageInterface $package) { return $package->getName(); }, $installedRepo->getPackages()), $platformHint @@ -142,12 +142,12 @@ private function suggestAvailablePackage(int $max = 99): \Closure $results = array_column($results, 'name'); if ($showVendors) { - $results = array_map(function (string $name): string { + $results = array_map(static function (string $name): string { return $name.'/'; }, $results); // sort shorter results first to avoid auto-expanding the completion to a longer string than needed - usort($results, function (string $a, string $b) { + usort($results, static function (string $a, string $b) { $lenA = \strlen($a); $lenB = \strlen($b); if ($lenA === $lenB) { @@ -199,9 +199,9 @@ private function suggestPlatformPackage(): \Closure $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform')); $pattern = BasePackage::packageNameToRegexp($input->getCompletionValue().'*'); - return array_filter(array_map(function (PackageInterface $package) { + return array_filter(array_map(static function (PackageInterface $package) { return $package->getName(); - }, $repos->getPackages()), function (string $name) use ($pattern): bool { + }, $repos->getPackages()), static function (string $name) use ($pattern): bool { return Preg::isMatch($pattern, $name); }); }; diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index dc3738a24fac..0215dba32068 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -320,10 +320,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int $values = $input->getArgument('setting-value'); // what the user is trying to add/change - $booleanValidator = function ($val): bool { + $booleanValidator = static function ($val): bool { return in_array($val, array('true', 'false', '1', '0'), true); }; - $booleanNormalizer = function ($val): bool { + $booleanNormalizer = static function ($val): bool { return $val !== 'false' && (bool) $val; }; @@ -333,26 +333,26 @@ protected function execute(InputInterface $input, OutputInterface $output): int 'use-include-path' => array($booleanValidator, $booleanNormalizer), 'use-github-api' => array($booleanValidator, $booleanNormalizer), 'preferred-install' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('auto', 'source', 'dist'), true); }, - function ($val) { + static function ($val) { return $val; }, ), 'gitlab-protocol' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('git', 'http', 'https'), true); }, - function ($val) { + static function ($val) { return $val; }, ), 'store-auths' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('true', 'false', 'prompt'), true); }, - function ($val) { + static function ($val) { if ('prompt' === $val) { return 'prompt'; } @@ -361,56 +361,56 @@ function ($val) { }, ), 'notify-on-install' => array($booleanValidator, $booleanNormalizer), - 'vendor-dir' => array('is_string', function ($val) { + 'vendor-dir' => array('is_string', static function ($val) { return $val; }), - 'bin-dir' => array('is_string', function ($val) { + 'bin-dir' => array('is_string', static function ($val) { return $val; }), - 'archive-dir' => array('is_string', function ($val) { + 'archive-dir' => array('is_string', static function ($val) { return $val; }), - 'archive-format' => array('is_string', function ($val) { + 'archive-format' => array('is_string', static function ($val) { return $val; }), - 'data-dir' => array('is_string', function ($val) { + 'data-dir' => array('is_string', static function ($val) { return $val; }), - 'cache-dir' => array('is_string', function ($val) { + 'cache-dir' => array('is_string', static function ($val) { return $val; }), - 'cache-files-dir' => array('is_string', function ($val) { + 'cache-files-dir' => array('is_string', static function ($val) { return $val; }), - 'cache-repo-dir' => array('is_string', function ($val) { + 'cache-repo-dir' => array('is_string', static function ($val) { return $val; }), - 'cache-vcs-dir' => array('is_string', function ($val) { + 'cache-vcs-dir' => array('is_string', static function ($val) { return $val; }), 'cache-ttl' => array('is_numeric', 'intval'), 'cache-files-ttl' => array('is_numeric', 'intval'), 'cache-files-maxsize' => array( - function ($val): bool { + static function ($val): bool { return Preg::isMatch('/^\s*([0-9.]+)\s*(?:([kmg])(?:i?b)?)?\s*$/i', $val); }, - function ($val) { + static function ($val) { return $val; }, ), 'bin-compat' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('auto', 'full', 'symlink')); }, - function ($val) { + static function ($val) { return $val; }, ), 'discard-changes' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('stash', 'true', 'false', '1', '0'), true); }, - function ($val) { + static function ($val) { if ('stash' === $val) { return 'stash'; } @@ -418,7 +418,7 @@ function ($val) { return $val !== 'false' && (bool) $val; }, ), - 'autoloader-suffix' => array('is_string', function ($val) { + 'autoloader-suffix' => array('is_string', static function ($val) { return $val === 'null' ? null : $val; }), 'sort-packages' => array($booleanValidator, $booleanNormalizer), @@ -429,18 +429,18 @@ function ($val) { 'disable-tls' => array($booleanValidator, $booleanNormalizer), 'secure-http' => array($booleanValidator, $booleanNormalizer), 'cafile' => array( - function ($val): bool { + static function ($val): bool { return file_exists($val) && Filesystem::isReadable($val); }, - function ($val) { + static function ($val) { return $val === 'null' ? null : $val; }, ), 'capath' => array( - function ($val): bool { + static function ($val): bool { return is_dir($val) && Filesystem::isReadable($val); }, - function ($val) { + static function ($val) { return $val === 'null' ? null : $val; }, ), @@ -449,10 +449,10 @@ function ($val) { 'lock' => array($booleanValidator, $booleanNormalizer), 'allow-plugins' => array($booleanValidator, $booleanNormalizer), 'platform-check' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('php-only', 'true', 'false', '1', '0'), true); }, - function ($val) { + static function ($val) { if ('php-only' === $val) { return 'php-only'; } @@ -461,10 +461,10 @@ function ($val) { }, ), 'use-parent-dir' => array( - function ($val): bool { + static function ($val): bool { return in_array($val, array('true', 'false', 'prompt'), true); }, - function ($val) { + static function ($val) { if ('prompt' === $val) { return 'prompt'; } @@ -475,7 +475,7 @@ function ($val) { ); $multiConfigValues = array( 'github-protocols' => array( - function ($vals) { + static function ($vals) { if (!is_array($vals)) { return 'array expected'; } @@ -488,31 +488,31 @@ function ($vals) { return true; }, - function ($vals) { + static function ($vals) { return $vals; }, ), 'github-domains' => array( - function ($vals) { + static function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, - function ($vals) { + static function ($vals) { return $vals; }, ), 'gitlab-domains' => array( - function ($vals) { + static function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, - function ($vals) { + static function ($vals) { return $vals; }, ), @@ -579,26 +579,26 @@ function ($vals) { // handle properties $uniqueProps = array( - 'name' => array('is_string', function ($val) { + 'name' => array('is_string', static function ($val) { return $val; }), - 'type' => array('is_string', function ($val) { + 'type' => array('is_string', static function ($val) { return $val; }), - 'description' => array('is_string', function ($val) { + 'description' => array('is_string', static function ($val) { return $val; }), - 'homepage' => array('is_string', function ($val) { + 'homepage' => array('is_string', static function ($val) { return $val; }), - 'version' => array('is_string', function ($val) { + 'version' => array('is_string', static function ($val) { return $val; }), 'minimum-stability' => array( - function ($val): bool { + static function ($val): bool { return isset(BasePackage::$stabilities[VersionParser::normalizeStability($val)]); }, - function ($val): string { + static function ($val): string { return VersionParser::normalizeStability($val); }, ), @@ -606,26 +606,26 @@ function ($val): string { ); $multiProps = array( 'keywords' => array( - function ($vals) { + static function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, - function ($vals) { + static function ($vals) { return $vals; }, ), 'license' => array( - function ($vals) { + static function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, - function ($vals) { + static function ($vals) { return $vals; }, ), @@ -897,7 +897,7 @@ protected function listConfiguration(array $contents, array $rawContents, Output } if (is_array($value)) { - $value = array_map(function ($val) { + $value = array_map(static function ($val) { return is_array($val) ? json_encode($val) : $val; }, $value); diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index e04c0fdcf335..a895c54945ad 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -445,7 +445,7 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p @mkdir($directory, 0777, true); if ($realDir = realpath($directory)) { pcntl_async_signals(true); - pcntl_signal(SIGINT, function () use ($realDir): void { + pcntl_signal(SIGINT, static function () use ($realDir): void { $fs = new Filesystem(); $fs->removeDirectory($realDir); exit(130); @@ -456,7 +456,7 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p if (function_exists('sapi_windows_set_ctrl_handler') && PHP_SAPI === 'cli') { @mkdir($directory, 0777, true); if ($realDir = realpath($directory)) { - sapi_windows_set_ctrl_handler(function () use ($realDir): void { + sapi_windows_set_ctrl_handler(static function () use ($realDir): void { $fs = new Filesystem(); $fs->removeDirectory($realDir); exit(130); diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index bdaa4d5671fb..255a2be214cf 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -520,7 +520,7 @@ private function outputResult($result): void private function checkPlatform() { $output = ''; - $out = function ($msg, $style) use (&$output): void { + $out = static function ($msg, $style) use (&$output): void { $output .= '<'.$style.'>'.$msg.''.PHP_EOL; }; diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index f30467bd8100..d9a57fc861a3 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -109,7 +109,7 @@ private function getBinaries(bool $forDisplay): array $bins = glob($binDir . '/*'); $localBins = $composer->getPackage()->getBinaries(); if ($forDisplay) { - $localBins = array_map(function ($e) { + $localBins = array_map(static function ($e) { return "$e (local)"; }, $localBins); } diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index 3654e868a182..ac88914d2422 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -33,7 +33,7 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti { $application = $this->getApplication(); if ($input->mustSuggestArgumentValuesFor('command-name')) { - $suggestions->suggestValues(array_filter(array_map(function (Command $command) { + $suggestions->suggestValues(array_filter(array_map(static function (Command $command) { return $command->isHidden() ? null : $command->getName(); }, $application->all()))); diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 408eba903f82..8e83e1edd93c 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -293,7 +293,7 @@ protected function interact(InputInterface $input, OutputInterface $output) $name = $io->askAndValidate( 'Package name (/) ['.$name.']: ', - function ($value) use ($name) { + static function ($value) use ($name) { if (null === $value) { return $name; } @@ -359,7 +359,7 @@ function ($value) use ($author) { $minimumStability = $input->getOption('stability') ?: null; $minimumStability = $io->askAndValidate( 'Minimum Stability ['.$minimumStability.']: ', - function ($value) use ($minimumStability) { + static function ($value) use ($minimumStability) { if (null === $value) { return $minimumStability; } @@ -433,7 +433,7 @@ function ($value) use ($minimumStability) { $namespace = $this->namespaceFromPackageName((string) $input->getOption('name')); $autoload = $io->askAndValidate( 'Add PSR-4 autoload mapping? Maps namespace "'.$namespace.'" to the entered relative path. ['.$autoload.', n to skip]: ', - function ($value) use ($autoload) { + static function ($value) use ($autoload) { if (null === $value) { return $autoload; } @@ -514,7 +514,7 @@ public function namespaceFromPackageName(string $packageName): ?string } $namespace = array_map( - function ($part): string { + static function ($part): string { $part = Preg::replace('/[^a-z0-9]/i', ' ', $part); $part = ucwords($part); diff --git a/src/Composer/Command/LicensesCommand.php b/src/Composer/Command/LicensesCommand.php index 52d0d0122959..9d34824a1801 100644 --- a/src/Composer/Command/LicensesCommand.php +++ b/src/Composer/Command/LicensesCommand.php @@ -167,7 +167,7 @@ private function filterRequiredPackages(RepositoryInterface $repo, PackageInterf $packageListNames = array_keys($bucket); $packages = array_filter( $repo->getPackages(), - function ($package) use ($requires, $packageListNames): bool { + static function ($package) use ($requires, $packageListNames): bool { return in_array($package->getName(), $requires) && !in_array($package->getName(), $packageListNames); } ); diff --git a/src/Composer/Command/PackageDiscoveryTrait.php b/src/Composer/Command/PackageDiscoveryTrait.php index e13abaf49155..0c2830196305 100644 --- a/src/Composer/Command/PackageDiscoveryTrait.php +++ b/src/Composer/Command/PackageDiscoveryTrait.php @@ -186,7 +186,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte $io->writeError($choices); $io->writeError(''); - $validator = function (string $selection) use ($matches, $versionParser) { + $validator = static function (string $selection) use ($matches, $versionParser) { if ('' === $selection) { return false; } @@ -224,7 +224,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte // no constraint yet, determine the best version automatically if (false !== $package && false === strpos($package, ' ')) { - $validator = function (string $input) { + $validator = static function (string $input) { $input = trim($input); return strlen($input) > 0 ? $input : false; @@ -296,7 +296,7 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string if (count($providers) > 0) { $constraint = '*'; if ($input->isInteractive()) { - $constraint = $this->getIO()->askAndValidate('Package "'.$name.'" does not exist but is provided by '.count($providers).' packages. Which version constraint would you like to use? [*] ', function ($value) { + $constraint = $this->getIO()->askAndValidate('Package "'.$name.'" does not exist but is provided by '.count($providers).' packages. Which version constraint would you like to use? [*] ', static function ($value) { $parser = new VersionParser(); $parser->parseConstraints($value); diff --git a/src/Composer/Command/ReinstallCommand.php b/src/Composer/Command/ReinstallCommand.php index 40a376134bdf..7a76b3cb2c74 100644 --- a/src/Composer/Command/ReinstallCommand.php +++ b/src/Composer/Command/ReinstallCommand.php @@ -125,7 +125,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $installOrder[$op->getPackage()->getName()] = $index; } } - usort($uninstallOperations, function ($a, $b) use ($installOrder): int { + usort($uninstallOperations, static function ($a, $b) use ($installOrder): int { return $installOrder[$b->getPackage()->getName()] - $installOrder[$a->getPackage()->getName()]; }); diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 6db97660242d..e64125cfa0ae 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -118,7 +118,7 @@ protected function interact(InputInterface $input, OutputInterface $output) if (count($input->getArgument('packages')) === 0) { $this->getIO()->writeError('No unused packages to remove'); - $this->setCode(function (): int { + $this->setCode(static function (): int { return 0; }); } diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index f8291f133907..2219fa377aeb 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -372,7 +372,7 @@ protected function fetchKeys(IOInterface $io, Config $config): void $io->write('Open https://composer.github.io/pubkeys.html to find the latest keys'); - $validator = function ($value): string { + $validator = static function ($value): string { if (!Preg::isMatch('{^-----BEGIN PUBLIC KEY-----$}', trim($value))) { throw new \UnexpectedValueException('Invalid input'); } diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index a1f359f21f72..6866dbc7ce8a 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -249,7 +249,7 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($input->getOption('no-dev')) { $packages = $this->filterRequiredPackages($installedRepo, $rootPkg); - $repos = $installedRepo = new InstalledRepository(array(new InstalledArrayRepository(array_map(function ($pkg): PackageInterface { + $repos = $installedRepo = new InstalledRepository(array(new InstalledArrayRepository(array_map(static function ($pkg): PackageInterface { return clone $pkg; }, $packages)))); } @@ -346,7 +346,7 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($input->getOption('tree')) { $rootRequires = $this->getRootRequires(); $packages = $installedRepo->getPackages(); - usort($packages, function (BasePackage $a, BasePackage $b): int { + usort($packages, static function (BasePackage $a, BasePackage $b): int { return strcmp((string) $a, (string) $b); }); $arrayTree = array(); @@ -1011,7 +1011,7 @@ private function appendLicenses(array $json, CompletePackageInterface $package): if ($licenses = $package->getLicense()) { $spdxLicenses = new SpdxLicenses(); - $json['licenses'] = array_map(function ($licenseId) use ($spdxLicenses) { + $json['licenses'] = array_map(static function ($licenseId) use ($spdxLicenses) { $license = $spdxLicenses->getLicenseByIdentifier($licenseId); // keys: 0 fullname, 1 osi, 2 url if (!$license) { diff --git a/src/Composer/Command/StatusCommand.php b/src/Composer/Command/StatusCommand.php index 0f8e2b530a9e..3548f5ace6b1 100644 --- a/src/Composer/Command/StatusCommand.php +++ b/src/Composer/Command/StatusCommand.php @@ -163,7 +163,7 @@ private function doExecute(InputInterface $input): int foreach ($errors as $path => $changes) { if ($input->getOption('verbose')) { - $indentedChanges = implode("\n", array_map(function ($line): string { + $indentedChanges = implode("\n", array_map(static function ($line): string { return ' ' . ltrim($line); }, explode("\n", $changes))); $io->write(''.$path.':'); @@ -179,7 +179,7 @@ private function doExecute(InputInterface $input): int foreach ($unpushedChanges as $path => $changes) { if ($input->getOption('verbose')) { - $indentedChanges = implode("\n", array_map(function ($line): string { + $indentedChanges = implode("\n", array_map(static function ($line): string { return ' ' . ltrim($line); }, explode("\n", $changes))); $io->write(''.$path.':'); diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 7927bc2c8489..1676f2c71987 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -132,7 +132,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // extract --with shorthands from the allowlist if (count($packages) > 0) { - $allowlistPackagesWithRequirements = array_filter($packages, function ($pkg): bool { + $allowlistPackagesWithRequirements = array_filter($packages, static function ($pkg): bool { return Preg::isMatch('{\S+[ =:]\S+}', $pkg); }); foreach ($this->formatRequirements($allowlistPackagesWithRequirements) as $package => $constraint) { @@ -176,7 +176,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // the arguments lock/nothing/mirrors are not package names but trigger a mirror update instead // they are further mutually exclusive with listing actual package names - $filteredPackages = array_filter($packages, function ($package): bool { + $filteredPackages = array_filter($packages, static function ($package): bool { return !in_array($package, array('lock', 'nothing', 'mirrors'), true); }); $updateMirrors = $input->getOption('lock') || count($filteredPackages) != count($packages); diff --git a/src/Composer/Command/ValidateCommand.php b/src/Composer/Command/ValidateCommand.php index 80c65a1b5886..82cf551d9d1f 100644 --- a/src/Composer/Command/ValidateCommand.php +++ b/src/Composer/Command/ValidateCommand.php @@ -196,13 +196,13 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr } if ($errors) { - $errors = array_map(function ($err): string { + $errors = array_map(static function ($err): string { return '- ' . $err; }, $errors); array_unshift($errors, '# General errors'); } if ($warnings) { - $warnings = array_map(function ($err): string { + $warnings = array_map(static function ($err): string { return '- ' . $err; }, $warnings); array_unshift($warnings, '# General warnings'); @@ -213,7 +213,7 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr // If checking publish errors, display them as errors, otherwise just show them as warnings if ($publishErrors) { - $publishErrors = array_map(function ($err): string { + $publishErrors = array_map(static function ($err): string { return '- ' . $err; }, $publishErrors); diff --git a/src/Composer/Compiler.php b/src/Composer/Compiler.php index c63c5564b3e5..b184e2519a21 100644 --- a/src/Composer/Compiler.php +++ b/src/Composer/Compiler.php @@ -82,7 +82,7 @@ public function compile(string $pharFile = 'composer.phar'): void $phar->startBuffering(); - $finderSort = function ($a, $b): int { + $finderSort = static function ($a, $b): int { return strcmp(strtr($a->getRealPath(), '\\', '/'), strtr($b->getRealPath(), '\\', '/')); }; diff --git a/src/Composer/Config/JsonConfigSource.php b/src/Composer/Config/JsonConfigSource.php index 4c031f5d8760..a4f82d3223e9 100644 --- a/src/Composer/Config/JsonConfigSource.php +++ b/src/Composer/Config/JsonConfigSource.php @@ -62,7 +62,7 @@ public function getName(): string */ public function addRepository(string $name, $config, bool $append = true): void { - $this->manipulateJson('addRepository', function (&$config, $repo, $repoConfig) use ($append): void { + $this->manipulateJson('addRepository', static function (&$config, $repo, $repoConfig) use ($append): void { // if converting from an array format to hashmap format, and there is a {"packagist.org":false} repo, we have // to convert it to "packagist.org": false key on the hashmap otherwise it fails schema validation if (isset($config['repositories'])) { @@ -91,7 +91,7 @@ public function addRepository(string $name, $config, bool $append = true): void */ public function removeRepository(string $name): void { - $this->manipulateJson('removeRepository', function (&$config, $repo): void { + $this->manipulateJson('removeRepository', static function (&$config, $repo): void { unset($config['repositories'][$repo]); }, $name); } @@ -102,7 +102,7 @@ public function removeRepository(string $name): void public function addConfigSetting(string $name, $value): void { $authConfig = $this->authConfig; - $this->manipulateJson('addConfigSetting', function (&$config, $key, $val) use ($authConfig): void { + $this->manipulateJson('addConfigSetting', static function (&$config, $key, $val) use ($authConfig): void { if (Preg::isMatch('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\.}', $key)) { list($key, $host) = explode('.', $key, 2); if ($authConfig) { @@ -122,7 +122,7 @@ public function addConfigSetting(string $name, $value): void public function removeConfigSetting(string $name): void { $authConfig = $this->authConfig; - $this->manipulateJson('removeConfigSetting', function (&$config, $key) use ($authConfig): void { + $this->manipulateJson('removeConfigSetting', static function (&$config, $key) use ($authConfig): void { if (Preg::isMatch('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\.}', $key)) { list($key, $host) = explode('.', $key, 2); if ($authConfig) { @@ -141,7 +141,7 @@ public function removeConfigSetting(string $name): void */ public function addProperty(string $name, $value): void { - $this->manipulateJson('addProperty', function (&$config, $key, $val): void { + $this->manipulateJson('addProperty', static function (&$config, $key, $val): void { if (strpos($key, 'extra.') === 0 || strpos($key, 'scripts.') === 0) { $bits = explode('.', $key); $last = array_pop($bits); @@ -164,7 +164,7 @@ public function addProperty(string $name, $value): void */ public function removeProperty(string $name): void { - $this->manipulateJson('removeProperty', function (&$config, $key): void { + $this->manipulateJson('removeProperty', static function (&$config, $key): void { if (strpos($key, 'extra.') === 0 || strpos($key, 'scripts.') === 0) { $bits = explode('.', $key); $last = array_pop($bits); @@ -187,7 +187,7 @@ public function removeProperty(string $name): void */ public function addLink(string $type, string $name, string $value): void { - $this->manipulateJson('addLink', function (&$config, $type, $name, $value): void { + $this->manipulateJson('addLink', static function (&$config, $type, $name, $value): void { $config[$type][$name] = $value; }, $type, $name, $value); } @@ -197,10 +197,10 @@ public function addLink(string $type, string $name, string $value): void */ public function removeLink(string $type, string $name): void { - $this->manipulateJson('removeSubNode', function (&$config, $type, $name): void { + $this->manipulateJson('removeSubNode', static function (&$config, $type, $name): void { unset($config[$type][$name]); }, $type, $name); - $this->manipulateJson('removeMainKeyIfEmpty', function (&$config, $type): void { + $this->manipulateJson('removeMainKeyIfEmpty', static function (&$config, $type): void { if (0 === count($config[$type])) { unset($config[$type]); } diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index c5fc2b0d3581..be16570b4c40 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -96,14 +96,14 @@ public function __construct() if (!$shutdownRegistered) { if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { pcntl_async_signals(true); - pcntl_signal(SIGINT, function ($sig): void { + pcntl_signal(SIGINT, static function ($sig): void { exit(130); }); } $shutdownRegistered = true; - register_shutdown_function(function (): void { + register_shutdown_function(static function (): void { $lastError = error_get_last(); if ($lastError && $lastError['message'] && @@ -296,7 +296,7 @@ function_exists('php_uname') ? php_uname('s') . ' / ' . php_uname('r') : 'Unknow } // Check system temp folder for usability as it can cause weird runtime issues otherwise - Silencer::call(function () use ($io): void { + Silencer::call(static function () use ($io): void { $tempfile = sys_get_temp_dir() . '/temp-' . md5(microtime()); if (!(file_put_contents($tempfile, __FILE__) && (file_get_contents($tempfile) == __FILE__) && unlink($tempfile) && !file_exists($tempfile))) { $io->writeError(sprintf('PHP temp directory (%s) does not exist or is not writable to Composer. Set sys_temp_dir in your php.ini', sys_get_temp_dir())); diff --git a/src/Composer/DependencyResolver/LockTransaction.php b/src/Composer/DependencyResolver/LockTransaction.php index e9bffab30297..b05afa7c12c1 100644 --- a/src/Composer/DependencyResolver/LockTransaction.php +++ b/src/Composer/DependencyResolver/LockTransaction.php @@ -152,7 +152,7 @@ public function getAliases(array $aliases): array } } - usort($usedAliases, function ($a, $b): int { + usort($usedAliases, static function ($a, $b): int { return strcmp($a['package'], $b['package']); }); diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index 54223fba4a8f..cb9732ff23f1 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -532,7 +532,7 @@ private function getSkippedRootRequires(Request $request, string $name): array $matches = array(); if (isset($rootRequires[$name])) { - return array_map(function (PackageInterface $package) use ($name): string { + return array_map(static function (PackageInterface $package) use ($name): string { if ($name !== $package->getName()) { return $package->getName() .' (via replace of '.$name.')'; } diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index 07cecb836997..fd38b5f23750 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -286,7 +286,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req if ($packages = $repositorySet->findPackages($packageName, $constraint)) { $rootReqs = $repositorySet->getRootRequires(); if (isset($rootReqs[$packageName])) { - $filtered = array_filter($packages, function ($p) use ($rootReqs, $packageName): bool { + $filtered = array_filter($packages, static function ($p) use ($rootReqs, $packageName): bool { return $rootReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); }); if (0 === count($filtered)) { @@ -296,7 +296,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $tempReqs = $repositorySet->getTemporaryConstraints(); if (isset($tempReqs[$packageName])) { - $filtered = array_filter($packages, function ($p) use ($tempReqs, $packageName): bool { + $filtered = array_filter($packages, static function ($p) use ($tempReqs, $packageName): bool { return $tempReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); }); if (0 === count($filtered)) { @@ -306,7 +306,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req if ($lockedPackage) { $fixedConstraint = new Constraint('==', $lockedPackage->getVersion()); - $filtered = array_filter($packages, function ($p) use ($fixedConstraint): bool { + $filtered = array_filter($packages, static function ($p) use ($fixedConstraint): bool { return $fixedConstraint->matches(new Constraint('==', $p->getVersion())); }); if (0 === count($filtered)) { @@ -314,7 +314,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req } } - $nonLockedPackages = array_filter($packages, function ($p): bool { + $nonLockedPackages = array_filter($packages, static function ($p): bool { return !$p->getRepository() instanceof LockArrayRepository; }); @@ -370,7 +370,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req if ($providers = $repositorySet->getProviders($packageName)) { $maxProviders = 20; - $providersStr = implode(array_map(function ($p): string { + $providersStr = implode(array_map(static function ($p): string { $description = $p['description'] ? ' '.substr($p['description'], 0, 100) : ''; return ' - '.$p['name'].$description."\n"; diff --git a/src/Composer/DependencyResolver/Rule.php b/src/Composer/DependencyResolver/Rule.php index f02b764115fa..7398d2046fcc 100644 --- a/src/Composer/DependencyResolver/Rule.php +++ b/src/Composer/DependencyResolver/Rule.php @@ -281,7 +281,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, return 'No package found to satisfy root composer.json require '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : ''); } - $packagesNonAlias = array_values(array_filter($packages, function ($p): bool { + $packagesNonAlias = array_values(array_filter($packages, static function ($p): bool { return !($p instanceof AliasPackage); })); if (count($packagesNonAlias) === 1) { diff --git a/src/Composer/DependencyResolver/RuleWatchGraph.php b/src/Composer/DependencyResolver/RuleWatchGraph.php index 2fea3c43d7b0..5a30cdc0659f 100644 --- a/src/Composer/DependencyResolver/RuleWatchGraph.php +++ b/src/Composer/DependencyResolver/RuleWatchGraph.php @@ -110,7 +110,7 @@ public function propagateLiteral(int $decidedLiteral, int $level, Decisions $dec if (!$node->getRule()->isDisabled() && !$decisions->satisfy($otherWatch)) { $ruleLiterals = $node->getRule()->getLiterals(); - $alternativeLiterals = array_filter($ruleLiterals, function ($ruleLiteral) use ($literal, $otherWatch, $decisions): bool { + $alternativeLiterals = array_filter($ruleLiterals, static function ($ruleLiteral) use ($literal, $otherWatch, $decisions): bool { return $literal !== $ruleLiteral && $otherWatch !== $ruleLiteral && !$decisions->conflict($ruleLiteral); diff --git a/src/Composer/DependencyResolver/SolverProblemsException.php b/src/Composer/DependencyResolver/SolverProblemsException.php index 1a28f288b155..7696351f042d 100644 --- a/src/Composer/DependencyResolver/SolverProblemsException.php +++ b/src/Composer/DependencyResolver/SolverProblemsException.php @@ -121,7 +121,7 @@ private function createExtensionHint(array $missingExtensions): string array_shift($paths); } - $ignoreExtensionsArguments = implode(" ", array_map(function ($extension) { + $ignoreExtensionsArguments = implode(" ", array_map(static function ($extension) { return "--ignore-platform-req=$extension"; }, $missingExtensions)); diff --git a/src/Composer/DependencyResolver/Transaction.php b/src/Composer/DependencyResolver/Transaction.php index c9db082df6ce..5df550591f0f 100644 --- a/src/Composer/DependencyResolver/Transaction.php +++ b/src/Composer/DependencyResolver/Transaction.php @@ -71,7 +71,7 @@ public function getOperations(): array */ private function setResultPackageMaps(array $resultPackages): void { - $packageSort = function (PackageInterface $a, PackageInterface $b): int { + $packageSort = static function (PackageInterface $a, PackageInterface $b): int { // sort alias packages by the same name behind their non alias version if ($a->getName() == $b->getName()) { if ($a instanceof AliasPackage != $b instanceof AliasPackage) { @@ -289,7 +289,7 @@ private function movePluginsToFront(array $operations): array // is this a downloads modifying plugin or a dependency of one? if ($isDownloadsModifyingPlugin || count(array_intersect($package->getNames(), $dlModifyingPluginRequires))) { // get the package's requires, but filter out any platform requirements - $requires = array_filter(array_keys($package->getRequires()), function ($req): bool { + $requires = array_filter(array_keys($package->getRequires()), static function ($req): bool { return !PlatformRepository::isPlatformPackage($req); }); @@ -314,7 +314,7 @@ private function movePluginsToFront(array $operations): array // is this a plugin or a dependency of a plugin? if ($isPlugin || count(array_intersect($package->getNames(), $pluginRequires))) { // get the package's requires, but filter out any platform requirements - $requires = array_filter(array_keys($package->getRequires()), function ($req): bool { + $requires = array_filter(array_keys($package->getRequires()), static function ($req): bool { return !PlatformRepository::isPlatformPackage($req); }); diff --git a/src/Composer/Downloader/ArchiveDownloader.php b/src/Composer/Downloader/ArchiveDownloader.php index 6c01e947ff90..11390f319400 100644 --- a/src/Composer/Downloader/ArchiveDownloader.php +++ b/src/Composer/Downloader/ArchiveDownloader.php @@ -124,7 +124,7 @@ public function install(PackageInterface $package, string $path, bool $output = * @param string $dir Directory * @return \SplFileInfo[] */ - $getFolderContent = function ($dir): array { + $getFolderContent = static function ($dir): array { $finder = Finder::create() ->ignoreVCS(false) ->ignoreDotFiles(false) @@ -146,7 +146,7 @@ public function install(PackageInterface $package, string $path, bool $output = * @param string $to Directory * @return void */ - $renameRecursively = function ($from, $to) use ($filesystem, $getFolderContent, $package, &$renameRecursively) { + $renameRecursively = static function ($from, $to) use ($filesystem, $getFolderContent, $package, &$renameRecursively) { $contentDir = $getFolderContent($from); // move files back out of the temp dir @@ -203,7 +203,7 @@ public function install(PackageInterface $package, string $path, bool $output = $this->removeCleanupPath($package, $temporaryDir); $this->removeCleanupPath($package, $path); }); - }, function ($e) use ($cleanup) { + }, static function ($e) use ($cleanup) { $cleanup(); throw $e; diff --git a/src/Composer/Downloader/DownloadManager.php b/src/Composer/Downloader/DownloadManager.php index 05afde466ed3..c4d6cb3e49d9 100644 --- a/src/Composer/Downloader/DownloadManager.php +++ b/src/Composer/Downloader/DownloadManager.php @@ -205,7 +205,7 @@ public function download(PackageInterface $package, string $targetDir, PackageIn return \React\Promise\resolve(null); } - $handleError = function ($e) use ($sources, $source, $package, $io, $download) { + $handleError = static function ($e) use ($sources, $source, $package, $io, $download) { if ($e instanceof \RuntimeException && !$e instanceof IrrecoverableDownloadException) { if (!$sources) { throw $e; @@ -230,7 +230,7 @@ public function download(PackageInterface $package, string $targetDir, PackageIn return $handleError($e); } - $res = $result->then(function ($res) { + $res = $result->then(static function ($res) { return $res; }, $handleError); @@ -426,7 +426,7 @@ private function getAvailableSources(PackageInterface $package, PackageInterface && !(!$prevPackage->isDev() && $prevPackage->getInstallationSource() === 'dist' && $package->isDev()) ) { $prevSource = $prevPackage->getInstallationSource(); - usort($sources, function ($a, $b) use ($prevSource): int { + usort($sources, static function ($a, $b) use ($prevSource): int { return $a === $prevSource ? -1 : 1; }); diff --git a/src/Composer/Downloader/FileDownloader.php b/src/Composer/Downloader/FileDownloader.php index 960fcbf5864c..cd8e189353e4 100644 --- a/src/Composer/Downloader/FileDownloader.php +++ b/src/Composer/Downloader/FileDownloader.php @@ -117,7 +117,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa throw new \InvalidArgumentException('The given package is missing url information'); } - $cacheKeyGenerator = function (PackageInterface $package, $key): string { + $cacheKeyGenerator = static function (PackageInterface $package, $key): string { $cacheKey = sha1($key); return $package->getName().'/'.$cacheKey.'.'.$package->getDistType(); @@ -194,7 +194,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa ->then($accept, $reject); } - return $result->then(function ($result) use ($fileName, $checksum, $url, $package, $eventDispatcher): string { + return $result->then(static function ($result) use ($fileName, $checksum, $url, $package, $eventDispatcher): string { // in case of retry, the first call's Promise chain finally calls this twice at the end, // once with $result being the returned $fileName from $accept, and then once for every // failed request with a null result, which can be skipped. @@ -420,7 +420,7 @@ public function remove(PackageInterface $package, string $path, bool $output = t } $promise = $this->filesystem->removeDirectoryAsync($path); - return $promise->then(function ($result) use ($path): void { + return $promise->then(static function ($result) use ($path): void { if (!$result) { throw new \RuntimeException('Could not completely delete '.$path.', aborting.'); } diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index c4fbc8d76b96..c5676df2755e 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -114,7 +114,7 @@ protected function doInstall(PackageInterface $package, string $path, string $ur $this->io->writeError($msg); - $commandCallable = function (string $url) use ($path, $command, $cachePath): string { + $commandCallable = static function (string $url) use ($path, $command, $cachePath): string { return str_replace( array('%url%', '%path%', '%cachePath%', '%sanitizedUrl%'), array( @@ -172,7 +172,7 @@ protected function doUpdate(PackageInterface $initial, PackageInterface $target, $this->io->writeError($msg); - $commandCallable = function ($url) use ($ref, $command, $cachePath): string { + $commandCallable = static function ($url) use ($ref, $command, $cachePath): string { return str_replace( array('%url%', '%ref%', '%cachePath%', '%sanitizedUrl%'), array( @@ -360,7 +360,7 @@ protected function cleanChanges(PackageInterface $package, string $path, bool $u return parent::cleanChanges($package, $path, $update); } - $changes = array_map(function ($elem): string { + $changes = array_map(static function ($elem): string { return ' '.$elem; }, Preg::split('{\s*\r?\n\s*}', $changes)); $this->io->writeError(' '.$package->getPrettyName().' has modified files:'); diff --git a/src/Composer/Downloader/HgDownloader.php b/src/Composer/Downloader/HgDownloader.php index 094f028a194b..c1b71a29932e 100644 --- a/src/Composer/Downloader/HgDownloader.php +++ b/src/Composer/Downloader/HgDownloader.php @@ -41,7 +41,7 @@ protected function doInstall(PackageInterface $package, string $path, string $ur { $hgUtils = new HgUtils($this->io, $this->config, $this->process); - $cloneCommand = function (string $url) use ($path): string { + $cloneCommand = static function (string $url) use ($path): string { return sprintf('hg clone -- %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($path)); }; @@ -70,7 +70,7 @@ protected function doUpdate(PackageInterface $initial, PackageInterface $target, throw new \RuntimeException('The .hg directory is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); } - $command = function ($url) use ($ref): string { + $command = static function ($url) use ($ref): string { return sprintf('hg pull -- %s && hg up -- %s', ProcessExecutor::escape($url), ProcessExecutor::escape($ref)); }; diff --git a/src/Composer/Downloader/SvnDownloader.php b/src/Composer/Downloader/SvnDownloader.php index 970d93774143..66f86224b09e 100644 --- a/src/Composer/Downloader/SvnDownloader.php +++ b/src/Composer/Downloader/SvnDownloader.php @@ -144,7 +144,7 @@ protected function cleanChanges(PackageInterface $package, string $path, bool $u return parent::cleanChanges($package, $path, $update); } - $changes = array_map(function ($elem): string { + $changes = array_map(static function ($elem): string { return ' '.$elem; }, Preg::split('{\s*\r?\n\s*}', $changes)); $countChanges = count($changes); diff --git a/src/Composer/Downloader/VcsDownloader.php b/src/Composer/Downloader/VcsDownloader.php index eb5336c70296..6fab1172ad9c 100644 --- a/src/Composer/Downloader/VcsDownloader.php +++ b/src/Composer/Downloader/VcsDownloader.php @@ -200,7 +200,7 @@ public function update(PackageInterface $initial, PackageInterface $target, stri } if ('' !== trim($logs)) { - $logs = implode("\n", array_map(function ($line): string { + $logs = implode("\n", array_map(static function ($line): string { return ' ' . $line; }, explode("\n", $logs))); @@ -228,7 +228,7 @@ public function remove(PackageInterface $package, string $path): PromiseInterfac $promise = $this->filesystem->removeDirectoryAsync($path); - return $promise->then(function (bool $result) use ($path) { + return $promise->then(static function (bool $result) use ($path) { if (!$result) { throw new \RuntimeException('Could not completely delete '.$path.', aborting.'); } diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index d5cd9aabd365..323922c6b6df 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -292,7 +292,7 @@ protected function doDispatch(Event $event) if (strpos($exec, '@php ') === 0) { $pathAndArgs = substr($exec, 5); if (Platform::isWindows()) { - $pathAndArgs = Preg::replaceCallback('{^\S+}', function ($path) { + $pathAndArgs = Preg::replaceCallback('{^\S+}', static function ($path) { return str_replace('/', '\\', $path[0]); }, $pathAndArgs); } @@ -314,7 +314,7 @@ protected function doDispatch(Event $event) } if (Platform::isWindows()) { - $exec = Preg::replaceCallback('{^\S+}', function ($path) { + $exec = Preg::replaceCallback('{^\S+}', static function ($path) { return str_replace('/', '\\', $path[0]); }, $exec); } diff --git a/src/Composer/IO/BufferIO.php b/src/Composer/IO/BufferIO.php index ecbb4a3032de..c25cc64dbd68 100644 --- a/src/Composer/IO/BufferIO.php +++ b/src/Composer/IO/BufferIO.php @@ -56,7 +56,7 @@ public function getOutput(): string $output = stream_get_contents($this->output->getStream()); - $output = Preg::replaceCallback("{(?<=^|\n|\x08)(.+?)(\x08+)}", function ($matches): string { + $output = Preg::replaceCallback("{(?<=^|\n|\x08)(.+?)(\x08+)}", static function ($matches): string { $pre = strip_tags($matches[1]); if (strlen($pre) === strlen($matches[2])) { diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 971d52736c9c..508a34e8be1d 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -175,7 +175,7 @@ private function doWrite($messages, bool $newline, bool $stderr, int $verbosity, if (null !== $this->startTime) { $memoryUsage = memory_get_usage() / 1024 / 1024; $timeSpent = microtime(true) - $this->startTime; - $messages = array_map(function ($message) use ($memoryUsage, $timeSpent): string { + $messages = array_map(static function ($message) use ($memoryUsage, $timeSpent): string { return sprintf('[%.1fMiB/%.2fs] %s', $memoryUsage, $timeSpent, $message); }, (array) $messages); } diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index c4cf9785eed6..3ea52508e00c 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -533,7 +533,7 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doIns } } - $sortByName = function ($a, $b): int { + $sortByName = static function ($a, $b): int { if ($a instanceof UpdateOperation) { $a = $a->getTargetPackage()->getName(); } else { diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index 05f2062d379e..74a6a229e992 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -199,18 +199,18 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b $loop = $this->loop; $io = $this->io; - $runCleanup = function () use (&$cleanupPromises, $loop): void { + $runCleanup = static function () use (&$cleanupPromises, $loop): void { $promises = array(); $loop->abortJobs(); foreach ($cleanupPromises as $cleanup) { - $promises[] = new \React\Promise\Promise(function ($resolve, $reject) use ($cleanup): void { + $promises[] = new \React\Promise\Promise(static function ($resolve, $reject) use ($cleanup): void { $promise = $cleanup(); if (!$promise instanceof PromiseInterface) { $resolve(); } else { - $promise->then(function () use ($resolve): void { + $promise->then(static function () use ($resolve): void { $resolve(); }); } @@ -229,7 +229,7 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b if ($handleInterruptsUnix) { pcntl_async_signals(true); $prevHandler = pcntl_signal_get_handler(SIGINT); - pcntl_signal(SIGINT, function ($sig) use ($runCleanup, $prevHandler, $io): void { + pcntl_signal(SIGINT, static function ($sig) use ($runCleanup, $prevHandler, $io): void { $io->writeError('Received SIGINT, aborting', true, IOInterface::DEBUG); $runCleanup(); @@ -241,7 +241,7 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b }); } if ($handleInterruptsWindows) { - $windowsHandler = function ($event) use ($runCleanup, $io): void { + $windowsHandler = static function ($event) use ($runCleanup, $io): void { if ($event !== PHP_WINDOWS_EVENT_CTRL_C) { return; } @@ -339,7 +339,7 @@ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, arr } $installer = $this->getInstaller($package->getType()); - $cleanupPromises[$index] = function () use ($opType, $installer, $package, $initialPackage) { + $cleanupPromises[$index] = static function () use ($opType, $installer, $package, $initialPackage) { // avoid calling cleanup if the download was not even initialized for a package // as without installation source configured nothing will work if (!$package->getInstallationSource()) { @@ -453,7 +453,7 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati })->then($cleanupPromises[$index]) ->then(function () use ($devMode, $repo): void { $repo->write($devMode, $this); - }, function ($e) use ($opType, $package, $io): void { + }, static function ($e) use ($opType, $package, $io): void { $io->writeError(' ' . ucfirst($opType) .' of '.$package->getPrettyName().' failed'); throw $e; @@ -466,7 +466,7 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati ][$opType] ?? null; if (null !== $eventName && $runScripts && $dispatcher) { - $postExecCallbacks[] = function () use ($dispatcher, $eventName, $devMode, $repo, $allOperations, $operation): void { + $postExecCallbacks[] = static function () use ($dispatcher, $eventName, $devMode, $repo, $allOperations, $operation): void { $dispatcher->dispatchPackageEvent($eventName, $devMode, $repo, $allOperations, $operation); }; } @@ -558,7 +558,7 @@ public function update(InstalledRepositoryInterface $repo, UpdateOperation $oper } $installer = $this->getInstaller($targetType); - $promise = $promise->then(function () use ($installer, $repo, $target): PromiseInterface { + $promise = $promise->then(static function () use ($installer, $repo, $target): PromiseInterface { $promise = $installer->install($repo, $target); if ($promise instanceof PromiseInterface) { return $promise; diff --git a/src/Composer/Installer/LibraryInstaller.php b/src/Composer/Installer/LibraryInstaller.php index 55c190d99e44..9aebddbd3da7 100644 --- a/src/Composer/Installer/LibraryInstaller.php +++ b/src/Composer/Installer/LibraryInstaller.php @@ -160,7 +160,7 @@ public function install(InstalledRepositoryInterface $repo, PackageInterface $pa $binaryInstaller = $this->binaryInstaller; $installPath = $this->getInstallPath($package); - return $promise->then(function () use ($binaryInstaller, $installPath, $package, $repo): void { + return $promise->then(static function () use ($binaryInstaller, $installPath, $package, $repo): void { $binaryInstaller->installBinaries($package, $installPath); if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); @@ -188,7 +188,7 @@ public function update(InstalledRepositoryInterface $repo, PackageInterface $ini $binaryInstaller = $this->binaryInstaller; $installPath = $this->getInstallPath($target); - return $promise->then(function () use ($binaryInstaller, $installPath, $target, $initial, $repo): void { + return $promise->then(static function () use ($binaryInstaller, $installPath, $target, $initial, $repo): void { $binaryInstaller->installBinaries($target, $installPath); $repo->removePackage($initial); if (!$repo->hasPackage($target)) { @@ -215,7 +215,7 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ $downloadPath = $this->getPackageBasePath($package); $filesystem = $this->filesystem; - return $promise->then(function () use ($binaryInstaller, $filesystem, $downloadPath, $package, $repo): void { + return $promise->then(static function () use ($binaryInstaller, $filesystem, $downloadPath, $package, $repo): void { $binaryInstaller->removeBinaries($package); $repo->removePackage($package); diff --git a/src/Composer/Installer/SuggestedPackagesReporter.php b/src/Composer/Installer/SuggestedPackagesReporter.php index 315afea5bdcd..18faf55d2542 100644 --- a/src/Composer/Installer/SuggestedPackagesReporter.php +++ b/src/Composer/Installer/SuggestedPackagesReporter.php @@ -198,7 +198,7 @@ private function getFilteredSuggestions(InstalledRepository $installedRepo = nul $sourceFilter = array(); if ($onlyDependentsOf) { - $sourceFilter = array_map(function ($link): string { + $sourceFilter = array_map(static function ($link): string { return $link->getTarget(); }, array_merge($onlyDependentsOf->getRequires(), $onlyDependentsOf->getDevRequires())); $sourceFilter[] = $onlyDependentsOf->getName(); diff --git a/src/Composer/Json/JsonFormatter.php b/src/Composer/Json/JsonFormatter.php index e75012fa3501..de1afad0decd 100644 --- a/src/Composer/Json/JsonFormatter.php +++ b/src/Composer/Json/JsonFormatter.php @@ -70,7 +70,7 @@ public static function format(string $json, bool $unescapeUnicode, bool $unescap if ($unescapeUnicode && function_exists('mb_convert_encoding')) { // https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha - $buffer = Preg::replaceCallback('/(\\\\+)u([0-9a-f]{4})/i', function ($match) { + $buffer = Preg::replaceCallback('/(\\\\+)u([0-9a-f]{4})/i', static function ($match) { $l = strlen($match[1]); if ($l % 2) { diff --git a/src/Composer/Json/JsonManipulator.php b/src/Composer/Json/JsonManipulator.php index 9d9792cfea1c..f046532df18e 100644 --- a/src/Composer/Json/JsonManipulator.php +++ b/src/Composer/Json/JsonManipulator.php @@ -94,7 +94,7 @@ public function addLink(string $type, string $package, string $constraint, bool // update existing link $existingPackage = $packageMatches['package']; $packageRegex = str_replace('/', '\\\\?/', preg_quote($existingPackage)); - $links = Preg::replaceCallback('{'.self::$DEFINES.'"'.$packageRegex.'"(?P\s*:\s*)(?&string)}ix', function ($m) use ($existingPackage, $constraint): string { + $links = Preg::replaceCallback('{'.self::$DEFINES.'"'.$packageRegex.'"(?P\s*:\s*)(?&string)}ix', static function ($m) use ($existingPackage, $constraint): string { return JsonFile::encode(str_replace('\\/', '/', $existingPackage)) . $m['separator'] . '"' . $constraint . '"'; }, $links); } else { @@ -135,7 +135,7 @@ public function addLink(string $type, string $package, string $constraint, bool */ private function sortPackages(array &$packages = array()): void { - $prefix = function ($requirement): string { + $prefix = static function ($requirement): string { if (PlatformRepository::isPlatformPackage($requirement)) { return Preg::replace( array( @@ -159,7 +159,7 @@ private function sortPackages(array &$packages = array()): void return '5-'.$requirement; }; - uksort($packages, function ($a, $b) use ($prefix): int { + uksort($packages, static function ($a, $b) use ($prefix): int { return strnatcmp($prefix($a), $prefix($b)); }); } @@ -351,7 +351,7 @@ public function addSubNode(string $mainNode, string $name, $value, bool $append } } - $this->contents = Preg::replaceCallback($nodeRegex, function ($m) use ($children): string { + $this->contents = Preg::replaceCallback($nodeRegex, static function ($m) use ($children): string { return $m['start'] . $children . $m['end']; }, $this->contents); @@ -437,7 +437,7 @@ public function removeSubNode(string $mainNode, string $name): bool $newline = $this->newline; $indent = $this->indent; - $this->contents = Preg::replaceCallback($nodeRegex, function ($matches) use ($indent, $newline): string { + $this->contents = Preg::replaceCallback($nodeRegex, static function ($matches) use ($indent, $newline): string { return $matches['start'] . '{' . $newline . $indent . '}' . $matches['end']; }, $this->contents); diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index 9c769d736f18..6a9139387210 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -163,7 +163,7 @@ private function parseType(array $def, string $path): Type $type = TypeCombinator::union(...$types); } elseif (isset($def['enum'])) { - $type = TypeCombinator::union(...array_map(function (string $value): ConstantStringType { + $type = TypeCombinator::union(...array_map(static function (string $value): ConstantStringType { return new ConstantStringType($value); }, $def['enum'])); } else { diff --git a/src/Composer/Package/Archiver/ArchivableFilesFinder.php b/src/Composer/Package/Archiver/ArchivableFilesFinder.php index 70be416242c0..b37e50f55025 100644 --- a/src/Composer/Package/Archiver/ArchivableFilesFinder.php +++ b/src/Composer/Package/Archiver/ArchivableFilesFinder.php @@ -57,7 +57,7 @@ public function __construct(string $sources, array $excludes, bool $ignoreFilter $this->finder = new Finder(); - $filter = function (\SplFileInfo $file) use ($sources, $filters, $fs): bool { + $filter = static function (\SplFileInfo $file) use ($sources, $filters, $fs): bool { if ($file->isLink() && ($file->getRealPath() === false || strpos($file->getRealPath(), $sources) !== 0)) { return false; } diff --git a/src/Composer/Package/Archiver/ArchiveManager.php b/src/Composer/Package/Archiver/ArchiveManager.php index 75d010a1eb6c..973fb9eadfa3 100644 --- a/src/Composer/Package/Archiver/ArchiveManager.php +++ b/src/Composer/Package/Archiver/ArchiveManager.php @@ -101,7 +101,7 @@ public function getPackageFilename(CompletePackageInterface $package): string $nameParts[] = substr(sha1($package->getSourceReference()), 0, 6); } - $name = implode('-', array_filter($nameParts, function ($p): bool { + $name = implode('-', array_filter($nameParts, static function ($p): bool { return !empty($p); })); diff --git a/src/Composer/Package/Archiver/BaseExcludeFilter.php b/src/Composer/Package/Archiver/BaseExcludeFilter.php index 13b215199136..a7e587fc3924 100644 --- a/src/Composer/Package/Archiver/BaseExcludeFilter.php +++ b/src/Composer/Package/Archiver/BaseExcludeFilter.php @@ -84,7 +84,7 @@ protected function parseLines(array $lines, callable $lineParser): array { return array_filter( array_map( - function ($line) use ($lineParser) { + static function ($line) use ($lineParser) { $line = trim($line); if (!$line || 0 === strpos($line, '#')) { @@ -95,7 +95,7 @@ function ($line) use ($lineParser) { }, $lines ), - function ($pattern): bool { + static function ($pattern): bool { return $pattern !== null; } ); diff --git a/src/Composer/Package/BasePackage.php b/src/Composer/Package/BasePackage.php index df9b3ce290ee..cdefbfa43247 100644 --- a/src/Composer/Package/BasePackage.php +++ b/src/Composer/Package/BasePackage.php @@ -273,7 +273,7 @@ public static function packageNameToRegexp(string $allowPattern, string $wrap = public static function packageNamesToRegexp(array $packageNames, string $wrap = '{^(?:%s)$}iD'): string { $packageNames = array_map( - function ($packageName): string { + static function ($packageName): string { return BasePackage::packageNameToRegexp($packageName, '%s'); }, $packageNames diff --git a/src/Composer/Package/Locker.php b/src/Composer/Package/Locker.php index 1763f42b4b41..dc055971dd7a 100644 --- a/src/Composer/Package/Locker.php +++ b/src/Composer/Package/Locker.php @@ -357,7 +357,7 @@ public function setLockData(array $packages, ?array $devPackages, array $platfor { // keep old default branch names normalized to DEFAULT_BRANCH_ALIAS for BC as that is how Composer 1 outputs the lock file // when loading the lock file the version is anyway ignored in Composer 2, so it has no adverse effect - $aliases = array_map(function ($alias): array { + $aliases = array_map(static function ($alias): array { if (in_array($alias['version'], array('dev-master', 'dev-trunk', 'dev-default'), true)) { $alias['version'] = VersionParser::DEFAULT_BRANCH_ALIAS; } @@ -457,7 +457,7 @@ private function lockPackages(array $packages): array $locked[] = $spec; } - usort($locked, function ($a, $b) { + usort($locked, static function ($a, $b) { $comparison = strcmp($a['name'], $b['name']); if (0 !== $comparison) { diff --git a/src/Composer/Package/Version/VersionGuesser.php b/src/Composer/Package/Version/VersionGuesser.php index d768f3247c49..6532f14a5f9b 100644 --- a/src/Composer/Package/Version/VersionGuesser.php +++ b/src/Composer/Package/Version/VersionGuesser.php @@ -305,7 +305,7 @@ private function guessFeatureVersion(array $packageConfig, ?string $version, arr // sort local branches first then remote ones // and sort numeric branches below named ones, to make sure if the branch has the same distance from main and 1.10 and 1.9 for example, main is picked // and sort using natural sort so that 1.10 will appear before 1.9 - usort($branches, function ($a, $b): int { + usort($branches, static function ($a, $b): int { $aRemote = 0 === strpos($a, 'remotes/'); $bRemote = 0 === strpos($b, 'remotes/'); diff --git a/src/Composer/Package/Version/VersionSelector.php b/src/Composer/Package/Version/VersionSelector.php index f1cfeafc5efd..7f082c209951 100644 --- a/src/Composer/Package/Version/VersionSelector.php +++ b/src/Composer/Package/Version/VersionSelector.php @@ -87,7 +87,7 @@ public function findBestCandidate(string $packageName, string $targetPackageVers if ($this->platformConstraints && !($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter)) { $platformConstraints = $this->platformConstraints; - $candidates = array_filter($candidates, function ($pkg) use ($platformConstraints, $platformRequirementFilter): bool { + $candidates = array_filter($candidates, static function ($pkg) use ($platformConstraints, $platformRequirementFilter): bool { $reqs = $pkg->getRequires(); foreach ($reqs as $name => $link) { diff --git a/src/Composer/Question/StrictConfirmationQuestion.php b/src/Composer/Question/StrictConfirmationQuestion.php index b815675c6b6f..112e97733cea 100644 --- a/src/Composer/Question/StrictConfirmationQuestion.php +++ b/src/Composer/Question/StrictConfirmationQuestion.php @@ -59,7 +59,7 @@ private function getDefaultNormalizer(): callable $trueRegex = $this->trueAnswerRegex; $falseRegex = $this->falseAnswerRegex; - return function ($answer) use ($default, $trueRegex, $falseRegex) { + return static function ($answer) use ($default, $trueRegex, $falseRegex) { if (is_bool($answer)) { return $answer; } @@ -86,7 +86,7 @@ private function getDefaultNormalizer(): callable */ private function getDefaultValidator(): callable { - return function ($answer): bool { + return static function ($answer): bool { if (!is_bool($answer)) { throw new InvalidArgumentException('Please answer yes, y, no, or n.'); } diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 114d6388cad7..1c07f60ba2fd 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -356,7 +356,7 @@ public function getPackageNames(?string $packageFilter = null) * @param list $results * @return list */ - function (array $results): array { + static function (array $results): array { return $results; } ; @@ -367,7 +367,7 @@ function (array $results): array { * @param list $results * @return list */ - function (array $results) use ($packageFilterRegex): array { + static function (array $results) use ($packageFilterRegex): array { /** @var list $results */ return Preg::grep($packageFilterRegex, $results); } @@ -1104,7 +1104,7 @@ protected function loadRootServerFile(?int $rootMaxAge = null) // Disables lazy-provider behavior as with available-packages, but may allow much more compact expression of packages covered by this repository. // Over-specifying covered packages is safe, but may result in increased traffic to your repository. if (!empty($data['available-package-patterns'])) { - $this->availablePackagePatterns = array_map(function ($pattern): string { + $this->availablePackagePatterns = array_map(static function ($pattern): string { return BasePackage::packageNameToRegexp($pattern); }, $data['available-package-patterns']); $this->hasAvailablePackageList = true; diff --git a/src/Composer/Repository/CompositeRepository.php b/src/Composer/Repository/CompositeRepository.php index b9a247f0b3ad..3ae0aafbb908 100644 --- a/src/Composer/Repository/CompositeRepository.php +++ b/src/Composer/Repository/CompositeRepository.php @@ -42,7 +42,7 @@ public function __construct(array $repositories) public function getRepoName(): string { - return 'composite repo ('.implode(', ', array_map(function ($repo): string { + return 'composite repo ('.implode(', ', array_map(static function ($repo): string { return $repo->getRepoName(); }, $this->repositories)).')'; } diff --git a/src/Composer/Repository/FilesystemRepository.php b/src/Composer/Repository/FilesystemRepository.php index b811dbe79cb6..94e8ef9996d1 100644 --- a/src/Composer/Repository/FilesystemRepository.php +++ b/src/Composer/Repository/FilesystemRepository.php @@ -153,7 +153,7 @@ public function write(bool $devMode, InstallationManager $installationManager) } sort($data['dev-package-names']); - usort($data['packages'], function ($a, $b): int { + usort($data['packages'], static function ($a, $b): int { return strcmp($a['name'], $b['name']); }); diff --git a/src/Composer/Repository/InstalledRepository.php b/src/Composer/Repository/InstalledRepository.php index 2c3231a9d908..b418664a7d1d 100644 --- a/src/Composer/Repository/InstalledRepository.php +++ b/src/Composer/Repository/InstalledRepository.php @@ -251,7 +251,7 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, public function getRepoName(): string { - return 'installed repo ('.implode(', ', array_map(function ($repo): string { + return 'installed repo ('.implode(', ', array_map(static function ($repo): string { return $repo->getRepoName(); }, $this->getRepositories())).')'; } diff --git a/src/Composer/Repository/PathRepository.php b/src/Composer/Repository/PathRepository.php index 2a77a83db359..777cb2f109af 100644 --- a/src/Composer/Repository/PathRepository.php +++ b/src/Composer/Repository/PathRepository.php @@ -250,7 +250,7 @@ private function getUrlMatches(): array } // Ensure environment-specific path separators are normalized to URL separators - return array_map(function ($val): string { + return array_map(static function ($val): string { return rtrim(str_replace(DIRECTORY_SEPARATOR, '/', $val), '/'); }, glob($this->url, $flags)); } diff --git a/src/Composer/Repository/PlatformRepository.php b/src/Composer/Repository/PlatformRepository.php index abbe428c7910..22feb91d6c4e 100644 --- a/src/Composer/Repository/PlatformRepository.php +++ b/src/Composer/Repository/PlatformRepository.php @@ -369,7 +369,7 @@ protected function initialize(): void case 'libxml': // ext/dom, ext/simplexml, ext/xmlreader and ext/xmlwriter use the same libxml as the ext/libxml - $libxmlProvides = array_map(function ($extension): string { + $libxmlProvides = array_map(static function ($extension): string { return $extension . '-libxml'; }, array_intersect($loadedExtensions, array('dom', 'simplexml', 'xml', 'xmlreader', 'xmlwriter'))); $this->addLibrary($name, $this->runtime->getConstant('LIBXML_DOTTED_VERSION'), 'libxml library version', array(), $libxmlProvides); diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php index 71fc6b24175f..66650ce7b5dd 100644 --- a/src/Composer/Repository/Vcs/GitDriver.php +++ b/src/Composer/Repository/Vcs/GitDriver.php @@ -245,7 +245,7 @@ public static function supports(IOInterface $io, Config $config, string $url, bo GitUtil::cleanEnv(); try { - $gitUtil->runCommand(function ($url): string { + $gitUtil->runCommand(static function ($url): string { return 'git ls-remote --heads -- ' . ProcessExecutor::escape($url); }, $url, sys_get_temp_dir()); } catch (\RuntimeException $e) { diff --git a/src/Composer/Repository/Vcs/HgDriver.php b/src/Composer/Repository/Vcs/HgDriver.php index c448c21e249f..73ad1a2e3871 100644 --- a/src/Composer/Repository/Vcs/HgDriver.php +++ b/src/Composer/Repository/Vcs/HgDriver.php @@ -71,7 +71,7 @@ public function initialize(): void $fs->removeDirectory($this->repoDir); $repoDir = $this->repoDir; - $command = function ($url) use ($repoDir): string { + $command = static function ($url) use ($repoDir): string { return sprintf('hg clone --noupdate -- %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($repoDir)); }; diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index db41c694ff10..d36bd6111407 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -50,7 +50,7 @@ public function storeAuth(string $origin, $storeAuth): void } elseif ($storeAuth === 'prompt') { $answer = $this->io->askAndValidate( 'Do you want to store credentials for '.$origin.' in '.$configSource->getName().' ? [Yn] ', - function ($value): string { + static function ($value): string { $input = strtolower(substr(trim($value), 0, 1)); if (in_array($input, array('y','n'))) { return $input; diff --git a/src/Composer/Util/ErrorHandler.php b/src/Composer/Util/ErrorHandler.php index 5fa1a3dd309a..d918504fcdbb 100644 --- a/src/Composer/Util/ErrorHandler.php +++ b/src/Composer/Util/ErrorHandler.php @@ -58,7 +58,7 @@ public static function handle(int $level, string $message, string $file, int $li self::$io->writeError('Deprecation Notice: '.$message.' in '.$file.':'.$line.''); if (self::$io->isVerbose()) { self::$io->writeError('Stack trace:'); - self::$io->writeError(array_filter(array_map(function ($a): ?string { + self::$io->writeError(array_filter(array_map(static function ($a): ?string { if (isset($a['line'], $a['file'])) { return ' '.$a['file'].':'.$a['line'].''; } diff --git a/src/Composer/Util/Filesystem.php b/src/Composer/Util/Filesystem.php index 21ea5711590b..a04513cd64ec 100644 --- a/src/Composer/Util/Filesystem.php +++ b/src/Composer/Util/Filesystem.php @@ -603,7 +603,7 @@ public function normalizePath(string $path) } // ensure c: is normalized to C: - $prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', function (array $m) { return strtoupper($m[0]); }, $prefix); + $prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', static function (array $m) { return strtoupper($m[0]); }, $prefix); return $prefix.$absolute.implode('/', $parts); } diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php index 9348b109ee59..e3e34dd7afba 100644 --- a/src/Composer/Util/Git.php +++ b/src/Composer/Util/Git.php @@ -282,7 +282,7 @@ public function syncMirror(string $url, string $dir): bool // update the repo if it is a valid git repository if (is_dir($dir) && 0 === $this->process->execute('git rev-parse --git-dir', $output, $dir) && trim($output) === '.') { try { - $commandCallable = function ($url): string { + $commandCallable = static function ($url): string { $sanitizedUrl = Preg::replace('{://([^@]+?):(.+?)@}', '://', $url); return sprintf('git remote set-url origin -- %s && git remote update --prune origin && git remote set-url origin -- %s && git gc --auto', ProcessExecutor::escape($url), ProcessExecutor::escape($sanitizedUrl)); @@ -300,7 +300,7 @@ public function syncMirror(string $url, string $dir): bool // clean up directory and do a fresh clone into it $this->filesystem->removeDirectory($dir); - $commandCallable = function ($url) use ($dir): string { + $commandCallable = static function ($url) use ($dir): string { return sprintf('git clone --mirror -- %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($dir)); }; @@ -401,7 +401,7 @@ public function getMirrorDefaultBranch(string $url, string $dir, bool $isLocalPa if ($isLocalPathRepository) { $this->process->execute('git remote show origin', $output, $dir); } else { - $commandCallable = function ($url): string { + $commandCallable = static function ($url): string { $sanitizedUrl = Preg::replace('{://([^@]+?):(.+?)@}', '://', $url); return sprintf('git remote set-url origin -- %s && git remote show origin && git remote set-url origin -- %s', ProcessExecutor::escape($url), ProcessExecutor::escape($sanitizedUrl)); diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 3799074f19c5..ffb04e6f835e 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -182,7 +182,7 @@ private function initDownload(callable $resolve, callable $reject, string $origi if ($copyTo) { $errorMessage = ''; // @phpstan-ignore-next-line - set_error_handler(function ($code, $msg) use (&$errorMessage): void { + set_error_handler(static function ($code, $msg) use (&$errorMessage): void { if ($errorMessage) { $errorMessage .= "\n"; } diff --git a/src/Composer/Util/HttpDownloader.php b/src/Composer/Util/HttpDownloader.php index 581e17226a26..68f2110858e9 100644 --- a/src/Composer/Util/HttpDownloader.php +++ b/src/Composer/Util/HttpDownloader.php @@ -214,13 +214,13 @@ private function addJob(array $request, bool $sync = false): array $rfs = $this->rfs; if ($this->canUseCurl($job)) { - $resolver = function ($resolve, $reject) use (&$job): void { + $resolver = static function ($resolve, $reject) use (&$job): void { $job['status'] = HttpDownloader::STATUS_QUEUED; $job['resolve'] = $resolve; $job['reject'] = $reject; }; } else { - $resolver = function ($resolve, $reject) use (&$job, $rfs): void { + $resolver = static function ($resolve, $reject) use (&$job, $rfs): void { // start job $url = $job['request']['url']; $options = $job['request']['options']; @@ -246,7 +246,7 @@ private function addJob(array $request, bool $sync = false): array $curl = $this->curl; - $canceler = function () use (&$job, $curl): void { + $canceler = static function () use (&$job, $curl): void { if ($job['status'] === HttpDownloader::STATUS_QUEUED) { $job['status'] = HttpDownloader::STATUS_ABORTED; } @@ -428,7 +428,7 @@ private function getResponse(int $index): Response */ public static function outputWarnings(IOInterface $io, string $url, $data): void { - $cleanMessage = function ($msg) use ($io) { + $cleanMessage = static function ($msg) use ($io) { if (!$io->isDecorated()) { $msg = Preg::replace('{'.chr(27).'\\[[;\d]*m}u', '', $msg); } diff --git a/src/Composer/Util/Loop.php b/src/Composer/Util/Loop.php index cc4d08c9f453..1ea0bdeb6637 100644 --- a/src/Composer/Util/Loop.php +++ b/src/Composer/Util/Loop.php @@ -68,9 +68,9 @@ public function wait(array $promises, ProgressBar $progress = null): void $uncaught = null; \React\Promise\all($promises)->then( - function (): void { + static function (): void { }, - function ($e) use (&$uncaught): void { + static function ($e) use (&$uncaught): void { $uncaught = $e; } ); diff --git a/src/Composer/Util/PackageSorter.php b/src/Composer/Util/PackageSorter.php index 69d2afb63e84..8032f732bf70 100644 --- a/src/Composer/Util/PackageSorter.php +++ b/src/Composer/Util/PackageSorter.php @@ -42,7 +42,7 @@ public static function sortPackages(array $packages, array $weights = array()): } $computing = array(); $computed = array(); - $computeImportance = function ($name) use (&$computeImportance, &$computing, &$computed, $usageList, $weights) { + $computeImportance = static function ($name) use (&$computeImportance, &$computing, &$computed, $usageList, $weights) { // reusing computed importance if (isset($computed[$name])) { return $computed[$name]; @@ -76,7 +76,7 @@ public static function sortPackages(array $packages, array $weights = array()): $weightedPackages[] = array('name' => $name, 'weight' => $weight, 'index' => $index); } - usort($weightedPackages, function (array $a, array $b): int { + usort($weightedPackages, static function (array $a, array $b): int { if ($a['weight'] !== $b['weight']) { return $a['weight'] - $b['weight']; } diff --git a/src/Composer/Util/Platform.php b/src/Composer/Util/Platform.php index f7b1129b7a39..9c48e670aafc 100644 --- a/src/Composer/Util/Platform.php +++ b/src/Composer/Util/Platform.php @@ -108,7 +108,7 @@ public static function expandPath(string $path): string return self::getUserDirectory() . substr($path, 1); } - return Preg::replaceCallback('#^(\$|(?P%))(?P\w++)(?(percent)%)(?P.*)#', function ($matches): string { + return Preg::replaceCallback('#^(\$|(?P%))(?P\w++)(?(percent)%)(?P.*)#', static function ($matches): string { // Treat HOME as an alias for USERPROFILE on Windows for legacy reasons if (Platform::isWindows() && $matches['var'] == 'HOME') { return (Platform::getEnv('HOME') ?: Platform::getEnv('USERPROFILE')) . $matches['path']; diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 2bcd0b0a483f..768acbc217ff 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -156,13 +156,13 @@ public function executeAsync($command, ?string $cwd = null): PromiseInterface 'cwd' => $cwd, ); - $resolver = function ($resolve, $reject) use (&$job): void { + $resolver = static function ($resolve, $reject) use (&$job): void { $job['status'] = ProcessExecutor::STATUS_QUEUED; $job['resolve'] = $resolve; $job['reject'] = $reject; }; - $canceler = function () use (&$job): void { + $canceler = static function () use (&$job): void { if ($job['status'] === ProcessExecutor::STATUS_QUEUED) { $job['status'] = ProcessExecutor::STATUS_ABORTED; } @@ -412,7 +412,7 @@ private function outputCommandRun($command, ?string $cwd, bool $async): void } $commandString = is_string($command) ? $command : implode(' ', array_map(self::class.'::escape', $command)); - $safeCommand = Preg::replaceCallback('{://(?P[^:/\s]+):(?P[^@\s/]+)@}i', function ($m): string { + $safeCommand = Preg::replaceCallback('{://(?P[^:/\s]+):(?P[^@\s/]+)@}i', static function ($m): string { // if the username looks like a long (12char+) hex string, or a modern github token (e.g. ghp_xxx) we obfuscate that if (Preg::isMatch('{^([a-f0-9]{12,}|gh[a-z]_[a-zA-Z0-9_]+)$}', $m['user'])) { return '://***:***@'; diff --git a/src/Composer/Util/RemoteFilesystem.php b/src/Composer/Util/RemoteFilesystem.php index 00c68f629e6d..0585beeea68e 100644 --- a/src/Composer/Util/RemoteFilesystem.php +++ b/src/Composer/Util/RemoteFilesystem.php @@ -290,7 +290,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti $errorMessage = ''; $errorCode = 0; $result = false; - set_error_handler(function ($code, $msg) use (&$errorMessage): bool { + set_error_handler(static function ($code, $msg) use (&$errorMessage): bool { if ($errorMessage) { $errorMessage .= "\n"; } @@ -445,7 +445,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti } $errorMessage = ''; - set_error_handler(function ($code, $msg) use (&$errorMessage): bool { + set_error_handler(static function ($code, $msg) use (&$errorMessage): bool { if ($errorMessage) { $errorMessage .= "\n"; } diff --git a/src/Composer/Util/StreamContextFactory.php b/src/Composer/Util/StreamContextFactory.php index 99a5d96c254d..c905df4f81fa 100644 --- a/src/Composer/Util/StreamContextFactory.php +++ b/src/Composer/Util/StreamContextFactory.php @@ -245,7 +245,7 @@ private static function fixHttpHeaderField($header): array if (!is_array($header)) { $header = explode("\r\n", $header); } - uasort($header, function ($el): int { + uasort($header, static function ($el): int { return stripos($el, 'content-type') === 0 ? 1 : -1; }); diff --git a/src/Composer/Util/Svn.php b/src/Composer/Util/Svn.php index db5950696cb2..d385ccb74bf1 100644 --- a/src/Composer/Util/Svn.php +++ b/src/Composer/Util/Svn.php @@ -138,7 +138,7 @@ private function executeWithAuthRetry(string $svnCommand, ?string $cwd, string $ $output = null; $io = $this->io; - $handler = function ($type, $buffer) use (&$output, $io, $verbose) { + $handler = static function ($type, $buffer) use (&$output, $io, $verbose) { if ($type !== 'out') { return null; } diff --git a/src/Composer/Util/TlsHelper.php b/src/Composer/Util/TlsHelper.php index 95f94887f956..8de4dc83695b 100644 --- a/src/Composer/Util/TlsHelper.php +++ b/src/Composer/Util/TlsHelper.php @@ -78,7 +78,7 @@ public static function getCertificateNames($certificate): ?array if (isset($info['extensions']['subjectAltName'])) { $subjectAltNames = Preg::split('{\s*,\s*}', $info['extensions']['subjectAltName']); - $subjectAltNames = array_filter(array_map(function ($name): ?string { + $subjectAltNames = array_filter(array_map(static function ($name): ?string { if (0 === strpos($name, 'DNS:')) { return strtolower(ltrim(substr($name, 4))); } @@ -179,7 +179,7 @@ private static function certNameMatcher(string $certName): ?callable if (0 === $wildcards) { // Literal match. - return function ($hostname) use ($certName): bool { + return static function ($hostname) use ($certName): bool { return $hostname === $certName; }; } @@ -203,7 +203,7 @@ private static function certNameMatcher(string $certName): ?callable $wildcardRegex = str_replace('\\*', '[a-z0-9-]+', $wildcardRegex); $wildcardRegex = "{^{$wildcardRegex}$}"; - return function ($hostname) use ($wildcardRegex): bool { + return static function ($hostname) use ($wildcardRegex): bool { return Preg::isMatch($wildcardRegex, $hostname); }; } diff --git a/src/Composer/Util/Url.php b/src/Composer/Util/Url.php index 04c006560f9d..b98178505609 100644 --- a/src/Composer/Util/Url.php +++ b/src/Composer/Util/Url.php @@ -113,7 +113,7 @@ public static function sanitize(string $url): string // e.g. https://api.github.com/repositories/9999999999?access_token=github_token $url = Preg::replace('{([&?]access_token=)[^&]+}', '$1***', $url); - $url = Preg::replaceCallback('{^(?P[a-z0-9]+://)?(?P[^:/\s@]+):(?P[^@\s/]+)@}i', function ($m): string { + $url = Preg::replaceCallback('{^(?P[a-z0-9]+://)?(?P[^:/\s@]+):(?P[^@\s/]+)@}i', static function ($m): string { // if the username looks like a long (12char+) hex string, or a modern github token (e.g. ghp_xxx) we obfuscate that if (Preg::isMatch('{^([a-f0-9]{12,}|gh[a-z]_[a-zA-Z0-9_]+)$}', $m['user'])) { return $m['prefix'].'***:***@'; From d17c724f2323d16a38c2cbd4cdbb271f0febb1f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Reker=20=E2=9A=A1=EF=B8=8F?= Date: Wed, 22 Jun 2022 14:20:08 +0200 Subject: [PATCH 143/618] Php unit dedicate assert (#10881) Co-authored-by: Jordi Boggiano --- .../Test/Autoload/AutoloadGeneratorTest.php | 2 +- tests/Composer/Test/IO/NullIOTest.php | 2 +- .../Repository/CompositeRepositoryTest.php | 2 +- tests/Composer/Test/Util/FilesystemTest.php | 32 +++++++++---------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index f74f2d6b0aa9..9129b9e68c92 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -1820,7 +1820,7 @@ public function testGeneratesPlatformCheck(array $requires, ?string $expectedFix $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_1'); if (null === $expectedFixture) { - $this->assertFalse(file_exists($this->vendorDir . '/composer/platform_check.php')); + $this->assertFileDoesNotExist($this->vendorDir . '/composer/platform_check.php'); $this->assertStringNotContainsString("require __DIR__ . '/platform_check.php';", (string) file_get_contents($this->vendorDir.'/composer/autoload_real.php')); } else { $this->assertFileContentEquals(__DIR__ . '/Fixtures/platform/' . $expectedFixture . '.php', $this->vendorDir . '/composer/platform_check.php'); diff --git a/tests/Composer/Test/IO/NullIOTest.php b/tests/Composer/Test/IO/NullIOTest.php index d43c891fef7e..c9e02af37123 100644 --- a/tests/Composer/Test/IO/NullIOTest.php +++ b/tests/Composer/Test/IO/NullIOTest.php @@ -42,7 +42,7 @@ public function testgetAuthentications(): void { $io = new NullIO(); - $this->assertTrue(is_array($io->getAuthentications())); // @phpstan-ignore-line + $this->assertIsArray($io->getAuthentications()); // @phpstan-ignore-line $this->assertEmpty($io->getAuthentications()); $this->assertEquals(array('username' => null, 'password' => null), $io->getAuthentication('foo')); } diff --git a/tests/Composer/Test/Repository/CompositeRepositoryTest.php b/tests/Composer/Test/Repository/CompositeRepositoryTest.php index ca123a3b3e96..949a9234ea74 100644 --- a/tests/Composer/Test/Repository/CompositeRepositoryTest.php +++ b/tests/Composer/Test/Repository/CompositeRepositoryTest.php @@ -123,7 +123,7 @@ public function testCount(): void $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); - $this->assertEquals(2, count($repo), "Should return '2' for count(\$repo)"); + $this->assertCount(2, $repo, "Should return '2' for count(\$repo)"); } /** diff --git a/tests/Composer/Test/Util/FilesystemTest.php b/tests/Composer/Test/Util/FilesystemTest.php index abb5d1b4813f..dc34eccae58c 100644 --- a/tests/Composer/Test/Util/FilesystemTest.php +++ b/tests/Composer/Test/Util/FilesystemTest.php @@ -324,9 +324,9 @@ public function testJunctions(): void $this->assertTrue($fs->isJunction($junction . '/../junction'), $junction . '/../junction: is a junction'); // Remove junction - $this->assertTrue(is_dir($junction), $junction . ' is a directory'); + $this->assertDirectoryExists($junction, $junction . ' is a directory'); $this->assertTrue($fs->removeJunction($junction), $junction . ' has been removed'); - $this->assertFalse(is_dir($junction), $junction . ' is not a directory'); + $this->assertDirectoryDoesNotExist($junction, $junction . ' is not a directory'); } public function testCopy(): void @@ -342,16 +342,16 @@ public function testCopy(): void $result1 = $fs->copy($this->workingDir . '/foo', $this->workingDir . '/foop'); $this->assertTrue($result1, 'Copying directory failed.'); - $this->assertTrue(is_dir($this->workingDir . '/foop'), 'Not a directory: ' . $this->workingDir . '/foop'); - $this->assertTrue(is_dir($this->workingDir . '/foop/bar'), 'Not a directory: ' . $this->workingDir . '/foop/bar'); - $this->assertTrue(is_dir($this->workingDir . '/foop/baz'), 'Not a directory: ' . $this->workingDir . '/foop/baz'); - $this->assertTrue(is_file($this->workingDir . '/foop/foo.file'), 'Not a file: ' . $this->workingDir . '/foop/foo.file'); - $this->assertTrue(is_file($this->workingDir . '/foop/bar/foobar.file'), 'Not a file: ' . $this->workingDir . '/foop/bar/foobar.file'); - $this->assertTrue(is_file($this->workingDir . '/foop/baz/foobaz.file'), 'Not a file: ' . $this->workingDir . '/foop/baz/foobaz.file'); + $this->assertDirectoryExists($this->workingDir . '/foop', 'Not a directory: ' . $this->workingDir . '/foop'); + $this->assertDirectoryExists($this->workingDir . '/foop/bar', 'Not a directory: ' . $this->workingDir . '/foop/bar'); + $this->assertDirectoryExists($this->workingDir . '/foop/baz', 'Not a directory: ' . $this->workingDir . '/foop/baz'); + $this->assertFileExists($this->workingDir . '/foop/foo.file', 'Not a file: ' . $this->workingDir . '/foop/foo.file'); + $this->assertFileExists($this->workingDir . '/foop/bar/foobar.file', 'Not a file: ' . $this->workingDir . '/foop/bar/foobar.file'); + $this->assertFileExists($this->workingDir . '/foop/baz/foobaz.file', 'Not a file: ' . $this->workingDir . '/foop/baz/foobaz.file'); $result2 = $fs->copy($this->testFile, $this->workingDir . '/testfile.file'); $this->assertTrue($result2); - $this->assertTrue(is_file($this->workingDir . '/testfile.file')); + $this->assertFileExists($this->workingDir . '/testfile.file'); } public function testCopyThenRemove(): void @@ -366,14 +366,14 @@ public function testCopyThenRemove(): void $fs = new Filesystem(); $fs->copyThenRemove($this->testFile, $this->workingDir . '/testfile.file'); - $this->assertFalse(is_file($this->testFile), 'Still a file: ' . $this->testFile); + $this->assertFileDoesNotExist($this->testFile, 'Still a file: ' . $this->testFile); $fs->copyThenRemove($this->workingDir . '/foo', $this->workingDir . '/foop'); - $this->assertFalse(is_file($this->workingDir . '/foo/baz/foobaz.file'), 'Still a file: ' . $this->workingDir . '/foo/baz/foobaz.file'); - $this->assertFalse(is_file($this->workingDir . '/foo/bar/foobar.file'), 'Still a file: ' . $this->workingDir . '/foo/bar/foobar.file'); - $this->assertFalse(is_file($this->workingDir . '/foo/foo.file'), 'Still a file: ' . $this->workingDir . '/foo/foo.file'); - $this->assertFalse(is_dir($this->workingDir . '/foo/baz'), 'Still a directory: ' . $this->workingDir . '/foo/baz'); - $this->assertFalse(is_dir($this->workingDir . '/foo/bar'), 'Still a directory: ' . $this->workingDir . '/foo/bar'); - $this->assertFalse(is_dir($this->workingDir . '/foo'), 'Still a directory: ' . $this->workingDir . '/foo'); + $this->assertFileDoesNotExist($this->workingDir . '/foo/baz/foobaz.file', 'Still a file: ' . $this->workingDir . '/foo/baz/foobaz.file'); + $this->assertFileDoesNotExist($this->workingDir . '/foo/bar/foobar.file', 'Still a file: ' . $this->workingDir . '/foo/bar/foobar.file'); + $this->assertFileDoesNotExist($this->workingDir . '/foo/foo.file', 'Still a file: ' . $this->workingDir . '/foo/foo.file'); + $this->assertDirectoryDoesNotExist($this->workingDir . '/foo/baz', 'Still a directory: ' . $this->workingDir . '/foo/baz'); + $this->assertDirectoryDoesNotExist($this->workingDir . '/foo/bar', 'Still a directory: ' . $this->workingDir . '/foo/bar'); + $this->assertDirectoryDoesNotExist($this->workingDir . '/foo', 'Still a directory: ' . $this->workingDir . '/foo'); } } From d93239ddd9e6c18a2f7db3cdf94213dd892fa950 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Wed, 22 Jun 2022 15:14:00 +0200 Subject: [PATCH 144/618] Add audit command to check for security issues (#10798) Closes #10329 --- doc/03-cli.md | 27 ++ phpstan/baseline.neon | 5 + src/Composer/Command/AuditCommand.php | 102 +++++ src/Composer/Command/CreateProjectCommand.php | 7 +- src/Composer/Command/InstallCommand.php | 5 + src/Composer/Command/RemoveCommand.php | 5 + src/Composer/Command/RequireCommand.php | 5 + src/Composer/Command/UpdateCommand.php | 5 + src/Composer/Console/Application.php | 1 + src/Composer/IO/ConsoleIO.php | 9 + src/Composer/Installer.php | 54 ++- src/Composer/Util/Auditor.php | 245 +++++++++++ .../Test/Command/UpdateCommandTest.php | 2 +- tests/Composer/Test/InstallerTest.php | 7 +- tests/Composer/Test/Util/AuditorTest.php | 399 ++++++++++++++++++ 15 files changed, 873 insertions(+), 5 deletions(-) create mode 100644 src/Composer/Command/AuditCommand.php create mode 100644 src/Composer/Util/Auditor.php create mode 100644 tests/Composer/Test/Util/AuditorTest.php diff --git a/doc/03-cli.md b/doc/03-cli.md index 039e6a8bd854..494bfa96536a 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -109,6 +109,8 @@ resolution. * **--no-autoloader:** Skips autoloader generation. * **--no-progress:** Removes the progress display that can mess with some terminals or scripts which don't handle backspace characters. +* **--no-audit:** Does not run the audit step after installation is complete. +* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). * **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but can take a bit of time to run so it is currently not done by default. @@ -188,6 +190,8 @@ and this feature is only available for your root package dependencies. * **--dev:** Install packages listed in `require-dev` (this is the default behavior). * **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader generation skips the `autoload-dev` rules. * **--no-install:** Does not run the install step after updating the composer.lock file. +* **--no-audit:** Does not run the audit steps after updating the composer.lock file. +* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). * **--lock:** Only updates the lock file hash to suppress warning about the lock file being out of date. * **--with:** Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 @@ -259,6 +263,8 @@ If you do not specify a package, Composer will prompt you to search for a packag terminals or scripts which don't handle backspace characters. * **--no-update:** Disables the automatic update of the dependencies (implies --no-install). * **--no-install:** Does not run the install step after updating the composer.lock file. +* **--no-audit:** Does not run the audit steps after updating the composer.lock file. +* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). * **--update-no-dev:** Run the dependency update with the `--no-dev` option. * **--update-with-dependencies (-w):** Also update dependencies of the newly required packages, except those that are root requirements. * **--update-with-all-dependencies (-W):** Also update dependencies of the newly required packages, including those that are root requirements. @@ -301,6 +307,8 @@ uninstalled. terminals or scripts which don't handle backspace characters. * **--no-update:** Disables the automatic update of the dependencies (implies --no-install). * **--no-install:** Does not run the install step after updating the composer.lock file. +* **--no-audit:** Does not run the audit steps after installation is complete. +* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). * **--update-no-dev:** Run the dependency update with the --no-dev option. * **--update-with-dependencies (-w):** Also update dependencies of the removed packages. (Deprecated, is now default behavior) @@ -880,6 +888,8 @@ By default the command checks for the packages on packagist.org. mode. * **--remove-vcs:** Force-remove the VCS metadata without prompting. * **--no-install:** Disables installation of the vendors. +* **--no-audit:** Does not run the audit steps after installation is complete. +* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). * **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine does not fulfill these. @@ -991,6 +1001,23 @@ php composer.phar archive vendor/package 2.0.21 --format=zip * **--dir:** Write the archive to this directory (default: ".") * **--file:** Write the archive with the given file name. +## audit + +This command is used to audit the packages you have installed +for possible security issues. Currently this only checks for and +lists security vulnerability advisories according to the +[Packagist.org api](https://packagist.org/apidoc#list-security-advisories). + +```sh +php composer.phar audit +``` + +### Options + +* **--no-dev:** Disables auditing of require-dev packages. +* **--format (-f):** Audit output format. Must be "table" (default), "plain", or "summary". +* **--locked:** Audit packages from the lock file, regardless of what is currently in vendor dir. + ## help To get more information about a certain command, you can use `help`. diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 6a7c6d188cfa..5538f5f70aab 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -4518,6 +4518,11 @@ parameters: count: 1 path: ../src/Composer/SelfUpdate/Versions.php + - + message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" + count: 1 + path: src/Composer/Util/Auditor.php + - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" count: 1 diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php new file mode 100644 index 000000000000..e9770eb1ce42 --- /dev/null +++ b/src/Composer/Command/AuditCommand.php @@ -0,0 +1,102 @@ +setName('audit') + ->setDescription('Checks for security vulnerability advisories for installed packages.') + ->setDefinition(array( + new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables auditing of require-dev packages.'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_TABLE, Auditor::FORMATS), + new InputOption('locked', null, InputOption::VALUE_NONE, 'Audit based on the lock file instead of the installed packages.'), + )) + ->setHelp( + <<audit command checks for security vulnerability advisories for installed packages. + +If you do not want to include dev dependencies in the audit you can omit them with --no-dev + +Read more at https://getcomposer.org/doc/03-cli.md#audit +EOT + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $composer = $this->requireComposer(); + $packages = $this->getPackages($composer, $input); + $httpDownloader = $composer->getLoop()->getHttpDownloader(); + + if (count($packages) === 0) { + $this->getIO()->writeError('No packages - skipping audit.'); + return 0; + } + + $auditor = new Auditor($httpDownloader); + return $auditor->audit($this->getIO(), $packages, $input->getOption('format'), false); + } + + /** + * @param InputInterface $input + * @return PackageInterface[] + */ + private function getPackages(Composer $composer, InputInterface $input): array + { + if ($input->getOption('locked')) { + if (!$composer->getLocker()->isLocked()) { + throw new \UnexpectedValueException('Valid composer.json and composer.lock files are required to run this command with --locked'); + } + $locker = $composer->getLocker(); + return $locker->getLockedRepository(!$input->getOption('no-dev'))->getPackages(); + } + + $rootPkg = $composer->getPackage(); + $installedRepo = new InstalledRepository(array($composer->getRepositoryManager()->getLocalRepository())); + + if ($input->getOption('no-dev')) { + return $this->filterRequiredPackages($installedRepo, $rootPkg); + } + + return $installedRepo->getPackages(); + } + + /** + * Find package requires and child requires. + * Effectively filters out dev dependencies. + * + * @param PackageInterface[] $bucket + * @return PackageInterface[] + */ + private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, array $bucket = array()): array + { + $requires = $package->getRequires(); + + foreach ($repo->getPackages() as $candidate) { + foreach ($candidate->getNames() as $name) { + if (isset($requires[$name])) { + if (!in_array($candidate, $bucket, true)) { + $bucket[] = $candidate; + $bucket = $this->filterRequiredPackages($repo, $candidate, $bucket); + } + break; + } + } + } + + return $bucket; + } +} diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index a895c54945ad..0a765727175b 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -44,6 +44,7 @@ use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Package\Version\VersionParser; +use Composer\Util\Auditor; /** * Install a package as new project into new directory. @@ -90,6 +91,8 @@ protected function configure(): void new InputOption('keep-vcs', null, InputOption::VALUE_NONE, 'Whether to prevent deleting the vcs folder.'), new InputOption('remove-vcs', null, InputOption::VALUE_NONE, 'Whether to force deletion of the vcs folder without prompting.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Whether to skip installation of the package dependencies.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Whether to skip auditing of the installed package dependencies.'), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('ask', null, InputOption::VALUE_NONE, 'Whether to ask for project directory.'), @@ -259,7 +262,9 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ ->setSuggestedPackagesReporter($this->suggestedPackagesReporter) ->setOptimizeAutoloader($config->get('optimize-autoloader')) ->setClassMapAuthoritative($config->get('classmap-authoritative')) - ->setApcuAutoloader($config->get('apcu-autoloader')); + ->setApcuAutoloader($config->get('apcu-autoloader')) + ->setAudit(!$input->getOption('no-audit')) + ->setAuditFormat($input->getOption('audit-format')); if (!$composer->getLocker()->isLocked()) { $installer->setUpdate(true); diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 6e27a5815b3a..d707ecbb424f 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -15,6 +15,7 @@ use Composer\Installer; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; +use Composer\Util\Auditor; use Composer\Util\HttpDownloader; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; @@ -51,6 +52,8 @@ protected function configure() new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Do not use, only defined here to catch misuse of the install command.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after installation is complete.'), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), @@ -130,6 +133,8 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setClassMapAuthoritative($authoritative) ->setApcuAutoloader($apcu, $apcuPrefix) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) + ->setAudit(!$input->getOption('no-audit')) + ->setAuditFormat($input->getOption('audit-format')) ; if ($input->getOption('no-plugins')) { diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index e64125cfa0ae..5cb509b9256f 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -25,6 +25,7 @@ use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Composer\Package\BasePackage; +use Composer\Util\Auditor; /** * @author Pierre du Plessis @@ -49,6 +50,8 @@ protected function configure() new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated with explicit dependencies. (Deprecrated, is now default behavior)'), new InputOption('update-with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements.'), @@ -282,6 +285,8 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setUpdateAllowTransitiveDependencies($updateAllowTransitiveDependencies) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) ->setDryRun($dryRun) + ->setAudit(!$input->getOption('no-audit')) + ->setAuditFormat($input->getOption('audit-format')) ; // if no lock is present, we do not do a partial update as diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index a04bb0c08044..9b2ae44c78ed 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -31,6 +31,7 @@ use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\IO\IOInterface; +use Composer\Util\Auditor; use Composer\Util\Silencer; /** @@ -79,6 +80,8 @@ protected function configure() new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated, except those that are root requirements.'), new InputOption('update-with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements.'), @@ -415,6 +418,8 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) + ->setAudit(!$input->getOption('no-audit')) + ->setAuditFormat($input->getOption('audit-format')) ; // if no lock is present, or the file is brand new, we do not do a diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 1676f2c71987..94092609e277 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -25,6 +25,7 @@ use Composer\Util\HttpDownloader; use Composer\Semver\Constraint\MultiConstraint; use Composer\Package\Link; +use Composer\Util\Auditor; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; @@ -60,6 +61,8 @@ protected function configure() new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Overwrites the lock file hash to suppress warning about the lock file being out of date without updating package versions. Package metadata like mirrors and URLs are updated if they changed.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), @@ -229,6 +232,8 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) ->setTemporaryConstraints($temporaryConstraints) + ->setAudit(!$input->getOption('no-audit')) + ->setAuditFormat($input->getOption('audit-format')) ; if ($input->getOption('no-plugins')) { diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index be16570b4c40..d1b304535f5a 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -529,6 +529,7 @@ protected function getDefaultCommands(): array new Command\UpdateCommand(), new Command\SearchCommand(), new Command\ValidateCommand(), + new Command\AuditCommand(), new Command\ShowCommand(), new Command\SuggestsCommand(), new Command\RequireCommand(), diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 508a34e8be1d..5ad647a20ab7 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -15,6 +15,7 @@ use Composer\Question\StrictConfirmationQuestion; use Symfony\Component\Console\Helper\HelperSet; use Symfony\Component\Console\Helper\ProgressBar; +use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -342,6 +343,14 @@ public function select($question, $choices, $default, $attempts = false, $errorM return $results; } + /** + * @return Table + */ + public function getTable(): Table + { + return new Table($this->output); + } + /** * @return OutputInterface */ diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 3ea52508e00c..36825de3642d 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -27,6 +27,7 @@ use Composer\DependencyResolver\SolverProblemsException; use Composer\DependencyResolver\PolicyInterface; use Composer\Downloader\DownloadManager; +use Composer\Downloader\TransportException; use Composer\EventDispatcher\EventDispatcher; use Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; @@ -61,6 +62,7 @@ use Composer\Repository\LockArrayRepository; use Composer\Script\ScriptEvents; use Composer\Semver\Constraint\ConstraintInterface; +use Composer\Util\Auditor; use Composer\Util\Platform; /** @@ -163,6 +165,10 @@ class Installer protected $writeLock; /** @var bool */ protected $executeOperations = true; + /** @var bool */ + protected $audit = true; + /** @var string */ + protected $auditFormat = Auditor::FORMAT_TABLE; /** @var bool */ protected $updateMirrors = false; @@ -381,6 +387,23 @@ public function run(): int gc_enable(); } + if ($this->audit) { + $packages = $localRepo->getCanonicalPackages(); + if (count($packages) > 0) { + try { + $auditor = new Auditor(Factory::createHttpDownloader($this->io, $this->config)); + $auditor->audit($this->io, $packages, $this->auditFormat); + } catch (TransportException $e) { + $this->io->error('Failed to audit installed packages.'); + if ($this->io->isVerbose()) { + $this->io->error($e->getMessage()); + } + } + } else { + $this->io->writeError('No packages - skipping audit.'); + } + } + return 0; } @@ -1071,10 +1094,13 @@ public function setAdditionalFixedRepository(RepositoryInterface $additionalFixe /** * @param array $constraints + * @return Installer */ - public function setTemporaryConstraints(array $constraints): void + public function setTemporaryConstraints(array $constraints): self { $this->temporaryConstraints = $constraints; + + return $this; } /** @@ -1418,6 +1444,32 @@ public function setExecuteOperations(bool $executeOperations = true): self return $this; } + /** + * Should an audit be run after installation is complete? + * + * @param boolean $audit + * @return Installer + */ + public function setAudit(bool $audit): self + { + $this->audit = $audit; + + return $this; + } + + /** + * What format should be used for audit output? + * + * @param string $auditFormat + * @return Installer + */ + public function setAuditFormat(string $auditFormat): self + { + $this->auditFormat = $auditFormat; + + return $this; + } + /** * Disables plugins. * diff --git a/src/Composer/Util/Auditor.php b/src/Composer/Util/Auditor.php new file mode 100644 index 000000000000..7b3cb071562b --- /dev/null +++ b/src/Composer/Util/Auditor.php @@ -0,0 +1,245 @@ +httpDownloader = $httpDownloader; + } + + /** + * @param IOInterface $io + * @param PackageInterface[] $packages + * @param self::FORMAT_* $format The format that will be used to output audit results. + * @param bool $warningOnly If true, outputs a warning. If false, outputs an error. + * @return int + * @throws InvalidArgumentException If no packages are passed in + */ + public function audit(IOInterface $io, array $packages, string $format, bool $warningOnly = true): int + { + $advisories = $this->getAdvisories($packages); + $errorOrWarn = $warningOnly ? 'warning' : 'error'; + if (count($advisories) > 0) { + $numAdvisories = $this->countAdvisories($advisories); + $plurality = $numAdvisories === 1 ? 'y' : 'ies'; + $io->writeError("<$errorOrWarn>Found $numAdvisories security vulnerability advisor$plurality:"); + $this->outputAdvisories($io, $advisories, $format); + return 1; + } + $io->writeError('No security vulnerability advisories found'); + return 0; + } + + /** + * Get advisories from packagist.org + * + * @param PackageInterface[] $packages + * @param ?int $updatedSince Timestamp + * @param bool $filterByVersion Filter by the package versions if true + * @return string[][][] + * @throws InvalidArgumentException If no packages and no updatedSince timestamp are passed in + */ + public function getAdvisories(array $packages = [], int $updatedSince = null, bool $filterByVersion = true): array + { + if (count($packages) === 0 && $updatedSince === null) { + throw new InvalidArgumentException( + 'At least one package or an $updatedSince timestamp must be passed in.' + ); + } + + if (count($packages) === 0 && $filterByVersion) { + return []; + } + + // Add updatedSince query to URL if passed in + $url = self::API_URL; + if ($updatedSince !== null) { + $url .= "?updatedSince=$updatedSince"; + } + + // Get advisories from API + $response = $this->httpDownloader->get($url, $this->createPostOptions($packages)); + $advisories = $response->decodeJson()['advisories']; + + if (count($advisories) > 0 && $filterByVersion) { + return $this->filterAdvisories($advisories, $packages); + } + + return $advisories; + } + + /** + * @param PackageInterface[] $packages + * @return string[] + * @phpstan-return array|int|string>> + */ + private function createPostOptions(array $packages): array + { + $options = [ + 'http' => [ + 'method' => 'POST', + 'header' => ['Content-type: application/x-www-form-urlencoded'], + 'timeout' => 10, + ], + ]; + if (count($packages) > 0) { + $content = ['packages' => []]; + foreach ($packages as $package) { + $content['packages'][] = $package->getName(); + } + $options['http']['content'] = http_build_query($content); + } + return $options; + } + + /** + * @param string[][][] $advisories + * @param PackageInterface[] $packages + * @return string[][][] + */ + private function filterAdvisories(array $advisories, array $packages): array + { + $filteredAdvisories = []; + foreach ($packages as $package) { + if (array_key_exists($package->getName(), $advisories)) { + foreach ($advisories[$package->getName()] as $advisory) { + if (Semver::satisfies($package->getVersion(), $advisory['affectedVersions'])) { + $filteredAdvisories[$package->getName()][] = $advisory; + } + } + } + } + return $filteredAdvisories; + } + + /** + * @param string[][][] $advisories + * @return integer + */ + private function countAdvisories(array $advisories): int + { + $count = 0; + foreach ($advisories as $packageAdvisories) { + $count += count($packageAdvisories); + } + return $count; + } + + /** + * @param IOInterface $io + * @param string[][][] $advisories + * @param self::FORMAT_* $format The format that will be used to output audit results. + * @return void + */ + private function outputAdvisories(IOInterface $io, array $advisories, string $format): void + { + switch ($format) { + case self::FORMAT_TABLE: + if (!($io instanceof ConsoleIO)) { + throw new InvalidArgumentException('Cannot use table format with ' . get_class($io)); + } + $this->outputAvisoriesTable($io, $advisories); + return; + case self::FORMAT_PLAIN: + $this->outputAdvisoriesPlain($io, $advisories); + return; + case self::FORMAT_SUMMARY: + // We've already output the number of advisories in audit() + $io->writeError('Run composer audit for a full list of advisories.'); + default: + throw new InvalidArgumentException('Invalid format.'); + } + } + + /** + * @param ConsoleIO $io + * @param string[][][] $advisories + * @return void + */ + private function outputAvisoriesTable(ConsoleIO $io, array $advisories): void + { + foreach ($advisories as $package => $packageAdvisories) { + foreach ($packageAdvisories as $advisory) { + $io->getTable() + ->setHorizontal() + ->setHeaders([ + 'Package', + 'CVE', + 'Title', + 'URL', + 'Affected versions', + 'Reported at', + ]) + ->addRow([ + $package, + $advisory['cve'] ?: 'NO CVE', + $advisory['title'], + $advisory['link'], + $advisory['affectedVersions'], + $advisory['reportedAt'], + ]) + ->setColumnWidth(1, 80) + ->setColumnMaxWidth(1, 80) + ->render(); + } + } + } + + /** + * @param IOInterface $io + * @param string[][][] $advisories + * @return void + */ + private function outputAdvisoriesPlain(IOInterface $io, array $advisories): void + { + $error = []; + $firstAdvisory = true; + foreach ($advisories as $package => $packageAdvisories) { + foreach ($packageAdvisories as $advisory) { + if (!$firstAdvisory) { + $error[] = '--------'; + } + $cve = $advisory['cve'] ?: 'NO CVE'; + $error[] = "Package: $package"; + $error[] = "CVE: $cve"; + $error[] = "Title: {$advisory['title']}"; + $error[] = "URL: {$advisory['link']}"; + $error[] = "Affected versions: {$advisory['affectedVersions']}"; + $error[] = "Reported at: {$advisory['reportedAt']}"; + $firstAdvisory = false; + } + } + $io->writeError($error); + } +} diff --git a/tests/Composer/Test/Command/UpdateCommandTest.php b/tests/Composer/Test/Command/UpdateCommandTest.php index 9a12a49bd3e8..ba97577728c6 100644 --- a/tests/Composer/Test/Command/UpdateCommandTest.php +++ b/tests/Composer/Test/Command/UpdateCommandTest.php @@ -26,7 +26,7 @@ public function testUpdate(array $composerJson, array $command, string $expected $this->initTempComposer($composerJson); $appTester = $this->getApplicationTester(); - $appTester->run(array_merge(['command' => 'update', '--dry-run' => true], $command)); + $appTester->run(array_merge(['command' => 'update', '--dry-run' => true, '--no-audit' => true], $command)); $this->assertSame(trim($expected), trim($appTester->getDisplay(true))); } diff --git a/tests/Composer/Test/InstallerTest.php b/tests/Composer/Test/InstallerTest.php index baed74379fab..d714e618b650 100644 --- a/tests/Composer/Test/InstallerTest.php +++ b/tests/Composer/Test/InstallerTest.php @@ -136,6 +136,7 @@ public function testInstaller(RootPackageInterface $rootPackage, array $reposito $autoloadGenerator = $this->getMockBuilder('Composer\Autoload\AutoloadGenerator')->disableOriginalConstructor()->getMock(); $installer = new Installer($io, $config, clone $rootPackage, $downloadManager, $repositoryManager, $locker, $installationManager, $eventDispatcher, $autoloadGenerator); + $installer->setAudit(false); $result = $installer->run(); $output = str_replace("\r", '', $io->getOutput()); @@ -395,7 +396,8 @@ private function doTestIntegration(string $file, string $message, ?string $condi $installer ->setDevMode(!$input->getOption('no-dev')) ->setDryRun($input->getOption('dry-run')) - ->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)); + ->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)) + ->setAudit(false); return $installer->run(); }); @@ -440,7 +442,8 @@ private function doTestIntegration(string $file, string $message, ?string $condi ->setUpdateAllowTransitiveDependencies($updateAllowTransitiveDependencies) ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) - ->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)); + ->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)) + ->setAudit(false); return $installer->run(); }); diff --git a/tests/Composer/Test/Util/AuditorTest.php b/tests/Composer/Test/Util/AuditorTest.php new file mode 100644 index 000000000000..8a64a56eef13 --- /dev/null +++ b/tests/Composer/Test/Util/AuditorTest.php @@ -0,0 +1,399 @@ +io = $this + ->getMockBuilder(IOInterface::class) + ->disableOriginalConstructor() + ->getMock(); + } + + public function auditProvider() + { + return [ + // Test no advisories returns 0 + [ + 'data' => [ + 'packages' => [ + new Package('vendor1/package2', '9.0.0', '9.0.0'), + new Package('vendor1/package1', '9.0.0', '9.0.0'), + new Package('vendor3/package1', '9.0.0', '9.0.0'), + ], + 'warningOnly' => true, + ], + 'expected' => 0, + 'message' => 'Test no advisories returns 0', + ], + // Test with advisories returns 1 + [ + 'data' => [ + 'packages' => [ + new Package('vendor1/package2', '9.0.0', '9.0.0'), + new Package('vendor1/package1', '8.2.1', '8.2.1'), + new Package('vendor3/package1', '9.0.0', '9.0.0'), + ], + 'warningOnly' => true, + ], + 'expected' => 1, + 'message' => 'Test with advisories returns 1', + ], + // Test no packages throws InvalidArgumentException + [ + 'data' => [ + 'packages' => [], + 'warningOnly' => true, + ], + 'expected' => 1, + 'message' => 'Test no packages throws InvalidArgumentException', + ], + ]; + } + + /** + * @dataProvider auditProvider + * @phpstan-param array $data + */ + public function testAudit(array $data, int $expected, string $message): void + { + if (count($data['packages']) === 0) { + $this->expectException(InvalidArgumentException::class); + } + $auditor = new Auditor($this->getHttpDownloader()); + $result = $auditor->audit($this->io, $data['packages'], Auditor::FORMAT_PLAIN, $data['warningOnly']); + $this->assertSame($expected, $result, $message); + } + + public function advisoriesProvider() + { + $advisories = static::getMockAdvisories(null); + return [ + [ + 'data' => [ + 'packages' => [ + new Package('vendor1/package1', '8.2.1', '8.2.1'), + new Package('vendor1/package2', '3.1.0', '3.1.0'), + // Check a package with no advisories at all doesn't cause any issues + new Package('vendor5/package2', '5.0.0', '5.0.0'), + ], + 'updatedSince' => null, + 'filterByVersion' => false + ], + 'expected' => [ + 'vendor1/package1' => $advisories['vendor1/package1'], + 'vendor1/package2' => $advisories['vendor1/package2'], + ], + 'message' => 'Check not filtering by version', + ], + [ + 'data' => [ + 'packages' => [ + new Package('vendor1/package1', '8.2.1', '8.2.1'), + new Package('vendor1/package2', '3.1.0', '3.1.0'), + // Check a package with no advisories at all doesn't cause any issues + new Package('vendor5/package2', '5.0.0', '5.0.0'), + ], + 'updatedSince' => null, + 'filterByVersion' => true + ], + 'expected' => [ + 'vendor1/package1' => [ + $advisories['vendor1/package1'][1], + $advisories['vendor1/package1'][2], + ], + 'vendor1/package2' => [ + $advisories['vendor1/package2'][0], + ], + ], + 'message' => 'Check filter by version', + ], + [ + 'data' => [ + 'packages' => [ + new Package('vendor1/package1', '8.2.1', '8.2.1'), + new Package('vendor1/package2', '5.0.0', '5.0.0'), + new Package('vendor2/package1', '3.0.0', '3.0.0'), + ], + 'updatedSince' => 1335939007, + 'filterByVersion' => false + ], + 'expected' => [ + 'vendor1/package1' => [ + $advisories['vendor1/package1'][0], + $advisories['vendor1/package1'][1], + ], + 'vendor1/package2' => [ + $advisories['vendor1/package2'][0], + ], + 'vendor2/package1' => [ + $advisories['vendor2/package1'][0], + ], + ], + 'message' => 'Check updatedSince is passed through to the API', + ], + [ + 'data' => [ + 'packages' => [], + 'updatedSince' => 1335939007, + 'filterByVersion' => true + ], + 'expected' => [], + 'message' => 'No packages and filterByVersion === true should return 0 results', + ], + [ + 'data' => [ + 'packages' => [], + 'updatedSince' => 0, + 'filterByVersion' => false + ], + // All advisories expected with no packages and updatedSince === 0 + 'expected' => $advisories, + 'message' => 'No packages and updatedSince === 0 should NOT throw LogicException', + ], + [ + 'data' => [ + 'packages' => [], + 'updatedSince' => null, + 'filterByVersion' => false + ], + 'expected' => [], + 'message' => 'No packages and updatedSince === null should throw LogicException', + ], + ]; + } + + /** + * @dataProvider advisoriesProvider + * @phpstan-param array $data + * @phpstan-param string[][][] $expected + */ + public function testGetAdvisories(array $data, array $expected, string $message): void + { + if (count($data['packages']) === 0 && $data['updatedSince'] === null) { + $this->expectException(InvalidArgumentException::class); + } + $auditor = new Auditor($this->getHttpDownloader(), Auditor::FORMAT_PLAIN); + $result = $auditor->getAdvisories($data['packages'], $data['updatedSince'], $data['filterByVersion']); + $this->assertSame($expected, $result, $message); + } + + /** + * @return HttpDownloader&MockObject + */ + private function getHttpDownloader(): MockObject + { + $httpDownloader = $this + ->getMockBuilder(HttpDownloader::class) + ->disableOriginalConstructor() + ->onlyMethods(['get']) + ->getMock(); + + $callback = function(string $url, array $options) { + parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $query); + $updatedSince = null; + if (isset($query['updatedSince'])) { + $updatedSince = $query['updatedSince']; + } + + $advisories = AuditorTest::getMockAdvisories($updatedSince); + + // If the mock API request is for specific packages, only include advisories for those packages + if (isset($options['http']['content'])) { + parse_str($options['http']['content'], $body); + $packages = $body['packages']; + foreach ($advisories as $package => $data) { + if (!in_array($package, $packages)) { + unset($advisories[$package]); + } + } + } + + return new Response(['url' => 'https://packagist.org/api/security-advisories/'], 200, [], json_encode(['advisories' => $advisories])); + }; + + $httpDownloader + ->method('get') + ->willReturnCallback($callback); + + return $httpDownloader; + } + + public static function getMockAdvisories(?int $updatedSince) + { + $advisories = [ + 'vendor1/package1' => [ + [ + 'advisoryId' => 'ID1', + 'packageName' => 'vendor1/package1', + 'title' => 'advisory1', + 'link' => 'https://advisory.example.com/advisory1', + 'cve' => 'CVE1', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source1', + 'remoteId' => 'RemoteID1', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + [ + 'advisoryId' => 'ID4', + 'packageName' => 'vendor1/package1', + 'title' => 'advisory4', + 'link' => 'https://advisory.example.com/advisory4', + 'cve' => 'CVE3', + 'affectedVersions' => '>=8,<8.2.2|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID2', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + 'vendor1/package2' => [ + [ + 'advisoryId' => 'ID2', + 'packageName' => 'vendor1/package2', + 'title' => 'advisory2', + 'link' => 'https://advisory.example.com/advisory2', + 'cve' => '', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source1', + 'remoteId' => 'RemoteID2', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + 'vendorx/packagex' => [ + [ + 'advisoryId' => 'IDx', + 'packageName' => 'vendorx/packagex', + 'title' => 'advisory7', + 'link' => 'https://advisory.example.com/advisory7', + 'cve' => 'CVE5', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID4', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + 'vendor2/package1' => [ + [ + 'advisoryId' => 'ID3', + 'packageName' => 'vendor2/package1', + 'title' => 'advisory3', + 'link' => 'https://advisory.example.com/advisory3', + 'cve' => 'CVE2', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID1', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + ]; + + // Intentionally allow updatedSince === 0 to include these advisories + if (!$updatedSince) { + $advisories['vendor1/package1'][] = [ + 'advisoryId' => 'ID5', + 'packageName' => 'vendor1/package1', + 'title' => 'advisory5', + 'link' => 'https://advisory.example.com/advisory5', + 'cve' => '', + 'affectedVersions' => '>=8,<8.2.2|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source1', + 'remoteId' => 'RemoteID3', + ], + ], + 'reportedAt' => '', + 'composerRepository' => 'https://packagist.org', + ]; + $advisories['vendor2/package1'][] = [ + 'advisoryId' => 'ID6', + 'packageName' => 'vendor2/package1', + 'title' => 'advisory6', + 'link' => 'https://advisory.example.com/advisory6', + 'cve' => 'CVE4', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID3', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ]; + $advisories['vendory/packagey'][] = [ + 'advisoryId' => 'IDy', + 'packageName' => 'vendory/packagey', + 'title' => 'advisory7', + 'link' => 'https://advisory.example.com/advisory7', + 'cve' => 'CVE5', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID4', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ]; + $advisories['vendor3/package1'][] = [ + 'advisoryId' => 'ID7', + 'packageName' => 'vendor3/package1', + 'title' => 'advisory7', + 'link' => 'https://advisory.example.com/advisory7', + 'cve' => 'CVE5', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID4', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ]; + } + + return $advisories; + } +} From 611b215896bca622761c590d91b967afaff5c46c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 15:39:51 +0200 Subject: [PATCH 145/618] Fix PHPStan issues and a couple minor bugs in audit functionality, refs #10798 --- src/Composer/Command/AuditCommand.php | 4 +-- src/Composer/Command/BaseCommand.php | 20 +++++++++++ src/Composer/Command/CreateProjectCommand.php | 2 +- src/Composer/Command/InstallCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/RequireCommand.php | 4 +-- src/Composer/Command/UpdateCommand.php | 2 +- src/Composer/Installer.php | 6 ++-- src/Composer/Util/Auditor.php | 10 +++--- tests/Composer/Test/Util/AuditorTest.php | 36 +++++++++---------- 10 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index e9770eb1ce42..4c093c3725b5 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -9,7 +9,7 @@ use Composer\Repository\InstalledRepository; use Composer\Repository\RepositoryInterface; use Composer\Util\Auditor; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; class AuditCommand extends BaseCommand { @@ -47,7 +47,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $auditor = new Auditor($httpDownloader); - return $auditor->audit($this->getIO(), $packages, $input->getOption('format'), false); + return $auditor->audit($this->getIO(), $packages, $this->getAuditFormat($input, 'format'), false); } /** diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 89c3996247c3..afd2ae33b940 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -25,6 +25,7 @@ use Composer\Plugin\PreCommandRunEvent; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginEvents; +use Composer\Util\Auditor; use Composer\Util\Platform; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; @@ -405,4 +406,23 @@ protected function getTerminalWidth() return $width; } + + /** + * @internal + * @param 'format'|'audit-format' $optName + * @return Auditor::FORMAT_* + */ + protected function getAuditFormat(InputInterface $input, string $optName = 'audit-format'): string + { + if (!$input->hasOption($optName)) { + throw new \LogicException('This should not be called on a Command which has no '.$optName.' option defined.'); + } + + $val = $input->getOption($optName); + if (!in_array($val, Auditor::FORMATS, true)) { + throw new \InvalidArgumentException('--'.$optName.' must be one of '.implode(', ', Auditor::FORMATS).'.'); + } + + return $val; + } } diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 0a765727175b..3c25b06b071c 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -264,7 +264,7 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ ->setClassMapAuthoritative($config->get('classmap-authoritative')) ->setApcuAutoloader($config->get('apcu-autoloader')) ->setAudit(!$input->getOption('no-audit')) - ->setAuditFormat($input->getOption('audit-format')); + ->setAuditFormat($this->getAuditFormat($input)); if (!$composer->getLocker()->isLocked()) { $installer->setUpdate(true); diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index d707ecbb424f..015c7362dd2d 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -134,7 +134,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setApcuAutoloader($apcu, $apcuPrefix) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) ->setAudit(!$input->getOption('no-audit')) - ->setAuditFormat($input->getOption('audit-format')) + ->setAuditFormat($this->getAuditFormat($input)) ; if ($input->getOption('no-plugins')) { diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 5cb509b9256f..bfa3fe8257ed 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -286,7 +286,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) ->setDryRun($dryRun) ->setAudit(!$input->getOption('no-audit')) - ->setAuditFormat($input->getOption('audit-format')) + ->setAuditFormat($this->getAuditFormat($input)) ; // if no lock is present, we do not do a partial update as diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 9b2ae44c78ed..d2898fbbad75 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -419,7 +419,7 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) ->setAudit(!$input->getOption('no-audit')) - ->setAuditFormat($input->getOption('audit-format')) + ->setAuditFormat($this->getAuditFormat($input)) ; // if no lock is present, or the file is brand new, we do not do a @@ -475,7 +475,7 @@ private function updateFileCleanly(JsonFile $json, array $new, string $requireKe protected function interact(InputInterface $input, OutputInterface $output): void { - + } /** diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 94092609e277..7df4cc397b29 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -233,7 +233,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setPreferLowest($input->getOption('prefer-lowest')) ->setTemporaryConstraints($temporaryConstraints) ->setAudit(!$input->getOption('no-audit')) - ->setAuditFormat($input->getOption('audit-format')) + ->setAuditFormat($this->getAuditFormat($input)) ; if ($input->getOption('no-plugins')) { diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 36825de3642d..572f6870c812 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -167,8 +167,8 @@ class Installer protected $executeOperations = true; /** @var bool */ protected $audit = true; - /** @var string */ - protected $auditFormat = Auditor::FORMAT_TABLE; + /** @var Auditor::FORMAT_* */ + protected $auditFormat = Auditor::FORMAT_SUMMARY; /** @var bool */ protected $updateMirrors = false; @@ -1460,7 +1460,7 @@ public function setAudit(bool $audit): self /** * What format should be used for audit output? * - * @param string $auditFormat + * @param Auditor::FORMAT_* $auditFormat * @return Installer */ public function setAuditFormat(string $auditFormat): self diff --git a/src/Composer/Util/Auditor.php b/src/Composer/Util/Auditor.php index 7b3cb071562b..3bb22dd25879 100644 --- a/src/Composer/Util/Auditor.php +++ b/src/Composer/Util/Auditor.php @@ -53,7 +53,8 @@ public function audit(IOInterface $io, array $packages, string $format, bool $wa if (count($advisories) > 0) { $numAdvisories = $this->countAdvisories($advisories); $plurality = $numAdvisories === 1 ? 'y' : 'ies'; - $io->writeError("<$errorOrWarn>Found $numAdvisories security vulnerability advisor$plurality:"); + $punctuation = $format === 'summary' ? '.' : ':'; + $io->writeError("<$errorOrWarn>Found $numAdvisories security vulnerability advisor{$plurality}{$punctuation}"); $this->outputAdvisories($io, $advisories, $format); return 1; } @@ -177,8 +178,9 @@ private function outputAdvisories(IOInterface $io, array $advisories, string $fo case self::FORMAT_SUMMARY: // We've already output the number of advisories in audit() $io->writeError('Run composer audit for a full list of advisories.'); + return; default: - throw new InvalidArgumentException('Invalid format.'); + throw new InvalidArgumentException('Invalid format "'.$format.'".'); } } @@ -203,7 +205,7 @@ private function outputAvisoriesTable(ConsoleIO $io, array $advisories): void ]) ->addRow([ $package, - $advisory['cve'] ?: 'NO CVE', + $advisory['cve'] ?? 'NO CVE', $advisory['title'], $advisory['link'], $advisory['affectedVersions'], @@ -230,7 +232,7 @@ private function outputAdvisoriesPlain(IOInterface $io, array $advisories): void if (!$firstAdvisory) { $error[] = '--------'; } - $cve = $advisory['cve'] ?: 'NO CVE'; + $cve = $advisory['cve'] ?? 'NO CVE'; $error[] = "Package: $package"; $error[] = "CVE: $cve"; $error[] = "Title: {$advisory['title']}"; diff --git a/tests/Composer/Test/Util/AuditorTest.php b/tests/Composer/Test/Util/AuditorTest.php index 8a64a56eef13..ad4c06f65f7d 100644 --- a/tests/Composer/Test/Util/AuditorTest.php +++ b/tests/Composer/Test/Util/AuditorTest.php @@ -3,6 +3,8 @@ namespace Composer\Test\Util; use Composer\IO\IOInterface; +use Composer\IO\NullIO; +use Composer\Json\JsonFile; use Composer\Package\Package; use Composer\Test\TestCase; use Composer\Util\Auditor; @@ -13,17 +15,6 @@ class AuditorTest extends TestCase { - /** @var IOInterface&\PHPUnit\Framework\MockObject\MockObject */ - private $io; - - protected function setUp(): void - { - $this->io = $this - ->getMockBuilder(IOInterface::class) - ->disableOriginalConstructor() - ->getMock(); - } - public function auditProvider() { return [ @@ -75,11 +66,14 @@ public function testAudit(array $data, int $expected, string $message): void $this->expectException(InvalidArgumentException::class); } $auditor = new Auditor($this->getHttpDownloader()); - $result = $auditor->audit($this->io, $data['packages'], Auditor::FORMAT_PLAIN, $data['warningOnly']); + $result = $auditor->audit(new NullIO(), $data['packages'], Auditor::FORMAT_PLAIN, $data['warningOnly']); $this->assertSame($expected, $result, $message); } - public function advisoriesProvider() + /** + * @return mixed[] + */ + public function advisoriesProvider(): array { $advisories = static::getMockAdvisories(null); return [ @@ -187,7 +181,7 @@ public function testGetAdvisories(array $data, array $expected, string $message) if (count($data['packages']) === 0 && $data['updatedSince'] === null) { $this->expectException(InvalidArgumentException::class); } - $auditor = new Auditor($this->getHttpDownloader(), Auditor::FORMAT_PLAIN); + $auditor = new Auditor($this->getHttpDownloader()); $result = $auditor->getAdvisories($data['packages'], $data['updatedSince'], $data['filterByVersion']); $this->assertSame($expected, $result, $message); } @@ -204,7 +198,7 @@ private function getHttpDownloader(): MockObject ->getMock(); $callback = function(string $url, array $options) { - parse_str(parse_url($url, PHP_URL_QUERY) ?? '', $query); + parse_str((string) parse_url($url, PHP_URL_QUERY), $query); $updatedSince = null; if (isset($query['updatedSince'])) { $updatedSince = $query['updatedSince']; @@ -217,13 +211,13 @@ private function getHttpDownloader(): MockObject parse_str($options['http']['content'], $body); $packages = $body['packages']; foreach ($advisories as $package => $data) { - if (!in_array($package, $packages)) { + if (!in_array($package, $packages, true)) { unset($advisories[$package]); } } } - return new Response(['url' => 'https://packagist.org/api/security-advisories/'], 200, [], json_encode(['advisories' => $advisories])); + return new Response(['url' => 'https://packagist.org/api/security-advisories/'], 200, [], JsonFile::encode(['advisories' => $advisories])); }; $httpDownloader @@ -233,7 +227,10 @@ private function getHttpDownloader(): MockObject return $httpDownloader; } - public static function getMockAdvisories(?int $updatedSince) + /** + * @return array + */ + public static function getMockAdvisories(?int $updatedSince): array { $advisories = [ 'vendor1/package1' => [ @@ -326,8 +323,7 @@ public static function getMockAdvisories(?int $updatedSince) ], ]; - // Intentionally allow updatedSince === 0 to include these advisories - if (!$updatedSince) { + if (0 === $updatedSince || null === $updatedSince) { $advisories['vendor1/package1'][] = [ 'advisoryId' => 'ID5', 'packageName' => 'vendor1/package1', From e3c46cb2b2b50bbd2480ddd145192e51fc700c27 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 22 Jun 2022 16:36:54 +0200 Subject: [PATCH 146/618] Audit locked packages if update is called with --no-install, fixes #10894 --- src/Composer/Installer.php | 12 +++- .../Repository/CanonicalPackagesTrait.php | 55 +++++++++++++++++++ .../Repository/LockArrayRepository.php | 2 + .../Repository/WritableArrayRepository.php | 31 +---------- 4 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 src/Composer/Repository/CanonicalPackagesTrait.php diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 572f6870c812..3328931d3cfb 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -388,19 +388,25 @@ public function run(): int } if ($this->audit) { - $packages = $localRepo->getCanonicalPackages(); + if ($this->update && !$this->install) { + $packages = $lockedRepository->getCanonicalPackages(); + $target = 'locked'; + } else { + $packages = $localRepo->getCanonicalPackages(); + $target = 'installed'; + } if (count($packages) > 0) { try { $auditor = new Auditor(Factory::createHttpDownloader($this->io, $this->config)); $auditor->audit($this->io, $packages, $this->auditFormat); } catch (TransportException $e) { - $this->io->error('Failed to audit installed packages.'); + $this->io->error('Failed to audit '.$target.' packages.'); if ($this->io->isVerbose()) { $this->io->error($e->getMessage()); } } } else { - $this->io->writeError('No packages - skipping audit.'); + $this->io->writeError('No '.$target.' packages - skipping audit.'); } } diff --git a/src/Composer/Repository/CanonicalPackagesTrait.php b/src/Composer/Repository/CanonicalPackagesTrait.php new file mode 100644 index 000000000000..fc4e1ef86270 --- /dev/null +++ b/src/Composer/Repository/CanonicalPackagesTrait.php @@ -0,0 +1,55 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Repository; + +use Composer\Package\AliasPackage; +use Composer\Package\PackageInterface; + +/** + * Provides getCanonicalPackages() to various repository implementations + * + * @internal + */ +trait CanonicalPackagesTrait +{ + /** + * Get unique packages (at most one package of each name), with aliases resolved and removed. + * + * @return PackageInterface[] + */ + public function getCanonicalPackages() + { + $packages = $this->getPackages(); + + // get at most one package of each name, preferring non-aliased ones + $packagesByName = array(); + foreach ($packages as $package) { + if (!isset($packagesByName[$package->getName()]) || $packagesByName[$package->getName()] instanceof AliasPackage) { + $packagesByName[$package->getName()] = $package; + } + } + + $canonicalPackages = array(); + + // unfold aliased packages + foreach ($packagesByName as $package) { + while ($package instanceof AliasPackage) { + $package = $package->getAliasOf(); + } + + $canonicalPackages[] = $package; + } + + return $canonicalPackages; + } +} diff --git a/src/Composer/Repository/LockArrayRepository.php b/src/Composer/Repository/LockArrayRepository.php index 2203525c32fb..da077589512b 100644 --- a/src/Composer/Repository/LockArrayRepository.php +++ b/src/Composer/Repository/LockArrayRepository.php @@ -21,6 +21,8 @@ */ class LockArrayRepository extends ArrayRepository { + use CanonicalPackagesTrait; + public function getRepoName(): string { return 'lock repo'; diff --git a/src/Composer/Repository/WritableArrayRepository.php b/src/Composer/Repository/WritableArrayRepository.php index acf317e0056c..8fb92a7a44f1 100644 --- a/src/Composer/Repository/WritableArrayRepository.php +++ b/src/Composer/Repository/WritableArrayRepository.php @@ -22,6 +22,8 @@ */ class WritableArrayRepository extends ArrayRepository implements WritableRepositoryInterface { + use CanonicalPackagesTrait; + /** * @var string[] */ @@ -69,33 +71,4 @@ public function reload() { $this->devMode = null; } - - /** - * @inheritDoc - */ - public function getCanonicalPackages() - { - $packages = $this->getPackages(); - - // get at most one package of each name, preferring non-aliased ones - $packagesByName = array(); - foreach ($packages as $package) { - if (!isset($packagesByName[$package->getName()]) || $packagesByName[$package->getName()] instanceof AliasPackage) { - $packagesByName[$package->getName()] = $package; - } - } - - $canonicalPackages = array(); - - // unfold aliased packages - foreach ($packagesByName as $package) { - while ($package instanceof AliasPackage) { - $package = $package->getAliasOf(); - } - - $canonicalPackages[] = $package; - } - - return $canonicalPackages; - } } From 658f56ff13717c864dc0a0634e3fcadedb20bbad Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 23 Jun 2022 12:31:09 +0200 Subject: [PATCH 147/618] Fix audit command to exit with amount of advisories matched --- src/Composer/Command/AuditCommand.php | 3 ++- src/Composer/Util/Auditor.php | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index 4c093c3725b5..ff511625e8a8 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -47,7 +47,8 @@ protected function execute(InputInterface $input, OutputInterface $output) } $auditor = new Auditor($httpDownloader); - return $auditor->audit($this->getIO(), $packages, $this->getAuditFormat($input, 'format'), false); + + return min(255, $auditor->audit($this->getIO(), $packages, $this->getAuditFormat($input, 'format'), false)); } /** diff --git a/src/Composer/Util/Auditor.php b/src/Composer/Util/Auditor.php index 3bb22dd25879..ca45c45f0eaa 100644 --- a/src/Composer/Util/Auditor.php +++ b/src/Composer/Util/Auditor.php @@ -43,7 +43,7 @@ public function __construct(HttpDownloader $httpDownloader) * @param PackageInterface[] $packages * @param self::FORMAT_* $format The format that will be used to output audit results. * @param bool $warningOnly If true, outputs a warning. If false, outputs an error. - * @return int + * @return int Amount of advisories found * @throws InvalidArgumentException If no packages are passed in */ public function audit(IOInterface $io, array $packages, string $format, bool $warningOnly = true): int @@ -56,9 +56,12 @@ public function audit(IOInterface $io, array $packages, string $format, bool $wa $punctuation = $format === 'summary' ? '.' : ':'; $io->writeError("<$errorOrWarn>Found $numAdvisories security vulnerability advisor{$plurality}{$punctuation}"); $this->outputAdvisories($io, $advisories, $format); - return 1; + + return count($advisories); } + $io->writeError('No security vulnerability advisories found'); + return 0; } From 92ff8e5bc6b814efb9aa497034d0200242ffcc10 Mon Sep 17 00:00:00 2001 From: Nils Adermann Date: Thu, 23 Jun 2022 12:59:45 +0200 Subject: [PATCH 148/618] Audit command doc improvements (#10893) --- doc/03-cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 494bfa96536a..57685296c62f 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -1004,7 +1004,7 @@ php composer.phar archive vendor/package 2.0.21 --format=zip ## audit This command is used to audit the packages you have installed -for possible security issues. Currently this only checks for and +for possible security issues. It checks for and lists security vulnerability advisories according to the [Packagist.org api](https://packagist.org/apidoc#list-security-advisories). From a5fdc00de1d9040aaa1ad8e65391716167b3dd11 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 23 Jun 2022 13:39:39 +0200 Subject: [PATCH 149/618] Remove duplicate function in RootPackageInterface, fixes #10895 --- src/Composer/Package/RootPackageInterface.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Composer/Package/RootPackageInterface.php b/src/Composer/Package/RootPackageInterface.php index 32cc44750f88..14f80ae13654 100644 --- a/src/Composer/Package/RootPackageInterface.php +++ b/src/Composer/Package/RootPackageInterface.php @@ -113,15 +113,6 @@ public function setProvides(array $provides); */ public function setReplaces(array $replaces); - /** - * Set the repositories - * - * @param mixed[] $repositories - * - * @return void - */ - public function setRepositories(array $repositories); - /** * Set the autoload mapping * From eba49147e78ed4b331e2de7fb8d612101f20e44f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 23 Jun 2022 14:37:04 +0200 Subject: [PATCH 150/618] Add warning when the latest version of a package cannot be auto-selected in require/init/create-project, fixes #10884 (#10896) --- src/Composer/Command/CreateProjectCommand.php | 2 +- .../Command/PackageDiscoveryTrait.php | 2 +- .../Package/Version/VersionSelector.php | 25 ++- .../Test/Command/RequireCommandTest.php | 155 ++++++++++++++++++ 4 files changed, 179 insertions(+), 5 deletions(-) create mode 100644 tests/Composer/Test/Command/RequireCommandTest.php diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 3c25b06b071c..9156f04a80a2 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -434,7 +434,7 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p // find the latest version if there are multiple $versionSelector = new VersionSelector($repositorySet, $platformRepo); - $package = $versionSelector->findBestCandidate($name, $packageVersion, $stability, $platformRequirementFilter); + $package = $versionSelector->findBestCandidate($name, $packageVersion, $stability, $platformRequirementFilter, 0, $io); if (!$package) { $errorMessage = "Could not find package $name with " . ($packageVersion ? "version $packageVersion" : "stability $stability"); diff --git a/src/Composer/Command/PackageDiscoveryTrait.php b/src/Composer/Command/PackageDiscoveryTrait.php index 0c2830196305..1c1ba9d1bdbb 100644 --- a/src/Composer/Command/PackageDiscoveryTrait.php +++ b/src/Composer/Command/PackageDiscoveryTrait.php @@ -282,7 +282,7 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string $versionSelector = new VersionSelector($repoSet, $platformRepo); $effectiveMinimumStability = $this->getMinimumStability($input); - $package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter); + $package = $versionSelector->findBestCandidate($name, null, $preferredStability, $platformRequirementFilter, 0, $this->getIO()); if (false === $package) { // platform packages can not be found in the pool in versions other than the local platform's has diff --git a/src/Composer/Package/Version/VersionSelector.php b/src/Composer/Package/Version/VersionSelector.php index 7f082c209951..b2a2f56ac973 100644 --- a/src/Composer/Package/Version/VersionSelector.php +++ b/src/Composer/Package/Version/VersionSelector.php @@ -15,6 +15,7 @@ use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; +use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; @@ -65,10 +66,11 @@ public function __construct(RepositorySet $repositorySet, PlatformRepository $pl * @param string $targetPackageVersion * @param string $preferredStability * @param PlatformRequirementFilterInterface|bool|string[] $platformRequirementFilter - * @param int $repoSetFlags* + * @param int $repoSetFlags + * @param IOInterface|null $io If passed, warnings will be output there in case versions cannot be selected due to platform requirements * @return PackageInterface|false */ - public function findBestCandidate(string $packageName, string $targetPackageVersion = null, string $preferredStability = 'stable', $platformRequirementFilter = null, int $repoSetFlags = 0) + public function findBestCandidate(string $packageName, string $targetPackageVersion = null, string $preferredStability = 'stable', $platformRequirementFilter = null, int $repoSetFlags = 0, ?IOInterface $io = null) { if (!isset(BasePackage::$stabilities[$preferredStability])) { // If you get this, maybe you are still relying on the Composer 1.x signature where the 3rd arg was the php version @@ -84,10 +86,11 @@ public function findBestCandidate(string $packageName, string $targetPackageVers $constraint = $targetPackageVersion ? $this->getParser()->parseConstraints($targetPackageVersion) : null; $candidates = $this->repositorySet->findPackages(strtolower($packageName), $constraint, $repoSetFlags); + $skippedWarnings = []; if ($this->platformConstraints && !($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter)) { $platformConstraints = $this->platformConstraints; - $candidates = array_filter($candidates, static function ($pkg) use ($platformConstraints, $platformRequirementFilter): bool { + $candidates = array_filter($candidates, static function ($pkg) use ($platformConstraints, $platformRequirementFilter, &$skippedWarnings): bool { $reqs = $pkg->getRequires(); foreach ($reqs as $name => $link) { @@ -99,10 +102,12 @@ public function findBestCandidate(string $packageName, string $targetPackageVers } } + $skippedWarnings[$pkg->getName()][] = ['version' => $pkg->getPrettyVersion(), 'link' => $link, 'reason' => 'is not satisfied by your platform']; return false; } elseif (PlatformRepository::isPlatformPackage($name)) { // Package requires a platform package that is unknown on current platform. // It means that current platform cannot validate this constraint and so package is not installable. + $skippedWarnings[$pkg->getName()][] = ['version' => $pkg->getPrettyVersion(), 'link' => $link, 'reason' => 'is missing from your platform']; return false; } } @@ -116,6 +121,20 @@ public function findBestCandidate(string $packageName, string $targetPackageVers return false; } + if (count($skippedWarnings) > 0 && $io !== null) { + foreach ($skippedWarnings as $name => $warnings) { + foreach ($warnings as $index => $warning) { + $link = $warning['link']; + $latest = $index === 0 ? "'s latest version" : ''; + $io->writeError( + 'Cannot use '.$name.$latest.' '.$warning['version'].' as it '.$link->getDescription().' '.$link->getTarget().' '.$link->getPrettyConstraint().' which '.$warning['reason'].'.', + true, + $index === 0 ? IOInterface::NORMAL : IOInterface::VERBOSE + ); + } + } + } + // select highest version if we have many $package = reset($candidates); $minPriority = BasePackage::$stabilities[$preferredStability]; diff --git a/tests/Composer/Test/Command/RequireCommandTest.php b/tests/Composer/Test/Command/RequireCommandTest.php new file mode 100644 index 000000000000..0579d06e763e --- /dev/null +++ b/tests/Composer/Test/Command/RequireCommandTest.php @@ -0,0 +1,155 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Test\TestCase; +use InvalidArgumentException; + +class RequireCommandTest extends TestCase +{ + public function testRequireThrowsIfNoneMatches(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage( + 'Package required/pkg has requirements incompatible with your PHP version, PHP extensions and Composer version:' . PHP_EOL . + ' - required/pkg 1.0.0 requires ext-foobar ^1 but it is not present.' + ); + + $this->initTempComposer([ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'required/pkg', 'version' => '1.0.0', 'require' => ['ext-foobar' => '^1']], + ], + ], + ], + ]); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'require', '--dry-run' => true, '--no-audit' => true, 'packages' => ['required/pkg']]); + } + + /** + * @dataProvider provideRequire + * @param array $composerJson + * @param array $command + */ + public function testRequire(array $composerJson, array $command, string $expected): void + { + $this->initTempComposer($composerJson); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'require', '--dry-run' => true, '--no-audit' => true], $command)); + + if (str_contains($expected, '%d')) { + $pattern = '{^'.str_replace('%d', '[0-9.]+', preg_quote(trim($expected))).'$}'; + $this->assertMatchesRegularExpression($pattern, trim($appTester->getDisplay(true))); + } else { + $this->assertSame(trim($expected), trim($appTester->getDisplay(true))); + } + + // workaround until https://github.com/symfony/symfony/pull/46747 is merged + putenv('SHELL_VERBOSITY'); + unset($_ENV['SHELL_VERBOSITY']); + unset($_SERVER['SHELL_VERBOSITY']); + } + + public function provideRequire(): \Generator + { + yield 'warn once for missing ext but a lower package matches' => [ + [ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'required/pkg', 'version' => '1.2.0', 'require' => ['ext-foobar' => '^1']], + ['name' => 'required/pkg', 'version' => '1.1.0', 'require' => ['ext-foobar' => '^1']], + ['name' => 'required/pkg', 'version' => '1.0.0'], + ], + ], + ], + ], + ['packages' => ['required/pkg']], + <<Cannot use required/pkg's latest version 1.2.0 as it requires ext-foobar ^1 which is missing from your platform. +Using version ^1.0 for required/pkg +./composer.json has been updated +Running composer update required/pkg +Loading composer repositories with package information +Updating dependencies +Lock file operations: 1 install, 0 updates, 0 removals + - Locking required/pkg (1.0.0) +Installing dependencies from lock file (including require-dev) +Package operations: 1 install, 0 updates, 0 removals + - Installing required/pkg (1.0.0) +OUTPUT + ]; + + yield 'warn multiple times when verbose' => [ + [ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'required/pkg', 'version' => '1.2.0', 'require' => ['ext-foobar' => '^1']], + ['name' => 'required/pkg', 'version' => '1.1.0', 'require' => ['ext-foobar' => '^1']], + ['name' => 'required/pkg', 'version' => '1.0.0'], + ], + ], + ], + ], + ['packages' => ['required/pkg'], '--no-install' => true, '-v' => true], + <<Cannot use required/pkg's latest version 1.2.0 as it requires ext-foobar ^1 which is missing from your platform. +Cannot use required/pkg 1.1.0 as it requires ext-foobar ^1 which is missing from your platform. +Using version ^1.0 for required/pkg +./composer.json has been updated +Running composer update required/pkg +Loading composer repositories with package information +Updating dependencies +Dependency resolution completed in %d seconds +Analyzed %d packages to resolve dependencies +Analyzed %d rules to resolve dependencies +Lock file operations: 1 install, 0 updates, 0 removals +Installs: required/pkg:1.0.0 + - Locking required/pkg (1.0.0) +OUTPUT + ]; + + yield 'warn for not satisfied req which is satisfied by lower version' => [ + [ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'required/pkg', 'version' => '1.1.0', 'require' => ['php' => '^20']], + ['name' => 'required/pkg', 'version' => '1.0.0', 'require' => ['php' => '>=7']], + ], + ], + ], + ], + ['packages' => ['required/pkg'], '--no-install' => true], + <<Cannot use required/pkg's latest version 1.1.0 as it requires php ^20 which is not satisfied by your platform. +Using version ^1.0 for required/pkg +./composer.json has been updated +Running composer update required/pkg +Loading composer repositories with package information +Updating dependencies +Lock file operations: 1 install, 0 updates, 0 removals + - Locking required/pkg (1.0.0) +OUTPUT + ]; + } +} From ddecd5e328c2643103e659c4aaa68904ed3d894a Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 23 Jun 2022 21:16:12 +0200 Subject: [PATCH 151/618] Add hint to why-not that calling update with a temporary constraint can also help elucidate an issue --- src/Composer/Command/BaseDependencyCommand.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 6361c7e28df4..493e4adda00d 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -127,6 +127,10 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo $this->printTable($output, $results); } + if ($inverted) { + $this->getIO()->writeError('Not finding what you were looking for? Try calling `composer update "'.$input->getArgument(self::ARGUMENT_PACKAGE).':'.$input->getArgument(self::ARGUMENT_CONSTRAINT).'" --dry-run` to get another view on the problem.'); + } + return 0; } From 6776cef441d19a87e527f00b5465c01d1c9c959f Mon Sep 17 00:00:00 2001 From: Stephan Date: Fri, 24 Jun 2022 09:30:33 +0100 Subject: [PATCH 152/618] Fix: ValidatingArrayLoader [TypeError]: strcasecmp(): Argument #1() must be of type string, int given (#10897) --- src/Composer/Package/Loader/ValidatingArrayLoader.php | 1 + .../Test/Package/Loader/ValidatingArrayLoaderTest.php | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/Composer/Package/Loader/ValidatingArrayLoader.php b/src/Composer/Package/Loader/ValidatingArrayLoader.php index e5d513c41b66..7e4318b85683 100644 --- a/src/Composer/Package/Loader/ValidatingArrayLoader.php +++ b/src/Composer/Package/Loader/ValidatingArrayLoader.php @@ -252,6 +252,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa foreach (array_keys(BasePackage::$supportedLinkTypes) as $linkType) { if ($this->validateArray($linkType) && isset($this->config[$linkType])) { foreach ($this->config[$linkType] as $package => $constraint) { + $package = (string) $package; if (0 === strcasecmp($package, $this->config['name'])) { $this->errors[] = $linkType.'.'.$package.' : a package cannot set a '.$linkType.' on itself'; unset($this->config[$linkType][$package]); diff --git a/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php index e3d6103e1bdc..4562a2702ae7 100644 --- a/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php @@ -419,6 +419,13 @@ public function errorProvider(): array 'dist.url : must be present', ), ), + array( + array( + 'name' => 'foo/bar', + 'replace' => array('acme/bar'), + ), + array('replace.0 : invalid version constraint (Could not parse version constraint acme/bar: Invalid version string "acme/bar")') + ), )); } From 978037fbfad71ff9da87f3baaa86e350a62af175 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 24 Jun 2022 11:12:57 +0200 Subject: [PATCH 153/618] Fix build --- src/Composer/Command/BaseDependencyCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 493e4adda00d..8aa9759e026d 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -127,7 +127,7 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo $this->printTable($output, $results); } - if ($inverted) { + if ($inverted && $input->hasArgument(self::ARGUMENT_CONSTRAINT)) { $this->getIO()->writeError('Not finding what you were looking for? Try calling `composer update "'.$input->getArgument(self::ARGUMENT_PACKAGE).':'.$input->getArgument(self::ARGUMENT_CONSTRAINT).'" --dry-run` to get another view on the problem.'); } From 8c9f82dc1eba5a79ae2be3324b9390357c0f46cf Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 24 Jun 2022 16:21:01 +0200 Subject: [PATCH 154/618] Move security advisory loading to repositories, allows others to provider them and reduces load on packagist.org for summary advisory reports --- phpstan/baseline.neon | 122 +----- src/Composer/Advisory/Auditor.php | 174 ++++++++ .../Advisory/PartialSecurityAdvisory.php | 48 +++ src/Composer/Advisory/SecurityAdvisory.php | 54 +++ src/Composer/Command/AuditCommand.php | 14 +- src/Composer/Command/BaseCommand.php | 2 +- src/Composer/Command/CreateProjectCommand.php | 2 +- src/Composer/Command/InstallCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/RequireCommand.php | 2 +- src/Composer/Command/UpdateCommand.php | 2 +- src/Composer/Installer.php | 10 +- .../Repository/AdvisoryProviderInterface.php | 34 ++ .../Repository/ComposerRepository.php | 177 ++++++-- src/Composer/Repository/RepositorySet.php | 56 +++ src/Composer/Util/Auditor.php | 250 ----------- tests/Composer/Test/Advisory/AuditorTest.php | 289 +++++++++++++ tests/Composer/Test/Util/AuditorTest.php | 395 ------------------ 18 files changed, 836 insertions(+), 799 deletions(-) create mode 100644 src/Composer/Advisory/Auditor.php create mode 100644 src/Composer/Advisory/PartialSecurityAdvisory.php create mode 100644 src/Composer/Advisory/SecurityAdvisory.php create mode 100644 src/Composer/Repository/AdvisoryProviderInterface.php delete mode 100644 src/Composer/Util/Auditor.php create mode 100644 tests/Composer/Test/Advisory/AuditorTest.php delete mode 100644 tests/Composer/Test/Util/AuditorTest.php diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 5538f5f70aab..335235af88c2 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -1,13 +1,13 @@ parameters: ignoreErrors: - - message: "#^Binary operation \"\\.\" between non\\-empty\\-string and array\\|string\\|null results in an error\\.$#" + message: "#^Parameter \\#2 \\$advisories of method Composer\\\\Advisory\\\\Auditor\\:\\:outputAdvisories\\(\\) expects array\\\\>, array\\\\> given\\.$#" count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php + path: ../src/Composer/Advisory/Auditor.php - - message: "#^Cannot call method writeError\\(\\) on Composer\\\\IO\\\\IOInterface\\|null\\.$#" - count: 2 + message: "#^Binary operation \"\\.\" between non\\-empty\\-string and array\\|string\\|null results in an error\\.$#" + count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - @@ -20,11 +20,6 @@ parameters: count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Only booleans are allowed in &&, Composer\\\\IO\\\\IOInterface\\|null given on the left side\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Only booleans are allowed in &&, array\\\\|int\\|string\\>\\|bool\\|string\\>\\|bool\\|string\\|null given on the left side\\.$#" count: 1 @@ -55,21 +50,11 @@ parameters: count: 3 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Only booleans are allowed in a ternary operator condition, array\\ given\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Only booleans are allowed in a ternary operator condition, mixed given\\.$#" count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Only booleans are allowed in an if condition, array\\\\|null given\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" count: 1 @@ -115,11 +100,6 @@ parameters: count: 1 path: ../src/Composer/Autoload/AutoloadGenerator.php - - - message: "#^Parameter \\#2 \\$excluded of static method Composer\\\\Autoload\\\\ClassMapGenerator\\:\\:createMap\\(\\) expects string\\|null, array\\|string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Autoload/AutoloadGenerator.php - - message: "#^Parameter \\#2 \\$subject of static method Composer\\\\Pcre\\\\Preg\\:\\:isMatch\\(\\) expects string, string\\|false given\\.$#" count: 1 @@ -165,66 +145,6 @@ parameters: count: 1 path: ../src/Composer/Autoload/ClassLoader.php - - - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Cannot call method getPathname\\(\\) on SplFileInfo\\|string\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 2 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Method Composer\\\\Autoload\\\\ClassMapGenerator\\:\\:findClasses\\(\\) should return array\\ but returns array\\\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Only booleans are allowed in &&, Composer\\\\IO\\\\IOInterface\\|null given on the left side\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#" - count: 2 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Only booleans are allowed in an if condition, Composer\\\\IO\\\\IOInterface\\|null given\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Only booleans are allowed in an if condition, array\\ given\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Parameter \\#1 \\$str of function strtr expects string, string\\|false given\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Parameter \\#3 \\$baseNamespace of static method Composer\\\\Autoload\\\\ClassMapGenerator\\:\\:filterByNamespace\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - - - message: "#^Parameter \\#5 \\$basePath of static method Composer\\\\Autoload\\\\ClassMapGenerator\\:\\:filterByNamespace\\(\\) expects string, array\\\\|string\\|Traversable\\ given\\.$#" - count: 1 - path: ../src/Composer/Autoload/ClassMapGenerator.php - - message: "#^Casting to bool something that's already bool\\.$#" count: 2 @@ -717,7 +637,7 @@ parameters: - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 3 + count: 2 path: ../src/Composer/Command/RequireCommand.php - @@ -735,11 +655,6 @@ parameters: count: 1 path: ../src/Composer/Command/RequireCommand.php - - - message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" - count: 1 - path: ../src/Composer/Command/RequireCommand.php - - message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#" count: 2 @@ -1842,7 +1757,7 @@ parameters: - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 2 + count: 1 path: ../src/Composer/DependencyResolver/SolverProblemsException.php - @@ -3725,11 +3640,6 @@ parameters: count: 2 path: ../src/Composer/Repository/ComposerRepository.php - - - message: "#^Only booleans are allowed in a negated boolean, string\\|null given\\.$#" - count: 2 - path: ../src/Composer/Repository/ComposerRepository.php - - message: "#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#" count: 1 @@ -4518,11 +4428,6 @@ parameters: count: 1 path: ../src/Composer/SelfUpdate/Versions.php - - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" - count: 1 - path: src/Composer/Util/Auditor.php - - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" count: 1 @@ -5598,21 +5503,6 @@ parameters: count: 2 path: ../tests/Composer/Test/Autoload/AutoloadGeneratorTest.php - - - message: "#^Dynamic call to static method Composer\\\\Test\\\\TestCase\\:\\:ensureDirectoryExistsAndClear\\(\\)\\.$#" - count: 1 - path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - - - message: "#^Parameter \\#1 \\$expected of method Composer\\\\Test\\\\Autoload\\\\ClassMapGeneratorTest\\:\\:assertEqualsNormalized\\(\\) expects array\\, array\\ given\\.$#" - count: 3 - path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - - - message: "#^Parameter \\#2 \\$actual of method Composer\\\\Test\\\\Autoload\\\\ClassMapGeneratorTest\\:\\:assertEqualsNormalized\\(\\) expects array\\, array\\ given\\.$#" - count: 3 - path: ../tests/Composer/Test/Autoload/ClassMapGeneratorTest.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 1 diff --git a/src/Composer/Advisory/Auditor.php b/src/Composer/Advisory/Auditor.php new file mode 100644 index 000000000000..124372751d0a --- /dev/null +++ b/src/Composer/Advisory/Auditor.php @@ -0,0 +1,174 @@ +getMatchingSecurityAdvisories($packages, $format === self::FORMAT_SUMMARY); + $errorOrWarn = $warningOnly ? 'warning' : 'error'; + if (count($advisories) > 0) { + [$affectedPackages, $totalAdvisories] = $this->countAdvisories($advisories); + $plurality = $totalAdvisories === 1 ? 'y' : 'ies'; + $pkgPlurality = $affectedPackages === 1 ? '' : 's'; + $punctuation = $format === 'summary' ? '.' : ':'; + $io->writeError("<$errorOrWarn>Found $totalAdvisories security vulnerability advisor{$plurality} affecting $affectedPackages package{$pkgPlurality}{$punctuation}"); + $this->outputAdvisories($io, $advisories, $format); + + return $affectedPackages; + } + + $io->writeError('No security vulnerability advisories found'); + + return 0; + } + + /** + * @param array> $advisories + * @return array{int, int} Count of affected packages and total count of advisories + */ + private function countAdvisories(array $advisories): array + { + $count = 0; + foreach ($advisories as $packageAdvisories) { + $count += count($packageAdvisories); + } + return [count($advisories), $count]; + } + + /** + * @param IOInterface $io + * @param array> $advisories + * @param self::FORMAT_* $format The format that will be used to output audit results. + * @return void + */ + private function outputAdvisories(IOInterface $io, array $advisories, string $format): void + { + switch ($format) { + case self::FORMAT_TABLE: + if (!($io instanceof ConsoleIO)) { + throw new InvalidArgumentException('Cannot use table format with ' . get_class($io)); + } + $this->outputAvisoriesTable($io, $advisories); + return; + case self::FORMAT_PLAIN: + $this->outputAdvisoriesPlain($io, $advisories); + return; + case self::FORMAT_SUMMARY: + // We've already output the number of advisories in audit() + $io->writeError('Run composer audit for a full list of advisories.'); + return; + default: + throw new InvalidArgumentException('Invalid format "'.$format.'".'); + } + } + + /** + * @param ConsoleIO $io + * @param array> $advisories + * @return void + */ + private function outputAvisoriesTable(ConsoleIO $io, array $advisories): void + { + foreach ($advisories as $packageAdvisories) { + foreach ($packageAdvisories as $advisory) { + $io->getTable() + ->setHorizontal() + ->setHeaders([ + 'Package', + 'CVE', + 'Title', + 'URL', + 'Affected versions', + 'Reported at', + ]) + ->addRow([ + $advisory->packageName, + $this->getCVE($advisory), + $advisory->title, + $this->getURL($advisory), + $advisory->affectedVersions->getPrettyString(), + $advisory->reportedAt->format(DATE_ATOM), + ]) + ->setColumnWidth(1, 80) + ->setColumnMaxWidth(1, 80) + ->render(); + } + } + } + + /** + * @param IOInterface $io + * @param array> $advisories + * @return void + */ + private function outputAdvisoriesPlain(IOInterface $io, array $advisories): void + { + $error = []; + $firstAdvisory = true; + foreach ($advisories as $packageAdvisories) { + foreach ($packageAdvisories as $advisory) { + if (!$firstAdvisory) { + $error[] = '--------'; + } + $error[] = "Package: ".$advisory->packageName; + $error[] = "CVE: ".$this->getCVE($advisory); + $error[] = "Title: ".OutputFormatter::escape($advisory->title); + $error[] = "URL: ".$this->getURL($advisory); + $error[] = "Affected versions: ".OutputFormatter::escape($advisory->affectedVersions->getPrettyString()); + $error[] = "Reported at: ".$advisory->reportedAt->format(DATE_ATOM); + $firstAdvisory = false; + } + } + $io->writeError($error); + } + + private function getCVE(SecurityAdvisory $advisory): string + { + if ($advisory->cve === null) { + return 'NO CVE'; + } + + return ''.$advisory->cve.''; + } + + private function getURL(SecurityAdvisory $advisory): string + { + if ($advisory->link === null) { + return ''; + } + + return 'link).'>'.OutputFormatter::escape($advisory->link).''; + } +} diff --git a/src/Composer/Advisory/PartialSecurityAdvisory.php b/src/Composer/Advisory/PartialSecurityAdvisory.php new file mode 100644 index 000000000000..7a4cc7e12669 --- /dev/null +++ b/src/Composer/Advisory/PartialSecurityAdvisory.php @@ -0,0 +1,48 @@ + $data + * @return SecurityAdvisory|PartialSecurityAdvisory + */ + public static function create(string $packageName, array $data, VersionParser $parser): self + { + $constraint = $parser->parseConstraints($data['affectedVersions']); + if (isset($data['title'], $data['sources'], $data['reportedAt'])) { + return new SecurityAdvisory($packageName, $data['advisoryId'], $constraint, $data['title'], $data['sources'], new \DateTimeImmutable($data['reportedAt'], new \DateTimeZone('UTC')), $data['cve'] ?? null, $data['link'] ?? null); + } + + return new self($packageName, $data['advisoryId'], $constraint); + } + + public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions) + { + $this->advisoryId = $advisoryId; + $this->packageName = $packageName; + $this->affectedVersions = $affectedVersions; + } +} diff --git a/src/Composer/Advisory/SecurityAdvisory.php b/src/Composer/Advisory/SecurityAdvisory.php new file mode 100644 index 000000000000..e8b53e925f35 --- /dev/null +++ b/src/Composer/Advisory/SecurityAdvisory.php @@ -0,0 +1,54 @@ + + * @readonly + */ + public $sources; + + /** + * @param non-empty-array $sources + * @readonly + */ + public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, \DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null) + { + parent::__construct($packageName, $advisoryId, $affectedVersions); + + $this->title = $title; + $this->sources = $sources; + $this->reportedAt = $reportedAt; + $this->cve = $cve; + $this->link = $link; + } +} diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index ff511625e8a8..a5d0f5d6f3f8 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -1,14 +1,15 @@ -requireComposer(); $packages = $this->getPackages($composer, $input); - $httpDownloader = $composer->getLoop()->getHttpDownloader(); if (count($packages) === 0) { $this->getIO()->writeError('No packages - skipping audit.'); return 0; } - $auditor = new Auditor($httpDownloader); + $auditor = new Auditor(); + $repoSet = new RepositorySet(); + foreach ($composer->getRepositoryManager()->getRepositories() as $repo) { + $repoSet->addRepository($repo); + } - return min(255, $auditor->audit($this->getIO(), $packages, $this->getAuditFormat($input, 'format'), false)); + return min(255, $auditor->audit($this->getIO(), $repoSet, $packages, $this->getAuditFormat($input, 'format'), false)); } /** diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index afd2ae33b940..354b95be8ddd 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -25,7 +25,7 @@ use Composer\Plugin\PreCommandRunEvent; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginEvents; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; use Composer\Util\Platform; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 9156f04a80a2..f129b1523f82 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -44,7 +44,7 @@ use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Package\Version\VersionParser; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; /** * Install a package as new project into new directory. diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 015c7362dd2d..29b2d02f3f2f 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -15,7 +15,7 @@ use Composer\Installer; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; use Composer\Util\HttpDownloader; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index bfa3fe8257ed..ae26269bb2d5 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -25,7 +25,7 @@ use Composer\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Composer\Package\BasePackage; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; /** * @author Pierre du Plessis diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index d2898fbbad75..37e01b8547dd 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -31,7 +31,7 @@ use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\IO\IOInterface; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; use Composer\Util\Silencer; /** diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 7df4cc397b29..c4659693e645 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -25,7 +25,7 @@ use Composer\Util\HttpDownloader; use Composer\Semver\Constraint\MultiConstraint; use Composer\Package\Link; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 3328931d3cfb..737b58018d0d 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -62,7 +62,7 @@ use Composer\Repository\LockArrayRepository; use Composer\Script\ScriptEvents; use Composer\Semver\Constraint\ConstraintInterface; -use Composer\Util\Auditor; +use Composer\Advisory\Auditor; use Composer\Util\Platform; /** @@ -397,8 +397,12 @@ public function run(): int } if (count($packages) > 0) { try { - $auditor = new Auditor(Factory::createHttpDownloader($this->io, $this->config)); - $auditor->audit($this->io, $packages, $this->auditFormat); + $auditor = new Auditor(); + $repoSet = new RepositorySet(); + foreach ($this->repositoryManager->getRepositories() as $repo) { + $repoSet->addRepository($repo); + } + $auditor->audit($this->io, $repoSet, $packages, $this->auditFormat); } catch (TransportException $e) { $this->io->error('Failed to audit '.$target.' packages.'); if ($this->io->isVerbose()) { diff --git a/src/Composer/Repository/AdvisoryProviderInterface.php b/src/Composer/Repository/AdvisoryProviderInterface.php new file mode 100644 index 000000000000..950f283027ea --- /dev/null +++ b/src/Composer/Repository/AdvisoryProviderInterface.php @@ -0,0 +1,34 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Repository; + +use Composer\Semver\Constraint\ConstraintInterface; +use Composer\Advisory\PartialSecurityAdvisory; +use Composer\Advisory\SecurityAdvisory; + +/** + * Repositories that allow fetching security advisory data + * + * @author Jordi Boggiano + * @internal + */ +interface AdvisoryProviderInterface +{ + public function hasSecurityAdvisories(): bool; + + /** + * @param array $packageConstraintMap Map of package name to constraint (can be MatchAllConstraint to fetch all advisories) + * @return ($allowPartialAdvisories is true ? array{namesFound: string[], advisories: array>} : array{namesFound: string[], advisories: array>}) + */ + public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPartialAdvisories = false): array; +} diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 1c07f60ba2fd..fabf2d2b8ce6 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -12,6 +12,8 @@ namespace Composer\Repository; +use Composer\Advisory\PartialSecurityAdvisory; +use Composer\Advisory\SecurityAdvisory; use Composer\Package\BasePackage; use Composer\Package\Loader\ArrayLoader; use Composer\Package\PackageInterface; @@ -40,11 +42,12 @@ use Composer\MetadataMinifier\MetadataMinifier; use Composer\Util\Url; use React\Promise\PromiseInterface; +use function React\Promise\resolve; /** * @author Jordi Boggiano */ -class ComposerRepository extends ArrayRepository implements ConfigurableRepositoryInterface +class ComposerRepository extends ArrayRepository implements ConfigurableRepositoryInterface, AdvisoryProviderInterface { /** * @var mixed[] @@ -107,6 +110,8 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito private $partialPackagesByName = null; /** @var bool */ private $displayedWarningAboutNonMatchingPackageIndex = false; + /** @var array{metadata: bool, query-all: bool, api-url: string|null}|null */ + private $securityAdvisoryConfig = null; /** * @var array list of package names which are fresh and can be loaded from the cache directly in case loadPackage is called several times @@ -472,7 +477,7 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities // this call initializes loadRootServerFile which is needed for the rest below to work $hasProviders = $this->hasProviders(); - if (!$hasProviders && !$this->hasPartialPackages() && !$this->lazyProvidersUrl) { + if (!$hasProviders && !$this->hasPartialPackages() && null === $this->lazyProvidersUrl) { return parent::loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); } @@ -604,6 +609,102 @@ public function search(string $query, int $mode = 0, ?string $type = null) return parent::search($query, $mode); } + public function hasSecurityAdvisories(): bool + { + $this->loadRootServerFile(600); + return $this->securityAdvisoryConfig !== null && ($this->securityAdvisoryConfig['metadata'] || $this->securityAdvisoryConfig['api-url'] !== null); + } + + /** + * @inheritDoc + */ + public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPartialAdvisories = false): array + { + $this->loadRootServerFile(600); + if (null === $this->securityAdvisoryConfig) { + return ['namesFound' => [], 'advisories' => []]; + } + + $advisories = []; + $namesFound = []; + + $apiUrl = $this->securityAdvisoryConfig['api-url']; + + $parser = new VersionParser(); + /** + * @param array $data + * @param string $name + * @return ($allowPartialAdvisories is false ? SecurityAdvisory|null : PartialSecurityAdvisory|SecurityAdvisory|null) + */ + $create = function (array $data, string $name) use ($parser, $allowPartialAdvisories, &$packageConstraintMap): ?PartialSecurityAdvisory { + $advisory = PartialSecurityAdvisory::create($name, $data, $parser); + if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { + throw new \RuntimeException('Advisory for '.$name.' could not be loaded as a full advisory from '.$this->getRepoName() . PHP_EOL . var_export($data, true)); + } + if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { + return null; + } + + return $advisory; + }; + + if ($this->securityAdvisoryConfig['metadata'] && ($allowPartialAdvisories || $apiUrl === null)) { + $promises = []; + foreach ($packageConstraintMap as $name => $constraint) { + $name = strtolower($name); + + // skip platform packages, root package and composer-plugin-api + if (PlatformRepository::isPlatformPackage($name) || '__root__' === $name) { + continue; + } + + $promises[] = $this->startCachedAsyncDownload($name, $name) + ->then(function (array $spec) use (&$advisories, &$namesFound, &$packageConstraintMap, $name, $create): void { + list($response, ) = $spec; + + if (!isset($response['security-advisories']) || !is_array($response['security-advisories'])) { + return; + } + + $namesFound[$name] = true; + if (count($response['security-advisories']) > 0) { + $advisories[$name] = array_filter(array_map( + function ($data) use ($name, $create) { return $create($data, $name); }, + $response['security-advisories'] + )); + } + unset($packageConstraintMap[$name]); + }); + } + + $this->loop->wait($promises); + } + + if ($apiUrl !== null && count($packageConstraintMap) > 0) { + $options = [ + 'http' => [ + 'method' => 'POST', + 'header' => ['Content-type: application/x-www-form-urlencoded'], + 'timeout' => 10, + 'content' => http_build_query(['packages' => array_keys($packageConstraintMap)]), + ], + ]; + $response = $this->httpDownloader->get($apiUrl, $options); + /** @var string $name */ + foreach ($response->decodeJson()['advisories'] as $name => $list) { + if (count($list) > 0) { + $advisories[$name] = array_filter(array_map( + function ($data) use ($name, $create) { return $create($data, $name); }, + $list + )); + } + $namesFound[$name] = true; + } + } + + return ['namesFound' => array_keys($namesFound), 'advisories' => array_filter($advisories)]; + } + public function getProviders(string $packageName) { $this->loadRootServerFile(); @@ -863,7 +964,8 @@ public function addPackage(PackageInterface $package) } /** - * @param array $packageNames array of package name => ConstraintInterface|null - if a constraint is provided, only packages matching it will be loaded + * @param array $packageNames array of package name => ConstraintInterface|null - if a constraint is provided, only + * packages matching it will be loaded * @param array|null $acceptableStabilities * @phpstan-param array|null $acceptableStabilities * @param array|null $stabilityFlags an array of package name => BasePackage::STABILITY_* value @@ -880,7 +982,7 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili $namesFound = array(); $promises = array(); - if (!$this->lazyProvidersUrl) { + if (null === $this->lazyProvidersUrl) { throw new \LogicException('loadAsyncPackages only supports v2 protocol composer repos with a metadata-url'); } @@ -904,25 +1006,10 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili continue; } - $url = str_replace('%package%', $name, $this->lazyProvidersUrl); - $cacheKey = 'provider-'.strtr($name, '/', '~').'.json'; - - $lastModified = null; - if ($contents = $this->cache->read($cacheKey)) { - $contents = json_decode($contents, true); - $lastModified = $contents['last-modified'] ?? null; - } - - $promises[] = $this->asyncFetchFile($url, $cacheKey, $lastModified) - ->then(function ($response) use (&$packages, &$namesFound, $url, $cacheKey, $contents, $realName, $constraint, $acceptableStabilities, $stabilityFlags, $alreadyLoaded): void { - $packagesSource = 'downloaded file ('.Url::sanitize($url).')'; - - if (true === $response) { - $packagesSource = 'cached file ('.$cacheKey.' originating from '.Url::sanitize($url).')'; - $response = $contents; - } - - if (!isset($response['packages'][$realName])) { + $promises[] = $this->startCachedAsyncDownload($name, $realName) + ->then(function (array $spec) use (&$packages, &$namesFound, $realName, $constraint, $acceptableStabilities, $stabilityFlags, $alreadyLoaded): void { + list($response, $packagesSource) = $spec; + if (null === $response) { return; } @@ -968,7 +1055,41 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili $this->loop->wait($promises); return array('namesFound' => $namesFound, 'packages' => $packages); - // RepositorySet should call loadMetadata, getMetadata when all promises resolved, then metadataComplete when done so we can GC the loaded json and whatnot then as needed + } + + private function startCachedAsyncDownload(string $fileName, string $packageName = null): PromiseInterface + { + if (null === $this->lazyProvidersUrl) { + throw new \LogicException('startCachedAsyncDownload only supports v2 protocol composer repos with a metadata-url'); + } + + $name = strtolower($fileName); + $packageName = $packageName ?? $name; + + $url = str_replace('%package%', $name, $this->lazyProvidersUrl); + $cacheKey = 'provider-'.strtr($name, '/', '~').'.json'; + + $lastModified = null; + if ($contents = $this->cache->read($cacheKey)) { + $contents = json_decode($contents, true); + $lastModified = $contents['last-modified'] ?? null; + } + + return $this->asyncFetchFile($url, $cacheKey, $lastModified) + ->then(function ($response) use ($url, $cacheKey, $contents, $packageName): array { + $packagesSource = 'downloaded file ('.Url::sanitize($url).')'; + + if (true === $response) { + $packagesSource = 'cached file ('.$cacheKey.' originating from '.Url::sanitize($url).')'; + $response = $contents; + } + + if (!isset($response['packages'][$packageName])) { + return [null, $packagesSource]; + } + + return [$response, $packagesSource]; + }); } /** @@ -1113,6 +1234,14 @@ protected function loadRootServerFile(?int $rootMaxAge = null) // Remove legacy keys as most repos need to be compatible with Composer v1 // as well but we are not interested in the old format anymore at this point unset($data['providers-url'], $data['providers'], $data['providers-includes']); + + if (isset($data['security-advisories']) && is_array($data['security-advisories'])) { + $this->securityAdvisoryConfig = [ + 'metadata' => $data['security-advisories']['metadata'] ?? false, + 'api-url' => $data['security-advisories']['api-url'] ?? null, + 'query-all' => $data['security-advisories']['query-all'] ?? false, + ]; + } } if ($this->allowSslDowngrade) { diff --git a/src/Composer/Repository/RepositorySet.php b/src/Composer/Repository/RepositorySet.php index e656d18c5415..c9183ce8443d 100644 --- a/src/Composer/Repository/RepositorySet.php +++ b/src/Composer/Repository/RepositorySet.php @@ -17,14 +17,19 @@ use Composer\DependencyResolver\PoolBuilder; use Composer\DependencyResolver\Request; use Composer\EventDispatcher\EventDispatcher; +use Composer\Advisory\SecurityAdvisory; +use Composer\Advisory\PartialSecurityAdvisory; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; +use Composer\Package\PackageInterface; +use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Package\Version\StabilityFilter; +use Composer\Semver\Constraint\MatchAllConstraint; /** * @author Nils Adermann @@ -226,6 +231,57 @@ public function findPackages(string $name, ConstraintInterface $constraint = nul return $result; } + /** + * @param string[] $packageNames + * @return ($allowPartialAdvisories is true ? array> : array>) + */ + public function getSecurityAdvisories(array $packageNames, bool $allowPartialAdvisories = false): array + { + $map = []; + foreach ($packageNames as $name) { + $map[$name] = new MatchAllConstraint(); + } + + return $this->getSecurityAdvisoriesForConstraints($map, $allowPartialAdvisories); + } + + /** + * @param PackageInterface[] $packages + * @return ($allowPartialAdvisories is true ? array> : array>) + */ + public function getMatchingSecurityAdvisories(array $packages, bool $allowPartialAdvisories = false): array + { + $map = []; + foreach ($packages as $package) { + $map[$package->getName()] = new Constraint('=', $package->getVersion()); + } + + return $this->getSecurityAdvisoriesForConstraints($map, $allowPartialAdvisories); + } + + /** + * @param array $packageConstraintMap + * @return ($allowPartialAdvisories is true ? array> : array>) + */ + private function getSecurityAdvisoriesForConstraints(array $packageConstraintMap, bool $allowPartialAdvisories): array + { + $advisories = []; + foreach ($this->repositories as $repository) { + if (!$repository instanceof AdvisoryProviderInterface || !$repository->hasSecurityAdvisories()) { + continue; + } + + $result = $repository->getSecurityAdvisories($packageConstraintMap, $allowPartialAdvisories); + foreach ($result['namesFound'] as $nameFound) { + unset($packageConstraintMap[$nameFound]); + } + + $advisories = array_merge($advisories, $result['advisories']); + } + + return $advisories; + } + /** * @param string $packageName * diff --git a/src/Composer/Util/Auditor.php b/src/Composer/Util/Auditor.php deleted file mode 100644 index ca45c45f0eaa..000000000000 --- a/src/Composer/Util/Auditor.php +++ /dev/null @@ -1,250 +0,0 @@ -httpDownloader = $httpDownloader; - } - - /** - * @param IOInterface $io - * @param PackageInterface[] $packages - * @param self::FORMAT_* $format The format that will be used to output audit results. - * @param bool $warningOnly If true, outputs a warning. If false, outputs an error. - * @return int Amount of advisories found - * @throws InvalidArgumentException If no packages are passed in - */ - public function audit(IOInterface $io, array $packages, string $format, bool $warningOnly = true): int - { - $advisories = $this->getAdvisories($packages); - $errorOrWarn = $warningOnly ? 'warning' : 'error'; - if (count($advisories) > 0) { - $numAdvisories = $this->countAdvisories($advisories); - $plurality = $numAdvisories === 1 ? 'y' : 'ies'; - $punctuation = $format === 'summary' ? '.' : ':'; - $io->writeError("<$errorOrWarn>Found $numAdvisories security vulnerability advisor{$plurality}{$punctuation}"); - $this->outputAdvisories($io, $advisories, $format); - - return count($advisories); - } - - $io->writeError('No security vulnerability advisories found'); - - return 0; - } - - /** - * Get advisories from packagist.org - * - * @param PackageInterface[] $packages - * @param ?int $updatedSince Timestamp - * @param bool $filterByVersion Filter by the package versions if true - * @return string[][][] - * @throws InvalidArgumentException If no packages and no updatedSince timestamp are passed in - */ - public function getAdvisories(array $packages = [], int $updatedSince = null, bool $filterByVersion = true): array - { - if (count($packages) === 0 && $updatedSince === null) { - throw new InvalidArgumentException( - 'At least one package or an $updatedSince timestamp must be passed in.' - ); - } - - if (count($packages) === 0 && $filterByVersion) { - return []; - } - - // Add updatedSince query to URL if passed in - $url = self::API_URL; - if ($updatedSince !== null) { - $url .= "?updatedSince=$updatedSince"; - } - - // Get advisories from API - $response = $this->httpDownloader->get($url, $this->createPostOptions($packages)); - $advisories = $response->decodeJson()['advisories']; - - if (count($advisories) > 0 && $filterByVersion) { - return $this->filterAdvisories($advisories, $packages); - } - - return $advisories; - } - - /** - * @param PackageInterface[] $packages - * @return string[] - * @phpstan-return array|int|string>> - */ - private function createPostOptions(array $packages): array - { - $options = [ - 'http' => [ - 'method' => 'POST', - 'header' => ['Content-type: application/x-www-form-urlencoded'], - 'timeout' => 10, - ], - ]; - if (count($packages) > 0) { - $content = ['packages' => []]; - foreach ($packages as $package) { - $content['packages'][] = $package->getName(); - } - $options['http']['content'] = http_build_query($content); - } - return $options; - } - - /** - * @param string[][][] $advisories - * @param PackageInterface[] $packages - * @return string[][][] - */ - private function filterAdvisories(array $advisories, array $packages): array - { - $filteredAdvisories = []; - foreach ($packages as $package) { - if (array_key_exists($package->getName(), $advisories)) { - foreach ($advisories[$package->getName()] as $advisory) { - if (Semver::satisfies($package->getVersion(), $advisory['affectedVersions'])) { - $filteredAdvisories[$package->getName()][] = $advisory; - } - } - } - } - return $filteredAdvisories; - } - - /** - * @param string[][][] $advisories - * @return integer - */ - private function countAdvisories(array $advisories): int - { - $count = 0; - foreach ($advisories as $packageAdvisories) { - $count += count($packageAdvisories); - } - return $count; - } - - /** - * @param IOInterface $io - * @param string[][][] $advisories - * @param self::FORMAT_* $format The format that will be used to output audit results. - * @return void - */ - private function outputAdvisories(IOInterface $io, array $advisories, string $format): void - { - switch ($format) { - case self::FORMAT_TABLE: - if (!($io instanceof ConsoleIO)) { - throw new InvalidArgumentException('Cannot use table format with ' . get_class($io)); - } - $this->outputAvisoriesTable($io, $advisories); - return; - case self::FORMAT_PLAIN: - $this->outputAdvisoriesPlain($io, $advisories); - return; - case self::FORMAT_SUMMARY: - // We've already output the number of advisories in audit() - $io->writeError('Run composer audit for a full list of advisories.'); - return; - default: - throw new InvalidArgumentException('Invalid format "'.$format.'".'); - } - } - - /** - * @param ConsoleIO $io - * @param string[][][] $advisories - * @return void - */ - private function outputAvisoriesTable(ConsoleIO $io, array $advisories): void - { - foreach ($advisories as $package => $packageAdvisories) { - foreach ($packageAdvisories as $advisory) { - $io->getTable() - ->setHorizontal() - ->setHeaders([ - 'Package', - 'CVE', - 'Title', - 'URL', - 'Affected versions', - 'Reported at', - ]) - ->addRow([ - $package, - $advisory['cve'] ?? 'NO CVE', - $advisory['title'], - $advisory['link'], - $advisory['affectedVersions'], - $advisory['reportedAt'], - ]) - ->setColumnWidth(1, 80) - ->setColumnMaxWidth(1, 80) - ->render(); - } - } - } - - /** - * @param IOInterface $io - * @param string[][][] $advisories - * @return void - */ - private function outputAdvisoriesPlain(IOInterface $io, array $advisories): void - { - $error = []; - $firstAdvisory = true; - foreach ($advisories as $package => $packageAdvisories) { - foreach ($packageAdvisories as $advisory) { - if (!$firstAdvisory) { - $error[] = '--------'; - } - $cve = $advisory['cve'] ?? 'NO CVE'; - $error[] = "Package: $package"; - $error[] = "CVE: $cve"; - $error[] = "Title: {$advisory['title']}"; - $error[] = "URL: {$advisory['link']}"; - $error[] = "Affected versions: {$advisory['affectedVersions']}"; - $error[] = "Reported at: {$advisory['reportedAt']}"; - $firstAdvisory = false; - } - } - $io->writeError($error); - } -} diff --git a/tests/Composer/Test/Advisory/AuditorTest.php b/tests/Composer/Test/Advisory/AuditorTest.php new file mode 100644 index 000000000000..1dec611d4037 --- /dev/null +++ b/tests/Composer/Test/Advisory/AuditorTest.php @@ -0,0 +1,289 @@ + [ + 'packages' => [ + new Package('vendor1/package2', '9.0.0', '9.0.0'), + new Package('vendor1/package1', '9.0.0', '9.0.0'), + new Package('vendor3/package1', '9.0.0', '9.0.0'), + ], + 'warningOnly' => true, + ], + 'expected' => 0, + 'message' => 'Test no advisories returns 0', + ], + // Test with advisories returns 1 + [ + 'data' => [ + 'packages' => [ + new Package('vendor1/package2', '9.0.0', '9.0.0'), + new Package('vendor1/package1', '8.2.1', '8.2.1'), + new Package('vendor3/package1', '9.0.0', '9.0.0'), + ], + 'warningOnly' => true, + ], + 'expected' => 1, + 'message' => 'Test with advisories returns 1', + ], + ]; + } + + /** + * @dataProvider auditProvider + * @phpstan-param array $data + */ + public function testAudit(array $data, int $expected, string $message): void + { + if (count($data['packages']) === 0) { + $this->expectException(InvalidArgumentException::class); + } + $auditor = new Auditor(); + $result = $auditor->audit(new NullIO(), $this->getRepoSet(), $data['packages'], Auditor::FORMAT_PLAIN, $data['warningOnly']); + $this->assertSame($expected, $result, $message); + } + + private function getRepoSet(): RepositorySet + { + $repo = $this + ->getMockBuilder(ComposerRepository::class) + ->disableOriginalConstructor() + ->onlyMethods(['hasSecurityAdvisories', 'getSecurityAdvisories']) + ->getMock(); + + $repoSet = new RepositorySet(); + $repoSet->addRepository($repo); + + $repo + ->method('hasSecurityAdvisories') + ->willReturn(true); + + $repo + ->method('getSecurityAdvisories') + ->willReturnCallback(function (array $packageConstraintMap, bool $allowPartialAdvisories) { + $advisories = []; + + $parser = new VersionParser(); + /** + * @param array $data + * @param string $name + * @return ($allowPartialAdvisories is false ? SecurityAdvisory|null : PartialSecurityAdvisory|SecurityAdvisory|null) + */ + $create = function (array $data, string $name) use ($parser, $allowPartialAdvisories, $packageConstraintMap): ?PartialSecurityAdvisory { + $advisory = PartialSecurityAdvisory::create($name, $data, $parser); + if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { + throw new \RuntimeException('Advisory for '.$name.' could not be loaded as a full advisory from test repo'); + } + if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { + return null; + } + + return $advisory; + }; + + foreach (self::getMockAdvisories() as $package => $list) { + if (!isset($packageConstraintMap[$package])) { + continue; + } + $advisories[$package] = array_filter(array_map( + function ($data) use ($package, $create) { return $create($data, $package); }, + $list + )); + } + + return ['namesFound' => array_keys($packageConstraintMap), 'advisories' => array_filter($advisories)]; + }); + + return $repoSet; + } + + /** + * @return array + */ + public static function getMockAdvisories(): array + { + $advisories = [ + 'vendor1/package1' => [ + [ + 'advisoryId' => 'ID1', + 'packageName' => 'vendor1/package1', + 'title' => 'advisory1', + 'link' => 'https://advisory.example.com/advisory1', + 'cve' => 'CVE1', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source1', + 'remoteId' => 'RemoteID1', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + [ + 'advisoryId' => 'ID4', + 'packageName' => 'vendor1/package1', + 'title' => 'advisory4', + 'link' => 'https://advisory.example.com/advisory4', + 'cve' => 'CVE3', + 'affectedVersions' => '>=8,<8.2.2|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID2', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + [ + 'advisoryId' => 'ID5', + 'packageName' => 'vendor1/package1', + 'title' => 'advisory5', + 'link' => 'https://advisory.example.com/advisory5', + 'cve' => '', + 'affectedVersions' => '>=8,<8.2.2|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source1', + 'remoteId' => 'RemoteID3', + ], + ], + 'reportedAt' => '', + 'composerRepository' => 'https://packagist.org', + ] + ], + 'vendor1/package2' => [ + [ + 'advisoryId' => 'ID2', + 'packageName' => 'vendor1/package2', + 'title' => 'advisory2', + 'link' => 'https://advisory.example.com/advisory2', + 'cve' => '', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source1', + 'remoteId' => 'RemoteID2', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + 'vendorx/packagex' => [ + [ + 'advisoryId' => 'IDx', + 'packageName' => 'vendorx/packagex', + 'title' => 'advisory7', + 'link' => 'https://advisory.example.com/advisory7', + 'cve' => 'CVE5', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID4', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + 'vendor2/package1' => [ + [ + 'advisoryId' => 'ID3', + 'packageName' => 'vendor2/package1', + 'title' => 'advisory3', + 'link' => 'https://advisory.example.com/advisory3', + 'cve' => 'CVE2', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID1', + ], + ], + 'reportedAt' => '2022-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + [ + 'advisoryId' => 'ID6', + 'packageName' => 'vendor2/package1', + 'title' => 'advisory6', + 'link' => 'https://advisory.example.com/advisory6', + 'cve' => 'CVE4', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID3', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ] + ], + 'vendory/packagey' => [ + [ + 'advisoryId' => 'IDy', + 'packageName' => 'vendory/packagey', + 'title' => 'advisory7', + 'link' => 'https://advisory.example.com/advisory7', + 'cve' => 'CVE5', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID4', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + 'vendor3/package1' => [ + [ + 'advisoryId' => 'ID7', + 'packageName' => 'vendor3/package1', + 'title' => 'advisory7', + 'link' => 'https://advisory.example.com/advisory7', + 'cve' => 'CVE5', + 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', + 'sources' => [ + [ + 'name' => 'source2', + 'remoteId' => 'RemoteID4', + ], + ], + 'reportedAt' => '2015-05-25 13:21:00', + 'composerRepository' => 'https://packagist.org', + ], + ], + ]; + + return $advisories; + } +} diff --git a/tests/Composer/Test/Util/AuditorTest.php b/tests/Composer/Test/Util/AuditorTest.php deleted file mode 100644 index ad4c06f65f7d..000000000000 --- a/tests/Composer/Test/Util/AuditorTest.php +++ /dev/null @@ -1,395 +0,0 @@ - [ - 'packages' => [ - new Package('vendor1/package2', '9.0.0', '9.0.0'), - new Package('vendor1/package1', '9.0.0', '9.0.0'), - new Package('vendor3/package1', '9.0.0', '9.0.0'), - ], - 'warningOnly' => true, - ], - 'expected' => 0, - 'message' => 'Test no advisories returns 0', - ], - // Test with advisories returns 1 - [ - 'data' => [ - 'packages' => [ - new Package('vendor1/package2', '9.0.0', '9.0.0'), - new Package('vendor1/package1', '8.2.1', '8.2.1'), - new Package('vendor3/package1', '9.0.0', '9.0.0'), - ], - 'warningOnly' => true, - ], - 'expected' => 1, - 'message' => 'Test with advisories returns 1', - ], - // Test no packages throws InvalidArgumentException - [ - 'data' => [ - 'packages' => [], - 'warningOnly' => true, - ], - 'expected' => 1, - 'message' => 'Test no packages throws InvalidArgumentException', - ], - ]; - } - - /** - * @dataProvider auditProvider - * @phpstan-param array $data - */ - public function testAudit(array $data, int $expected, string $message): void - { - if (count($data['packages']) === 0) { - $this->expectException(InvalidArgumentException::class); - } - $auditor = new Auditor($this->getHttpDownloader()); - $result = $auditor->audit(new NullIO(), $data['packages'], Auditor::FORMAT_PLAIN, $data['warningOnly']); - $this->assertSame($expected, $result, $message); - } - - /** - * @return mixed[] - */ - public function advisoriesProvider(): array - { - $advisories = static::getMockAdvisories(null); - return [ - [ - 'data' => [ - 'packages' => [ - new Package('vendor1/package1', '8.2.1', '8.2.1'), - new Package('vendor1/package2', '3.1.0', '3.1.0'), - // Check a package with no advisories at all doesn't cause any issues - new Package('vendor5/package2', '5.0.0', '5.0.0'), - ], - 'updatedSince' => null, - 'filterByVersion' => false - ], - 'expected' => [ - 'vendor1/package1' => $advisories['vendor1/package1'], - 'vendor1/package2' => $advisories['vendor1/package2'], - ], - 'message' => 'Check not filtering by version', - ], - [ - 'data' => [ - 'packages' => [ - new Package('vendor1/package1', '8.2.1', '8.2.1'), - new Package('vendor1/package2', '3.1.0', '3.1.0'), - // Check a package with no advisories at all doesn't cause any issues - new Package('vendor5/package2', '5.0.0', '5.0.0'), - ], - 'updatedSince' => null, - 'filterByVersion' => true - ], - 'expected' => [ - 'vendor1/package1' => [ - $advisories['vendor1/package1'][1], - $advisories['vendor1/package1'][2], - ], - 'vendor1/package2' => [ - $advisories['vendor1/package2'][0], - ], - ], - 'message' => 'Check filter by version', - ], - [ - 'data' => [ - 'packages' => [ - new Package('vendor1/package1', '8.2.1', '8.2.1'), - new Package('vendor1/package2', '5.0.0', '5.0.0'), - new Package('vendor2/package1', '3.0.0', '3.0.0'), - ], - 'updatedSince' => 1335939007, - 'filterByVersion' => false - ], - 'expected' => [ - 'vendor1/package1' => [ - $advisories['vendor1/package1'][0], - $advisories['vendor1/package1'][1], - ], - 'vendor1/package2' => [ - $advisories['vendor1/package2'][0], - ], - 'vendor2/package1' => [ - $advisories['vendor2/package1'][0], - ], - ], - 'message' => 'Check updatedSince is passed through to the API', - ], - [ - 'data' => [ - 'packages' => [], - 'updatedSince' => 1335939007, - 'filterByVersion' => true - ], - 'expected' => [], - 'message' => 'No packages and filterByVersion === true should return 0 results', - ], - [ - 'data' => [ - 'packages' => [], - 'updatedSince' => 0, - 'filterByVersion' => false - ], - // All advisories expected with no packages and updatedSince === 0 - 'expected' => $advisories, - 'message' => 'No packages and updatedSince === 0 should NOT throw LogicException', - ], - [ - 'data' => [ - 'packages' => [], - 'updatedSince' => null, - 'filterByVersion' => false - ], - 'expected' => [], - 'message' => 'No packages and updatedSince === null should throw LogicException', - ], - ]; - } - - /** - * @dataProvider advisoriesProvider - * @phpstan-param array $data - * @phpstan-param string[][][] $expected - */ - public function testGetAdvisories(array $data, array $expected, string $message): void - { - if (count($data['packages']) === 0 && $data['updatedSince'] === null) { - $this->expectException(InvalidArgumentException::class); - } - $auditor = new Auditor($this->getHttpDownloader()); - $result = $auditor->getAdvisories($data['packages'], $data['updatedSince'], $data['filterByVersion']); - $this->assertSame($expected, $result, $message); - } - - /** - * @return HttpDownloader&MockObject - */ - private function getHttpDownloader(): MockObject - { - $httpDownloader = $this - ->getMockBuilder(HttpDownloader::class) - ->disableOriginalConstructor() - ->onlyMethods(['get']) - ->getMock(); - - $callback = function(string $url, array $options) { - parse_str((string) parse_url($url, PHP_URL_QUERY), $query); - $updatedSince = null; - if (isset($query['updatedSince'])) { - $updatedSince = $query['updatedSince']; - } - - $advisories = AuditorTest::getMockAdvisories($updatedSince); - - // If the mock API request is for specific packages, only include advisories for those packages - if (isset($options['http']['content'])) { - parse_str($options['http']['content'], $body); - $packages = $body['packages']; - foreach ($advisories as $package => $data) { - if (!in_array($package, $packages, true)) { - unset($advisories[$package]); - } - } - } - - return new Response(['url' => 'https://packagist.org/api/security-advisories/'], 200, [], JsonFile::encode(['advisories' => $advisories])); - }; - - $httpDownloader - ->method('get') - ->willReturnCallback($callback); - - return $httpDownloader; - } - - /** - * @return array - */ - public static function getMockAdvisories(?int $updatedSince): array - { - $advisories = [ - 'vendor1/package1' => [ - [ - 'advisoryId' => 'ID1', - 'packageName' => 'vendor1/package1', - 'title' => 'advisory1', - 'link' => 'https://advisory.example.com/advisory1', - 'cve' => 'CVE1', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source1', - 'remoteId' => 'RemoteID1', - ], - ], - 'reportedAt' => '2022-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ], - [ - 'advisoryId' => 'ID4', - 'packageName' => 'vendor1/package1', - 'title' => 'advisory4', - 'link' => 'https://advisory.example.com/advisory4', - 'cve' => 'CVE3', - 'affectedVersions' => '>=8,<8.2.2|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source2', - 'remoteId' => 'RemoteID2', - ], - ], - 'reportedAt' => '2022-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ], - ], - 'vendor1/package2' => [ - [ - 'advisoryId' => 'ID2', - 'packageName' => 'vendor1/package2', - 'title' => 'advisory2', - 'link' => 'https://advisory.example.com/advisory2', - 'cve' => '', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source1', - 'remoteId' => 'RemoteID2', - ], - ], - 'reportedAt' => '2022-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ], - ], - 'vendorx/packagex' => [ - [ - 'advisoryId' => 'IDx', - 'packageName' => 'vendorx/packagex', - 'title' => 'advisory7', - 'link' => 'https://advisory.example.com/advisory7', - 'cve' => 'CVE5', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source2', - 'remoteId' => 'RemoteID4', - ], - ], - 'reportedAt' => '2015-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ], - ], - 'vendor2/package1' => [ - [ - 'advisoryId' => 'ID3', - 'packageName' => 'vendor2/package1', - 'title' => 'advisory3', - 'link' => 'https://advisory.example.com/advisory3', - 'cve' => 'CVE2', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source2', - 'remoteId' => 'RemoteID1', - ], - ], - 'reportedAt' => '2022-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ], - ], - ]; - - if (0 === $updatedSince || null === $updatedSince) { - $advisories['vendor1/package1'][] = [ - 'advisoryId' => 'ID5', - 'packageName' => 'vendor1/package1', - 'title' => 'advisory5', - 'link' => 'https://advisory.example.com/advisory5', - 'cve' => '', - 'affectedVersions' => '>=8,<8.2.2|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source1', - 'remoteId' => 'RemoteID3', - ], - ], - 'reportedAt' => '', - 'composerRepository' => 'https://packagist.org', - ]; - $advisories['vendor2/package1'][] = [ - 'advisoryId' => 'ID6', - 'packageName' => 'vendor2/package1', - 'title' => 'advisory6', - 'link' => 'https://advisory.example.com/advisory6', - 'cve' => 'CVE4', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source2', - 'remoteId' => 'RemoteID3', - ], - ], - 'reportedAt' => '2015-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ]; - $advisories['vendory/packagey'][] = [ - 'advisoryId' => 'IDy', - 'packageName' => 'vendory/packagey', - 'title' => 'advisory7', - 'link' => 'https://advisory.example.com/advisory7', - 'cve' => 'CVE5', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source2', - 'remoteId' => 'RemoteID4', - ], - ], - 'reportedAt' => '2015-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ]; - $advisories['vendor3/package1'][] = [ - 'advisoryId' => 'ID7', - 'packageName' => 'vendor3/package1', - 'title' => 'advisory7', - 'link' => 'https://advisory.example.com/advisory7', - 'cve' => 'CVE5', - 'affectedVersions' => '>=3,<3.4.3|>=1,<2.5.6', - 'sources' => [ - [ - 'name' => 'source2', - 'remoteId' => 'RemoteID4', - ], - ], - 'reportedAt' => '2015-05-25 13:21:00', - 'composerRepository' => 'https://packagist.org', - ]; - } - - return $advisories; - } -} From 0196690ab383eedfaaf268850cdfe1b2ce90efb2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 24 Jun 2022 16:54:30 +0200 Subject: [PATCH 155/618] Disable automatic audit at the end of install step to keep things fast, switch --no-audit to an opt-in --audit flag --- doc/03-cli.md | 2 +- src/Composer/Command/InstallCommand.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 57685296c62f..3703adde62b5 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -109,7 +109,7 @@ resolution. * **--no-autoloader:** Skips autoloader generation. * **--no-progress:** Removes the progress display that can mess with some terminals or scripts which don't handle backspace characters. -* **--no-audit:** Does not run the audit step after installation is complete. +* **--audit:** Run an audit after installation is complete. * **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). * **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but can take diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 29b2d02f3f2f..7ad0acf7906c 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -52,7 +52,7 @@ protected function configure() new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Do not use, only defined here to catch misuse of the install command.'), - new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after installation is complete.'), + new InputOption('audit', null, InputOption::VALUE_NONE, 'Run an audit after installation is complete.'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), @@ -133,7 +133,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setClassMapAuthoritative($authoritative) ->setApcuAutoloader($apcu, $apcuPrefix) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) - ->setAudit(!$input->getOption('no-audit')) + ->setAudit($input->getOption('audit')) ->setAuditFormat($this->getAuditFormat($input)) ; From d880ab68cf9567406457c209d93b5adc0099bdf2 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Sat, 25 Jun 2022 16:06:58 +0100 Subject: [PATCH 156/618] Allow use of --locked with depends and prohibits (#10834) * Allow use of --locked with depends and prohibits * Only include other repos if not --locked * Move logic to appease PHPStan * Load a PlatformRepository when reading lock file --- .../Command/BaseDependencyCommand.php | 35 +++++++++++++++---- src/Composer/Command/DependsCommand.php | 1 + src/Composer/Command/ProhibitsCommand.php | 1 + 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 8aa9759e026d..992d6473a47f 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -58,12 +58,35 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo $commandEvent = new CommandEvent(PluginEvents::COMMAND, $this->getName(), $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); - $platformOverrides = $composer->getConfig()->get('platform') ?: array(); - $installedRepo = new InstalledRepository(array( - new RootPackageRepository($composer->getPackage()), - $composer->getRepositoryManager()->getLocalRepository(), - new PlatformRepository(array(), $platformOverrides), - )); + $repos = []; + + $repos[] = new RootPackageRepository($composer->getPackage()); + + if ($input->getOption('locked')) { + $locker = $composer->getLocker(); + + if (!$locker->isLocked()) { + throw new \UnexpectedValueException('A valid composer.lock file is required to run this command with --locked'); + } + + $repos[] = $locker->getLockedRepository(true); + $repos[] = new PlatformRepository([], $locker->getPlatformOverrides()); + } else { + $localRepo = $composer->getRepositoryManager()->getLocalRepository(); + $rootPkg = $composer->getPackage(); + + if (count($localRepo->getPackages()) === 0 && (count($rootPkg->getRequires()) > 0 || count($rootPkg->getDevRequires()) > 0)) { + $output->writeln('No dependencies installed. Try running composer install or update, or use --locked.'); + return 1; + } + + $repos[] = $localRepo; + + $platformOverrides = $composer->getConfig()->get('platform') ?: array(); + $repos[] = new PlatformRepository([], $platformOverrides); + } + + $installedRepo = new InstalledRepository($repos); // Parse package name and constraint list($needle, $textConstraint) = array_pad( diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index 1b353807aad4..de912add93c4 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -39,6 +39,7 @@ protected function configure(): void new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(true)), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), + new InputOption('locked', null, InputOption::VALUE_NONE, 'Read dependency information from composer.lock'), )) ->setHelp( <<setHelp( << Date: Tue, 28 Jun 2022 13:32:45 -0500 Subject: [PATCH 157/618] chore: Included githubactions in the dependabot config (#10900) This should help with keeping the GitHub actions updated on new releases. This will also help with keeping it secure. Dependabot helps in keeping the supply chain secure https://docs.github.com/en/code-security/dependabot GitHub actions up to date https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot https://github.com/ossf/scorecard/blob/main/docs/checks.md#dependency-update-tool Signed-off-by: naveen <172697+naveensrinivasan@users.noreply.github.com> --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000000..5ace4600a1f2 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" From de9996d4c4851de71adc6f5c9eb16304c12d91c6 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 30 Jun 2022 09:12:39 +0200 Subject: [PATCH 158/618] Output exception class when audit fails --- src/Composer/Installer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 737b58018d0d..c6bc21c0fff9 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -406,7 +406,7 @@ public function run(): int } catch (TransportException $e) { $this->io->error('Failed to audit '.$target.' packages.'); if ($this->io->isVerbose()) { - $this->io->error($e->getMessage()); + $this->io->error('['.get_class($e).'] '.$e->getMessage()); } } } else { From efd426f8bb7b6759253d41a9000c3809f63034a8 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 30 Jun 2022 15:05:34 +0200 Subject: [PATCH 159/618] Extract some common logic for filtering away dev requirements into a RepositoryUtils --- src/Composer/Command/AuditCommand.php | 30 +----- src/Composer/Command/LicensesCommand.php | 51 +--------- src/Composer/Command/ShowCommand.php | 28 +----- src/Composer/Repository/RepositorySet.php | 2 + src/Composer/Repository/RepositoryUtils.php | 52 +++++++++++ src/Composer/Util/PackageSorter.php | 16 ++++ .../Test/Repository/RepositoryUtilsTest.php | 92 +++++++++++++++++++ 7 files changed, 171 insertions(+), 100 deletions(-) create mode 100644 src/Composer/Repository/RepositoryUtils.php create mode 100644 tests/Composer/Test/Repository/RepositoryUtilsTest.php diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index a5d0f5d6f3f8..839c050065c7 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -4,11 +4,11 @@ use Composer\Composer; use Composer\Repository\RepositorySet; +use Composer\Repository\RepositoryUtils; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepository; -use Composer\Repository\RepositoryInterface; use Composer\Advisory\Auditor; use Composer\Console\Input\InputOption; @@ -73,35 +73,9 @@ private function getPackages(Composer $composer, InputInterface $input): array $installedRepo = new InstalledRepository(array($composer->getRepositoryManager()->getLocalRepository())); if ($input->getOption('no-dev')) { - return $this->filterRequiredPackages($installedRepo, $rootPkg); + return RepositoryUtils::filterRequiredPackages($installedRepo->getPackages(), $rootPkg); } return $installedRepo->getPackages(); } - - /** - * Find package requires and child requires. - * Effectively filters out dev dependencies. - * - * @param PackageInterface[] $bucket - * @return PackageInterface[] - */ - private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, array $bucket = array()): array - { - $requires = $package->getRequires(); - - foreach ($repo->getPackages() as $candidate) { - foreach ($candidate->getNames() as $name) { - if (isset($requires[$name])) { - if (!in_array($candidate, $bucket, true)) { - $bucket[] = $candidate; - $bucket = $this->filterRequiredPackages($repo, $candidate, $bucket); - } - break; - } - } - } - - return $bucket; - } } diff --git a/src/Composer/Command/LicensesCommand.php b/src/Composer/Command/LicensesCommand.php index 9d34824a1801..13f332e8e94d 100644 --- a/src/Composer/Command/LicensesCommand.php +++ b/src/Composer/Command/LicensesCommand.php @@ -19,7 +19,9 @@ use Composer\Plugin\PluginEvents; use Composer\Package\PackageInterface; use Composer\Repository\RepositoryInterface; +use Composer\Repository\RepositoryUtils; use Composer\Util\PackageInfo; +use Composer\Util\PackageSorter; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; @@ -65,12 +67,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $repo = $composer->getRepositoryManager()->getLocalRepository(); if ($input->getOption('no-dev')) { - $packages = $this->filterRequiredPackages($repo, $root); + $packages = RepositoryUtils::filterRequiredPackages($repo->getPackages(), $root); } else { - $packages = $this->appendPackages($repo->getPackages(), array()); + $packages = $repo->getPackages(); } - ksort($packages); + $packages = PackageSorter::sortPackagesAlphabetically($packages); $io = $this->getIO(); switch ($format = $input->getOption('format')) { @@ -153,47 +155,4 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 0; } - - /** - * Find package requires and child requires - * - * @param array $bucket - * @return array - */ - private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, array $bucket = array()): array - { - $requires = array_keys($package->getRequires()); - - $packageListNames = array_keys($bucket); - $packages = array_filter( - $repo->getPackages(), - static function ($package) use ($requires, $packageListNames): bool { - return in_array($package->getName(), $requires) && !in_array($package->getName(), $packageListNames); - } - ); - - $bucket = $this->appendPackages($packages, $bucket); - - foreach ($packages as $package) { - $bucket = $this->filterRequiredPackages($repo, $package, $bucket); - } - - return $bucket; - } - - /** - * Adds packages to the package list - * - * @param PackageInterface[] $packages the list of packages to add - * @param array $bucket the list to add packages to - * @return array - */ - public function appendPackages(array $packages, array $bucket): array - { - foreach ($packages as $package) { - $bucket[$package->getName()] = $package; - } - - return $bucket; - } } diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 6866dbc7ce8a..68ea436619f4 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -36,6 +36,7 @@ use Composer\Repository\InstalledRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositorySet; +use Composer\Repository\RepositoryUtils; use Composer\Repository\RootPackageRepository; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Semver; @@ -248,7 +249,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $repos = $installedRepo = new InstalledRepository(array($composer->getRepositoryManager()->getLocalRepository())); if ($input->getOption('no-dev')) { - $packages = $this->filterRequiredPackages($installedRepo, $rootPkg); + $packages = RepositoryUtils::filterRequiredPackages($installedRepo->getPackages(), $rootPkg); $repos = $installedRepo = new InstalledRepository(array(new InstalledArrayRepository(array_map(static function ($pkg): PackageInterface { return clone $pkg; }, $packages)))); @@ -1423,29 +1424,4 @@ private function getRepositorySet(Composer $composer): RepositorySet return $this->repositorySet; } - - /** - * Find package requires and child requires - * - * @param array $bucket - * @return array - */ - private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, array $bucket = array()): array - { - $requires = $package->getRequires(); - - foreach ($repo->getPackages() as $candidate) { - foreach ($candidate->getNames() as $name) { - if (isset($requires[$name])) { - if (!in_array($candidate, $bucket, true)) { - $bucket[] = $candidate; - $bucket = $this->filterRequiredPackages($repo, $candidate, $bucket); - } - break; - } - } - } - - return $bucket; - } } diff --git a/src/Composer/Repository/RepositorySet.php b/src/Composer/Repository/RepositorySet.php index c9183ce8443d..3f408ad0d336 100644 --- a/src/Composer/Repository/RepositorySet.php +++ b/src/Composer/Repository/RepositorySet.php @@ -33,6 +33,8 @@ /** * @author Nils Adermann + * + * @see RepositoryUtils for ways to work with single repos */ class RepositorySet { diff --git a/src/Composer/Repository/RepositoryUtils.php b/src/Composer/Repository/RepositoryUtils.php new file mode 100644 index 000000000000..e62c9dfdf594 --- /dev/null +++ b/src/Composer/Repository/RepositoryUtils.php @@ -0,0 +1,52 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Repository; + +use Composer\Package\PackageInterface; + +/** + * @author Jordi Boggiano + * + * @see RepositorySet for ways to work with sets of repos + */ +class RepositoryUtils +{ + /** + * Find all of $packages which are required by $requirer, either directly or transitively + * + * Require-dev is ignored + * + * @template T of PackageInterface + * @param array $packages + * @param array $bucket Do not pass this in, only used to avoid recursion with circular deps + * @return list + */ + public static function filterRequiredPackages(array $packages, PackageInterface $requirer, array $bucket = array()): array + { + $requires = $requirer->getRequires(); + + foreach ($packages as $candidate) { + foreach ($candidate->getNames() as $name) { + if (isset($requires[$name])) { + if (!in_array($candidate, $bucket, true)) { + $bucket[] = $candidate; + $bucket = self::filterRequiredPackages($packages, $candidate, $bucket); + } + break; + } + } + } + + return $bucket; + } +} diff --git a/src/Composer/Util/PackageSorter.php b/src/Composer/Util/PackageSorter.php index 8032f732bf70..38b606e6af3a 100644 --- a/src/Composer/Util/PackageSorter.php +++ b/src/Composer/Util/PackageSorter.php @@ -17,6 +17,22 @@ class PackageSorter { + /** + * Sorts packages by name + * + * @template T of PackageInterface + * @param array $packages + * @return array + */ + public static function sortPackagesAlphabetically(array $packages): array + { + usort($packages, static function (PackageInterface $a, PackageInterface $b) { + return $a->getName() <=> $b->getName(); + }); + + return $packages; + } + /** * Sorts packages by dependency weight * diff --git a/tests/Composer/Test/Repository/RepositoryUtilsTest.php b/tests/Composer/Test/Repository/RepositoryUtilsTest.php new file mode 100644 index 000000000000..03532065031c --- /dev/null +++ b/tests/Composer/Test/Repository/RepositoryUtilsTest.php @@ -0,0 +1,92 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Repository; + +use Composer\Package\PackageInterface; +use Composer\Repository\RepositoryUtils; +use Composer\Test\TestCase; +use Generator; + +class RepositoryUtilsTest extends TestCase +{ + /** + * @dataProvider provideFilterRequireTests + * @param PackageInterface[] $pkgs + * @param PackageInterface $requirer + * @param string[] $expected + */ + public function testFilterRequiredPackages(array $pkgs, PackageInterface $requirer, array $expected): void + { + $expected = array_map(static function (string $name) use ($pkgs): PackageInterface { + return $pkgs[$name]; + }, $expected); + + self::assertSame($expected, RepositoryUtils::filterRequiredPackages($pkgs, $requirer)); + } + + /** + * @return array + */ + private function getPackages(): array + { + $packageA = $this->getPackage('required/a'); + $packageB = $this->getPackage('required/b'); + $this->configureLinks($packageB, ['require' => ['required/c' => '*']]); + $packageC = $this->getPackage('required/c'); + $packageCAlias = $this->getAliasPackage($packageC, '2.0.0'); + + $packageCircular = $this->getPackage('required/circular'); + $this->configureLinks($packageCircular, ['require' => ['required/circular-b' => '*']]); + $packageCircularB = $this->getPackage('required/circular-b'); + $this->configureLinks($packageCircularB, ['require' => ['required/circular' => '*']]); + + return [ + $this->getPackage('dummy/pkg'), + $this->getPackage('dummy/pkg2', '2.0.0'), + 'a' => $packageA, + 'b' => $packageB, + 'c' => $packageC, + 'c-alias' => $packageCAlias, + 'circular' => $packageCircular, + 'circular-b' => $packageCircularB, + ]; + } + + public function provideFilterRequireTests(): Generator + { + $pkgs = $this->getPackages(); + + $requirer = $this->getPackage('requirer/pkg'); + yield 'no require' => [$pkgs, $requirer, []]; + + $requirer = $this->getPackage('requirer/pkg'); + $this->configureLinks($requirer, ['require-dev' => ['required/a' => '*']]); + yield 'require-dev has no effect' => [$pkgs, $requirer, []]; + + $requirer = $this->getPackage('requirer/pkg'); + $this->configureLinks($requirer, ['require' => ['required/a' => '*']]); + yield 'simple require' => [$pkgs, $requirer, ['a']]; + + $requirer = $this->getPackage('requirer/pkg'); + $this->configureLinks($requirer, ['require' => ['required/a' => 'dev-lala']]); + yield 'require constraint is irrelevant' => [$pkgs, $requirer, ['a']]; + + $requirer = $this->getPackage('requirer/pkg'); + $this->configureLinks($requirer, ['require' => ['required/b' => '*']]); + yield 'require transitive deps and aliases are included' => [$pkgs, $requirer, ['b', 'c', 'c-alias']]; + + $requirer = $this->getPackage('requirer/pkg'); + $this->configureLinks($requirer, ['require' => ['required/circular' => '*']]); + yield 'circular deps are no problem' => [$pkgs, $requirer, ['circular', 'circular-b']]; + } +} From 51db9e823c4c28d4b982f1a1048cf221a9657d56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Jun 2022 15:17:38 +0200 Subject: [PATCH 160/618] Bump actions/cache from 2 to 3 (#10902) Bumps [actions/cache](https://github.com/actions/cache) from 2 to 3. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/phpstan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 587cbc26473a..b5015adbad10 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -48,7 +48,7 @@ jobs: run: "echo \"::set-output name=directory::$(composer config cache-dir)\"" - name: "Cache dependencies installed with composer" - uses: "actions/cache@v2" + uses: "actions/cache@v3" with: path: "${{ steps.determine-composer-cache-directory.outputs.directory }}" key: "php-${{ matrix.php-version }}-symfony-php-unit-version-${{ env.SYMFONY_PHPUNIT_VERSION }}-${{ hashFiles('**/composer.lock') }}" From 1812862d5ed565f8748ec2e988f87258e25bc96d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 30 Jun 2022 17:07:18 +0200 Subject: [PATCH 161/618] Update phpstan to latest, update baseline (1909, 103) --- composer.lock | 78 +++++++++---------- phpstan/baseline.neon | 27 +------ src/Composer/Command/BaseCommand.php | 4 +- .../Command/BaseDependencyCommand.php | 2 +- src/Composer/Command/ConfigCommand.php | 2 +- src/Composer/Command/UpdateCommand.php | 2 +- src/Composer/Compiler.php | 6 +- src/Composer/Config.php | 2 +- src/Composer/Console/Application.php | 2 +- src/Composer/DependencyResolver/Decisions.php | 6 +- .../DependencyResolver/GenericRule.php | 8 +- .../DependencyResolver/LockTransaction.php | 4 +- .../DependencyResolver/MultiConflictRule.php | 8 +- src/Composer/DependencyResolver/Rule.php | 8 +- .../DependencyResolver/Rule2Literals.php | 6 +- .../DependencyResolver/RuleSetGenerator.php | 4 +- .../DependencyResolver/RuleWatchGraph.php | 2 +- .../DependencyResolver/RuleWatchNode.php | 4 +- src/Composer/DependencyResolver/Solver.php | 12 +-- .../DependencyResolver/Transaction.php | 6 +- src/Composer/Installer.php | 4 +- src/Composer/Json/JsonFile.php | 2 +- .../Package/Archiver/GitExcludeFilter.php | 4 +- .../Package/Version/VersionSelector.php | 4 +- .../Repository/FilesystemRepository.php | 2 +- src/Composer/Util/AuthHelper.php | 2 +- src/Composer/Util/ConfigValidator.php | 2 +- src/Composer/Util/Http/CurlDownloader.php | 4 +- src/Composer/Util/Perforce.php | 2 +- src/Composer/Util/Platform.php | 2 +- src/Composer/Util/Zip.php | 2 +- tests/Composer/Test/InstallerTest.php | 2 +- 32 files changed, 101 insertions(+), 124 deletions(-) diff --git a/composer.lock b/composer.lock index d1c3e2680125..cdfb70766eb9 100644 --- a/composer.lock +++ b/composer.lock @@ -880,16 +880,16 @@ }, { "name": "symfony/console", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", + "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", "shasum": "" }, "require": { @@ -959,7 +959,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.9" + "source": "https://github.com/symfony/console/tree/v5.4.10" }, "funding": [ { @@ -975,11 +975,11 @@ "type": "tidelift" } ], - "time": "2022-05-18T06:17:34+00:00" + "time": "2022-06-26T13:00:04+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -1026,7 +1026,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -1727,16 +1727,16 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { @@ -1790,7 +1790,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -1806,20 +1806,20 @@ "type": "tidelift" } ], - "time": "2022-03-13T20:07:29+00:00" + "time": "2022-05-30T19:17:29+00:00" }, { "name": "symfony/string", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", "shasum": "" }, "require": { @@ -1876,7 +1876,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.9" + "source": "https://github.com/symfony/string/tree/v5.4.10" }, "funding": [ { @@ -1892,22 +1892,22 @@ "type": "tidelift" } ], - "time": "2022-04-19T10:40:37+00:00" + "time": "2022-06-26T15:57:47+00:00" } ], "packages-dev": [ { "name": "phpstan/phpstan", - "version": "1.7.15", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "cd0202ea1b1fc6d1bbe156c6e2e18a03e0ff160a" + "reference": "b7648d4ee9321665acaf112e49da9fd93df8fbd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/cd0202ea1b1fc6d1bbe156c6e2e18a03e0ff160a", - "reference": "cd0202ea1b1fc6d1bbe156c6e2e18a03e0ff160a", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b7648d4ee9321665acaf112e49da9fd93df8fbd5", + "reference": "b7648d4ee9321665acaf112e49da9fd93df8fbd5", "shasum": "" }, "require": { @@ -1933,7 +1933,7 @@ "description": "PHPStan - PHP Static Analysis Tool", "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.7.15" + "source": "https://github.com/phpstan/phpstan/tree/1.8.0" }, "funding": [ { @@ -1953,7 +1953,7 @@ "type": "tidelift" } ], - "time": "2022-06-20T08:29:01+00:00" + "time": "2022-06-29T08:53:31+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -2059,21 +2059,21 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.2.3", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "0c82c96f2a55d8b91bbc7ee6512c94f68a206b43" + "reference": "543675a9be82d4befb9ca0bd8cdc9d211665037f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/0c82c96f2a55d8b91bbc7ee6512c94f68a206b43", - "reference": "0c82c96f2a55d8b91bbc7ee6512c94f68a206b43", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/543675a9be82d4befb9ca0bd8cdc9d211665037f", + "reference": "543675a9be82d4befb9ca0bd8cdc9d211665037f", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.6.3" + "phpstan/phpstan": "^1.7.15" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -2101,9 +2101,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.2.3" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.3.0" }, - "time": "2022-05-04T15:20:40+00:00" + "time": "2022-06-24T06:47:20+00:00" }, { "name": "phpstan/phpstan-symfony", @@ -2178,16 +2178,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.1.0", + "version": "v6.1.2", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "092ccc3b364925cd8ed6046bc31dcf3a022bd5a4" + "reference": "899fdec151add3dc339cf394a15100a1acc177ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/092ccc3b364925cd8ed6046bc31dcf3a022bd5a4", - "reference": "092ccc3b364925cd8ed6046bc31dcf3a022bd5a4", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/899fdec151add3dc339cf394a15100a1acc177ad", + "reference": "899fdec151add3dc339cf394a15100a1acc177ad", "shasum": "" }, "require": { @@ -2241,7 +2241,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.1.0" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.1.2" }, "funding": [ { @@ -2257,7 +2257,7 @@ "type": "tidelift" } ], - "time": "2022-04-12T16:22:53+00:00" + "time": "2022-06-20T12:01:07+00:00" } ], "aliases": [], diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 335235af88c2..1dd2336c15f4 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -595,16 +595,6 @@ parameters: count: 7 path: ../src/Composer/Command/InitCommand.php - - - message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" - count: 2 - path: ../src/Composer/Command/LicensesCommand.php - - - - message: "#^Foreach overwrites \\$package with its value variable\\.$#" - count: 1 - path: ../src/Composer/Command/LicensesCommand.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 2 @@ -1645,11 +1635,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/RuleSetIterator.php - - - message: "#^Only booleans are allowed in an if condition, array\\ given\\.$#" - count: 1 - path: ../src/Composer/DependencyResolver/RuleWatchGraph.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 2 @@ -1675,11 +1660,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/Solver.php - - - message: "#^Only booleans are allowed in a negated boolean, Composer\\\\DependencyResolver\\\\Rule\\|null given\\.$#" - count: 1 - path: ../src/Composer/DependencyResolver/Solver.php - - message: "#^Only booleans are allowed in a negated boolean, array\\ given\\.$#" count: 1 @@ -1726,7 +1706,7 @@ parameters: path: ../src/Composer/DependencyResolver/Solver.php - - message: "#^Parameter \\#1 \\$literals of class Composer\\\\DependencyResolver\\\\GenericRule constructor expects array\\, array\\ given\\.$#" + message: "#^Parameter \\#1 \\$literals of class Composer\\\\DependencyResolver\\\\GenericRule constructor expects array\\, array\\ given\\.$#" count: 1 path: ../src/Composer/DependencyResolver/Solver.php @@ -2830,11 +2810,6 @@ parameters: count: 1 path: ../src/Composer/Json/JsonFile.php - - - message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#" - count: 1 - path: ../src/Composer/Json/JsonFile.php - - message: "#^Only booleans are allowed in a ternary operator condition, int given\\.$#" count: 1 diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 354b95be8ddd..75048a672ae5 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -244,13 +244,13 @@ protected function initialize(InputInterface $input, OutputInterface $output) } if (true === $input->hasOption('no-dev')) { - if (!$input->getOption('no-dev') && true == Platform::getEnv('COMPOSER_NO_DEV')) { + if (!$input->getOption('no-dev') && (bool) Platform::getEnv('COMPOSER_NO_DEV')) { $input->setOption('no-dev', true); } } if (true === $input->hasOption('ignore-platform-reqs')) { - if (!$input->getOption('ignore-platform-reqs') && true == Platform::getEnv('COMPOSER_IGNORE_PLATFORM_REQS')) { + if (!$input->getOption('ignore-platform-reqs') && (bool) Platform::getEnv('COMPOSER_IGNORE_PLATFORM_REQS')) { $input->setOption('ignore-platform-reqs', true); $io->writeError('COMPOSER_IGNORE_PLATFORM_REQS is set. You may experience unexpected errors.'); diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 992d6473a47f..9788ffa23a63 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -234,7 +234,7 @@ protected function printTree(array $results, string $prefix = '', int $level = 1 $color = $this->colors[$level % count($this->colors)]; $prevColor = $this->colors[($level - 1) % count($this->colors)]; - $isLast = (++$idx == $count); + $isLast = (++$idx === $count); $versionText = $package->getPrettyVersion() === RootPackage::DEFAULT_PRETTY_VERSION ? '' : $package->getPrettyVersion(); $packageText = rtrim(sprintf('<%s>%s %s', $color, $package->getPrettyName(), $versionText)); $linkText = sprintf('%s <%s>%s %s', $link->getDescription(), $prevColor, $link->getTarget(), $link->getPrettyConstraint()); diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index 0215dba32068..e79c1541b481 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -921,7 +921,7 @@ protected function listConfiguration(array $contents, array $rawContents, Output $id = Preg::replace('{-+}', '-', $id); $link = 'https://getcomposer.org/doc/06-config.md#' . $id; } - if (is_string($rawVal) && $rawVal != $value) { + if (is_string($rawVal) && $rawVal !== $value) { $io->write('[' . $k . $key . '] ' . $rawVal . ' (' . $value . ')' . $source, true, IOInterface::QUIET); } else { $io->write('[' . $k . $key . '] ' . $value . '' . $source, true, IOInterface::QUIET); diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index c4659693e645..51b32ede8635 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -182,7 +182,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $filteredPackages = array_filter($packages, static function ($package): bool { return !in_array($package, array('lock', 'nothing', 'mirrors'), true); }); - $updateMirrors = $input->getOption('lock') || count($filteredPackages) != count($packages); + $updateMirrors = $input->getOption('lock') || count($filteredPackages) !== count($packages); $packages = $filteredPackages; if ($updateMirrors && !empty($packages)) { diff --git a/src/Composer/Compiler.php b/src/Composer/Compiler.php index b184e2519a21..528dfa97c5bb 100644 --- a/src/Composer/Compiler.php +++ b/src/Composer/Compiler.php @@ -51,13 +51,13 @@ public function compile(string $pharFile = 'composer.phar'): void } $process = new Process(array('git', 'log', '--pretty=%H', '-n1', 'HEAD'), __DIR__); - if ($process->run() != 0) { + if ($process->run() !== 0) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } $this->version = trim($process->getOutput()); $process = new Process(array('git', 'log', '-n1', '--pretty=%ci', 'HEAD'), __DIR__); - if ($process->run() != 0) { + if ($process->run() !== 0) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } @@ -65,7 +65,7 @@ public function compile(string $pharFile = 'composer.phar'): void $this->versionDate->setTimezone(new \DateTimeZone('UTC')); $process = new Process(array('git', 'describe', '--tags', '--exact-match', 'HEAD'), __DIR__); - if ($process->run() == 0) { + if ($process->run() === 0) { $this->version = trim($process->getOutput()); } else { // get branch-alias defined in composer.json for dev-main (if any) diff --git a/src/Composer/Config.php b/src/Composer/Config.php index 5a0ded2a1097..a8b7bb6f97bd 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -311,7 +311,7 @@ public function get(string $key, int $flags = 0) return $val; } - return (($flags & self::RELATIVE_PATHS) == self::RELATIVE_PATHS) ? $val : $this->realpath($val); + return (($flags & self::RELATIVE_PATHS) === self::RELATIVE_PATHS) ? $val : $this->realpath($val); // booleans with env var support case 'cache-read-only': diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index d1b304535f5a..82cc0b2a08e6 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -298,7 +298,7 @@ function_exists('php_uname') ? php_uname('s') . ' / ' . php_uname('r') : 'Unknow // Check system temp folder for usability as it can cause weird runtime issues otherwise Silencer::call(static function () use ($io): void { $tempfile = sys_get_temp_dir() . '/temp-' . md5(microtime()); - if (!(file_put_contents($tempfile, __FILE__) && (file_get_contents($tempfile) == __FILE__) && unlink($tempfile) && !file_exists($tempfile))) { + if (!(file_put_contents($tempfile, __FILE__) && (file_get_contents($tempfile) === __FILE__) && unlink($tempfile) && !file_exists($tempfile))) { $io->writeError(sprintf('PHP temp directory (%s) does not exist or is not writable to Composer. Set sys_temp_dir in your php.ini', sys_get_temp_dir())); } }); diff --git a/src/Composer/DependencyResolver/Decisions.php b/src/Composer/DependencyResolver/Decisions.php index fce11c269c10..543ab2efafbc 100644 --- a/src/Composer/DependencyResolver/Decisions.php +++ b/src/Composer/DependencyResolver/Decisions.php @@ -256,12 +256,12 @@ protected function addDecision(int $literal, int $level): void { $packageId = abs($literal); - $previousDecision = $this->decisionMap[$packageId] ?? null; - if ($previousDecision != 0) { + $previousDecision = $this->decisionMap[$packageId] ?? 0; + if ($previousDecision !== 0) { $literalString = $this->pool->literalToPrettyString($literal, array()); $package = $this->pool->literalToPackage($literal); throw new SolverBugException( - "Trying to decide $literalString on level $level, even though $package was previously decided as ".(int) $previousDecision."." + "Trying to decide $literalString on level $level, even though $package was previously decided as ".$previousDecision."." ); } diff --git a/src/Composer/DependencyResolver/GenericRule.php b/src/Composer/DependencyResolver/GenericRule.php index b1841466683c..d119d944be2b 100644 --- a/src/Composer/DependencyResolver/GenericRule.php +++ b/src/Composer/DependencyResolver/GenericRule.php @@ -17,11 +17,11 @@ */ class GenericRule extends Rule { - /** @var int[] */ + /** @var list */ protected $literals; /** - * @param int[] $literals + * @param list $literals */ public function __construct(array $literals, $reason, $reasonData) { @@ -34,7 +34,7 @@ public function __construct(array $literals, $reason, $reasonData) } /** - * @return int[] + * @return list */ public function getLiterals(): array { @@ -82,7 +82,7 @@ public function __toString(): string $result = $this->isDisabled() ? 'disabled(' : '('; foreach ($this->literals as $i => $literal) { - if ($i != 0) { + if ($i !== 0) { $result .= '|'; } $result .= $literal; diff --git a/src/Composer/DependencyResolver/LockTransaction.php b/src/Composer/DependencyResolver/LockTransaction.php index b05afa7c12c1..8e407b1fe3aa 100644 --- a/src/Composer/DependencyResolver/LockTransaction.php +++ b/src/Composer/DependencyResolver/LockTransaction.php @@ -92,7 +92,7 @@ public function setNonDevPackages(LockTransaction $extractionResult): void foreach ($packages as $package) { foreach ($this->resultPackages['dev'] as $i => $resultPackage) { // TODO this comparison is probably insufficient, aliases, what about modified versions? I guess they aren't possible? - if ($package->getName() == $resultPackage->getName()) { + if ($package->getName() === $resultPackage->getName()) { $this->resultPackages['non-dev'][] = $resultPackage; unset($this->resultPackages['dev'][$i]); } @@ -115,7 +115,7 @@ public function getNewLockPackages(bool $devMode, bool $updateMirrors = false): // we do not reset references if the currently present package didn't have any, or if the type of VCS has changed if ($updateMirrors && !isset($this->presentMap[spl_object_hash($package)])) { foreach ($this->presentMap as $presentPackage) { - if ($package->getName() == $presentPackage->getName() && $package->getVersion() == $presentPackage->getVersion()) { + if ($package->getName() === $presentPackage->getName() && $package->getVersion() === $presentPackage->getVersion()) { if ($presentPackage->getSourceReference() && $presentPackage->getSourceType() === $package->getSourceType()) { $package->setSourceDistReferences($presentPackage->getSourceReference()); } diff --git a/src/Composer/DependencyResolver/MultiConflictRule.php b/src/Composer/DependencyResolver/MultiConflictRule.php index 63fe1e09ec00..d065a2a309c8 100644 --- a/src/Composer/DependencyResolver/MultiConflictRule.php +++ b/src/Composer/DependencyResolver/MultiConflictRule.php @@ -19,11 +19,11 @@ */ class MultiConflictRule extends Rule { - /** @var int[] */ + /** @var list */ protected $literals; /** - * @param int[] $literals + * @param list $literals */ public function __construct(array $literals, $reason, $reasonData) { @@ -40,7 +40,7 @@ public function __construct(array $literals, $reason, $reasonData) } /** - * @return int[] + * @return list */ public function getLiterals(): array { @@ -102,7 +102,7 @@ public function __toString(): string $result = $this->isDisabled() ? 'disabled(multi(' : '(multi('; foreach ($this->literals as $i => $literal) { - if ($i != 0) { + if ($i !== 0) { $result .= '|'; } $result .= $literal; diff --git a/src/Composer/DependencyResolver/Rule.php b/src/Composer/DependencyResolver/Rule.php index 7398d2046fcc..cb5a7f1c65d1 100644 --- a/src/Composer/DependencyResolver/Rule.php +++ b/src/Composer/DependencyResolver/Rule.php @@ -69,7 +69,7 @@ public function __construct($reason, $reasonData) } /** - * @return int[] + * @return list */ abstract public function getLiterals(): array; @@ -380,13 +380,13 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $reason = null; if (!isset($packageNames[$replacedName])) { - $reason = 'They '.(count($literals) == 2 ? 'both' : 'all').' replace '.$replacedName.' and thus cannot coexist.'; + $reason = 'They '.(count($literals) === 2 ? 'both' : 'all').' replace '.$replacedName.' and thus cannot coexist.'; } else { $replacerNames = $packageNames; unset($replacerNames[$replacedName]); $replacerNames = array_keys($replacerNames); - if (count($replacerNames) == 1) { + if (count($replacerNames) === 1) { $reason = $replacerNames[0] . ' replaces '; } else { $reason = '['.implode(', ', $replacerNames).'] replace '; @@ -469,7 +469,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, default: $ruleText = ''; foreach ($literals as $i => $literal) { - if ($i != 0) { + if ($i !== 0) { $ruleText .= '|'; } $ruleText .= $pool->literalToPrettyString($literal, $installedMap); diff --git a/src/Composer/DependencyResolver/Rule2Literals.php b/src/Composer/DependencyResolver/Rule2Literals.php index bfac6dbfe16f..94a9a979193f 100644 --- a/src/Composer/DependencyResolver/Rule2Literals.php +++ b/src/Composer/DependencyResolver/Rule2Literals.php @@ -44,7 +44,9 @@ public function __construct(int $literal1, int $literal2, $reason, $reasonData) } } - /** @return int[] */ + /** + * @return list + */ public function getLiterals(): array { return array($this->literal1, $this->literal2); @@ -82,7 +84,7 @@ public function equals(Rule $rule): bool } $literals = $rule->getLiterals(); - if (2 != \count($literals)) { + if (2 !== \count($literals)) { return false; } diff --git a/src/Composer/DependencyResolver/RuleSetGenerator.php b/src/Composer/DependencyResolver/RuleSetGenerator.php index c91141d54ac5..59eefdf606da 100644 --- a/src/Composer/DependencyResolver/RuleSetGenerator.php +++ b/src/Composer/DependencyResolver/RuleSetGenerator.php @@ -134,7 +134,7 @@ protected function createMultiConflictRule(array $packages, $reason, $reasonData $literals[] = -$package->id; } - if (\count($literals) == 2) { + if (\count($literals) === 2) { return new Rule2Literals($literals[0], $literals[1], $reason, $reasonData); } @@ -262,7 +262,7 @@ protected function addConflictRules(PlatformRequirementFilterInterface $platform protected function addRulesForRequest(Request $request, PlatformRequirementFilterInterface $platformRequirementFilter): void { foreach ($request->getFixedPackages() as $package) { - if ($package->id == -1) { + if ($package->id === -1) { // fixed package was not added to the pool as it did not pass the stability requirements, this is fine if ($this->pool->isUnacceptableFixedOrLockedPackage($package)) { continue; diff --git a/src/Composer/DependencyResolver/RuleWatchGraph.php b/src/Composer/DependencyResolver/RuleWatchGraph.php index 5a30cdc0659f..375563863a5e 100644 --- a/src/Composer/DependencyResolver/RuleWatchGraph.php +++ b/src/Composer/DependencyResolver/RuleWatchGraph.php @@ -116,7 +116,7 @@ public function propagateLiteral(int $decidedLiteral, int $level, Decisions $dec !$decisions->conflict($ruleLiteral); }); - if ($alternativeLiterals) { + if (\count($alternativeLiterals) > 0) { reset($alternativeLiterals); $this->moveWatch($literal, current($alternativeLiterals), $node); continue; diff --git a/src/Composer/DependencyResolver/RuleWatchNode.php b/src/Composer/DependencyResolver/RuleWatchNode.php index 54e4283c0781..f102086e6357 100644 --- a/src/Composer/DependencyResolver/RuleWatchNode.php +++ b/src/Composer/DependencyResolver/RuleWatchNode.php @@ -93,7 +93,7 @@ public function getRule(): Rule */ public function getOtherWatch(int $literal): int { - if ($this->watch1 == $literal) { + if ($this->watch1 === $literal) { return $this->watch2; } @@ -109,7 +109,7 @@ public function getOtherWatch(int $literal): int */ public function moveWatch(int $from, int $to): void { - if ($this->watch1 == $from) { + if ($this->watch1 === $from) { $this->watch1 = $to; } else { $this->watch2 = $to; diff --git a/src/Composer/DependencyResolver/Solver.php b/src/Composer/DependencyResolver/Solver.php index 2c416a95e82b..05d2a39df1ad 100644 --- a/src/Composer/DependencyResolver/Solver.php +++ b/src/Composer/DependencyResolver/Solver.php @@ -311,11 +311,11 @@ private function setPropagateLearn(int $level, $literal, Rule $rule): int while (true) { $rule = $this->propagate($level); - if (!$rule) { + if (null === $rule) { break; } - if ($level == 1) { + if ($level === 1) { return $this->analyzeUnsolvable($rule); } @@ -523,7 +523,7 @@ private function analyzeUnsolvableRule(Problem $problem, Rule $conflictRule, arr $why = spl_object_hash($conflictRule); $ruleSeen[$why] = true; - if ($conflictRule->getType() == RuleSet::TYPE_LEARNED) { + if ($conflictRule->getType() === RuleSet::TYPE_LEARNED) { $learnedWhy = $this->learnedWhy[$why]; $problemRules = $this->learnedPool[$learnedWhy]; @@ -536,7 +536,7 @@ private function analyzeUnsolvableRule(Problem $problem, Rule $conflictRule, arr return; } - if ($conflictRule->getType() == RuleSet::TYPE_PACKAGE) { + if ($conflictRule->getType() === RuleSet::TYPE_PACKAGE) { // package rules cannot be part of a problem return; } @@ -723,7 +723,7 @@ private function runSat(): void $this->io->writeError('Looking at all rules.', true, IOInterface::DEBUG); for ($i = 0, $n = 0; $n < $rulesCount; $i++, $n++) { - if ($i == $rulesCount) { + if ($i === $rulesCount) { if (1 === $pass) { $this->io->writeError("Something's changed, looking at all rules again (pass #$pass)", false, IOInterface::DEBUG); } else { @@ -814,7 +814,7 @@ private function runSat(): void $level = $this->setPropagateLearn($level, $lastLiteral, $why); - if ($level == 0) { + if ($level === 0) { return; } diff --git a/src/Composer/DependencyResolver/Transaction.php b/src/Composer/DependencyResolver/Transaction.php index 5df550591f0f..2c7d06fa6fa0 100644 --- a/src/Composer/DependencyResolver/Transaction.php +++ b/src/Composer/DependencyResolver/Transaction.php @@ -73,8 +73,8 @@ private function setResultPackageMaps(array $resultPackages): void { $packageSort = static function (PackageInterface $a, PackageInterface $b): int { // sort alias packages by the same name behind their non alias version - if ($a->getName() == $b->getName()) { - if ($a instanceof AliasPackage != $b instanceof AliasPackage) { + if ($a->getName() === $b->getName()) { + if ($a instanceof AliasPackage !== $b instanceof AliasPackage) { return $a instanceof AliasPackage ? -1 : 1; } // if names are the same, compare version, e.g. to sort aliases reliably, actual order does not matter @@ -162,7 +162,7 @@ protected function calculateOperations(): array // do we need to update? // TODO different for lock? - if ($package->getVersion() != $presentPackageMap[$package->getName()]->getVersion() || + if ($package->getVersion() !== $presentPackageMap[$package->getName()]->getVersion() || $package->getDistReference() !== $presentPackageMap[$package->getName()]->getDistReference() || $package->getSourceReference() !== $presentPackageMap[$package->getName()]->getSourceReference() ) { diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index c6bc21c0fff9..59e4c502ca37 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -530,8 +530,8 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doIns // when mirrors/metadata from a package gets updated we do not want to list it as an // update in the output as it is only an internal lock file metadata update if ($this->updateMirrors - && $operation->getInitialPackage()->getName() == $operation->getTargetPackage()->getName() - && $operation->getInitialPackage()->getVersion() == $operation->getTargetPackage()->getVersion() + && $operation->getInitialPackage()->getName() === $operation->getTargetPackage()->getName() + && $operation->getInitialPackage()->getVersion() === $operation->getTargetPackage()->getVersion() ) { continue; } diff --git a/src/Composer/Json/JsonFile.php b/src/Composer/Json/JsonFile.php index 22f1e8f67c82..805ca57ee8a4 100644 --- a/src/Composer/Json/JsonFile.php +++ b/src/Composer/Json/JsonFile.php @@ -177,7 +177,7 @@ public function write(array $hash, int $options = JSON_UNESCAPED_SLASHES | JSON_ private function filePutContentsIfModified(string $path, string $content) { $currentContent = @file_get_contents($path); - if (!$currentContent || ($currentContent != $content)) { + if (false === $currentContent || $currentContent !== $content) { return file_put_contents($path, $content); } diff --git a/src/Composer/Package/Archiver/GitExcludeFilter.php b/src/Composer/Package/Archiver/GitExcludeFilter.php index 2d41e9c08d58..12b4c5a657d7 100644 --- a/src/Composer/Package/Archiver/GitExcludeFilter.php +++ b/src/Composer/Package/Archiver/GitExcludeFilter.php @@ -54,11 +54,11 @@ public function parseGitAttributesLine(string $line): ?array { $parts = Preg::split('#\s+#', $line); - if (count($parts) == 2 && $parts[1] === 'export-ignore') { + if (count($parts) === 2 && $parts[1] === 'export-ignore') { return $this->generatePattern($parts[0]); } - if (count($parts) == 2 && $parts[1] === '-export-ignore') { + if (count($parts) === 2 && $parts[1] === '-export-ignore') { return $this->generatePattern('!'.$parts[0]); } diff --git a/src/Composer/Package/Version/VersionSelector.php b/src/Composer/Package/Version/VersionSelector.php index b2a2f56ac973..241251779203 100644 --- a/src/Composer/Package/Version/VersionSelector.php +++ b/src/Composer/Package/Version/VersionSelector.php @@ -237,7 +237,7 @@ private function transformVersion(string $version, string $prettyVersion, string $semanticVersionParts = explode('.', $version); // check to see if we have a semver-looking version - if (count($semanticVersionParts) == 4 && Preg::isMatch('{^0\D?}', $semanticVersionParts[3])) { + if (count($semanticVersionParts) === 4 && Preg::isMatch('{^0\D?}', $semanticVersionParts[3])) { // remove the last parts (i.e. the patch version number and any extra) if ($semanticVersionParts[0] === '0') { unset($semanticVersionParts[3]); @@ -250,7 +250,7 @@ private function transformVersion(string $version, string $prettyVersion, string } // append stability flag if not default - if ($stability != 'stable') { + if ($stability !== 'stable') { $version .= '@'.$stability; } diff --git a/src/Composer/Repository/FilesystemRepository.php b/src/Composer/Repository/FilesystemRepository.php index 94e8ef9996d1..8a87970bbc0a 100644 --- a/src/Composer/Repository/FilesystemRepository.php +++ b/src/Composer/Repository/FilesystemRepository.php @@ -202,7 +202,7 @@ private function dumpToPhpCode(array $array = array(), int $level = 0): string } } - $lines .= str_repeat(' ', $level - 1) . ')' . ($level - 1 == 0 ? '' : ",\n"); + $lines .= str_repeat(' ', $level - 1) . ')' . ($level - 1 === 0 ? '' : ",\n"); return $lines; } diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index d36bd6111407..5e0fa48748c1 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -302,6 +302,6 @@ public function isPublicBitBucketDownload(string $urlToBitBucketFile): bool // {@link https://blog.bitbucket.org/2009/04/12/new-feature-downloads/} $pathParts = explode('/', $path); - return count($pathParts) >= 4 && $pathParts[3] == 'downloads'; + return count($pathParts) >= 4 && $pathParts[3] === 'downloads'; } } diff --git a/src/Composer/Util/ConfigValidator.php b/src/Composer/Util/ConfigValidator.php index b3a3346db245..82cd39171bda 100644 --- a/src/Composer/Util/ConfigValidator.php +++ b/src/Composer/Util/ConfigValidator.php @@ -142,7 +142,7 @@ public function validate(string $file, int $arrayLoaderValidationFlags = Validat ); } - if (!empty($manifest['type']) && $manifest['type'] == 'composer-installer') { + if (!empty($manifest['type']) && $manifest['type'] === 'composer-installer') { $warnings[] = "The package type 'composer-installer' is deprecated. Please distribute your custom installers as plugins from now on. See https://getcomposer.org/doc/articles/plugins.md for plugin documentation."; } diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index ffb04e6f835e..98af5c1a1be2 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -369,7 +369,7 @@ public function tick(): void continue; } - if ($errno === 28 /* CURLE_OPERATION_TIMEDOUT */ && PHP_VERSION_ID >= 70300 && $progress['namelookup_time'] == 0 && !$timeoutWarning) { + if ($errno === 28 /* CURLE_OPERATION_TIMEDOUT */ && PHP_VERSION_ID >= 70300 && $progress['namelookup_time'] === 0.0 && !$timeoutWarning) { $timeoutWarning = true; $this->io->writeError('A connection timeout was encountered. If you intend to run Composer without connecting to the internet, run the command again prefixed with COMPOSER_DISABLE_NETWORK=1 to make Composer run in offline mode.'); } @@ -669,7 +669,7 @@ private function rejectJob(array $job, \Exception $e): void */ private function checkCurlResult(int $code): void { - if ($code != CURLM_OK && $code != CURLM_CALL_MULTI_PERFORM) { + if ($code !== CURLM_OK && $code !== CURLM_CALL_MULTI_PERFORM) { throw new \RuntimeException( isset($this->multiErrors[$code]) ? "cURL error: {$code} ({$this->multiErrors[$code][0]}): cURL message: {$this->multiErrors[$code][1]}" diff --git a/src/Composer/Util/Perforce.php b/src/Composer/Util/Perforce.php index 65d2a03184e8..8355d7f6f2e0 100644 --- a/src/Composer/Util/Perforce.php +++ b/src/Composer/Util/Perforce.php @@ -339,7 +339,7 @@ protected function getP4variable(string $name): ?string $resArray = explode(PHP_EOL, $result); foreach ($resArray as $line) { $fields = explode('=', $line); - if (strcmp($name, $fields[0]) == 0) { + if (strcmp($name, $fields[0]) === 0) { $index = strpos($fields[1], ' '); if ($index === false) { $value = $fields[1]; diff --git a/src/Composer/Util/Platform.php b/src/Composer/Util/Platform.php index 9c48e670aafc..ad9ffdc16f00 100644 --- a/src/Composer/Util/Platform.php +++ b/src/Composer/Util/Platform.php @@ -110,7 +110,7 @@ public static function expandPath(string $path): string return Preg::replaceCallback('#^(\$|(?P%))(?P\w++)(?(percent)%)(?P.*)#', static function ($matches): string { // Treat HOME as an alias for USERPROFILE on Windows for legacy reasons - if (Platform::isWindows() && $matches['var'] == 'HOME') { + if (Platform::isWindows() && $matches['var'] === 'HOME') { return (Platform::getEnv('HOME') ?: Platform::getEnv('USERPROFILE')) . $matches['path']; } diff --git a/src/Composer/Util/Zip.php b/src/Composer/Util/Zip.php index 20c33771bd79..96b705c8f38f 100644 --- a/src/Composer/Util/Zip.php +++ b/src/Composer/Util/Zip.php @@ -35,7 +35,7 @@ public static function getComposerJson(string $pathToZip): ?string return null; } - if (0 == $zip->numFiles) { + if (0 === $zip->numFiles) { $zip->close(); return null; diff --git a/tests/Composer/Test/InstallerTest.php b/tests/Composer/Test/InstallerTest.php index d714e618b650..33d97a199afe 100644 --- a/tests/Composer/Test/InstallerTest.php +++ b/tests/Composer/Test/InstallerTest.php @@ -420,7 +420,7 @@ private function doTestIntegration(string $file, string $message, ?string $condi $filteredPackages = array_filter($packages, function ($package): bool { return !in_array($package, array('lock', 'nothing', 'mirrors'), true); }); - $updateMirrors = $input->getOption('lock') || count($filteredPackages) != count($packages); + $updateMirrors = $input->getOption('lock') || count($filteredPackages) !== count($packages); $packages = $filteredPackages; $updateAllowTransitiveDependencies = Request::UPDATE_ONLY_LISTED; From 424547bb704a1a245ec6a527f9756359d7abec68 Mon Sep 17 00:00:00 2001 From: Andreas Schempp Date: Fri, 1 Jul 2022 11:08:35 +0200 Subject: [PATCH 162/618] Correctly merge boolean flag of allow-plugin config (#10909) --- src/Composer/Config.php | 9 ++------- tests/Composer/Test/ConfigTest.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/Composer/Config.php b/src/Composer/Config.php index e81c11738572..eb4999fda3dc 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -34,7 +34,7 @@ class Config public static $defaultConfig = array( 'process-timeout' => 300, 'use-include-path' => false, - 'allow-plugins' => null, // null for BC for now, will become array() after July 2022 + 'allow-plugins' => array(), 'use-parent-dir' => 'prompt', 'preferred-install' => 'dist', 'notify-on-install' => true, @@ -119,11 +119,6 @@ public function __construct($useEnvironment = true, $baseDir = null) // load defaults $this->config = static::$defaultConfig; - // TODO after July 2022 remove this and update the default value above in self::$defaultConfig + remove note from 06-config.md - if (strtotime('2022-07-01') < time()) { - $this->config['allow-plugins'] = array(); - } - $this->repositories = static::$defaultRepositories; $this->useEnvironment = (bool) $useEnvironment; $this->baseDir = $baseDir; @@ -185,7 +180,7 @@ public function merge($config, $source = self::SOURCE_UNKNOWN) if (in_array($key, array('bitbucket-oauth', 'github-oauth', 'gitlab-oauth', 'gitlab-token', 'http-basic', 'bearer'), true) && isset($this->config[$key])) { $this->config[$key] = array_merge($this->config[$key], $val); $this->setSourceOfConfigValue($val, $key, $source); - } elseif (in_array($key, array('allow-plugins'), true) && isset($this->config[$key]) && is_array($this->config[$key])) { + } elseif (in_array($key, array('allow-plugins'), true) && isset($this->config[$key]) && is_array($this->config[$key]) && is_array($val)) { // merging $val first to get the local config on top of the global one, then appending the global config, // then merging local one again to make sure the values from local win over global ones for keys present in both $this->config[$key] = array_merge($val, $this->config[$key], $val); diff --git a/tests/Composer/Test/ConfigTest.php b/tests/Composer/Test/ConfigTest.php index d9d5c8cb283a..51d71ef29bfd 100644 --- a/tests/Composer/Test/ConfigTest.php +++ b/tests/Composer/Test/ConfigTest.php @@ -371,4 +371,34 @@ public function testGetSourceOfValueEnvVariables() $this->assertEquals('COMPOSER_HTACCESS_PROTECT', $result); } + + public function testMergesPluginConfig() + { + $config = new Config(false); + $config->merge(array('config' => array('allow-plugins' => array('some/plugin' => true)))); + $this->assertEquals(array('some/plugin' => true), $config->get('allow-plugins')); + + $config->merge(array('config' => array('allow-plugins' => array('another/plugin' => true)))); + $this->assertEquals(array('some/plugin' => true, 'another/plugin' => true), $config->get('allow-plugins')); + } + + public function testOverridesGlobalBooleanPluginsConfig() + { + $config = new Config(false); + $config->merge(array('config' => array('allow-plugins' => true))); + $this->assertEquals(true, $config->get('allow-plugins')); + + $config->merge(array('config' => array('allow-plugins' => array('another/plugin' => true)))); + $this->assertEquals(array('another/plugin' => true), $config->get('allow-plugins')); + } + + public function testAllowsAllPluginsFromLocalBoolean() + { + $config = new Config(false); + $config->merge(array('config' => array('allow-plugins' => array('some/plugin' => true)))); + $this->assertEquals(array('some/plugin' => true), $config->get('allow-plugins')); + + $config->merge(array('config' => array('allow-plugins' => true))); + $this->assertEquals(true, $config->get('allow-plugins')); + } } From 7ab4306c7837a8b0ee239b292bfd5503ec36b857 Mon Sep 17 00:00:00 2001 From: Tom Klingenberg <352517+ktomk@users.noreply.github.com> Date: Fri, 1 Jul 2022 11:15:29 +0200 Subject: [PATCH 163/618] Fix TypeError (#10904) Fix string type requirement in case of NULL value: [TypeError] Composer\Command\InitCommand::parseAuthorString(): Argument #1 ($author) must be of type string, null given, called in phar:///composer.phar/src/Composer/Command/InitCommand.php on line 345 --- src/Composer/Command/InitCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index ae8bc6c9bf70..a463c31de177 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -342,7 +342,7 @@ function ($value) use ($author) { return; } $value = $value ?: $author; - $author = $this->parseAuthorString($value); + $author = $this->parseAuthorString($value ?? ''); if ($author['email'] === null) { return $author['name']; From f1dd325e1475b351897ce8e865899a169a101285 Mon Sep 17 00:00:00 2001 From: Tom Klingenberg <352517+ktomk@users.noreply.github.com> Date: Fri, 1 Jul 2022 11:23:04 +0200 Subject: [PATCH 164/618] Fix TypeError (#10904) Fix string type requirement in case of NULL value: [TypeError] Composer\Command\InitCommand::parseAuthorString(): Argument #1 ($author) must be of type string, null given, called in phar:///composer.phar/src/Composer/Command/InitCommand.php on line 345 From 7adcf9f14c744ff1b5c09f23a9169db13aa5eefb Mon Sep 17 00:00:00 2001 From: Tom Klingenberg <352517+ktomk@users.noreply.github.com> Date: Fri, 1 Jul 2022 11:33:15 +0200 Subject: [PATCH 165/618] Fix TypeError (#10904) Fix string type requirement in case of NULL value: [TypeError] Composer\Command\InitCommand::parseAuthorString(): Argument #1 ($author) must be of type string, null given, called in phar:///composer.phar/src/Composer/Command/InitCommand.php on line 345 From ac7a6e3326593c5a574e10aff3002a6e523ed982 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 11:35:50 +0200 Subject: [PATCH 166/618] Update docs, refs #10909 --- doc/06-config.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/06-config.md b/doc/06-config.md index 5217b18f225e..c0b1a7d87660 100644 --- a/doc/06-config.md +++ b/doc/06-config.md @@ -26,8 +26,7 @@ helper is available: ## allow-plugins -Defaults to `null` (allow all plugins implicitly) for backwards compatibility until July 2022. -At that point the default will become `{}` and plugins will not load anymore unless allowed. +Defaults to `{}` which does not allow any plugins to be loaded. As of Composer 2.2.0, the `allow-plugins` option adds a layer of security allowing you to restrict which Composer plugins are able to execute code during From 143e42269ad08bdd71ed63e0058eb659daf7ef57 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 11:43:12 +0200 Subject: [PATCH 167/618] Update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ed45a499409..c292e2b317cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +### [2.2.15] 2022-07-01 + + * Fixed type error when using `allow-plugins: true` (#10909) + * Fixed @putenv scripts receiving arguments passed to the command (#10846) + * Fixed support for spaces in paths with binary proxies on Windows (#10836) + * Fixed type error in GitDownloader if branches cannot be listed (#10888) + * Fixed RootPackageInterface issue on PHP 5.3.3 (#10895) + ### [2.2.14] 2022-06-06 * Fixed handling of broken symlinks when checking whether a package is still installed (#6708) @@ -1446,6 +1454,7 @@ * Initial release +[2.2.15]: https://github.com/composer/composer/compare/2.2.14...2.2.15 [2.2.14]: https://github.com/composer/composer/compare/2.2.13...2.2.14 [2.2.13]: https://github.com/composer/composer/compare/2.2.12...2.2.13 [2.2.12]: https://github.com/composer/composer/compare/2.2.11...2.2.12 From f8324e05246593dee2e79fbe93287d5be745185a Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 11:50:26 +0200 Subject: [PATCH 168/618] Fix support for read-only caches where the filesystem is not writable (fixes #10906) --- CHANGELOG.md | 1 + src/Composer/Cache.php | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c292e2b317cf..733de9b7e69c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### [2.2.15] 2022-07-01 + * Fixed support for read-only caches where the filesystem is not writable (#10906) * Fixed type error when using `allow-plugins: true` (#10909) * Fixed @putenv scripts receiving arguments passed to the command (#10846) * Fixed support for spaces in paths with binary proxies on Windows (#10836) diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index c7da5c612734..1390e09b18a4 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -98,8 +98,11 @@ public function isEnabled() $this->enabled = true; if ( - (!is_dir($this->root) && !Silencer::call('mkdir', $this->root, 0777, true)) - || !is_writable($this->root) + !$this->readOnly + && ( + (!is_dir($this->root) && !Silencer::call('mkdir', $this->root, 0777, true)) + || !is_writable($this->root) + ) ) { $this->io->writeError('Cannot create cache directory ' . $this->root . ', or directory is not writable. Proceeding without cache'); $this->enabled = false; From c3bb27960b734a67f26ead8e7a69f537f03c3019 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 11:55:43 +0200 Subject: [PATCH 169/618] Fix other issues with readonly caches, refs #10906 --- CHANGELOG.md | 2 +- src/Composer/Cache.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 733de9b7e69c..e76593076762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### [2.2.15] 2022-07-01 - * Fixed support for read-only caches where the filesystem is not writable (#10906) + * Fixed support for `cache-read-only` where the filesystem is not writable (#10906) * Fixed type error when using `allow-plugins: true` (#10909) * Fixed @putenv scripts receiving arguments passed to the command (#10846) * Fixed support for spaces in paths with binary proxies on Windows (#10836) diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index 1390e09b18a4..61ae44f82565 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -104,7 +104,7 @@ public function isEnabled() || !is_writable($this->root) ) ) { - $this->io->writeError('Cannot create cache directory ' . $this->root . ', or directory is not writable. Proceeding without cache'); + $this->io->writeError('Cannot create cache directory ' . $this->root . ', or directory is not writable. Proceeding without cache. See also cache-read-only config if your filesystem is read-only.'); $this->enabled = false; } } @@ -265,7 +265,7 @@ public function gcIsNecessary() */ public function remove($file) { - if ($this->isEnabled()) { + if ($this->isEnabled() && !$this->readOnly) { $file = Preg::replace('{[^'.$this->allowlist.']}i', '-', $file); if (file_exists($this->root . $file)) { return $this->filesystem->unlink($this->root . $file); @@ -280,7 +280,7 @@ public function remove($file) */ public function clear() { - if ($this->isEnabled()) { + if ($this->isEnabled() && !$this->readOnly) { $this->filesystem->emptyDirectory($this->root); return true; @@ -314,7 +314,7 @@ public function getAge($file) */ public function gc($ttl, $maxSize) { - if ($this->isEnabled()) { + if ($this->isEnabled() && !$this->readOnly) { $expire = new \DateTime(); $expire->modify('-'.$ttl.' seconds'); From 509dcbd4f8d459e0ef2ef223a231b8c31bceed78 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:01:26 +0200 Subject: [PATCH 170/618] Release 2.2.15 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 624e0250764e..8a69e4dc7ac1 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '@package_version@'; - const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - const RELEASE_DATE = '@release_date@'; - const SOURCE_VERSION = '2.2.999-dev+source'; + const VERSION = '2.2.15'; + const BRANCH_ALIAS_VERSION = ''; + const RELEASE_DATE = '2022-07-01 12:01:26'; + const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From f14b02b9c9531b31d8547d88f07d493d1730a74c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:01:26 +0200 Subject: [PATCH 171/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 8a69e4dc7ac1..624e0250764e 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '2.2.15'; - const BRANCH_ALIAS_VERSION = ''; - const RELEASE_DATE = '2022-07-01 12:01:26'; - const SOURCE_VERSION = ''; + const VERSION = '@package_version@'; + const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + const RELEASE_DATE = '@release_date@'; + const SOURCE_VERSION = '2.2.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 75bea6ba7337cf5c1a02dc98ca99fce8de6bfe90 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:09:16 +0200 Subject: [PATCH 172/618] Update changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f44dd02ccef7..ee34068ed889 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +### [2.3.8] 2022-07-01 + + * Fixed support for `cache-read-only` where the filesystem is not writable (#10906) + * Fixed type error when using `allow-plugins: true` (#10909) + * Fixed @putenv scripts receiving arguments passed to the command (#10846) + * Fixed support for spaces in paths with binary proxies on Windows (#10836) + * Fixed type error in GitDownloader if branches cannot be listed (#10888) + * Fixed RootPackageInterface issue on PHP 5.3.3 (#10895) + * Fixed type errors (#10904, #10897) + ### [2.3.7] 2022-06-06 * Fixed a few PHPStan ConfigReturnTypeExtension bugs @@ -1551,6 +1561,7 @@ * Initial release +[2.3.8]: https://github.com/composer/composer/compare/2.3.7...2.3.8 [2.3.7]: https://github.com/composer/composer/compare/2.3.6...2.3.7 [2.3.6]: https://github.com/composer/composer/compare/2.3.5...2.3.6 [2.3.5]: https://github.com/composer/composer/compare/2.3.4...2.3.5 From f69e63262dadd02b3b6edade339c7badda2939c2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:10:47 +0200 Subject: [PATCH 173/618] Release 2.3.8 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 93e8c0a6f5d6..972e6a08fbf4 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.3.999-dev+source'; + public const VERSION = '2.3.8'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-07-01 12:10:47'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 726669084bcedc235d5055e0269ca22352eece2d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:10:47 +0200 Subject: [PATCH 174/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 972e6a08fbf4..93e8c0a6f5d6 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.3.8'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-07-01 12:10:47'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.3.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 99255d3d85f9fb025c496fed5c9bef27ac0603f2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:22:11 +0200 Subject: [PATCH 175/618] Build releases with 8.1 --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c45cb57b3d29..b0e1efd9d1d8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: coverage: "none" extensions: "intl" ini-values: "memory_limit=-1" - php-version: "8.0" + php-version: "8.1" - name: "Install dependencies from composer.lock using composer binary provided by system" run: "composer install ${{ env.COMPOSER_FLAGS }}" From 1703b74e73dd242ec3ce9790d03a3f1cee753495 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 1 Jul 2022 12:24:54 +0200 Subject: [PATCH 176/618] Add missing return types --- tests/Composer/Test/ConfigTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Composer/Test/ConfigTest.php b/tests/Composer/Test/ConfigTest.php index 69a64397b4c9..9fe1da3fcf22 100644 --- a/tests/Composer/Test/ConfigTest.php +++ b/tests/Composer/Test/ConfigTest.php @@ -409,7 +409,7 @@ public function testGetDefaultsToAnEmptyArray(): void } } - public function testMergesPluginConfig() + public function testMergesPluginConfig(): void { $config = new Config(false); $config->merge(array('config' => array('allow-plugins' => array('some/plugin' => true)))); @@ -419,7 +419,7 @@ public function testMergesPluginConfig() $this->assertEquals(array('some/plugin' => true, 'another/plugin' => true), $config->get('allow-plugins')); } - public function testOverridesGlobalBooleanPluginsConfig() + public function testOverridesGlobalBooleanPluginsConfig(): void { $config = new Config(false); $config->merge(array('config' => array('allow-plugins' => true))); @@ -429,7 +429,7 @@ public function testOverridesGlobalBooleanPluginsConfig() $this->assertEquals(array('another/plugin' => true), $config->get('allow-plugins')); } - public function testAllowsAllPluginsFromLocalBoolean() + public function testAllowsAllPluginsFromLocalBoolean(): void { $config = new Config(false); $config->merge(array('config' => array('allow-plugins' => array('some/plugin' => true)))); From 92e1c26c3b9d14f84d5edf03f42054c9a6f0fe09 Mon Sep 17 00:00:00 2001 From: Damien Tournoud Date: Tue, 5 Jul 2022 15:44:30 +0200 Subject: [PATCH 177/618] Disallow plugins by throwing an exception if non-interactive to avoid half-broken runtime states (#10920) * Disallow plugins by throwing an exception if non-interactive to avoid half-broken runtime states, fixes #10912 * Also allow BC mode for lock files older than 2.2.0 to keep plugins working there * Allow locker to be accessed by plugin manager at init time * Update allow-plugins docs Co-authored-by: Damien Tournoud Co-authored-by: Jordi Boggiano --- doc/06-config.md | 10 +- src/Composer/Factory.php | 22 ++-- src/Composer/Installer/PluginInstaller.php | 13 +++ src/Composer/Package/Locker.php | 10 ++ src/Composer/Plugin/PluginManager.php | 111 +++++++++++---------- 5 files changed, 99 insertions(+), 67 deletions(-) diff --git a/doc/06-config.md b/doc/06-config.md index c0b1a7d87660..4134d632e5a4 100644 --- a/doc/06-config.md +++ b/doc/06-config.md @@ -52,7 +52,15 @@ and **false** to disallow while suppressing further warnings and prompts. } ``` -You can also set the config option itself to `false` to disallow all plugins, or `true` to allow all plugins to run (NOT recommended). +You can also set the config option itself to `false` to disallow all plugins, or `true` to allow all plugins to run (NOT recommended). For example: + +```json +{ + "config": { + "allow-plugins": false + } +} +``` ## use-include-path diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 9288da19b914..9248071ca42e 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -427,6 +427,17 @@ public function createComposer(IOInterface $io, $localConfig = null, $disablePlu // add installers to the manager (must happen after download manager is created since they read it out of $composer) $this->createDefaultInstallers($im, $composer, $io, $process); + // init locker if possible + if ($fullLoad && isset($composerFile)) { + $lockFile = self::getLockFile($composerFile); + if (!$config->get('lock') && file_exists($lockFile)) { + $io->writeError(''.$lockFile.' is present but ignored as the "lock" config option is disabled.'); + } + + $locker = new Package\Locker($io, new JsonFile($config->get('lock') ? $lockFile : Platform::getDevNull(), null, $io), $im, file_get_contents($composerFile), $process); + $composer->setLocker($locker); + } + if ($fullLoad) { $globalComposer = null; if (realpath($config->get('home')) !== $cwd) { @@ -439,17 +450,6 @@ public function createComposer(IOInterface $io, $localConfig = null, $disablePlu $pm->loadInstalledPlugins(); } - // init locker if possible - if ($fullLoad && isset($composerFile)) { - $lockFile = self::getLockFile($composerFile); - if (!$config->get('lock') && file_exists($lockFile)) { - $io->writeError(''.$lockFile.' is present but ignored as the "lock" config option is disabled.'); - } - - $locker = new Package\Locker($io, new JsonFile($config->get('lock') ? $lockFile : Platform::getDevNull(), null, $io), $im, file_get_contents($composerFile), $process); - $composer->setLocker($locker); - } - if ($fullLoad) { $initEvent = new Event(PluginEvents::INIT); $composer->getEventDispatcher()->dispatch($initEvent->getName(), $initEvent); diff --git a/src/Composer/Installer/PluginInstaller.php b/src/Composer/Installer/PluginInstaller.php index 3fc09638befd..16bbd4b9651c 100644 --- a/src/Composer/Installer/PluginInstaller.php +++ b/src/Composer/Installer/PluginInstaller.php @@ -47,6 +47,19 @@ public function supports($packageType) return $packageType === 'composer-plugin' || $packageType === 'composer-installer'; } + /** + * @inheritDoc + */ + public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) + { + // fail install process early if it going to fail due to a plugin not being allowed + if ($type === 'install' || $type === 'update') { + $this->composer->getPluginManager()->isPluginAllowed($package->getName(), false); + } + + return parent::prepare($type, $package, $prevPackage); + } + /** * @inheritDoc */ diff --git a/src/Composer/Package/Locker.php b/src/Composer/Package/Locker.php index 7911c4c2358b..7e001aa1374f 100644 --- a/src/Composer/Package/Locker.php +++ b/src/Composer/Package/Locker.php @@ -318,6 +318,16 @@ public function getAliases() return isset($lockData['aliases']) ? $lockData['aliases'] : array(); } + /** + * @return string + */ + public function getPluginApi() + { + $lockData = $this->getLockData(); + + return isset($lockData['plugin-api-version']) ? $lockData['plugin-api-version'] : '1.1.0'; + } + /** * @return array */ diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index 4ffd590640ce..3cfb3fac90d4 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -18,6 +18,7 @@ use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\Package\CompletePackage; +use Composer\Package\Locker; use Composer\Package\Package; use Composer\Package\Version\VersionParser; use Composer\Pcre\Preg; @@ -82,9 +83,8 @@ public function __construct(IOInterface $io, Composer $composer, Composer $globa $this->globalComposer = $globalComposer; $this->versionParser = new VersionParser(); $this->disablePlugins = $disablePlugins; - - $this->allowPluginRules = $this->parseAllowedPlugins($composer->getConfig()->get('allow-plugins')); - $this->allowGlobalPluginRules = $this->parseAllowedPlugins($globalComposer !== null ? $globalComposer->getConfig()->get('allow-plugins') : false); + $this->allowPluginRules = $this->parseAllowedPlugins($composer->getConfig()->get('allow-plugins'), $composer->getLocker()); + $this->allowGlobalPluginRules = $this->parseAllowedPlugins($globalComposer !== null ? $globalComposer->getConfig()->get('allow-plugins') : false, $globalComposer !== null ? $globalComposer->getLocker() : null); } /** @@ -653,12 +653,12 @@ public function getPluginCapabilities($capabilityClassName, array $ctorArgs = ar } /** - * @param array|bool|null $allowPluginsConfig + * @param array|bool $allowPluginsConfig * @return array|null */ - private function parseAllowedPlugins($allowPluginsConfig) + private function parseAllowedPlugins($allowPluginsConfig, Locker $locker = null) { - if (null === $allowPluginsConfig) { + if (array() === $allowPluginsConfig && $locker !== null && $locker->isLocked() && version_compare($locker->getPluginApi(), '2.2.0', '<')) { return null; } @@ -679,22 +679,28 @@ private function parseAllowedPlugins($allowPluginsConfig) } /** + * @internal + * * @param string $package * @param bool $isGlobalPlugin * @return bool */ - private function isPluginAllowed($package, $isGlobalPlugin) + public function isPluginAllowed($package, $isGlobalPlugin) { - static $warned = array(); - $rules = $isGlobalPlugin ? $this->allowGlobalPluginRules : $this->allowPluginRules; + if ($isGlobalPlugin) { + $rules = &$this->allowGlobalPluginRules; + } else { + $rules = &$this->allowPluginRules; + } + // This is a BC mode for lock files created pre-Composer-2.2 where the expectation of + // an allow-plugins config being present cannot be made. if ($rules === null) { if (!$this->io->isInteractive()) { - if (!isset($warned['all'])) { - $this->io->writeError('For additional security you should declare the allow-plugins config with a list of packages names that are allowed to run code. See https://getcomposer.org/allow-plugins'); - $this->io->writeError('You have until July 2022 to add the setting. Composer will then switch the default behavior to disallow all plugins.'); - $warned['all'] = true; - } + $this->io->writeError('For additional security you should declare the allow-plugins config with a list of packages names that are allowed to run code. See https://getcomposer.org/allow-plugins'); + $this->io->writeError('This warning will become an exception once you run composer update!'); + + $rules = array('{}' => true); // if no config is defined we allow all plugins for BC return true; @@ -714,50 +720,45 @@ private function isPluginAllowed($package, $isGlobalPlugin) return false; } - if (!isset($warned[$package])) { - if ($this->io->isInteractive()) { - $composer = $isGlobalPlugin && $this->globalComposer !== null ? $this->globalComposer : $this->composer; - - $this->io->writeError(''.$package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins'); - while (true) { - switch ($answer = $this->io->ask('Do you trust "'.$package.'" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] ', '?')) { - case 'y': - case 'n': - case 'd': - $allow = $answer === 'y'; - - // persist answer in current rules to avoid prompting again if the package gets reloaded - if ($isGlobalPlugin) { - $this->allowGlobalPluginRules[BasePackage::packageNameToRegexp($package)] = $allow; - } else { - $this->allowPluginRules[BasePackage::packageNameToRegexp($package)] = $allow; - } - - // persist answer in composer.json if it wasn't simply discarded - if ($answer === 'y' || $answer === 'n') { - $composer->getConfig()->getConfigSource()->addConfigSetting('allow-plugins.'.$package, $allow); - } - - return $allow; - - case '?': - default: - $this->io->writeError(array( - 'y - add package to allow-plugins in composer.json and let it run immediately', - 'n - add package (as disallowed) to allow-plugins in composer.json to suppress further prompts', - 'd - discard this, do not change composer.json and do not allow the plugin to run', - '? - print help' - )); - break; - } + if ($this->io->isInteractive()) { + $composer = $isGlobalPlugin && $this->globalComposer !== null ? $this->globalComposer : $this->composer; + + $this->io->writeError(''.$package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins'); + while (true) { + switch ($answer = $this->io->ask('Do you trust "'.$package.'" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] ', + '?')) { + case 'y': + case 'n': + case 'd': + $allow = $answer === 'y'; + + // persist answer in current rules to avoid prompting again if the package gets reloaded + $rules[BasePackage::packageNameToRegexp($package)] = $allow; + + // persist answer in composer.json if it wasn't simply discarded + if ($answer === 'y' || $answer === 'n') { + $composer->getConfig()->getConfigSource()->addConfigSetting('allow-plugins.'.$package, $allow); + } + + return $allow; + + case '?': + default: + $this->io->writeError(array( + 'y - add package to allow-plugins in composer.json and let it run immediately', + 'n - add package (as disallowed) to allow-plugins in composer.json to suppress further prompts', + 'd - discard this, do not change composer.json and do not allow the plugin to run', + '? - print help' + )); + break; } - } else { - $this->io->writeError(''.$package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe. See https://getcomposer.org/allow-plugins'); - $this->io->writeError('You can run "composer '.($isGlobalPlugin ? 'global ' : '').'config --no-plugins allow-plugins.'.$package.' [true|false]" to enable it (true) or keep it disabled and suppress this warning (false)'); } - $warned[$package] = true; } - return false; + throw new \UnexpectedValueException( + $package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe.'.PHP_EOL. + 'You can run "composer '.($isGlobalPlugin ? 'global ' : '').'config --no-plugins allow-plugins.'.$package.' [true|false]" to enable it (true) or disable it explicitly and suppress this exception (false)'.PHP_EOL. + 'See https://getcomposer.org/allow-plugins' + ); } } From 3ebd66b85108e5da3585371aa1de66d8a611b019 Mon Sep 17 00:00:00 2001 From: fluffycondor <62219548+fluffycondor@users.noreply.github.com> Date: Tue, 5 Jul 2022 16:51:07 +0300 Subject: [PATCH 178/618] Fix deprecation notice (#10921) Deprecation Notice: trim(): Passing null to parameter #1 ($string) of type string is deprecated in phar:///usr/bin/composer/src/Composer/Util/GitHub.php:103 --- src/Composer/Util/GitHub.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Composer/Util/GitHub.php b/src/Composer/Util/GitHub.php index 2dd53e3506c6..84ca062fe6cd 100644 --- a/src/Composer/Util/GitHub.php +++ b/src/Composer/Util/GitHub.php @@ -101,9 +101,9 @@ public function authorizeOAuthInteractively($originUrl, $message = null) $this->io->writeError(sprintf('Tokens will be stored in plain text in "%s" for future use by Composer.', $this->config->getAuthConfigSource()->getName())); $this->io->writeError('For additional information, check https://getcomposer.org/doc/articles/authentication-for-private-packages.md#github-oauth'); - $token = trim($this->io->askAndHideAnswer('Token (hidden): ')); + $token = trim((string) $this->io->askAndHideAnswer('Token (hidden): ')); - if (!$token) { + if ($token === '') { $this->io->writeError('No token given, aborting.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth github-oauth.github.com "'); From 9a6d63f0f4f187df304fd60803b340c84211bc13 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:22:29 +0200 Subject: [PATCH 179/618] Fix build regressions --- src/Composer/Factory.php | 3 +++ src/Composer/Installer/PluginInstaller.php | 2 +- src/Composer/Plugin/PluginManager.php | 2 +- tests/Composer/Test/Plugin/PluginInstallerTest.php | 4 ++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 9fb0be111b02..de1516f7dd50 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -413,6 +413,9 @@ public function createComposer(IOInterface $io, $localConfig = null, bool $disab $locker = new Package\Locker($io, new JsonFile($config->get('lock') ? $lockFile : Platform::getDevNull(), null, $io), $im, file_get_contents($composerFile), $process); $composer->setLocker($locker); + } elseif ($composer instanceof Composer) { + $locker = new Package\Locker($io, new JsonFile(Platform::getDevNull(), null, $io), $im, json_encode($localConfig), $process); + $composer->setLocker($locker); } if ($composer instanceof Composer) { diff --git a/src/Composer/Installer/PluginInstaller.php b/src/Composer/Installer/PluginInstaller.php index 751130e7fc2e..fc9c6dcbb311 100644 --- a/src/Composer/Installer/PluginInstaller.php +++ b/src/Composer/Installer/PluginInstaller.php @@ -50,7 +50,7 @@ public function prepare($type, PackageInterface $package, PackageInterface $prev { // fail install process early if it going to fail due to a plugin not being allowed if ($type === 'install' || $type === 'update') { - $this->composer->getPluginManager()->isPluginAllowed($package->getName(), false); + $this->getPluginManager()->isPluginAllowed($package->getName(), false); } return parent::prepare($type, $package, $prevPackage); diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index f83353829bff..2ca137012917 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -77,7 +77,7 @@ public function __construct(IOInterface $io, Composer $composer, PartialComposer $this->versionParser = new VersionParser(); $this->disablePlugins = $disablePlugins; $this->allowPluginRules = $this->parseAllowedPlugins($composer->getConfig()->get('allow-plugins'), $composer->getLocker()); - $this->allowGlobalPluginRules = $this->parseAllowedPlugins($globalComposer !== null ? $globalComposer->getConfig()->get('allow-plugins') : false, $globalComposer !== null ? $globalComposer->getLocker() : null); + $this->allowGlobalPluginRules = $this->parseAllowedPlugins($globalComposer !== null ? $globalComposer->getConfig()->get('allow-plugins') : false); } /** diff --git a/tests/Composer/Test/Plugin/PluginInstallerTest.php b/tests/Composer/Test/Plugin/PluginInstallerTest.php index 44d06292ace5..8215b97f17e4 100644 --- a/tests/Composer/Test/Plugin/PluginInstallerTest.php +++ b/tests/Composer/Test/Plugin/PluginInstallerTest.php @@ -15,10 +15,12 @@ use Composer\Composer; use Composer\Config; use Composer\Installer\PluginInstaller; +use Composer\Json\JsonFile; use Composer\Package\CompleteAliasPackage; use Composer\Package\CompletePackage; use Composer\Package\Loader\JsonLoader; use Composer\Package\Loader\ArrayLoader; +use Composer\Package\Locker; use Composer\Package\RootPackage; use Composer\Plugin\PluginManager; use Composer\IO\BufferIO; @@ -26,6 +28,7 @@ use Composer\Autoload\AutoloadGenerator; use Composer\Test\TestCase; use Composer\Util\Filesystem; +use Composer\Util\Platform; class PluginInstallerTest extends TestCase { @@ -123,6 +126,7 @@ protected function setUp(): void $this->composer->setAutoloadGenerator($this->autoloadGenerator); $this->composer->setEventDispatcher(new EventDispatcher($this->composer, $this->io)); $this->composer->setPackage(new RootPackage('dummy/root', '1.0.0.0', '1.0.0')); + $this->composer->setLocker(new Locker($this->io, new JsonFile(Platform::getDevNull()), $im, '{}')); $config->merge(array( 'config' => array( From 8304ea06953a9f5eb74f96d3a3cd90ea222e009a Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:23:53 +0200 Subject: [PATCH 180/618] Fix type error with null descriptions, fixes #10924 --- src/Composer/Command/ShowCommand.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 72242073b205..632d6a1b657f 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -1070,7 +1070,12 @@ protected function displayPackageTree(array $arrayTree): void foreach ($arrayTree as $package) { $io->write(sprintf('%s', $package['name']), false); $io->write(' ' . $package['version'], false); - $io->write(' ' . strtok($package['description'], "\r\n")); + if (isset($package['description'])) { + $io->write(' ' . strtok($package['description'], "\r\n")); + } else { + // output newline + $io->write(''); + } if (isset($package['requires'])) { $requires = $package['requires']; From fca92faed8609473fb86ffa930720e6dab0ce95a Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:26:46 +0200 Subject: [PATCH 181/618] Fix type error --- src/Composer/Factory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index de1516f7dd50..9a7da447db7a 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -414,7 +414,7 @@ public function createComposer(IOInterface $io, $localConfig = null, bool $disab $locker = new Package\Locker($io, new JsonFile($config->get('lock') ? $lockFile : Platform::getDevNull(), null, $io), $im, file_get_contents($composerFile), $process); $composer->setLocker($locker); } elseif ($composer instanceof Composer) { - $locker = new Package\Locker($io, new JsonFile(Platform::getDevNull(), null, $io), $im, json_encode($localConfig), $process); + $locker = new Package\Locker($io, new JsonFile(Platform::getDevNull(), null, $io), $im, JsonFile::encode($localConfig), $process); $composer->setLocker($locker); } From 8b7ea8deb69024a05a271f99de9cd786c4b332fb Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:50:25 +0200 Subject: [PATCH 182/618] Update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e76593076762..75a4ffe0f61d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +### [2.2.16] 2022-07-05 + + * Fixed non-interactive behavior of allow-plugins to throw instead of continue with a warning to avoid broken installs (#10920) + * Fixed allow-plugins BC mode to ensure old lock files created pre-2.2 can be installed with only a warning but plugins fully loaded (#10920) + * Fixed deprecation notice (#10921) + ### [2.2.15] 2022-07-01 * Fixed support for `cache-read-only` where the filesystem is not writable (#10906) @@ -1455,6 +1461,7 @@ * Initial release +[2.2.16]: https://github.com/composer/composer/compare/2.2.15...2.2.16 [2.2.15]: https://github.com/composer/composer/compare/2.2.14...2.2.15 [2.2.14]: https://github.com/composer/composer/compare/2.2.13...2.2.14 [2.2.13]: https://github.com/composer/composer/compare/2.2.12...2.2.13 From 8c0ee53ff67399b0eec4eee2c5dc5189ec6938a6 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:50:29 +0200 Subject: [PATCH 183/618] Release 2.2.16 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 624e0250764e..9389c108f593 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '@package_version@'; - const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - const RELEASE_DATE = '@release_date@'; - const SOURCE_VERSION = '2.2.999-dev+source'; + const VERSION = '2.2.16'; + const BRANCH_ALIAS_VERSION = ''; + const RELEASE_DATE = '2022-07-05 16:50:29'; + const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 2759d8b545af3182f98f7571b1d3c0b6746f89ca Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:50:29 +0200 Subject: [PATCH 184/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 9389c108f593..624e0250764e 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '2.2.16'; - const BRANCH_ALIAS_VERSION = ''; - const RELEASE_DATE = '2022-07-05 16:50:29'; - const SOURCE_VERSION = ''; + const VERSION = '@package_version@'; + const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + const RELEASE_DATE = '@release_date@'; + const SOURCE_VERSION = '2.2.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 015f524c9969255a29cdea8890cbd4fec240ee47 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:52:11 +0200 Subject: [PATCH 185/618] Release 2.3.9 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 93e8c0a6f5d6..9e75a58130c1 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.3.999-dev+source'; + public const VERSION = '2.3.9'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-07-05 16:52:11'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 4cd8787c88f86d957fc548186aa635ea1f9db505 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 16:52:11 +0200 Subject: [PATCH 186/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 9e75a58130c1..93e8c0a6f5d6 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.3.9'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-07-05 16:52:11'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.3.999-dev+source'; /** * Version number of the internal composer-runtime-api package From dcd7f2180d8ebf6cd1bbe23833188dedcd9ba7ec Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 5 Jul 2022 22:20:33 +0200 Subject: [PATCH 187/618] Avoid checking for allowed plugins if plugins are disabled entirely, fixes #10925 --- src/Composer/Installer/PluginInstaller.php | 4 ++-- src/Composer/Plugin/PluginManager.php | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Composer/Installer/PluginInstaller.php b/src/Composer/Installer/PluginInstaller.php index 16bbd4b9651c..14d8caf9b5af 100644 --- a/src/Composer/Installer/PluginInstaller.php +++ b/src/Composer/Installer/PluginInstaller.php @@ -52,8 +52,8 @@ public function supports($packageType) */ public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) { - // fail install process early if it going to fail due to a plugin not being allowed - if ($type === 'install' || $type === 'update') { + // fail install process early if it is going to fail due to a plugin not being allowed + if (($type === 'install' || $type === 'update') && !$this->composer->getPluginManager()->arePluginsDisabled()) { $this->composer->getPluginManager()->isPluginAllowed($package->getName(), false); } diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index 3cfb3fac90d4..1210dd1891d2 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -678,6 +678,16 @@ private function parseAllowedPlugins($allowPluginsConfig, Locker $locker = null) return $rules; } + /** + * @internal + * + * @return bool + */ + public function arePluginsDisabled() + { + return $this->disablePlugins; + } + /** * @internal * From a73933e16715535f7fa8b8a4f3af24aac0203367 Mon Sep 17 00:00:00 2001 From: Calvin Truong <46874161+cxtruong70@users.noreply.github.com> Date: Sun, 10 Jul 2022 08:03:38 -0700 Subject: [PATCH 188/618] Update README.md (#10933) Minor change. Added a new line between sentence regarding Public and Private packages for slightly increased readability through spatial distinction. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d9fc7990999..dabb989db9b7 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,9 @@ For usage, see [the documentation](https://getcomposer.org/doc/). Packages -------- -Find public packages on [Packagist.org](https://packagist.org). For private package hosting take a look at [Private Packagist](https://packagist.com). +Find public packages on [Packagist.org](https://packagist.org). + +For private package hosting take a look at [Private Packagist](https://packagist.com). Community --------- From 8323e85bc844466fc71a85782bbd0f6141aa2750 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 12 Jul 2022 13:24:21 +0200 Subject: [PATCH 189/618] Fix allow-plugins check to not check plugins which are anyway incompatible with the current Composer version, refs #10928 --- src/Composer/Plugin/PluginManager.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index 1210dd1891d2..c3647438cb32 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -165,11 +165,6 @@ public function registerPackage(PackageInterface $package, $failOnMissingClasses return; } - if (!$this->isPluginAllowed($package->getName(), $isGlobalPlugin)) { - $this->io->writeError('Skipped loading "'.$package->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').'as it is not in config.allow-plugins', true, IOInterface::DEBUG); - return; - } - if ($package->getType() === 'composer-plugin') { $requiresComposer = null; foreach ($package->getRequires() as $link) { /** @var Link $link */ @@ -201,6 +196,12 @@ public function registerPackage(PackageInterface $package, $failOnMissingClasses } } + if (!$this->isPluginAllowed($package->getName(), $isGlobalPlugin)) { + $this->io->writeError('Skipped loading "'.$package->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').'as it is not in config.allow-plugins', true, IOInterface::DEBUG); + + return; + } + $oldInstallerPlugin = ($package->getType() === 'composer-installer'); if (isset($this->registeredPlugins[$package->getName()])) { From 75ef4903ef70d1e95028d0391b1f5ca8f3a4e1e1 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 12 Jul 2022 16:25:12 +0200 Subject: [PATCH 190/618] Ensure plugins from CWD/vendor do not get loaded when running create-project, fixes #10935 --- src/Composer/Command/CreateProjectCommand.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index a1eba060f731..4bccc3dc4464 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -403,7 +403,15 @@ protected function installRootPackage(IOInterface $io, Config $config, $packageN throw new \InvalidArgumentException('Invalid stability provided ('.$stability.'), must be one of: '.implode(', ', array_keys(BasePackage::$stabilities))); } - $composer = Factory::create($io, $config->all(), $disablePlugins); + $composerJson = array_merge( + // prevent version guessing from happening + array('version' => '1.0.0'), + $config->all(), + // ensure the vendor dir and its plugins does not get loaded if CWD/vendor has plugins in it + array('config' => array('vendor-dir' => Platform::getDevNull())) + ); + $factory = new Factory; + $composer = $factory->createComposer($io, $composerJson, $disablePlugins, Platform::getDevNull(), true, $disableScripts); $config = $composer->getConfig(); $rm = $composer->getRepositoryManager(); From 03cebc2490abb6b4907e53f09e3953344482aaa1 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 12 Jul 2022 20:56:23 +0200 Subject: [PATCH 191/618] Clean up types with conditional return types --- src/Composer/Factory.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 9a7da447db7a..9e397fed7eb9 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -283,6 +283,7 @@ public static function createOutput(): ConsoleOutput * @throws \InvalidArgumentException * @throws \UnexpectedValueException * @return Composer|PartialComposer Composer if $fullLoad is true, otherwise PartialComposer + * @phpstan-return ($fullLoad is true ? Composer : PartialComposer) */ public function createComposer(IOInterface $io, $localConfig = null, bool $disablePlugins = false, ?string $cwd = null, bool $fullLoad = true, bool $disableScripts = false) { @@ -450,10 +451,7 @@ public static function createGlobal(IOInterface $io, bool $disablePlugins = fals { $factory = new static(); - $composer = $factory->createGlobalComposer($io, static::createConfig($io), $disablePlugins, $disableScripts, true); - assert(null === $composer || $composer instanceof Composer); - - return $composer; + return $factory->createGlobalComposer($io, static::createConfig($io), $disablePlugins, $disableScripts, true); } /** @@ -474,6 +472,7 @@ protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, st /** * @return PartialComposer|Composer|null By default PartialComposer, but Composer if $fullLoad is set to true + * @phpstan-return ($fullLoad is true ? Composer|null : PartialComposer|null) */ protected function createGlobalComposer(IOInterface $io, Config $config, bool $disablePlugins, bool $disableScripts, bool $fullLoad = false): ?PartialComposer { @@ -615,10 +614,7 @@ public static function create(IOInterface $io, $config = null, bool $disablePlug { $factory = new static(); - $composer = $factory->createComposer($io, $config, $disablePlugins, null, true, $disableScripts); - assert($composer instanceof Composer); - - return $composer; + return $factory->createComposer($io, $config, $disablePlugins, null, true, $disableScripts); } /** From 32a7ceac2f78359b3ce26ab7e734ab71ff41a4e4 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 10:06:00 +0200 Subject: [PATCH 192/618] Improve exception message when a package cannot be added in another repo, refs #10940 --- src/Composer/Package/BasePackage.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Composer/Package/BasePackage.php b/src/Composer/Package/BasePackage.php index a3ec9c570f6b..8f225cbd3a77 100644 --- a/src/Composer/Package/BasePackage.php +++ b/src/Composer/Package/BasePackage.php @@ -135,7 +135,12 @@ public function getId() public function setRepository(RepositoryInterface $repository) { if ($this->repository && $repository !== $this->repository) { - throw new \LogicException('A package can only be added to one repository'); + throw new \LogicException(sprintf( + 'Package "%s" cannot be added to repository "%s" as it is already in repository "%s".', + $this->getPrettyName(), + $repository->getRepoName(), + $this->repository->getRepoName(), + )); } $this->repository = $repository; } From f600ea46c76a7126eb1fac4c6c6013a965213e6c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 10:09:33 +0200 Subject: [PATCH 193/618] Fix syntax error --- src/Composer/Package/BasePackage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Package/BasePackage.php b/src/Composer/Package/BasePackage.php index 8f225cbd3a77..3bedbf59634d 100644 --- a/src/Composer/Package/BasePackage.php +++ b/src/Composer/Package/BasePackage.php @@ -139,7 +139,7 @@ public function setRepository(RepositoryInterface $repository) 'Package "%s" cannot be added to repository "%s" as it is already in repository "%s".', $this->getPrettyName(), $repository->getRepoName(), - $this->repository->getRepoName(), + $this->repository->getRepoName() )); } $this->repository = $repository; From a481dfce3fc5312a2bee581d4df7f72ced52e84b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 10:35:32 +0200 Subject: [PATCH 194/618] Fix disk_free_space being called even when not available, fixes #10936 --- src/Composer/Cache.php | 4 ++-- src/Composer/Command/DiagnoseCommand.php | 4 ++++ src/Composer/Console/Application.php | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index 61ae44f82565..cafad5a281f9 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -162,11 +162,11 @@ public function write($file, $contents) unlink($tempFileName); $message = sprintf( - 'Writing %1$s into cache failed after %2$u of %3$u bytes written, only %4$u bytes of free space available', + 'Writing %1$s into cache failed after %2$u of %3$u bytes written, only %4$s bytes of free space available', $tempFileName, $m[1], $m[2], - @disk_free_space(dirname($tempFileName)) + function_exists('disk_free_space') ? @disk_free_space(dirname($tempFileName)) : 'unknown' ); $this->io->writeError($message); diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index 242c5815457e..6e56f3a4f3f6 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -370,6 +370,10 @@ private function getGithubRateLimit($domain, $token = null) */ private function checkDiskSpace(Config $config) { + if (!function_exists('disk_free_space')) { + return true; + } + $minSpaceFree = 1024 * 1024; if ((($df = @disk_free_space($dir = $config->get('home'))) !== false && $df < $minSpaceFree) || (($df = @disk_free_space($dir = $config->get('vendor-dir'))) !== false && $df < $minSpaceFree) diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index e7c3a32a5604..86e89e88b407 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -386,7 +386,7 @@ private function hintCommonErrors(\Exception $exception) Silencer::suppress(); try { $composer = $this->getComposer(false, true); - if ($composer) { + if (null !== $composer && function_exists('disk_free_space')) { $config = $composer->getConfig(); $minSpaceFree = 1024 * 1024; From 55fe12bd657dcb81ae20817a4095d7bc59742606 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 13:23:27 +0200 Subject: [PATCH 195/618] Allow disabling only local or global plugins internally to fix #10935 without side-effects --- src/Composer/Command/CreateProjectCommand.php | 10 +--- src/Composer/Factory.php | 9 ++-- src/Composer/Installer/PluginInstaller.php | 2 +- src/Composer/Plugin/PluginManager.php | 53 +++++++++---------- 4 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 4bccc3dc4464..7f7487dea113 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -403,15 +403,7 @@ protected function installRootPackage(IOInterface $io, Config $config, $packageN throw new \InvalidArgumentException('Invalid stability provided ('.$stability.'), must be one of: '.implode(', ', array_keys(BasePackage::$stabilities))); } - $composerJson = array_merge( - // prevent version guessing from happening - array('version' => '1.0.0'), - $config->all(), - // ensure the vendor dir and its plugins does not get loaded if CWD/vendor has plugins in it - array('config' => array('vendor-dir' => Platform::getDevNull())) - ); - $factory = new Factory; - $composer = $factory->createComposer($io, $composerJson, $disablePlugins, Platform::getDevNull(), true, $disableScripts); + $composer = Factory::create($io, $config->all(), $disablePlugins === true ? true : 'local', $disableScripts); $config = $composer->getConfig(); $rm = $composer->getRepositoryManager(); diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 9248071ca42e..5cc3867df1c9 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -293,7 +293,7 @@ public static function createOutput() * @param IOInterface $io IO instance * @param array|string|null $localConfig either a configuration array or a filename to read from, if null it will * read from the default filename - * @param bool $disablePlugins Whether plugins should not be loaded + * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts Whether scripts should not be run * @param string|null $cwd * @param bool $fullLoad Whether to initialize everything or only main project stuff (used when loading the global composer) @@ -500,6 +500,9 @@ protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, $v */ protected function createGlobalComposer(IOInterface $io, Config $config, $disablePlugins, $disableScripts, $fullLoad = false) { + // make sure if disable plugins was 'local' it is now turned off + $disablePlugins = $disablePlugins === 'global' || $disablePlugins === true; + $composer = null; try { $composer = $this->createComposer($io, $config->get('home') . '/composer.json', $disablePlugins, $config->get('home'), $fullLoad, $disableScripts); @@ -579,7 +582,7 @@ public function createArchiveManager(Config $config, Downloader\DownloadManager * @param IOInterface $io * @param Composer $composer * @param Composer $globalComposer - * @param bool $disablePlugins + * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @return Plugin\PluginManager */ protected function createPluginManager(IOInterface $io, Composer $composer, Composer $globalComposer = null, $disablePlugins = false) @@ -635,7 +638,7 @@ protected function loadRootPackage(RepositoryManager $rm, Config $config, Versio * @param IOInterface $io IO instance * @param mixed $config either a configuration array or a filename to read from, if null it will read from * the default filename - * @param bool $disablePlugins Whether plugins should not be loaded + * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts Whether scripts should not be run * @return Composer */ diff --git a/src/Composer/Installer/PluginInstaller.php b/src/Composer/Installer/PluginInstaller.php index 14d8caf9b5af..af9dd2d8916f 100644 --- a/src/Composer/Installer/PluginInstaller.php +++ b/src/Composer/Installer/PluginInstaller.php @@ -53,7 +53,7 @@ public function supports($packageType) public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) { // fail install process early if it is going to fail due to a plugin not being allowed - if (($type === 'install' || $type === 'update') && !$this->composer->getPluginManager()->arePluginsDisabled()) { + if (($type === 'install' || $type === 'update') && !$this->composer->getPluginManager()->arePluginsDisabled('local')) { $this->composer->getPluginManager()->isPluginAllowed($package->getName(), false); } diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index c3647438cb32..fdf50c4d40bd 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -47,7 +47,7 @@ class PluginManager protected $globalComposer; /** @var VersionParser */ protected $versionParser; - /** @var bool */ + /** @var bool|'local'|'global' */ protected $disablePlugins = false; /** @var array */ @@ -74,7 +74,7 @@ class PluginManager * @param IOInterface $io * @param Composer $composer * @param Composer $globalComposer - * @param bool $disablePlugins + * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins */ public function __construct(IOInterface $io, Composer $composer, Composer $globalComposer = null, $disablePlugins = false) { @@ -94,15 +94,16 @@ public function __construct(IOInterface $io, Composer $composer, Composer $globa */ public function loadInstalledPlugins() { - if ($this->disablePlugins) { - return; + if (!$this->arePluginsDisabled('local')) { + $repo = $this->composer->getRepositoryManager()->getLocalRepository(); + $this->loadRepository($repo, false); } - $repo = $this->composer->getRepositoryManager()->getLocalRepository(); - $globalRepo = $this->globalComposer !== null ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; - $this->loadRepository($repo, false); - if ($globalRepo) { - $this->loadRepository($globalRepo, true); + if (!$this->arePluginsDisabled('global')) { + $globalRepo = $this->globalComposer !== null ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; + if ($globalRepo !== null) { + $this->loadRepository($globalRepo, true); + } } } @@ -113,15 +114,16 @@ public function loadInstalledPlugins() */ public function deactivateInstalledPlugins() { - if ($this->disablePlugins) { - return; + if (!$this->arePluginsDisabled('local')) { + $repo = $this->composer->getRepositoryManager()->getLocalRepository(); + $this->deactivateRepository($repo, false); } - $repo = $this->composer->getRepositoryManager()->getLocalRepository(); - $globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; - $this->deactivateRepository($repo, false); - if ($globalRepo) { - $this->deactivateRepository($globalRepo, true); + if (!$this->arePluginsDisabled('global')) { + $globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; + if ($globalRepo !== null) { + $this->deactivateRepository($globalRepo, true); + } } } @@ -161,7 +163,7 @@ public function getGlobalComposer() */ public function registerPackage(PackageInterface $package, $failOnMissingClasses = false, $isGlobalPlugin = false) { - if ($this->disablePlugins) { + if ($this->arePluginsDisabled($isGlobalPlugin ? 'global' : 'local')) { return; } @@ -320,10 +322,6 @@ public function registerPackage(PackageInterface $package, $failOnMissingClasses */ public function deactivatePackage(PackageInterface $package) { - if ($this->disablePlugins) { - return; - } - if (!isset($this->registeredPlugins[$package->getName()])) { return; } @@ -351,10 +349,6 @@ public function deactivatePackage(PackageInterface $package) */ public function uninstallPackage(PackageInterface $package) { - if ($this->disablePlugins) { - return; - } - if (!isset($this->registeredPlugins[$package->getName()])) { return; } @@ -394,6 +388,10 @@ protected function getPluginApiVersion() */ public function addPlugin(PluginInterface $plugin, $isGlobalPlugin = false, PackageInterface $sourcePackage = null) { + if ($this->arePluginsDisabled($isGlobalPlugin ? 'global' : 'local')) { + return; + } + if ($sourcePackage === null) { trigger_error('Calling PluginManager::addPlugin without $sourcePackage is deprecated, if you are using this please get in touch with us to explain the use case', E_USER_DEPRECATED); } elseif (!$this->isPluginAllowed($sourcePackage->getName(), $isGlobalPlugin)) { @@ -682,11 +680,12 @@ private function parseAllowedPlugins($allowPluginsConfig, Locker $locker = null) /** * @internal * + * @param 'local'|'global' $type * @return bool */ - public function arePluginsDisabled() + public function arePluginsDisabled($type) { - return $this->disablePlugins; + return $this->disablePlugins === true || $this->disablePlugins === $type; } /** From 37a788932d052bce9a0519bd124e05b3b61dba8f Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 13:35:03 +0200 Subject: [PATCH 196/618] Fix phpdoc issue --- src/Composer/Factory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 5cc3867df1c9..84c2296033e7 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -492,7 +492,7 @@ protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, $v } /** - * @param bool $disablePlugins + * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts * @param bool $fullLoad * From 0e59fbb46eee2b89245dc347bfb4d6efbc6f2591 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 14:13:02 +0200 Subject: [PATCH 197/618] Fix #10935 in a more generic way which fixes the issue for all Factory::create usages --- src/Composer/Command/CreateProjectCommand.php | 2 +- src/Composer/Factory.php | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 7f7487dea113..826f41c86d19 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -403,7 +403,7 @@ protected function installRootPackage(IOInterface $io, Config $config, $packageN throw new \InvalidArgumentException('Invalid stability provided ('.$stability.'), must be one of: '.implode(', ', array_keys(BasePackage::$stabilities))); } - $composer = Factory::create($io, $config->all(), $disablePlugins === true ? true : 'local', $disableScripts); + $composer = Factory::create($io, $config->all(), $disablePlugins, $disableScripts); $config = $composer->getConfig(); $rm = $composer->getRepositoryManager(); diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 84c2296033e7..609c1cc2464a 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -646,6 +646,14 @@ public static function create(IOInterface $io, $config = null, $disablePlugins = { $factory = new static(); + // for BC reasons, if a config is passed in either as array or a path that is not the default composer.json path + // we disable local plugins as they really should not be loaded from CWD + // If you want to avoid this behavior, you should be calling createComposer directly with a $cwd arg set correctly + // to the path where the composer.json being loaded resides + if ($config !== null && $config !== self::getComposerFile() && $disablePlugins === false) { + $disablePlugins = 'local'; + } + return $factory->createComposer($io, $config, $disablePlugins, null, true, $disableScripts); } From 336a0d20c6cd2004b2374f88c30cd15bece7d0ba Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 14:38:54 +0200 Subject: [PATCH 198/618] Add hint in create-project when it fails due to a missing allow-plugins in project, refs #10928 --- src/Composer/Command/CreateProjectCommand.php | 13 ++++++++++--- .../Plugin/PluginBlockedException.php | 19 +++++++++++++++++++ src/Composer/Plugin/PluginManager.php | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 src/Composer/Plugin/PluginBlockedException.php diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 826f41c86d19..466611402436 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -26,6 +26,7 @@ use Composer\Package\Version\VersionSelector; use Composer\Package\AliasPackage; use Composer\Pcre\Preg; +use Composer\Plugin\PluginBlockedException; use Composer\Repository\RepositoryFactory; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; @@ -268,9 +269,15 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ $installer->disablePlugins(); } - $status = $installer->run(); - if (0 !== $status) { - return $status; + try { + $status = $installer->run(); + if (0 !== $status) { + return $status; + } + } catch (PluginBlockedException $e) { + $io->writeError('Hint: To allow running the config command recommended below before dependencies are installed, run create-project with --no-install.'); + $io->writeError('You can then cd into '.getcwd().', configure allow-plugins, and finally run a composer install to complete the process.'); + throw $e; } } diff --git a/src/Composer/Plugin/PluginBlockedException.php b/src/Composer/Plugin/PluginBlockedException.php new file mode 100644 index 000000000000..04a8db0052a8 --- /dev/null +++ b/src/Composer/Plugin/PluginBlockedException.php @@ -0,0 +1,19 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Plugin; + +use UnexpectedValueException; + +class PluginBlockedException extends UnexpectedValueException +{ +} diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index fdf50c4d40bd..dc6dc8d11745 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -765,7 +765,7 @@ public function isPluginAllowed($package, $isGlobalPlugin) } } - throw new \UnexpectedValueException( + throw new PluginBlockedException( $package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe.'.PHP_EOL. 'You can run "composer '.($isGlobalPlugin ? 'global ' : '').'config --no-plugins allow-plugins.'.$package.' [true|false]" to enable it (true) or disable it explicitly and suppress this exception (false)'.PHP_EOL. 'See https://getcomposer.org/allow-plugins' From b195f383f2474cb0ec68bead4467079bfd136f60 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:10:15 +0200 Subject: [PATCH 199/618] Always clone root package before adding it to a RootPackageRepo to avoid issues with plugins, fixes #10940 --- src/Composer/Command/BaseDependencyCommand.php | 2 +- src/Composer/Command/CheckPlatformReqsCommand.php | 2 +- src/Composer/Command/HomeCommand.php | 2 +- src/Composer/Command/ShowCommand.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index ba48173da3f5..78eeaea854fd 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -59,7 +59,7 @@ protected function doExecute(InputInterface $input, OutputInterface $output, $in $platformOverrides = $composer->getConfig()->get('platform') ?: array(); $installedRepo = new InstalledRepository(array( - new RootPackageRepository($composer->getPackage()), + new RootPackageRepository(clone $composer->getPackage()), $composer->getRepositoryManager()->getLocalRepository(), new PlatformRepository(array(), $platformOverrides), )); diff --git a/src/Composer/Command/CheckPlatformReqsCommand.php b/src/Composer/Command/CheckPlatformReqsCommand.php index 73aee955136d..aa5b95e46723 100644 --- a/src/Composer/Command/CheckPlatformReqsCommand.php +++ b/src/Composer/Command/CheckPlatformReqsCommand.php @@ -80,7 +80,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $requires[$require] = array($link); } - $installedRepo = new InstalledRepository(array($installedRepo, new RootPackageRepository($composer->getPackage()))); + $installedRepo = new InstalledRepository(array($installedRepo, new RootPackageRepository(clone $composer->getPackage()))); foreach ($installedRepo->getPackages() as $package) { if (in_array($package->getName(), $removePackages, true)) { continue; diff --git a/src/Composer/Command/HomeCommand.php b/src/Composer/Command/HomeCommand.php index ad4a42713ed5..775aa04b9e6c 100644 --- a/src/Composer/Command/HomeCommand.php +++ b/src/Composer/Command/HomeCommand.php @@ -167,7 +167,7 @@ private function initializeRepos() if ($composer) { return array_merge( - array(new RootPackageRepository($composer->getPackage())), // root package + array(new RootPackageRepository(clone $composer->getPackage())), // root package array($composer->getRepositoryManager()->getLocalRepository()), // installed packages $composer->getRepositoryManager()->getRepositories() // remotes ); diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 6df57e08c75f..3e14bd834d25 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -167,7 +167,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $lockedRepo = null; if ($input->getOption('self')) { - $package = $this->getComposer()->getPackage(); + $package = clone $this->getComposer()->getPackage(); if ($input->getOption('name-only')) { $io->write($package->getName()); From 5cb24aaa815288f7656b1db84a2cfcd4eefcd050 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:27:29 +0200 Subject: [PATCH 200/618] Update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a4ffe0f61d..47b60b44ed0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +### [2.2.17] 2022-07-13 + + * Fixed plugins from CWD/vendor being loaded in some cases like create-project or validate even though the target directory is outside of CWD (#10935) + * Fixed support for legacy (Composer 1.x, e.g. hirak/prestissimo) plugins which will not warn/error anymore if not in allow-plugins, as they are anyway not loaded (#10928) + * Fixed pre-install check for allowed plugins not taking --no-plugins into account (#10925) + * Fixed support for disable_functions containing disk_free_space (#10936) + * Fixed RootPackageRepository usages to always clone the root package to avoid interoperability issues with plugins (#10940) + ### [2.2.16] 2022-07-05 * Fixed non-interactive behavior of allow-plugins to throw instead of continue with a warning to avoid broken installs (#10920) @@ -1461,6 +1469,7 @@ * Initial release +[2.2.17]: https://github.com/composer/composer/compare/2.2.16...2.2.17 [2.2.16]: https://github.com/composer/composer/compare/2.2.15...2.2.16 [2.2.15]: https://github.com/composer/composer/compare/2.2.14...2.2.15 [2.2.14]: https://github.com/composer/composer/compare/2.2.13...2.2.14 From a8ab5070fb99396e4710baee286478ad697724c2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:27:38 +0200 Subject: [PATCH 201/618] Release 2.2.17 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 624e0250764e..06e8eb64d021 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '@package_version@'; - const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - const RELEASE_DATE = '@release_date@'; - const SOURCE_VERSION = '2.2.999-dev+source'; + const VERSION = '2.2.17'; + const BRANCH_ALIAS_VERSION = ''; + const RELEASE_DATE = '2022-07-13 15:27:38'; + const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From c5ff1e1fc67f0f6cf4edd03f78600de81f643923 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:27:38 +0200 Subject: [PATCH 202/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 06e8eb64d021..624e0250764e 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -52,10 +52,10 @@ class Composer * const RELEASE_DATE = '@release_date@'; * const SOURCE_VERSION = '1.8-dev+source'; */ - const VERSION = '2.2.17'; - const BRANCH_ALIAS_VERSION = ''; - const RELEASE_DATE = '2022-07-13 15:27:38'; - const SOURCE_VERSION = ''; + const VERSION = '@package_version@'; + const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + const RELEASE_DATE = '@release_date@'; + const SOURCE_VERSION = '2.2.999-dev+source'; /** * Version number of the internal composer-runtime-api package From f54878d92e31ab5e5c90c16d3a2896fc827e7ef0 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:48:20 +0200 Subject: [PATCH 203/618] Update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1aea7dbee8c..43419d94a9e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +### [2.3.10] 2022-07-13 + + * Fixed plugins from CWD/vendor being loaded in some cases like create-project or validate even though the target directory is outside of CWD (#10935) + * Fixed support for legacy (Composer 1.x, e.g. hirak/prestissimo) plugins which will not warn/error anymore if not in allow-plugins, as they are anyway not loaded (#10928) + * Fixed pre-install check for allowed plugins not taking --no-plugins into account (#10925) + * Fixed support for disable_functions containing disk_free_space (#10936) + * Fixed RootPackageRepository usages to always clone the root package to avoid interoperability issues with plugins (#10940) + ### [2.3.9] 2022-07-05 * Fixed non-interactive behavior of allow-plugins to throw instead of continue with a warning to avoid broken installs (#10920) @@ -1582,6 +1590,7 @@ * Initial release +[2.3.10]: https://github.com/composer/composer/compare/2.3.9...2.3.10 [2.3.9]: https://github.com/composer/composer/compare/2.3.8...2.3.9 [2.3.8]: https://github.com/composer/composer/compare/2.3.7...2.3.8 [2.3.7]: https://github.com/composer/composer/compare/2.3.6...2.3.7 From ebac357c0a41359f3981098729042ed6dedc97ba Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:48:23 +0200 Subject: [PATCH 204/618] Release 2.3.10 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 93e8c0a6f5d6..87505f849d3f 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.3.999-dev+source'; + public const VERSION = '2.3.10'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-07-13 15:48:23'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 80a0d3236dad7471e06bc92ddd178334fad78aa9 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 13 Jul 2022 15:48:23 +0200 Subject: [PATCH 205/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 87505f849d3f..93e8c0a6f5d6 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.3.10'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-07-13 15:48:23'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.3.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 93eb19e756aac57d134cb0350e42cbced2befc57 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 17 Jul 2022 10:22:07 +0200 Subject: [PATCH 206/618] For custom composer.json paths the default cwd should be that files directory, fixes ergebnis/composer-normalize#865, refs #10935 --- src/Composer/Factory.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 609c1cc2464a..c8d1fc3d83dd 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -303,6 +303,11 @@ public static function createOutput() */ public function createComposer(IOInterface $io, $localConfig = null, $disablePlugins = false, $cwd = null, $fullLoad = true, $disableScripts = false) { + // if a custom composer.json path is given, we change the default cwd to be that file's directory + if (is_string($localConfig) && is_file($localConfig) && null === $cwd) { + $cwd = dirname($localConfig); + } + $cwd = $cwd ?: (string) getcwd(); // load Composer configuration From 740af2bdb16ce9249da9b7266ee49e67b679f336 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 17 Jul 2022 10:29:56 +0200 Subject: [PATCH 207/618] Add warning if constraint appears too narrow, refs #10943 --- src/Composer/Command/InitCommand.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 75bc92dd2df1..b4ea4350d614 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -530,6 +530,10 @@ final protected function determineRequirements(InputInterface $input, OutputInte $io = $this->getIO(); foreach ($requires as $requirement) { + if (isset($requirement['version']) && Preg::isMatch('{^\d+(\.\d+)?$}', $requirement['version'])) { + $io->writeError('The "'.$requirement['version'].'" constraint for "'.$requirement['name'].'" appears too strict and will likely not match what you want. See https://getcomposer.org/constraints'); + } + if (!isset($requirement['version'])) { // determine the best version automatically list($name, $version) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, null, null, $fixed); From 8d5bdaf443ed924cf49a1981b5c566020d0d1beb Mon Sep 17 00:00:00 2001 From: Sam Litowitz Date: Wed, 13 Jul 2022 09:19:35 -0400 Subject: [PATCH 208/618] Fixes #10938: Do not display duplicate ignore extension hints --- src/Composer/DependencyResolver/SolverProblemsException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/DependencyResolver/SolverProblemsException.php b/src/Composer/DependencyResolver/SolverProblemsException.php index deaec7d24c29..33a122ad95cc 100644 --- a/src/Composer/DependencyResolver/SolverProblemsException.php +++ b/src/Composer/DependencyResolver/SolverProblemsException.php @@ -119,7 +119,7 @@ private function createExtensionHint(array $missingExtensions) $ignoreExtensionsArguments = implode(" ", array_map(function ($extension) { return "--ignore-platform-req=$extension"; - }, $missingExtensions)); + }, array_unique($missingExtensions))); $text = "To enable extensions, verify that they are enabled in your .ini files:\n - "; $text .= implode("\n - ", $paths); From 31c7474cde1abe5bb5ea5bc9623c399797ba2f8e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sun, 17 Jul 2022 21:59:18 +0200 Subject: [PATCH 209/618] Clarify that install path is absolute but not realpath'd, fixes #10945 --- doc/07-runtime.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/07-runtime.md b/doc/07-runtime.md index fef0b3923ef7..12f512f8981b 100644 --- a/doc/07-runtime.md +++ b/doc/07-runtime.md @@ -101,6 +101,10 @@ source/docblocks of [the class itself](https://github.com/composer/composer/blob The `getInstallPath` method to retrieve a package's absolute install path. +> **Note:** The path, while absolute, may contain `../` or symlinks. It is +> not guaranteed to be equivalent to a `realpath()` so you should run a +> realpath on it if that matters to you. + ```php // returns an absolute path to the package installation location if vendor/package is installed, // or null if it is provided/replaced, or the package is a metapackage From 8c488b9b08b8b43adf8c9c8c0fdf9216bbf14409 Mon Sep 17 00:00:00 2001 From: Alexander Dmitryuk Date: Mon, 18 Jul 2022 18:04:49 +0700 Subject: [PATCH 210/618] Add "r" alias for require (#10953) Co-authored-by: a.dmitryuk --- doc/03-cli.md | 2 +- src/Composer/Command/RequireCommand.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 3703adde62b5..c766bb61362b 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -226,7 +226,7 @@ and this feature is only available for your root package dependencies. Specifying one of the words `mirrors`, `lock`, or `nothing` as an argument has the same effect as specifying the option `--lock`, for example `composer update mirrors` is exactly the same as `composer update --lock`. -## require +## require / r The `require` command adds new packages to the `composer.json` file from the current directory. If no file exists one will be created on the fly. diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 37e01b8547dd..08339998f8f2 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -67,6 +67,7 @@ protected function configure() { $this ->setName('require') + ->setAliases(array('r')) ->setDescription('Adds required packages to your composer.json and installs them.') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), From 41822237626d161ec10725747dac858d49c6c194 Mon Sep 17 00:00:00 2001 From: Joel Pittet Date: Wed, 20 Jul 2022 12:06:14 -0700 Subject: [PATCH 211/618] Remove -p from --patch-only, --platform took it (#10956) --- doc/03-cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index c766bb61362b..1ff39c67f61f 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -520,7 +520,7 @@ php composer.phar show monolog/monolog 1.0.2 * **--no-dev:** Filters dev dependencies from the package list. * **--major-only (-M):** Use with --latest or --outdated. Only shows packages that have major SemVer-compatible updates. * **--minor-only (-m):** Use with --latest or --outdated. Only shows packages that have minor SemVer-compatible updates. -* **--patch-only (-p):** Use with --latest or --outdated. Only shows packages that have patch-level SemVer-compatible updates. +* **--patch-only:** Use with --latest or --outdated. Only shows packages that have patch-level SemVer-compatible updates. * **--direct (-D):** Restricts the list of packages to your direct dependencies. * **--strict:** Return a non-zero exit code when there are outdated packages. * **--format (-f):** Lets you pick between text (default) or json output format. From e43cae6231f2f9dc02f3f23b86c660bc4103c3df Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 22:29:27 +0200 Subject: [PATCH 212/618] Add COMPOSER_PREFER_STABLE and COMPOSER_PREFER_LOWEST env vars, fixes #10919 --- doc/03-cli.md | 24 +++++++++++++++++++----- src/Composer/Command/BaseCommand.php | 13 ++++++++++--- src/Composer/Command/RequireCommand.php | 4 ++-- src/Composer/Command/UpdateCommand.php | 4 ++-- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 1ff39c67f61f..2d53490dd875 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -218,9 +218,11 @@ and this feature is only available for your root package dependencies. a `+` makes it only ignore the upper-bound of the requirements. For example, if a package requires `php: ^7`, then the option `--ignore-platform-req=php+` would allow installing on PHP 8, but installation on PHP 5.6 would still fail. -* **--prefer-stable:** Prefer stable versions of dependencies. +* **--prefer-stable:** Prefer stable versions of dependencies. Can also be set via the + COMPOSER_PREFER_STABLE=1 env var. * **--prefer-lowest:** Prefer lowest versions of dependencies. Useful for testing minimal - versions of requirements, generally used with `--prefer-stable`. + versions of requirements, generally used with `--prefer-stable`. Can also be set via the + COMPOSER_PREFER_LOWEST=1 env var. * **--interactive:** Interactive interface with autocompletion to select the packages to update. * **--root-reqs:** Restricts the update to your first degree dependencies. @@ -275,9 +277,11 @@ If you do not specify a package, Composer will prompt you to search for a packag * **--ignore-platform-req:** ignore a specific platform requirement(`php`, `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine does not fulfill it. Multiple requirements can be ignored via wildcard. -* **--prefer-stable:** Prefer stable versions of dependencies. +* **--prefer-stable:** Prefer stable versions of dependencies. Can also be set via the + COMPOSER_PREFER_STABLE=1 env var. * **--prefer-lowest:** Prefer lowest versions of dependencies. Useful for testing minimal - versions of requirements, generally used with `--prefer-stable`. + versions of requirements, generally used with `--prefer-stable`. Can also be set via the + COMPOSER_PREFER_LOWEST=1 env var. * **--sort-packages:** Keep packages sorted in `composer.json`. * **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but @@ -1233,9 +1237,19 @@ useful for plugin authors to identify what is firing when exactly. ### COMPOSER_NO_DEV -If set to `1`, it is the equivalent of passing the `--no-dev` argument to `install` or +If set to `1`, it is the equivalent of passing the `--no-dev` option to `install` or `update`. You can override this for a single command by setting `COMPOSER_NO_DEV=0`. +### COMPOSER_PREFER_STABLE + +If set to `1`, it is the equivalent of passing the `--prefer-stable` option to +`update` or `require`. + +### COMPOSER_PREFER_LOWEST + +If set to `1`, it is the equivalent of passing the `--prefer-lowest` option to +`update` or `require`. + ### COMPOSER_IGNORE_PLATFORM_REQ or COMPOSER_IGNORE_PLATFORM_REQS If `COMPOSER_IGNORE_PLATFORM_REQS` set to `1`, it is the equivalent of passing the `--ignore-platform-reqs` argument. diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 75048a672ae5..5198f06bf835 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -243,9 +243,16 @@ protected function initialize(InputInterface $input, OutputInterface $output) $input->setOption('no-progress', true); } - if (true === $input->hasOption('no-dev')) { - if (!$input->getOption('no-dev') && (bool) Platform::getEnv('COMPOSER_NO_DEV')) { - $input->setOption('no-dev', true); + $envOptions = [ + 'COMPOSER_NO_DEV' => 'no-dev', + 'COMPOSER_PREFER_STABLE' => 'prefer-stable', + 'COMPOSER_PREFER_LOWEST' => 'prefer-lowest', + ]; + foreach ($envOptions as $envName => $optionName) { + if (true === $input->hasOption($optionName)) { + if (false === $input->getOption($optionName) && (bool) Platform::getEnv($envName)) { + $input->setOption($optionName, true); + } } } diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 08339998f8f2..b648166db475 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -90,8 +90,8 @@ protected function configure() new InputOption('with-all-dependencies', null, InputOption::VALUE_NONE, 'Alias for --update-with-all-dependencies'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), - new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies.'), - new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies.'), + new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies (can also be set via the COMPOSER_PREFER_STABLE=1 env var).'), + new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies (can also be set via the COMPOSER_PREFER_LOWEST=1 env var).'), new InputOption('sort-packages', null, InputOption::VALUE_NONE, 'Sorts packages when adding/updating a new dependency'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 51b32ede8635..243872d6a387 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -75,8 +75,8 @@ protected function configure() new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), - new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies.'), - new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies.'), + new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies (can also be set via the COMPOSER_PREFER_STABLE=1 env var).'), + new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies (can also be set via the COMPOSER_PREFER_LOWEST=1 env var).'), new InputOption('interactive', 'i', InputOption::VALUE_NONE, 'Interactive interface with autocompletion to select the packages to update.'), new InputOption('root-reqs', null, InputOption::VALUE_NONE, 'Restricts the update to your first degree dependencies.'), )) From 26e01abfae38da15959d92d66d9b4a3ae345ee0e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 22:31:59 +0200 Subject: [PATCH 213/618] Fix handling of .mdown files in phar compiler --- src/Composer/Compiler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Compiler.php b/src/Composer/Compiler.php index 528dfa97c5bb..08c805e7275a 100644 --- a/src/Composer/Compiler.php +++ b/src/Composer/Compiler.php @@ -118,7 +118,7 @@ public function compile(string $pharFile = 'composer.phar'): void $finder = new Finder(); $finder->files() ->ignoreVCS(true) - ->notPath('/\/(composer\.(json|lock)|[A-Z]+\.md|\.gitignore|appveyor.yml|phpunit\.xml\.dist|phpstan\.neon\.dist|phpstan-config\.neon|phpstan-baseline\.neon)$/') + ->notPath('/\/(composer\.(json|lock)|[A-Z]+\.md(?:own)?|\.gitignore|appveyor.yml|phpunit\.xml\.dist|phpstan\.neon\.dist|phpstan-config\.neon|phpstan-baseline\.neon)$/') ->notPath('/bin\/(jsonlint|validate-json|simple-phpunit|phpstan|phpstan\.phar)(\.bat)?$/') ->notPath('justinrainbow/json-schema/demo/') ->notPath('justinrainbow/json-schema/dist/') From 1a4f2174e45089f928afa73d91cb4670b06bb58c Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 17:00:20 +0200 Subject: [PATCH 214/618] Add seld/signal-handler dependency --- composer.json | 3 +- composer.lock | 63 ++++++++++++++++++- src/Composer/Command/CreateProjectCommand.php | 37 +++++------ src/Composer/Command/RequireCommand.php | 30 ++++----- src/Composer/Console/Application.php | 7 --- .../Installer/InstallationManager.php | 52 +++------------ .../functional/installed-versions.test | 8 +-- .../functional/installed-versions2.test | 12 ++-- 8 files changed, 109 insertions(+), 103 deletions(-) diff --git a/composer.json b/composer.json index 1377dccb09d2..bc9792e98933 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,8 @@ "react/promise": "^2.8", "composer/pcre": "^2 || ^3", "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24" + "symfony/polyfill-php80": "^1.24", + "seld/signal-handler": "^2.0" }, "require-dev": { "symfony/phpunit-bridge": "^6.0", diff --git a/composer.lock b/composer.lock index cdfb70766eb9..4d0b2df9b759 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0d8cb08c58ec6422f5894ce04cff0d41", + "content-hash": "9ee8eb32dddfba816d9eb589ade6f4e4", "packages": [ { "name": "composer/ca-bundle", @@ -878,6 +878,67 @@ }, "time": "2021-12-10T11:20:11+00:00" }, + { + "name": "seld/signal-handler", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", + "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + }, + "time": "2022-07-20T18:31:45+00:00" + }, { "name": "symfony/console", "version": "v5.4.10", diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 9721656b9511..ec4ad575aee8 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -35,6 +35,7 @@ use Composer\Script\ScriptEvents; use Composer\Util\Silencer; use Composer\Console\Input\InputArgument; +use Seld\Signal\SignalHandler; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -452,28 +453,15 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p throw new \InvalidArgumentException($errorMessage .'.'); } - // handler Ctrl+C for unix-like systems - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - @mkdir($directory, 0777, true); - if ($realDir = realpath($directory)) { - pcntl_async_signals(true); - pcntl_signal(SIGINT, static function () use ($realDir): void { - $fs = new Filesystem(); - $fs->removeDirectory($realDir); - exit(130); - }); - } - } - // handler Ctrl+C for Windows on PHP 7.4+ - if (function_exists('sapi_windows_set_ctrl_handler') && PHP_SAPI === 'cli') { - @mkdir($directory, 0777, true); - if ($realDir = realpath($directory)) { - sapi_windows_set_ctrl_handler(static function () use ($realDir): void { - $fs = new Filesystem(); - $fs->removeDirectory($realDir); - exit(130); - }); - } + // handler Ctrl+C aborts gracefully + @mkdir($directory, 0777, true); + if (false !== ($realDir = realpath($directory))) { + $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) use ($realDir) { + $this->getIO()->writeError('Received '.$signal.', aborting', true, IOInterface::DEBUG); + $fs = new Filesystem(); + $fs->removeDirectory($realDir); + $handler->exitWithLastSignal(); + }); } // avoid displaying 9999999-dev as version if default-branch was selected @@ -512,6 +500,11 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p Platform::putEnv('COMPOSER_ROOT_VERSION', $package->getPrettyVersion()); + // once the root project is fully initialized, we do not need to wipe everything on user abort anymore even if it happens during deps install + if (isset($signalHandler)) { + $signalHandler->unregister(); + } + return $installedFromVcs; } } diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index b648166db475..c980cafe97aa 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -14,6 +14,7 @@ use Composer\DependencyResolver\Request; use Composer\Util\Filesystem; +use Seld\Signal\SignalHandler; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; @@ -148,12 +149,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->composerBackup = file_get_contents($this->json->getPath()); $this->lockBackup = file_exists($this->lock) ? file_get_contents($this->lock) : null; - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - pcntl_async_signals(true); - pcntl_signal(SIGINT, function () { $this->revertComposerFile(); }); - pcntl_signal(SIGTERM, function () { $this->revertComposerFile(); }); - pcntl_signal(SIGHUP, function () { $this->revertComposerFile(); }); - } + $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) { + $this->getIO()->writeError('Received '.$signal.', aborting', true, IOInterface::DEBUG); + $this->revertComposerFile(); + $handler->exitWithLastSignal(); + }); // check for writability by writing to the file as is_writable can not be trusted on network-mounts // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 @@ -210,7 +210,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ); } catch (\Exception $e) { if ($this->newlyCreated) { - $this->revertComposerFile(false); + $this->revertComposerFile(); throw new \RuntimeException('No composer.json present in the current directory ('.$this->file.'), this may be the cause of the following exception.', 0, $e); } @@ -293,9 +293,11 @@ protected function execute(InputInterface $input, OutputInterface $output) return $this->doUpdate($input, $output, $io, $requirements, $requireKey, $removeKey); } catch (\Exception $e) { if (!$this->dependencyResolutionCompleted) { - $this->revertComposerFile(false); + $this->revertComposerFile(); } throw $e; + } finally { + $signalHandler->unregister(); } } @@ -439,7 +441,7 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte } } } - $this->revertComposerFile(false); + $this->revertComposerFile(); } return $status; @@ -479,11 +481,7 @@ protected function interact(InputInterface $input, OutputInterface $output): voi } - /** - * @param bool $hardExit - * @return void - */ - public function revertComposerFile(bool $hardExit = true): void + private function revertComposerFile(): void { $io = $this->getIO(); @@ -504,9 +502,5 @@ public function revertComposerFile(bool $hardExit = true): void file_put_contents($this->lock, $this->lockBackup); } } - - if ($hardExit) { - exit(1); - } } } diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 9964fe72c597..07f9108b335b 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -94,13 +94,6 @@ public function __construct() } if (!$shutdownRegistered) { - if (function_exists('pcntl_async_signals') && function_exists('pcntl_signal')) { - pcntl_async_signals(true); - pcntl_signal(SIGINT, static function ($sig): void { - exit(130); - }); - } - $shutdownRegistered = true; register_shutdown_function(static function (): void { diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index 74a6a229e992..dce5329f47ae 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -28,6 +28,7 @@ use Composer\Util\Loop; use Composer\Util\Platform; use React\Promise\PromiseInterface; +use Seld\Signal\SignalHandler; /** * Package operation manager. @@ -222,36 +223,11 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b } }; - $handleInterruptsUnix = function_exists('pcntl_async_signals') && function_exists('pcntl_signal'); - $handleInterruptsWindows = PHP_VERSION_ID >= 70400 && function_exists('sapi_windows_set_ctrl_handler') && PHP_SAPI === 'cli'; - $prevHandler = null; - $windowsHandler = null; - if ($handleInterruptsUnix) { - pcntl_async_signals(true); - $prevHandler = pcntl_signal_get_handler(SIGINT); - pcntl_signal(SIGINT, static function ($sig) use ($runCleanup, $prevHandler, $io): void { - $io->writeError('Received SIGINT, aborting', true, IOInterface::DEBUG); - $runCleanup(); - - if (!in_array($prevHandler, array(SIG_DFL, SIG_IGN), true)) { - call_user_func($prevHandler, $sig); - } - - exit(130); - }); - } - if ($handleInterruptsWindows) { - $windowsHandler = static function ($event) use ($runCleanup, $io): void { - if ($event !== PHP_WINDOWS_EVENT_CTRL_C) { - return; - } - $io->writeError('Received CTRL+C, aborting', true, IOInterface::DEBUG); - $runCleanup(); - - exit(130); - }; - sapi_windows_set_ctrl_handler($windowsHandler); - } + $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], static function (string $signal, SignalHandler $handler) use ($io, $runCleanup) { + $io->writeError('Received '.$signal.', aborting', true, IOInterface::DEBUG); + $runCleanup(); + $handler->exitWithLastSignal(); + }); try { // execute operations in batches to make sure download-modifying-plugins are installed @@ -284,21 +260,9 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b } catch (\Exception $e) { $runCleanup(); - if ($handleInterruptsUnix) { - pcntl_signal(SIGINT, $prevHandler); - } - if ($handleInterruptsWindows) { - sapi_windows_set_ctrl_handler($windowsHandler, false); - } - throw $e; - } - - if ($handleInterruptsUnix) { - pcntl_signal(SIGINT, $prevHandler); - } - if ($handleInterruptsWindows) { - sapi_windows_set_ctrl_handler($windowsHandler, false); + } finally { + $signalHandler->unregister(); } // do a last write so that we write the repository even if nothing changed diff --git a/tests/Composer/Test/Fixtures/functional/installed-versions.test b/tests/Composer/Test/Fixtures/functional/installed-versions.test index 85dfefe9dc9d..c50686711750 100644 --- a/tests/Composer/Test/Fixtures/functional/installed-versions.test +++ b/tests/Composer/Test/Fixtures/functional/installed-versions.test @@ -8,7 +8,7 @@ Checks that package versions in InstalledVersions are correct on initial install update --EXPECT-- > Hooks::preUpdate -!!PreUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string"] +!!PreUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% Loading composer repositories with package information %((Info|Warning) from .*\n)?%Updating dependencies @@ -26,12 +26,12 @@ Package operations: 6 installs, 0 updates, 0 removals%(\nAs there is no 'unzip' - Downloading symfony/filesystem (%v?[2-8]\.\d+\.\d+%) - Installing symfony/console (99999.1.2): Symlinking from symfony-console - Installing plugin/a (1.1.1): Symlinking from plugin-a -!!PluginAInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","root/pkg"] +!!PluginAInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","root/pkg"] !!PluginA:null !!PluginB:null !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% - Installing plugin/b (2.2.2): Symlinking from plugin-b -!!PluginBInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","root/pkg"] +!!PluginBInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","root/pkg"] !!PluginA:1.1.1.0 !!PluginB:null !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% @@ -42,7 +42,7 @@ Generating autoload files 2 packages you are using are looking for funding. Use the `composer fund` command to find out more! > Hooks::postUpdate -!!PostUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PostUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% --EXPECT-EXIT-CODE-- diff --git a/tests/Composer/Test/Fixtures/functional/installed-versions2.test b/tests/Composer/Test/Fixtures/functional/installed-versions2.test index a9d2c5a9e5bb..a2dc9f9b8a9e 100644 --- a/tests/Composer/Test/Fixtures/functional/installed-versions2.test +++ b/tests/Composer/Test/Fixtures/functional/installed-versions2.test @@ -7,14 +7,14 @@ Checks that package versions in InstalledVersions are correct during an upgrade. --RUN-- update plugin/* symfony/console symfony/filesystem symfony/process --EXPECT-- -!!PluginA:1.1.1.0["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginA:1.1.1.0["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginB:2.2.2.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% -!!PluginB:2.2.2.0["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginB:2.2.2.0["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginA:1.1.1.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% > Hooks::preUpdate -!!PreUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PreUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% Loading composer repositories with package information %((Info|Warning) from .*\n)?%Updating dependencies @@ -30,12 +30,12 @@ Package operations: 0 installs, 5 updates, 0 removals%(\nAs there is no 'unzip' - Downloading symfony/filesystem (%v?[2-8]\.\d+\.\d+%) - Upgrading symfony/console (99999.1.2 => 99999.1.3): Mirroring from symfony-console - Upgrading plugin/a (1.1.1 => 1.1.2): Mirroring from plugin-a -!!PluginAInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginAInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginA:1.1.1.0 !!PluginB:2.2.2.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% - Upgrading plugin/b (2.2.2 => 2.2.3): Mirroring from plugin-b -!!PluginBInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PluginBInit["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!PluginA:1.1.2.0 !!PluginB:2.2.2.0 !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% @@ -45,7 +45,7 @@ Generating autoload files 2 packages you are using are looking for funding. Use the `composer fund` command to find out more! > Hooks::postUpdate -!!PostUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] +!!PostUpdate:["composer/ca-bundle","composer/class-map-generator","composer/composer","composer/metadata-minifier","composer/pcre","composer/semver","composer/spdx-licenses","composer/xdebug-handler","justinrainbow/json-schema","psr/container","psr/log","psr/log-implementation","react/promise","seld/jsonlint","seld/phar-utils","seld/signal-handler","symfony/console","symfony/deprecation-contracts","symfony/filesystem","symfony/finder","symfony/polyfill-ctype","symfony/polyfill-intl-grapheme","symfony/polyfill-intl-normalizer","symfony/polyfill-mbstring","symfony/polyfill-php73","symfony/polyfill-php80","symfony/process","symfony/service-contracts","symfony/string","plugin/a","plugin/b","root/pkg"] !!Versions:console:%[2-8]\.\d+\.\d+.0%;process:%[2-8]\.\d+\.\d+.0%;filesystem:%[2-8]\.\d+\.\d+.0% !!PluginA:1.1.2.0 !!PluginB:2.2.3.0 From 07645b98952c995bf77020cb278d4e83426eccc3 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 22:08:44 +0200 Subject: [PATCH 215/618] Capture signals and wait until child process exits to also exit, fixes #6059 --- src/Composer/Console/Application.php | 11 ++++++-- .../ScriptExecutionException.php | 2 ++ src/Composer/Util/ProcessExecutor.php | 27 +++++++++++++++---- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 07f9108b335b..315379a2c505 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -17,6 +17,7 @@ use Composer\Util\Platform; use Composer\Util\Silencer; use LogicException; +use Seld\Signal\SignalHandler; use Symfony\Component\Console\Application as BaseApplication; use Symfony\Component\Console\Exception\CommandNotFoundException; use Symfony\Component\Console\Helper\HelperSet; @@ -93,7 +94,15 @@ public function __construct() date_default_timezone_set(Silencer::call('date_default_timezone_get')); } + $this->io = new NullIO(); + if (!$shutdownRegistered) { + $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) { + $this->io->writeError('Received '.$signal.', aborting', true, IOInterface::DEBUG); + + $handler->exitWithLastSignal(); + }); + $shutdownRegistered = true; register_shutdown_function(static function (): void { @@ -107,8 +116,6 @@ public function __construct() }); } - $this->io = new NullIO(); - $this->initialWorkingDirectory = getcwd(); parent::__construct('Composer', Composer::getVersion()); diff --git a/src/Composer/EventDispatcher/ScriptExecutionException.php b/src/Composer/EventDispatcher/ScriptExecutionException.php index 3b05a8831f7d..72a4aa273156 100644 --- a/src/Composer/EventDispatcher/ScriptExecutionException.php +++ b/src/Composer/EventDispatcher/ScriptExecutionException.php @@ -13,6 +13,8 @@ namespace Composer\EventDispatcher; /** + * Thrown when a script running an external process exits with a non-0 status code + * * @author Jordi Boggiano */ class ScriptExecutionException extends \RuntimeException diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 768acbc217ff..3f57239bf0a9 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -14,6 +14,8 @@ use Composer\IO\IOInterface; use Composer\Pcre\Preg; +use Seld\Signal\SignalHandler; +use Symfony\Component\Process\Exception\ProcessSignaledException; use Symfony\Component\Process\Process; use Symfony\Component\Process\Exception\RuntimeException; use React\Promise\Promise; @@ -125,13 +127,28 @@ private function doExecute($command, ?string $cwd, bool $tty, &$output = null): $this->outputHandler($type, $buffer); }; - $process->run($callback); + $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal) { + if ($this->io !== null) { + $this->io->writeError('Received '.$signal.', aborting when child process is done', true, IOInterface::DEBUG); + } + }); - if ($this->captureOutput && !is_callable($output)) { - $output = $process->getOutput(); - } + try { + $process->run($callback); - $this->errorOutput = $process->getErrorOutput(); + if ($this->captureOutput && !is_callable($output)) { + $output = $process->getOutput(); + } + + $this->errorOutput = $process->getErrorOutput(); + } catch (ProcessSignaledException $e) { + if ($signalHandler->isTriggered()) { + // exiting as we were signaled and the child process exited too due to the signal + $signalHandler->exitWithLastSignal(); + } + } finally { + $signalHandler->unregister(); + } return $process->getExitCode(); } From 734cbeb6107843ed8199f129fa394dceb1735579 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 22:42:57 +0200 Subject: [PATCH 216/618] Fix type declarations --- src/Composer/IO/ConsoleIO.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 971d52736c9c..aaac64495011 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -42,7 +42,7 @@ class ConsoleIO extends BaseIO /** @var float */ private $startTime; - /** @var array */ + /** @var array */ private $verbosityMap; /** @@ -165,11 +165,7 @@ private function doWrite($messages, bool $newline, bool $stderr, int $verbosity, } if ($raw) { - if ($sfVerbosity === OutputInterface::OUTPUT_NORMAL) { - $sfVerbosity = OutputInterface::OUTPUT_RAW; - } else { - $sfVerbosity |= OutputInterface::OUTPUT_RAW; - } + $sfVerbosity |= OutputInterface::OUTPUT_RAW; } if (null !== $this->startTime) { From 623f903d628be88b6cf0416471066dc5c64c9945 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 22:47:27 +0200 Subject: [PATCH 217/618] Add support for +meta in hg version number, fixes #10955 --- src/Composer/Util/Hg.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Util/Hg.php b/src/Composer/Util/Hg.php index 73e3a8e520cf..00cd886f7312 100644 --- a/src/Composer/Util/Hg.php +++ b/src/Composer/Util/Hg.php @@ -107,7 +107,7 @@ public static function getVersion(ProcessExecutor $process) { if (false === self::$version) { self::$version = null; - if (0 === $process->execute('hg --version', $output) && Preg::isMatch('/^.+? (\d+(?:\.\d+)+)\)?\r?\n/', $output, $matches)) { + if (0 === $process->execute('hg --version', $output) && Preg::isMatch('/^.+? (\d+(?:\.\d+)+)(?:\+.*?)?\)?\r?\n/', $output, $matches)) { self::$version = $matches[1]; } } From 9d90bc649deb62162e3981292755488fad9b559b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 20 Jul 2022 22:53:57 +0200 Subject: [PATCH 218/618] Fix tests --- .../installer/solver-problems-with-disabled-platform.test | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Composer/Test/Fixtures/installer/solver-problems-with-disabled-platform.test b/tests/Composer/Test/Fixtures/installer/solver-problems-with-disabled-platform.test index 9fab8e4cb28b..2c698a2a64f6 100644 --- a/tests/Composer/Test/Fixtures/installer/solver-problems-with-disabled-platform.test +++ b/tests/Composer/Test/Fixtures/installer/solver-problems-with-disabled-platform.test @@ -81,7 +81,6 @@ Your requirements could not be resolved to an installable set of packages. To enable extensions, verify that they are enabled in your .ini files: __inilist__ You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. -Alternatively, you can run Composer with `--ignore-platform-req=ext-foobar --ignore-platform-req=ext-pcre --ignore-platform-req=ext-foobar --ignore-platform-req=ext-pcre` to temporarily ignore these required extensions. +Alternatively, you can run Composer with `--ignore-platform-req=ext-foobar --ignore-platform-req=ext-pcre` to temporarily ignore these required extensions. --EXPECT-- - From 9fbc386a7b88b37c63f93f16d3086cc5baf49683 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 11:05:14 +0200 Subject: [PATCH 219/618] Fix package selector warnings to only show for versions that were actually skipped, #10942 --- src/Composer/Command/RequireCommand.php | 2 +- .../Package/Version/VersionSelector.php | 134 +++++++++--------- .../Package/Version/VersionSelectorTest.php | 107 +++++++------- 3 files changed, 123 insertions(+), 120 deletions(-) diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index b648166db475..76f220d3b6d8 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -240,7 +240,7 @@ protected function execute(InputInterface $input, OutputInterface $output) if (count($inconsistentRequireKeys) > 0) { foreach ($inconsistentRequireKeys as $package) { $io->warning(sprintf( - '%s is currently present in the %s key and you ran the command %s the --dev flag, which would move it to the %s key.', + '%s is currently present in the %s key and you ran the command %s the --dev flag, which will move it to the %s key.', $package, $removeKey, $input->getOption('dev') ? 'with' : 'without', diff --git a/src/Composer/Package/Version/VersionSelector.php b/src/Composer/Package/Version/VersionSelector.php index 241251779203..6832695c78c2 100644 --- a/src/Composer/Package/Version/VersionSelector.php +++ b/src/Composer/Package/Version/VersionSelector.php @@ -86,86 +86,84 @@ public function findBestCandidate(string $packageName, string $targetPackageVers $constraint = $targetPackageVersion ? $this->getParser()->parseConstraints($targetPackageVersion) : null; $candidates = $this->repositorySet->findPackages(strtolower($packageName), $constraint, $repoSetFlags); - $skippedWarnings = []; - if ($this->platformConstraints && !($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter)) { - $platformConstraints = $this->platformConstraints; - $candidates = array_filter($candidates, static function ($pkg) use ($platformConstraints, $platformRequirementFilter, &$skippedWarnings): bool { - $reqs = $pkg->getRequires(); + $minPriority = BasePackage::$stabilities[$preferredStability]; + usort($candidates, function (PackageInterface $a, PackageInterface $b) use ($minPriority) { + $aPriority = $a->getStabilityPriority(); + $bPriority = $b->getStabilityPriority(); + + // A is less stable than our preferred stability, + // and B is more stable than A, select B + if ($minPriority < $aPriority && $bPriority < $aPriority) { + return 1; + } + + // A is less stable than our preferred stability, + // and B is less stable than A, select A + if ($minPriority < $aPriority && $aPriority < $bPriority) { + return -1; + } + + // A is more stable than our preferred stability, + // and B is less stable than preferred stability, select A + if ($minPriority >= $aPriority && $minPriority < $bPriority) { + return -1; + } + + // select highest version of the two + return version_compare($b->getVersion(), $a->getVersion()); + }); + + if (count($this->platformConstraints) > 0 && !($platformRequirementFilter instanceof IgnoreAllPlatformRequirementFilter)) { + /** @var array $alreadyWarnedNames */ + $alreadyWarnedNames = []; + foreach ($candidates as $pkg) { + $reqs = $pkg->getRequires(); foreach ($reqs as $name => $link) { - if (!$platformRequirementFilter->isIgnored($name)) { - if (isset($platformConstraints[$name])) { - foreach ($platformConstraints[$name] as $constraint) { - if ($link->getConstraint()->matches($constraint)) { - continue 2; - } + if (!PlatformRepository::isPlatformPackage($name) || $platformRequirementFilter->isIgnored($name)) { + continue; + } + if (isset($this->platformConstraints[$name])) { + foreach ($this->platformConstraints[$name] as $providedConstraint) { + if ($link->getConstraint()->matches($providedConstraint)) { + // constraint satisfied, go to next require + continue 2; } - - $skippedWarnings[$pkg->getName()][] = ['version' => $pkg->getPrettyVersion(), 'link' => $link, 'reason' => 'is not satisfied by your platform']; - return false; - } elseif (PlatformRepository::isPlatformPackage($name)) { - // Package requires a platform package that is unknown on current platform. - // It means that current platform cannot validate this constraint and so package is not installable. - $skippedWarnings[$pkg->getName()][] = ['version' => $pkg->getPrettyVersion(), 'link' => $link, 'reason' => 'is missing from your platform']; - return false; } - } - } - return true; - }); - } + // constraint not satisfied + $reason = 'is not satisfied by your platform'; + } else { + // Package requires a platform package that is unknown on current platform. + // It means that current platform cannot validate this constraint and so package is not installable. + $reason = 'is missing from your platform'; + } - if (!$candidates) { - return false; - } + if ($io !== null) { + $isFirst = !isset($alreadyWarnedNames[$pkg->getName()]); + $alreadyWarnedNames[$pkg->getName()] = true; + $latest = $isFirst ? "'s latest version" : ''; + $io->writeError( + 'Cannot use '.$pkg->getPrettyName().$latest.' '.$pkg->getPrettyVersion().' as it '.$link->getDescription().' '.$link->getTarget().' '.$link->getPrettyConstraint().' which '.$reason.'.', + true, + $isFirst ? IOInterface::NORMAL : IOInterface::VERBOSE + ); + } - if (count($skippedWarnings) > 0 && $io !== null) { - foreach ($skippedWarnings as $name => $warnings) { - foreach ($warnings as $index => $warning) { - $link = $warning['link']; - $latest = $index === 0 ? "'s latest version" : ''; - $io->writeError( - 'Cannot use '.$name.$latest.' '.$warning['version'].' as it '.$link->getDescription().' '.$link->getTarget().' '.$link->getPrettyConstraint().' which '.$warning['reason'].'.', - true, - $index === 0 ? IOInterface::NORMAL : IOInterface::VERBOSE - ); + // skip candidate + continue 2; } - } - } - - // select highest version if we have many - $package = reset($candidates); - $minPriority = BasePackage::$stabilities[$preferredStability]; - foreach ($candidates as $candidate) { - $candidatePriority = $candidate->getStabilityPriority(); - $currentPriority = $package->getStabilityPriority(); - - // candidate is less stable than our preferred stability, - // and current package is more stable than candidate, skip it - if ($minPriority < $candidatePriority && $currentPriority < $candidatePriority) { - continue; - } - - // candidate is less stable than our preferred stability, - // and current package is less stable than candidate, select candidate - if ($minPriority < $candidatePriority && $candidatePriority < $currentPriority) { - $package = $candidate; - continue; - } - // candidate is more stable than our preferred stability, - // and current package is less stable than preferred stability, select candidate - if ($minPriority >= $candidatePriority && $minPriority < $currentPriority) { - $package = $candidate; - continue; + $package = $pkg; + break; } + } else { + $package = count($candidates) > 0 ? $candidates[0] : null; + } - // select highest version of the two - if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { - $package = $candidate; - } + if (!isset($package)) { + return false; } // if we end up with 9999999-dev as selected package, make sure we use the original version instead of the alias diff --git a/tests/Composer/Test/Package/Version/VersionSelectorTest.php b/tests/Composer/Test/Package/Version/VersionSelectorTest.php index 1cf08155e929..93b9b07d2c76 100644 --- a/tests/Composer/Test/Package/Version/VersionSelectorTest.php +++ b/tests/Composer/Test/Package/Version/VersionSelectorTest.php @@ -13,6 +13,8 @@ namespace Composer\Test\Package\Version; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; +use Composer\IO\BufferIO; +use Composer\IO\IOInterface; use Composer\Package\Version\VersionSelector; use Composer\Package\Package; use Composer\Package\Link; @@ -20,6 +22,7 @@ use Composer\Repository\PlatformRepository; use Composer\Package\Version\VersionParser; use Composer\Test\TestCase; +use Symfony\Component\Console\Output\StreamOutput; class VersionSelectorTest extends TestCase { @@ -29,11 +32,11 @@ class VersionSelectorTest extends TestCase public function testLatestVersionIsReturned(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package1 = $this->createPackage('1.2.1'); - $package2 = $this->createPackage('1.2.2'); - $package3 = $this->createPackage('1.2.0'); + $package1 = $this->getPackage('foo/bar', '1.2.1'); + $package2 = $this->getPackage('foo/bar', '1.2.2'); + $package3 = $this->getPackage('foo/bar', '1.2.0'); $packages = array($package1, $package2, $package3); $repositorySet = $this->createMockRepositorySet(); @@ -51,42 +54,56 @@ public function testLatestVersionIsReturned(): void public function testLatestVersionIsReturnedThatMatchesPhpRequirements(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; $platform = new PlatformRepository(array(), array('php' => '5.5.0')); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; - $package1 = $this->createPackage('1.0.0'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); $package1->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.4'), Link::TYPE_REQUIRE, '>=5.4'))); - $package2 = $this->createPackage('2.0.0'); + $package2 = $this->getPackage('foo/bar', '2.0.0'); $package2->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); - $packages = array($package1, $package2); + $package3 = $this->getPackage('foo/bar', '2.1.0'); + $package3->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); + $packages = array($package1, $package2, $package3); $repositorySet->expects($this->any()) ->method('findPackages') ->with($packageName, null) ->will($this->returnValue($packages)); - $best = $versionSelector->findBestCandidate($packageName); - $this->assertSame($package1, $best, 'Latest version supporting php 5.5 should be returned (1.0.0)'); + $io = new BufferIO(); + $best = $versionSelector->findBestCandidate($packageName, null, 'stable', null, 0, $io); + $this->assertSame((string) $package1, (string) $best, 'Latest version supporting php 5.5 should be returned (1.0.0)'); + self::assertSame("Cannot use foo/bar's latest version 2.1.0 as it requires php >=5.6 which is not satisfied by your platform.".PHP_EOL, $io->getOutput()); + + $io = new BufferIO('', StreamOutput::VERBOSITY_VERBOSE); + $best = $versionSelector->findBestCandidate($packageName, null, 'stable', null, 0, $io); + $this->assertSame((string) $package1, (string) $best, 'Latest version supporting php 5.5 should be returned (1.0.0)'); + self::assertSame( + "Cannot use foo/bar's latest version 2.1.0 as it requires php >=5.6 which is not satisfied by your platform.".PHP_EOL + ."Cannot use foo/bar 2.0.0 as it requires php >=5.6 which is not satisfied by your platform.".PHP_EOL, + $io->getOutput() + ); + $best = $versionSelector->findBestCandidate($packageName, null, 'stable', PlatformRequirementFilterFactory::ignoreAll()); - $this->assertSame($package2, $best, 'Latest version should be returned when ignoring platform reqs (2.0.0)'); + $this->assertSame((string) $package3, (string) $best, 'Latest version should be returned when ignoring platform reqs (2.1.0)'); } public function testLatestVersionIsReturnedThatMatchesExtRequirements(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; $platform = new PlatformRepository(array(), array('ext-zip' => '5.3.0')); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; - $package1 = $this->createPackage('1.0.0'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); $package1->setRequires(array('ext-zip' => new Link($packageName, 'ext-zip', $parser->parseConstraints('^5.2'), Link::TYPE_REQUIRE, '^5.2'))); - $package2 = $this->createPackage('2.0.0'); + $package2 = $this->getPackage('foo/bar', '2.0.0'); $package2->setRequires(array('ext-zip' => new Link($packageName, 'ext-zip', $parser->parseConstraints('^5.4'), Link::TYPE_REQUIRE, '^5.4'))); $packages = array($package1, $package2); @@ -103,15 +120,15 @@ public function testLatestVersionIsReturnedThatMatchesExtRequirements(): void public function testLatestVersionIsReturnedThatMatchesPlatformExt(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; $platform = new PlatformRepository(); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; - $package1 = $this->createPackage('1.0.0'); - $package2 = $this->createPackage('2.0.0'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); + $package2 = $this->getPackage('foo/bar', '2.0.0'); $package2->setRequires(array('ext-barfoo' => new Link($packageName, 'ext-barfoo', $parser->parseConstraints('*'), Link::TYPE_REQUIRE, '*'))); $packages = array($package1, $package2); @@ -128,16 +145,16 @@ public function testLatestVersionIsReturnedThatMatchesPlatformExt(): void public function testLatestVersionIsReturnedThatMatchesComposerRequirements(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; $platform = new PlatformRepository(array(), array('composer-runtime-api' => '1.0.0')); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; - $package1 = $this->createPackage('1.0.0'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); $package1->setRequires(array('composer-runtime-api' => new Link($packageName, 'composer-runtime-api', $parser->parseConstraints('^1.0'), Link::TYPE_REQUIRE, '^1.0'))); - $package2 = $this->createPackage('1.1.0'); + $package2 = $this->getPackage('foo/bar', '1.1.0'); $package2->setRequires(array('composer-runtime-api' => new Link($packageName, 'composer-runtime-api', $parser->parseConstraints('^2.0'), Link::TYPE_REQUIRE, '^2.0'))); $packages = array($package1, $package2); @@ -154,10 +171,10 @@ public function testLatestVersionIsReturnedThatMatchesComposerRequirements(): vo public function testMostStableVersionIsReturned(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package1 = $this->createPackage('1.0.0'); - $package2 = $this->createPackage('1.1.0-beta'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); + $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); $packages = array($package1, $package2); $repositorySet = $this->createMockRepositorySet(); @@ -174,10 +191,10 @@ public function testMostStableVersionIsReturned(): void public function testMostStableVersionIsReturnedRegardlessOfOrder(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package1 = $this->createPackage('2.x-dev'); - $package2 = $this->createPackage('2.0.0-beta3'); + $package1 = $this->getPackage('foo/bar', '2.x-dev'); + $package2 = $this->getPackage('foo/bar', '2.0.0-beta3'); $packages = array($package1, $package2); $repositorySet = $this->createMockRepositorySet(); @@ -199,10 +216,10 @@ public function testMostStableVersionIsReturnedRegardlessOfOrder(): void public function testHighestVersionIsReturned(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package1 = $this->createPackage('1.0.0'); - $package2 = $this->createPackage('1.1.0-beta'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); + $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); $packages = array($package1, $package2); $repositorySet = $this->createMockRepositorySet(); @@ -219,11 +236,11 @@ public function testHighestVersionIsReturned(): void public function testHighestVersionMatchingStabilityIsReturned(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package1 = $this->createPackage('1.0.0'); - $package2 = $this->createPackage('1.1.0-beta'); - $package3 = $this->createPackage('1.2.0-alpha'); + $package1 = $this->getPackage('foo/bar', '1.0.0'); + $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); + $package3 = $this->getPackage('foo/bar', '1.2.0-alpha'); $packages = array($package1, $package2, $package3); $repositorySet = $this->createMockRepositorySet(); @@ -240,10 +257,10 @@ public function testHighestVersionMatchingStabilityIsReturned(): void public function testMostStableUnstableVersionIsReturned(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package2 = $this->createPackage('1.1.0-beta'); - $package3 = $this->createPackage('1.2.0-alpha'); + $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); + $package3 = $this->getPackage('foo/bar', '1.2.0-alpha'); $packages = array($package2, $package3); $repositorySet = $this->createMockRepositorySet(); @@ -260,10 +277,10 @@ public function testMostStableUnstableVersionIsReturned(): void public function testDefaultBranchAliasIsNeverReturned(): void { - $packageName = 'foobar'; + $packageName = 'foo/bar'; - $package = $this->createPackage('1.1.0-beta'); - $package2 = $this->createPackage('dev-main'); + $package = $this->getPackage('foo/bar', '1.1.0-beta'); + $package2 = $this->getPackage('foo/bar', 'dev-main'); $package2Alias = new AliasPackage($package2, VersionParser::DEFAULT_BRANCH_ALIAS, VersionParser::DEFAULT_BRANCH_ALIAS); $packages = array($package, $package2Alias); @@ -357,18 +374,6 @@ public function provideRecommendedRequireVersionPackages(): array ); } - /** - * @param string $version - * - * @return Package - */ - private function createPackage(string $version): Package - { - $parser = new VersionParser(); - - return new Package('foo', $parser->normalize($version), $version); - } - /** * @return \PHPUnit\Framework\MockObject\MockObject&\Composer\Repository\RepositorySet */ From 8352ab8eb76a85af9b4bc8643bd0ef24d291d37d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 11:08:41 +0200 Subject: [PATCH 220/618] Expand test to avoid regressions --- tests/Composer/Test/Package/Version/VersionSelectorTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Composer/Test/Package/Version/VersionSelectorTest.php b/tests/Composer/Test/Package/Version/VersionSelectorTest.php index 93b9b07d2c76..e9204441d4d6 100644 --- a/tests/Composer/Test/Package/Version/VersionSelectorTest.php +++ b/tests/Composer/Test/Package/Version/VersionSelectorTest.php @@ -61,13 +61,15 @@ public function testLatestVersionIsReturnedThatMatchesPhpRequirements(): void $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; + $package0 = $this->getPackage('foo/bar', '0.9.0'); + $package0->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); $package1 = $this->getPackage('foo/bar', '1.0.0'); $package1->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.4'), Link::TYPE_REQUIRE, '>=5.4'))); $package2 = $this->getPackage('foo/bar', '2.0.0'); $package2->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); $package3 = $this->getPackage('foo/bar', '2.1.0'); $package3->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); - $packages = array($package1, $package2, $package3); + $packages = array($package0, $package1, $package2, $package3); $repositorySet->expects($this->any()) ->method('findPackages') From b0674c421a2f8739bfee4bda72d297142683fc48 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 11:14:47 +0200 Subject: [PATCH 221/618] Update ca-bundle --- composer.lock | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index d5437dabf2cb..6fa653271a23 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "composer/ca-bundle", - "version": "1.3.2", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "fd5dd441932a7e10ca6e5b490e272d34c8430640" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/fd5dd441932a7e10ca6e5b490e272d34c8430640", - "reference": "fd5dd441932a7e10ca6e5b490e272d34c8430640", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -64,7 +64,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.2" + "source": "https://github.com/composer/ca-bundle/tree/1.3.3" }, "funding": [ { @@ -80,7 +80,7 @@ "type": "tidelift" } ], - "time": "2022-05-24T11:56:16+00:00" + "time": "2022-07-20T07:14:26+00:00" }, { "name": "composer/metadata-minifier", @@ -851,6 +851,7 @@ "support": { "source": "https://github.com/symfony/debug/tree/v2.8.50" }, + "abandoned": "symfony/error-handler", "time": "2018-11-11T11:18:13+00:00" }, { From e59812c4394169c295209cb0dd3405fb87a2c275 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 14:40:21 +0200 Subject: [PATCH 222/618] Add prompt suggesting using --dev when require command is used with dev packages (#10960) * Add prompt suggesting using --dev when require command is used with packages which appear to be dev, fixes #10939 --- doc/04-schema.md | 4 +++ src/Composer/Command/RequireCommand.php | 33 ++++++++++++++++++++++++- src/Composer/Util/PackageSorter.php | 28 +++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/doc/04-schema.md b/doc/04-schema.md index 20bb61ac8bd0..5e65dee16151 100644 --- a/doc/04-schema.md +++ b/doc/04-schema.md @@ -119,6 +119,10 @@ Examples: - redis - templating +> **Note**: Some special keywords trigger `composer require` without the +> `--dev` option to prompt users if they would like to add these packages to +> `require-dev` instead of `require`. These are: `dev`, `testing`, `static analysis`. + Optional. ### homepage diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 29c85a8f1708..23e36bdfa3dc 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -13,7 +13,10 @@ namespace Composer\Command; use Composer\DependencyResolver\Request; +use Composer\Package\CompletePackageInterface; +use Composer\Package\PackageInterface; use Composer\Util\Filesystem; +use Composer\Util\PackageSorter; use Seld\Signal\SignalHandler; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; @@ -218,9 +221,36 @@ protected function execute(InputInterface $input, OutputInterface $output) throw $e; } + $requirements = $this->formatRequirements($requirements); + + if (!$input->getOption('dev') && $io->isInteractive()) { + $devPackages = []; + $devTags = ['dev', 'testing', 'static analysis']; + $currentRequiresByKey = $this->getPackagesByRequireKey(); + foreach ($requirements as $name => $version) { + // skip packages which are already in the composer.json as those have already been decided + if (isset($currentRequiresByKey[$name])) { + continue; + } + + $pkg = PackageSorter::getMostCurrentVersion($this->getRepos()->findPackages($name)); + if ($pkg instanceof CompletePackageInterface && count(array_intersect($devTags, array_map('strtolower', $pkg->getKeywords()))) > 0) { + $devPackages[] = $name; + } + } + + if (count($devPackages) === count($requirements)) { + $plural = count($requirements) > 1 ? 's' : ''; + $plural2 = count($requirements) > 1 ? 'are' : 'is'; + $io->warning('The package'.$plural.' you required '.$plural2.' recommended to be placed in require-dev but you did not use --dev.'); + if ($io->askConfirmation('Do you want to re-run the command with --dev? [yes]? ')) { + $input->setOption('dev', true); + } + } + } + $requireKey = $input->getOption('dev') ? 'require-dev' : 'require'; $removeKey = $input->getOption('dev') ? 'require' : 'require-dev'; - $requirements = $this->formatRequirements($requirements); // validate requirements format $versionParser = new VersionParser(); @@ -254,6 +284,7 @@ protected function execute(InputInterface $input, OutputInterface $output) return 0; } + $input->setOption('dev', true); list($requireKey, $removeKey) = array($removeKey, $requireKey); } } diff --git a/src/Composer/Util/PackageSorter.php b/src/Composer/Util/PackageSorter.php index 38b606e6af3a..6060c2781925 100644 --- a/src/Composer/Util/PackageSorter.php +++ b/src/Composer/Util/PackageSorter.php @@ -17,6 +17,34 @@ class PackageSorter { + /** + * Returns the most recent version of a set of packages + * + * This is ideally the default branch version, or failing that it will return the package with the highest version + * + * @template T of PackageInterface + * @param array $packages + * @return ($packages is non-empty-array ? T : T|null) + */ + public static function getMostCurrentVersion(array $packages): ?PackageInterface + { + return array_reduce($packages, function ($carry, $pkg) { + if ($carry === null) { + return $pkg; + } + + if ($pkg->isDefaultBranch()) { + return $pkg; + } + + if (!$carry->isDefaultBranch() && version_compare($carry->getVersion(), $pkg->getVersion(), '<')) { + return $pkg; + } + + return $carry; + }); + } + /** * Sorts packages by name * From b7331470a579e70a8ea322f27803e76098a1f845 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 15:38:30 +0200 Subject: [PATCH 223/618] Update changelog --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43419d94a9e3..2022f7f55239 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +### [2.4.0-RC1] 2022-07-21 + + * Added bash completions for Composer commands, package names, etc (see [how to setup](https://getcomposer.org/doc/03-cli.md#bash-completions)) (#10320) + * Added `bump` command to bump requirements to the currently installed version (#10829) + * Added `audit` command to check for known security vulnerabilities in installed packages (#10798, #10898) + * Added automatic auditing of security vulnerabilities after `update` is done, can be overridden with `--no-audit` (#10798, #10898) + * Added `--audit` to `install` command to also do an audit (#10798, #10898) + * Added `r` alias to `require` command (#10953) + * Added `composer/class-map-generator` dependency to replace `Composer\Autoload\ClassMapGenerator` which is now deprecated (#10885) + * Added `--locked` to `depends`/`prohibits` commands (#10834) + * Added `--strict-psr` flag to `dump-autoload` command to fail the process if PSR violations were detected, useful for CI (#10886) + * Added `COMPOSER_PREFER_STABLE` and `COMPOSER_PREFER_LOWEST` env vars to turn on `--prefer-stable`/`--prefer-lowest` on `update` and `require` command, useful for CI (#10919) + * Added support for temporary update constraints on all packages (now also including non-root dependencies) (#10773) + * Added `--major-only` flag to the `outdated` command to show only packages with major version updates (#10827) + * Added sections for direct and transitive deps in `outdated` command output (#10779) + * Added ability for cache GC to clean up `vcs` and `repo` caches (#10826) + * Added `--gc` flag to `clear-cache` to only trigger a garbage collection instead of clearing everything (#10826) + * Added signal (SIGINT, SIGTERM, SIGHUP) handling to ensure we wait for the child process to exit before Composer exits to avoid dropping output (#10958) + * Added prompt suggesting using `--dev` when requiring packages with `dev`/`testing`/`static analysis` keywords present (#10960) + * Added warning in `require`, `init` and `create-project` commands when the latest version of a package cannot be used due to platform requirements (#10896) + ### [2.3.10] 2022-07-13 * Fixed plugins from CWD/vendor being loaded in some cases like create-project or validate even though the target directory is outside of CWD (#10935) @@ -1590,6 +1611,7 @@ * Initial release +[2.4.0-RC1]: https://github.com/composer/composer/compare/2.3.10...2.4.0-RC1 [2.3.10]: https://github.com/composer/composer/compare/2.3.9...2.3.10 [2.3.9]: https://github.com/composer/composer/compare/2.3.8...2.3.9 [2.3.8]: https://github.com/composer/composer/compare/2.3.7...2.3.8 From c08cac5f67ae4cf6f988758c95dd30a6c8107063 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 15:46:32 +0200 Subject: [PATCH 224/618] Release 2.4.0-RC1 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index e07bac101417..666bdf3a8ea1 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.4.999-dev+source'; + public const VERSION = '2.4.0-RC1'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-07-21 15:46:32'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From f8ac872c9f8d9efc55524ba8a2085e0056b56273 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 15:46:32 +0200 Subject: [PATCH 225/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 666bdf3a8ea1..e07bac101417 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.4.0-RC1'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-07-21 15:46:32'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.4.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 6cb5576a32879a7c0488251bb5a4503afc958037 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 Jul 2022 16:30:01 +0200 Subject: [PATCH 226/618] Fix root package being part of package name suggestions where it should not be --- src/Composer/Command/CompletionTrait.php | 10 +++++++--- src/Composer/Command/DependsCommand.php | 2 +- src/Composer/Command/OutdatedCommand.php | 4 ++-- src/Composer/Command/ReinstallCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/ShowCommand.php | 4 ++-- src/Composer/Command/UpdateCommand.php | 2 +- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index fee0fca1a63a..0aad31fe397e 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -60,11 +60,15 @@ private function suggestRootRequirement(): \Closure /** * Suggest package names from installed. */ - private function suggestInstalledPackage(bool $includePlatformPackages = false): \Closure + private function suggestInstalledPackage(bool $includeRootPackage = true, bool $includePlatformPackages = false): \Closure { - return function (CompletionInput $input) use ($includePlatformPackages): array { + return function (CompletionInput $input) use ($includeRootPackage, $includePlatformPackages): array { $composer = $this->requireComposer(); - $installedRepos = [new RootPackageRepository(clone $composer->getPackage())]; + $installedRepos = []; + + if ($includeRootPackage) { + $installedRepos[] = new RootPackageRepository(clone $composer->getPackage()); + } $locker = $composer->getLocker(); if ($locker->isLocked()) { diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index de912add93c4..cb0e624eaf34 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -36,7 +36,7 @@ protected function configure(): void ->setAliases(array('why')) ->setDescription('Shows which packages cause the given package to be installed.') ->setDefinition(array( - new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(true)), + new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(true, true)), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Read dependency information from composer.lock'), diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index 5d3a05b164d5..04289101ddb5 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -34,7 +34,7 @@ protected function configure(): void ->setName('outdated') ->setDescription('Shows a list of installed packages that have updates available, including their latest version.') ->setDefinition(array( - new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage()), + new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage(false)), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated (this is the default, but present here for compat with `show`'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show all installed packages with their latest versions'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Shows updates for packages from the lock file, regardless of what is currently in vendor dir'), @@ -44,7 +44,7 @@ protected function configure(): void new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates.'), new InputOption('patch-only', 'p', InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), - new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), + new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage(false)), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), diff --git a/src/Composer/Command/ReinstallCommand.php b/src/Composer/Command/ReinstallCommand.php index 7a76b3cb2c74..340f18ff07e2 100644 --- a/src/Composer/Command/ReinstallCommand.php +++ b/src/Composer/Command/ReinstallCommand.php @@ -54,7 +54,7 @@ protected function configure(): void new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'List of package names to reinstall, can include a wildcard (*) to match any substring.', null, $this->suggestInstalledPackage()), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'List of package names to reinstall, can include a wildcard (*) to match any substring.', null, $this->suggestInstalledPackage(false)), )) ->setHelp( <<setName('remove') ->setDescription('Removes a package from the require or require-dev.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage(true)), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage(false, true)), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index aa66c3f6afca..b81d8dc1da5a 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -91,7 +91,7 @@ protected function configure() new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'), new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), - new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage()), + new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.', null, $this->suggestInstalledPackage(false)), new InputOption('major-only', 'M', InputOption::VALUE_NONE, 'Show only packages that have major SemVer-compatible updates. Use with the --latest or --outdated option.'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --latest or --outdated option.'), new InputOption('patch-only', null, InputOption::VALUE_NONE, 'Show only packages that have patch SemVer-compatible updates. Use with the --latest or --outdated option.'), @@ -124,7 +124,7 @@ protected function suggestPackageBasedOnMode(): \Closure return $this->suggestPlatformPackage()($input); } - return $this->suggestInstalledPackage()($input); + return $this->suggestInstalledPackage(false)($input); }; } diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 243872d6a387..75a46db061c7 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -51,7 +51,7 @@ protected function configure() ->setAliases(array('u', 'upgrade')) ->setDescription('Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.', null, $this->suggestInstalledPackage()), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.', null, $this->suggestInstalledPackage(false)), new InputOption('with', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), From 4aa3258d191dc5f047abd29eeca07097f2cbeccf Mon Sep 17 00:00:00 2001 From: Michael Telgmann Date: Fri, 22 Jul 2022 10:16:22 +0200 Subject: [PATCH 227/618] Improve documentation about the new bash completion feature (#10962) --- doc/03-cli.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 2d53490dd875..43c026c25407 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -15,9 +15,13 @@ calls `composer dump-autoload`. ## Bash Completions -To install bash completions you can run `composer completion bash > completion.bash` (put the file -in /etc/bash_completion.d/composer to make it load automatically in new terminals) and then -`source completion.bash` to enable it in the current terminal session. +To install bash completions you can run `composer completion bash > completion.bash`. +This will create a `completion.bash` file in the current directory. + +Then execute `source completion.bash` to enable it in the current terminal session. + +Move and rename the `completion.bash` file to `/etc/bash_completion.d/composer` to make +it load automatically in new terminals. ## Global Options From f0ab518c460a9ce4a725006a5559b4a26d742ab7 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 22 Jul 2022 10:36:27 +0200 Subject: [PATCH 228/618] Ensure signalHandler is kept around and unregistered --- src/Composer/Console/Application.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 315379a2c505..fc0144bd4e5d 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -81,6 +81,9 @@ class Application extends BaseApplication */ private $initialWorkingDirectory; + /** @var SignalHandler */ + private $signalHandler; + public function __construct() { static $shutdownRegistered = false; @@ -96,13 +99,13 @@ public function __construct() $this->io = new NullIO(); - if (!$shutdownRegistered) { - $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) { - $this->io->writeError('Received '.$signal.', aborting', true, IOInterface::DEBUG); + $this->signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) { + $this->io->writeError('Received '.$signal.', aborting', true, IOInterface::DEBUG); - $handler->exitWithLastSignal(); - }); + $handler->exitWithLastSignal(); + }); + if (!$shutdownRegistered) { $shutdownRegistered = true; register_shutdown_function(static function (): void { @@ -121,6 +124,11 @@ public function __construct() parent::__construct('Composer', Composer::getVersion()); } + public function __destruct() + { + $this->signalHandler->unregister(); + } + public function run(InputInterface $input = null, OutputInterface $output = null): int { if (null === $output) { From 01a7bb8e5f0de1d30aad14138d176942ad1430b7 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Fri, 22 Jul 2022 12:45:48 +0200 Subject: [PATCH 229/618] Use dev version of symfony/console until 5.4.11 is out --- composer.json | 2 +- composer.lock | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index bc9792e98933..aac933cd7562 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "psr/log": "^1.0 || ^2.0 || ^3.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", - "symfony/console": "^5.4.7 || ^6.0.7", + "symfony/console": "^5.4.7@dev || ^6.0.7@dev", "symfony/filesystem": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0", "symfony/process": "^5.4 || ^6.0", diff --git a/composer.lock b/composer.lock index 3f2c97a79cc0..c4b8c898c2a1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ee8eb32dddfba816d9eb589ade6f4e4", + "content-hash": "0ecdce68f92edae32e2f066b1e6defce", "packages": [ { "name": "composer/ca-bundle", @@ -941,16 +941,16 @@ }, { "name": "symfony/console", - "version": "v5.4.10", + "version": "5.4.x-dev", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", - "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", + "url": "https://api.github.com/repos/symfony/console/zipball/535846c7ee6bc4dd027ca0d93220601456734b10", + "reference": "535846c7ee6bc4dd027ca0d93220601456734b10", "shasum": "" }, "require": { @@ -1020,7 +1020,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.10" + "source": "https://github.com/symfony/console/tree/5.4" }, "funding": [ { @@ -1036,7 +1036,7 @@ "type": "tidelift" } ], - "time": "2022-06-26T13:00:04+00:00" + "time": "2022-07-22T10:42:43+00:00" }, { "name": "symfony/deprecation-contracts", @@ -2323,7 +2323,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "symfony/console": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { From a3f7c31ea76fa8e22811df2e0ac156925f64da58 Mon Sep 17 00:00:00 2001 From: "Barry vd. Heuvel" Date: Mon, 25 Jul 2022 13:13:32 +0200 Subject: [PATCH 230/618] Add json format to Audit command (#10965) --- doc/03-cli.md | 12 ++++++------ src/Composer/Advisory/Auditor.php | 9 +++++++++ src/Composer/Command/AuditCommand.php | 2 +- src/Composer/Command/CreateProjectCommand.php | 2 +- src/Composer/Command/InstallCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/RequireCommand.php | 2 +- src/Composer/Command/UpdateCommand.php | 2 +- 8 files changed, 21 insertions(+), 12 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 43c026c25407..84ce09873820 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -114,7 +114,7 @@ resolution. * **--no-progress:** Removes the progress display that can mess with some terminals or scripts which don't handle backspace characters. * **--audit:** Run an audit after installation is complete. -* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). +* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production, but can take a bit of time to run so it is currently not done by default. @@ -195,7 +195,7 @@ and this feature is only available for your root package dependencies. * **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader generation skips the `autoload-dev` rules. * **--no-install:** Does not run the install step after updating the composer.lock file. * **--no-audit:** Does not run the audit steps after updating the composer.lock file. -* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). +* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--lock:** Only updates the lock file hash to suppress warning about the lock file being out of date. * **--with:** Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 @@ -270,7 +270,7 @@ If you do not specify a package, Composer will prompt you to search for a packag * **--no-update:** Disables the automatic update of the dependencies (implies --no-install). * **--no-install:** Does not run the install step after updating the composer.lock file. * **--no-audit:** Does not run the audit steps after updating the composer.lock file. -* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). +* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--update-no-dev:** Run the dependency update with the `--no-dev` option. * **--update-with-dependencies (-w):** Also update dependencies of the newly required packages, except those that are root requirements. * **--update-with-all-dependencies (-W):** Also update dependencies of the newly required packages, including those that are root requirements. @@ -316,7 +316,7 @@ uninstalled. * **--no-update:** Disables the automatic update of the dependencies (implies --no-install). * **--no-install:** Does not run the install step after updating the composer.lock file. * **--no-audit:** Does not run the audit steps after installation is complete. -* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). +* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--update-no-dev:** Run the dependency update with the --no-dev option. * **--update-with-dependencies (-w):** Also update dependencies of the removed packages. (Deprecated, is now default behavior) @@ -897,7 +897,7 @@ By default the command checks for the packages on packagist.org. * **--remove-vcs:** Force-remove the VCS metadata without prompting. * **--no-install:** Disables installation of the vendors. * **--no-audit:** Does not run the audit steps after installation is complete. -* **--audit-format:** Audit output format. Must be "table", "plain", or "summary" (default). +* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine does not fulfill these. @@ -1023,7 +1023,7 @@ php composer.phar audit ### Options * **--no-dev:** Disables auditing of require-dev packages. -* **--format (-f):** Audit output format. Must be "table" (default), "plain", or "summary". +* **--format (-f):** Audit output format. Must be "table" (default), "plain", "json", or "summary". * **--locked:** Audit packages from the lock file, regardless of what is currently in vendor dir. ## help diff --git a/src/Composer/Advisory/Auditor.php b/src/Composer/Advisory/Auditor.php index 124372751d0a..7ceac1a1dd1c 100644 --- a/src/Composer/Advisory/Auditor.php +++ b/src/Composer/Advisory/Auditor.php @@ -4,6 +4,7 @@ use Composer\IO\ConsoleIO; use Composer\IO\IOInterface; +use Composer\Json\JsonFile; use Composer\Package\PackageInterface; use Composer\Repository\RepositorySet; use InvalidArgumentException; @@ -18,11 +19,14 @@ class Auditor public const FORMAT_PLAIN = 'plain'; + public const FORMAT_JSON = 'json'; + public const FORMAT_SUMMARY = 'summary'; public const FORMATS = [ self::FORMAT_TABLE, self::FORMAT_PLAIN, + self::FORMAT_JSON, self::FORMAT_SUMMARY, ]; @@ -37,6 +41,11 @@ class Auditor public function audit(IOInterface $io, RepositorySet $repoSet, array $packages, string $format, bool $warningOnly = true): int { $advisories = $repoSet->getMatchingSecurityAdvisories($packages, $format === self::FORMAT_SUMMARY); + if (self::FORMAT_JSON === $format) { + $io->write(JsonFile::encode(['advisories' => $advisories])); + return count($advisories); + } + $errorOrWarn = $warningOnly ? 'warning' : 'error'; if (count($advisories) > 0) { [$affectedPackages, $totalAdvisories] = $this->countAdvisories($advisories); diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index 839c050065c7..796d40a77d83 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -21,7 +21,7 @@ protected function configure(): void ->setDescription('Checks for security vulnerability advisories for installed packages.') ->setDefinition(array( new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables auditing of require-dev packages.'), - new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_TABLE, Auditor::FORMATS), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_TABLE, Auditor::FORMATS), new InputOption('locked', null, InputOption::VALUE_NONE, 'Audit based on the lock file instead of the installed packages.'), )) ->setHelp( diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index ec4ad575aee8..cd04c01ba696 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -94,7 +94,7 @@ protected function configure(): void new InputOption('remove-vcs', null, InputOption::VALUE_NONE, 'Whether to force deletion of the vcs folder without prompting.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Whether to skip installation of the package dependencies.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Whether to skip auditing of the installed package dependencies.'), - new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json" or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('ask', null, InputOption::VALUE_NONE, 'Whether to ask for project directory.'), diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 7ad0acf7906c..f9ef8b0a2129 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -53,7 +53,7 @@ protected function configure() new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Do not use, only defined here to catch misuse of the install command.'), new InputOption('audit', null, InputOption::VALUE_NONE, 'Run an audit after installation is complete.'), - new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 458dcdb60a4b..c21ae42b0e2d 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -51,7 +51,7 @@ protected function configure() new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), - new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated with explicit dependencies. (Deprecrated, is now default behavior)'), new InputOption('update-with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements.'), diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 23e36bdfa3dc..4f0e63984e74 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -86,7 +86,7 @@ protected function configure() new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), - new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated, except those that are root requirements.'), new InputOption('update-with-all-dependencies', 'W', InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements.'), diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 75a46db061c7..8602e83f3b74 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -62,7 +62,7 @@ protected function configure() new InputOption('lock', null, InputOption::VALUE_NONE, 'Overwrites the lock file hash to suppress warning about the lock file being out of date without updating package versions. Package metadata like mirrors and URLs are updated if they changed.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), - new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), + new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), From 81ea5409e0b902e3b77500fadf05e652b4d7bd48 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 30 Jul 2022 14:19:06 +0200 Subject: [PATCH 231/618] Set close status to not planned for auto closed support issues --- .github/workflows/close-stale-support.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/close-stale-support.yml b/.github/workflows/close-stale-support.yml index 6d92d8b594ff..5dc878950e9f 100644 --- a/.github/workflows/close-stale-support.yml +++ b/.github/workflows/close-stale-support.yml @@ -20,6 +20,7 @@ jobs: days-before-close: 15 stale-issue-message: 'This issue has been automatically marked Stale and will be closed in 15 days if no further activity happens.' stale-issue-label: 'Stale' + close-issue-reason: 'not_planned' only-labels: 'Support' exempt-all-milestones: true ascending: true From d1f36f43c16750e0644020c9682dc028524cdfe9 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 30 Jul 2022 22:14:03 +0300 Subject: [PATCH 232/618] Update symfony deps --- composer.json | 2 +- composer.lock | 70 +++++++++++++++++++++++++-------------------------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/composer.json b/composer.json index aac933cd7562..85fbff553fd7 100644 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "psr/log": "^1.0 || ^2.0 || ^3.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", - "symfony/console": "^5.4.7@dev || ^6.0.7@dev", + "symfony/console": "^5.4.11 || ^6.0.11", "symfony/filesystem": "^5.4 || ^6.0", "symfony/finder": "^5.4 || ^6.0", "symfony/process": "^5.4 || ^6.0", diff --git a/composer.lock b/composer.lock index c4b8c898c2a1..a6764fb6f55b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0ecdce68f92edae32e2f066b1e6defce", + "content-hash": "d3dba05c3c2010d8328f0795e69c7c8f", "packages": [ { "name": "composer/ca-bundle", @@ -941,7 +941,7 @@ }, { "name": "symfony/console", - "version": "5.4.x-dev", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/console.git", @@ -1020,7 +1020,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/5.4" + "source": "https://github.com/symfony/console/tree/v5.4.11" }, "funding": [ { @@ -1107,16 +1107,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.9", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba" + "reference": "6699fb0228d1bc35b12aed6dd5e7455457609ddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/36a017fa4cce1eff1b8e8129ff53513abcef05ba", - "reference": "36a017fa4cce1eff1b8e8129ff53513abcef05ba", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6699fb0228d1bc35b12aed6dd5e7455457609ddd", + "reference": "6699fb0228d1bc35b12aed6dd5e7455457609ddd", "shasum": "" }, "require": { @@ -1151,7 +1151,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.9" + "source": "https://github.com/symfony/filesystem/tree/v5.4.11" }, "funding": [ { @@ -1167,20 +1167,20 @@ "type": "tidelift" } ], - "time": "2022-05-20T13:55:35+00:00" + "time": "2022-07-20T13:00:38+00:00" }, { "name": "symfony/finder", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", - "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", + "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", + "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", "shasum": "" }, "require": { @@ -1214,7 +1214,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.8" + "source": "https://github.com/symfony/finder/tree/v5.4.11" }, "funding": [ { @@ -1230,7 +1230,7 @@ "type": "tidelift" } ], - "time": "2022-04-15T08:07:45+00:00" + "time": "2022-07-29T07:37:50+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1726,16 +1726,16 @@ }, { "name": "symfony/process", - "version": "v5.4.8", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", - "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", + "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", "shasum": "" }, "require": { @@ -1768,7 +1768,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.8" + "source": "https://github.com/symfony/process/tree/v5.4.11" }, "funding": [ { @@ -1784,7 +1784,7 @@ "type": "tidelift" } ], - "time": "2022-04-08T05:07:18+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/service-contracts", @@ -1871,16 +1871,16 @@ }, { "name": "symfony/string", - "version": "v5.4.10", + "version": "v5.4.11", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" + "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", - "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", + "url": "https://api.github.com/repos/symfony/string/zipball/5eb661e49ad389e4ae2b6e4df8d783a8a6548322", + "reference": "5eb661e49ad389e4ae2b6e4df8d783a8a6548322", "shasum": "" }, "require": { @@ -1937,7 +1937,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.10" + "source": "https://github.com/symfony/string/tree/v5.4.11" }, "funding": [ { @@ -1953,7 +1953,7 @@ "type": "tidelift" } ], - "time": "2022-06-26T15:57:47+00:00" + "time": "2022-07-24T16:15:25+00:00" } ], "packages-dev": [ @@ -2239,16 +2239,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v6.1.2", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "899fdec151add3dc339cf394a15100a1acc177ad" + "reference": "75c2fa71d049c1f48e39d208c0cefba97e66335a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/899fdec151add3dc339cf394a15100a1acc177ad", - "reference": "899fdec151add3dc339cf394a15100a1acc177ad", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/75c2fa71d049c1f48e39d208c0cefba97e66335a", + "reference": "75c2fa71d049c1f48e39d208c0cefba97e66335a", "shasum": "" }, "require": { @@ -2302,7 +2302,7 @@ "description": "Provides utilities for PHPUnit, especially user deprecation notices management", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.1.2" + "source": "https://github.com/symfony/phpunit-bridge/tree/v6.1.3" }, "funding": [ { @@ -2318,14 +2318,12 @@ "type": "tidelift" } ], - "time": "2022-06-20T12:01:07+00:00" + "time": "2022-07-28T13:40:41+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "symfony/console": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From 7377d1f0030e8050654f3fbc57c07b2c22eb630b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 10:28:59 +0200 Subject: [PATCH 233/618] Uniformize command description format, fixes #10971 --- src/Composer/Command/AboutCommand.php | 2 +- src/Composer/Command/ArchiveCommand.php | 2 +- src/Composer/Command/AuditCommand.php | 2 +- src/Composer/Command/BumpCommand.php | 2 +- src/Composer/Command/CheckPlatformReqsCommand.php | 2 +- src/Composer/Command/ClearCacheCommand.php | 2 +- src/Composer/Command/ConfigCommand.php | 2 +- src/Composer/Command/CreateProjectCommand.php | 2 +- src/Composer/Command/DependsCommand.php | 2 +- src/Composer/Command/DiagnoseCommand.php | 2 +- src/Composer/Command/DumpAutoloadCommand.php | 2 +- src/Composer/Command/ExecCommand.php | 2 +- src/Composer/Command/FundCommand.php | 2 +- src/Composer/Command/GlobalCommand.php | 2 +- src/Composer/Command/HomeCommand.php | 2 +- src/Composer/Command/InitCommand.php | 2 +- src/Composer/Command/InstallCommand.php | 2 +- src/Composer/Command/LicensesCommand.php | 2 +- src/Composer/Command/OutdatedCommand.php | 2 +- src/Composer/Command/ProhibitsCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/RequireCommand.php | 2 +- src/Composer/Command/RunScriptCommand.php | 2 +- src/Composer/Command/ScriptAliasCommand.php | 2 +- src/Composer/Command/SearchCommand.php | 2 +- src/Composer/Command/SelfUpdateCommand.php | 2 +- src/Composer/Command/ShowCommand.php | 2 +- src/Composer/Command/StatusCommand.php | 2 +- src/Composer/Command/SuggestsCommand.php | 2 +- src/Composer/Command/UpdateCommand.php | 2 +- src/Composer/Command/ValidateCommand.php | 2 +- tests/Composer/Test/Command/RunScriptCommandTest.php | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/Composer/Command/AboutCommand.php b/src/Composer/Command/AboutCommand.php index 29dc718e7056..8568e3df1507 100644 --- a/src/Composer/Command/AboutCommand.php +++ b/src/Composer/Command/AboutCommand.php @@ -28,7 +28,7 @@ protected function configure(): void { $this ->setName('about') - ->setDescription('Shows a short information about Composer.') + ->setDescription('Shows a short information about Composer') ->setHelp( <<php composer.phar about diff --git a/src/Composer/Command/ArchiveCommand.php b/src/Composer/Command/ArchiveCommand.php index a4843e75d15a..63f684777ab0 100644 --- a/src/Composer/Command/ArchiveCommand.php +++ b/src/Composer/Command/ArchiveCommand.php @@ -50,7 +50,7 @@ protected function configure(): void { $this ->setName('archive') - ->setDescription('Creates an archive of this composer package.') + ->setDescription('Creates an archive of this composer package') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'The package to archive instead of the current project', null, $this->suggestAvailablePackage()), new InputArgument('version', InputArgument::OPTIONAL, 'A version constraint to find the package to archive'), diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index 796d40a77d83..497161ac701d 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -18,7 +18,7 @@ protected function configure(): void { $this ->setName('audit') - ->setDescription('Checks for security vulnerability advisories for installed packages.') + ->setDescription('Checks for security vulnerability advisories for installed packages') ->setDefinition(array( new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables auditing of require-dev packages.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_TABLE, Auditor::FORMATS), diff --git a/src/Composer/Command/BumpCommand.php b/src/Composer/Command/BumpCommand.php index 3135b357f187..ae083ccf7005 100644 --- a/src/Composer/Command/BumpCommand.php +++ b/src/Composer/Command/BumpCommand.php @@ -51,7 +51,7 @@ protected function configure(): void { $this ->setName('bump') - ->setDescription('Increases the lower limit of your composer.json requirements to the currently installed versions.') + ->setDescription('Increases the lower limit of your composer.json requirements to the currently installed versions') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name(s) to restrict which packages are bumped.', null, $this->suggestRootRequirement()), new InputOption('dev-only', 'D', InputOption::VALUE_NONE, 'Only bump requirements in "require-dev".'), diff --git a/src/Composer/Command/CheckPlatformReqsCommand.php b/src/Composer/Command/CheckPlatformReqsCommand.php index 1053fc62c51a..e8f13d5c91db 100644 --- a/src/Composer/Command/CheckPlatformReqsCommand.php +++ b/src/Composer/Command/CheckPlatformReqsCommand.php @@ -29,7 +29,7 @@ class CheckPlatformReqsCommand extends BaseCommand protected function configure(): void { $this->setName('check-platform-reqs') - ->setDescription('Check that platform requirements are satisfied.') + ->setDescription('Check that platform requirements are satisfied') ->setDefinition(array( new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables checking of require-dev packages requirements.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Checks requirements only from the lock file, not from installed packages.'), diff --git a/src/Composer/Command/ClearCacheCommand.php b/src/Composer/Command/ClearCacheCommand.php index 4f3c2f4280dd..98c8fbde1aa7 100644 --- a/src/Composer/Command/ClearCacheCommand.php +++ b/src/Composer/Command/ClearCacheCommand.php @@ -31,7 +31,7 @@ protected function configure(): void $this ->setName('clear-cache') ->setAliases(array('clearcache', 'cc')) - ->setDescription('Clears composer\'s internal package cache.') + ->setDescription('Clears composer\'s internal package cache') ->setDefinition(array( new InputOption('gc', null, InputOption::VALUE_NONE, 'Only run garbage collection, not a full cache clear'), )) diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index e79c1541b481..f1fc6c3a176d 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -66,7 +66,7 @@ protected function configure(): void { $this ->setName('config') - ->setDescription('Sets config options.') + ->setDescription('Sets config options') ->setDefinition(array( new InputOption('global', 'g', InputOption::VALUE_NONE, 'Apply command to the global config file'), new InputOption('editor', 'e', InputOption::VALUE_NONE, 'Open editor'), diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index cd04c01ba696..23382834aee8 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -72,7 +72,7 @@ protected function configure(): void { $this ->setName('create-project') - ->setDescription('Creates new project from a package into given directory.') + ->setDescription('Creates new project from a package into given directory') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed', null, $this->suggestAvailablePackage()), new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'), diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index cb0e624eaf34..17425fb895f4 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -34,7 +34,7 @@ protected function configure(): void $this ->setName('depends') ->setAliases(array('why')) - ->setDescription('Shows which packages cause the given package to be installed.') + ->setDescription('Shows which packages cause the given package to be installed') ->setDefinition(array( new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(true, true)), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), diff --git a/src/Composer/Command/DiagnoseCommand.php b/src/Composer/Command/DiagnoseCommand.php index 4a4e2d46538c..ad968262cb73 100644 --- a/src/Composer/Command/DiagnoseCommand.php +++ b/src/Composer/Command/DiagnoseCommand.php @@ -57,7 +57,7 @@ protected function configure(): void { $this ->setName('diagnose') - ->setDescription('Diagnoses the system to identify common errors.') + ->setDescription('Diagnoses the system to identify common errors') ->setHelp( <<diagnose command checks common errors to help debugging problems. diff --git a/src/Composer/Command/DumpAutoloadCommand.php b/src/Composer/Command/DumpAutoloadCommand.php index 888ef347a4c6..23a7e278289b 100644 --- a/src/Composer/Command/DumpAutoloadCommand.php +++ b/src/Composer/Command/DumpAutoloadCommand.php @@ -31,7 +31,7 @@ protected function configure() $this ->setName('dump-autoload') ->setAliases(array('dumpautoload')) - ->setDescription('Dumps the autoloader.') + ->setDescription('Dumps the autoloader') ->setDefinition(array( new InputOption('optimize', 'o', InputOption::VALUE_NONE, 'Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize`.'), diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index d9a57fc861a3..3d18d3d52e1d 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -29,7 +29,7 @@ protected function configure() { $this ->setName('exec') - ->setDescription('Executes a vendored binary/script.') + ->setDescription('Executes a vendored binary/script') ->setDefinition(array( new InputOption('list', 'l', InputOption::VALUE_NONE), new InputArgument('binary', InputArgument::OPTIONAL, 'The binary to run, e.g. phpunit', null, function () { diff --git a/src/Composer/Command/FundCommand.php b/src/Composer/Command/FundCommand.php index 15960d294523..b2198fc9eec2 100644 --- a/src/Composer/Command/FundCommand.php +++ b/src/Composer/Command/FundCommand.php @@ -36,7 +36,7 @@ class FundCommand extends BaseCommand protected function configure(): void { $this->setName('fund') - ->setDescription('Discover how to help fund the maintenance of your dependencies.') + ->setDescription('Discover how to help fund the maintenance of your dependencies') ->setDefinition(array( new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['text', 'json']), )) diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index ac88914d2422..8fc6ba9bbd2f 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -58,7 +58,7 @@ protected function configure(): void { $this ->setName('global') - ->setDescription('Allows running commands in the global composer dir ($COMPOSER_HOME).') + ->setDescription('Allows running commands in the global composer dir ($COMPOSER_HOME)') ->setDefinition(array( new InputArgument('command-name', InputArgument::REQUIRED, ''), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), diff --git a/src/Composer/Command/HomeCommand.php b/src/Composer/Command/HomeCommand.php index 7b88a0877f6c..8fcd2b78a2b3 100644 --- a/src/Composer/Command/HomeCommand.php +++ b/src/Composer/Command/HomeCommand.php @@ -40,7 +40,7 @@ protected function configure(): void $this ->setName('browse') ->setAliases(array('home')) - ->setDescription('Opens the package\'s repository URL or homepage in your browser.') + ->setDescription('Opens the package\'s repository URL or homepage in your browser') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY, 'Package(s) to browse to.', null, $this->suggestInstalledPackage()), new InputOption('homepage', 'H', InputOption::VALUE_NONE, 'Open the homepage instead of the repository URL.'), diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index 34f9b0491029..c2ca0d24d57d 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -52,7 +52,7 @@ protected function configure() { $this ->setName('init') - ->setDescription('Creates a basic composer.json file in current directory.') + ->setDescription('Creates a basic composer.json file in current directory') ->setDefinition(array( new InputOption('name', null, InputOption::VALUE_REQUIRED, 'Name of the package'), new InputOption('description', null, InputOption::VALUE_REQUIRED, 'Description of package'), diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index f9ef8b0a2129..0e5dbdf9b498 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -40,7 +40,7 @@ protected function configure() $this ->setName('install') ->setAliases(array('i')) - ->setDescription('Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.') + ->setDescription('Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json') ->setDefinition(array( new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), diff --git a/src/Composer/Command/LicensesCommand.php b/src/Composer/Command/LicensesCommand.php index 13f332e8e94d..7b7069f66cf1 100644 --- a/src/Composer/Command/LicensesCommand.php +++ b/src/Composer/Command/LicensesCommand.php @@ -40,7 +40,7 @@ protected function configure(): void { $this ->setName('licenses') - ->setDescription('Shows information about licenses of dependencies.') + ->setDescription('Shows information about licenses of dependencies') ->setDefinition(array( new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text, json or summary', 'text', ['text', 'json', 'summary']), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index 04289101ddb5..b711f8ca0a5a 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -32,7 +32,7 @@ protected function configure(): void { $this ->setName('outdated') - ->setDescription('Shows a list of installed packages that have updates available, including their latest version.') + ->setDescription('Shows a list of installed packages that have updates available, including their latest version') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage(false)), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated (this is the default, but present here for compat with `show`'), diff --git a/src/Composer/Command/ProhibitsCommand.php b/src/Composer/Command/ProhibitsCommand.php index 49d819334084..8300ccf703d5 100644 --- a/src/Composer/Command/ProhibitsCommand.php +++ b/src/Composer/Command/ProhibitsCommand.php @@ -34,7 +34,7 @@ protected function configure(): void $this ->setName('prohibits') ->setAliases(array('why-not')) - ->setDescription('Shows which packages prevent the given package from being installed.') + ->setDescription('Shows which packages prevent the given package from being installed') ->setDefinition(array( new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestAvailablePackage()), new InputArgument(self::ARGUMENT_CONSTRAINT, InputArgument::REQUIRED, 'Version constraint, which version you expected to be installed'), diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index c21ae42b0e2d..1efdad6501fe 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -42,7 +42,7 @@ protected function configure() { $this ->setName('remove') - ->setDescription('Removes a package from the require or require-dev.') + ->setDescription('Removes a package from the require or require-dev') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage(false, true)), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 4f0e63984e74..50cba311d76c 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -72,7 +72,7 @@ protected function configure() $this ->setName('require') ->setAliases(array('r')) - ->setDescription('Adds required packages to your composer.json and installs them.') + ->setDescription('Adds required packages to your composer.json and installs them') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Add requirement to require-dev.'), diff --git a/src/Composer/Command/RunScriptCommand.php b/src/Composer/Command/RunScriptCommand.php index cdc262b1af3b..27aa32f4cf9b 100644 --- a/src/Composer/Command/RunScriptCommand.php +++ b/src/Composer/Command/RunScriptCommand.php @@ -52,7 +52,7 @@ protected function configure(): void $this ->setName('run-script') ->setAliases(array('run')) - ->setDescription('Runs the scripts defined in composer.json.') + ->setDescription('Runs the scripts defined in composer.json') ->setDefinition(array( new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.', null, function () { return array_keys($this->requireComposer()->getPackage()->getScripts()); diff --git a/src/Composer/Command/ScriptAliasCommand.php b/src/Composer/Command/ScriptAliasCommand.php index 603ea1059010..9d3b9bf312dc 100644 --- a/src/Composer/Command/ScriptAliasCommand.php +++ b/src/Composer/Command/ScriptAliasCommand.php @@ -30,7 +30,7 @@ class ScriptAliasCommand extends BaseCommand public function __construct(string $script, ?string $description) { $this->script = $script; - $this->description = $description ?? 'Runs the '.$script.' script as defined in composer.json.'; + $this->description = $description ?? 'Runs the '.$script.' script as defined in composer.json'; parent::__construct(); } diff --git a/src/Composer/Command/SearchCommand.php b/src/Composer/Command/SearchCommand.php index 32ceaa9bc9eb..fd0e75b4334b 100644 --- a/src/Composer/Command/SearchCommand.php +++ b/src/Composer/Command/SearchCommand.php @@ -37,7 +37,7 @@ protected function configure(): void { $this ->setName('search') - ->setDescription('Searches for packages.') + ->setDescription('Searches for packages') ->setDefinition(array( new InputOption('only-name', 'N', InputOption::VALUE_NONE, 'Search only in package names'), new InputOption('only-vendor', 'O', InputOption::VALUE_NONE, 'Search only for vendor / organization names, returns only "vendor" as result'), diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index 2219fa377aeb..abbfb726e1fe 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -47,7 +47,7 @@ protected function configure(): void $this ->setName('self-update') ->setAliases(array('selfupdate')) - ->setDescription('Updates composer.phar to the latest version.') + ->setDescription('Updates composer.phar to the latest version') ->setDefinition(array( new InputOption('rollback', 'r', InputOption::VALUE_NONE, 'Revert to an older installation of composer'), new InputOption('clean-backups', null, InputOption::VALUE_NONE, 'Delete old backups during an update. This makes the current version of composer the only backup available after the update'), diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index b81d8dc1da5a..ef0c34475119 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -76,7 +76,7 @@ protected function configure() $this ->setName('show') ->setAliases(array('info')) - ->setDescription('Shows information about packages.') + ->setDescription('Shows information about packages') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestPackageBasedOnMode()), new InputArgument('version', InputArgument::OPTIONAL, 'Version or version constraint to inspect'), diff --git a/src/Composer/Command/StatusCommand.php b/src/Composer/Command/StatusCommand.php index 3548f5ace6b1..b1e2b843e4b5 100644 --- a/src/Composer/Command/StatusCommand.php +++ b/src/Composer/Command/StatusCommand.php @@ -44,7 +44,7 @@ protected function configure(): void { $this ->setName('status') - ->setDescription('Shows a list of locally modified packages.') + ->setDescription('Shows a list of locally modified packages') ->setDefinition(array( new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Show modified files for each directory that contains changes.'), )) diff --git a/src/Composer/Command/SuggestsCommand.php b/src/Composer/Command/SuggestsCommand.php index 0e28b6089da7..63bc19ef942e 100644 --- a/src/Composer/Command/SuggestsCommand.php +++ b/src/Composer/Command/SuggestsCommand.php @@ -32,7 +32,7 @@ protected function configure(): void { $this ->setName('suggests') - ->setDescription('Shows package suggestions.') + ->setDescription('Shows package suggestions') ->setDefinition(array( new InputOption('by-package', null, InputOption::VALUE_NONE, 'Groups output by suggesting package (default)'), new InputOption('by-suggestion', null, InputOption::VALUE_NONE, 'Groups output by suggested package'), diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index 8602e83f3b74..f3ee86fe50ba 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -49,7 +49,7 @@ protected function configure() $this ->setName('update') ->setAliases(array('u', 'upgrade')) - ->setDescription('Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file.') + ->setDescription('Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.', null, $this->suggestInstalledPackage(false)), new InputOption('with', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0'), diff --git a/src/Composer/Command/ValidateCommand.php b/src/Composer/Command/ValidateCommand.php index 82cf551d9d1f..79b41bd2120b 100644 --- a/src/Composer/Command/ValidateCommand.php +++ b/src/Composer/Command/ValidateCommand.php @@ -42,7 +42,7 @@ protected function configure(): void { $this ->setName('validate') - ->setDescription('Validates a composer.json and composer.lock.') + ->setDescription('Validates a composer.json and composer.lock') ->setDefinition(array( new InputOption('no-check-all', null, InputOption::VALUE_NONE, 'Do not validate requires for overly strict/loose constraints'), new InputOption('check-lock', null, InputOption::VALUE_NONE, 'Check if lock file is up to date (even when config.lock is false)'), diff --git a/tests/Composer/Test/Command/RunScriptCommandTest.php b/tests/Composer/Test/Command/RunScriptCommandTest.php index 2f9fc53c781b..b26bd397d3b2 100644 --- a/tests/Composer/Test/Command/RunScriptCommandTest.php +++ b/tests/Composer/Test/Command/RunScriptCommandTest.php @@ -108,7 +108,7 @@ public function testCanListScripts(): void $output = $appTester->getDisplay(); - $this->assertStringContainsString('Runs the test script as defined in composer.json.', $output, 'The default description for the test script should be printed'); + $this->assertStringContainsString('Runs the test script as defined in composer.json', $output, 'The default description for the test script should be printed'); $this->assertStringContainsString('Run the codestyle fixer', $output, 'The custom description for the fix-cs script should be printed'); } From a6d872191c14a00d907801c284756100d44c3f86 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 10:41:58 +0200 Subject: [PATCH 234/618] Disable packagist.org loading by default in initTempComposer test cases if other repos are provided --- tests/Composer/Test/Command/ConfigCommandTest.php | 6 +++--- tests/Composer/Test/TestCase.php | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/Composer/Test/Command/ConfigCommandTest.php b/tests/Composer/Test/Command/ConfigCommandTest.php index 942d052d49fa..b8ab10e32049 100644 --- a/tests/Composer/Test/Command/ConfigCommandTest.php +++ b/tests/Composer/Test/Command/ConfigCommandTest.php @@ -123,17 +123,17 @@ public function provideConfigReads(): \Generator 'vendor', ]; yield 'read repos by named key' => [ - ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org']]], + ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org'], 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org']]], ['setting-key' => 'repositories.foo'], '{"type":"vcs","url":"https://example.org"}', ]; yield 'read repos by numeric index' => [ - ['repositories' => [['type' => 'vcs', 'url' => 'https://example.org']]], + ['repositories' => [['type' => 'vcs', 'url' => 'https://example.org'], 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org']]], ['setting-key' => 'repos.0'], '{"type":"vcs","url":"https://example.org"}', ]; yield 'read all repos includes the default packagist' => [ - ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org']]], + ['repositories' => ['foo' => ['type' => 'vcs', 'url' => 'https://example.org'], 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org']]], ['setting-key' => 'repos'], '{"foo":{"type":"vcs","url":"https://example.org"},"packagist.org":{"type":"composer","url":"https://repo.packagist.org"}}', ]; diff --git a/tests/Composer/Test/TestCase.php b/tests/Composer/Test/TestCase.php index fe0f9365b826..567a725960f8 100644 --- a/tests/Composer/Test/TestCase.php +++ b/tests/Composer/Test/TestCase.php @@ -137,6 +137,10 @@ public function initTempComposer(array $composerJson = [], array $authJson = []) $authJson = new \stdClass; } + if (is_array($composerJson) && isset($composerJson['repositories']) && !isset($composerJson['repositories']['packagist.org'])) { + $composerJson['repositories']['packagist.org'] = false; + } + chdir($dir); file_put_contents($dir.'/composer.json', JsonFile::encode($composerJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); file_put_contents($dir.'/auth.json', JsonFile::encode($authJson, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); From 135ca98eb025b49ad9e040d9f1c6c63c912d98a8 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 10:46:07 +0200 Subject: [PATCH 235/618] Remove workaround for upstream bug --- tests/Composer/Test/Command/RequireCommandTest.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/Composer/Test/Command/RequireCommandTest.php b/tests/Composer/Test/Command/RequireCommandTest.php index 0579d06e763e..ed7ec98b9e81 100644 --- a/tests/Composer/Test/Command/RequireCommandTest.php +++ b/tests/Composer/Test/Command/RequireCommandTest.php @@ -58,11 +58,6 @@ public function testRequire(array $composerJson, array $command, string $expecte } else { $this->assertSame(trim($expected), trim($appTester->getDisplay(true))); } - - // workaround until https://github.com/symfony/symfony/pull/46747 is merged - putenv('SHELL_VERBOSITY'); - unset($_ENV['SHELL_VERBOSITY']); - unset($_SERVER['SHELL_VERBOSITY']); } public function provideRequire(): \Generator From 74a045783bbec3e63467676ca25e6dcd1f16976d Mon Sep 17 00:00:00 2001 From: Ion Bazan Date: Tue, 16 Aug 2022 16:52:01 +0800 Subject: [PATCH 236/618] Add SearchCommand tests (#10982) Signed-off-by: Ion Bazan --- .../Test/Command/SearchCommandTest.php | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 tests/Composer/Test/Command/SearchCommandTest.php diff --git a/tests/Composer/Test/Command/SearchCommandTest.php b/tests/Composer/Test/Command/SearchCommandTest.php new file mode 100644 index 000000000000..01f7a58be566 --- /dev/null +++ b/tests/Composer/Test/Command/SearchCommandTest.php @@ -0,0 +1,129 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Test\TestCase; +use InvalidArgumentException; + +class SearchCommandTest extends TestCase +{ + /** + * @dataProvider provideSearch + * @param array $command + */ + public function testSearch(array $command, string $expected = ''): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'vendor-1/package-1', 'description' => 'generic description', 'version' => '1.0.0'], + ['name' => 'foo/bar', 'description' => 'generic description', 'version' => '1.0.0'], + ['name' => 'bar/baz', 'description' => 'fancy baz', 'version' => '1.0.0', 'abandoned' => true], + ['name' => 'vendor-2/fancy-package', 'fancy description', 'version' => '1.0.0', 'type' => 'foo'], + ], + ], + ], + ]); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'search'], $command)); + self::assertSame(trim($expected), trim($appTester->getDisplay(true))); + } + + public function testInvalidFormat(): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packagist.org' => false, + ], + ]); + + $appTester = $this->getApplicationTester(); + $result = $appTester->run(['command' => 'search', '--format' => 'test-format', 'tokens' => ['test']]); + self::assertSame(1, $result); + self::assertSame('Unsupported format "test-format". See help for supported formats.', trim($appTester->getDisplay(true))); + } + + public function testInvalidFlags(): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packagist.org' => false, + ], + ]); + + $appTester = $this->getApplicationTester(); + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('--only-name and --only-vendor cannot be used together'); + $appTester->run(['command' => 'search', '--only-vendor' => true, '--only-name' => true, 'tokens' => ['test']]); + } + + public function provideSearch(): \Generator + { + yield 'by name and description' => [ + ['tokens' => ['fancy']], + <<! Abandoned ! fancy baz +vendor-2/fancy-package +OUTPUT + ]; + + yield 'by name and description with multiple tokens' => [ + ['tokens' => ['fancy', 'vendor']], + <<! Abandoned ! fancy baz +vendor-2/fancy-package +OUTPUT + ]; + + yield 'by name only' => [ + ['tokens' => ['fancy'], '--only-name' => true], + << [ + ['tokens' => ['bar'], '--only-vendor' => true], + << [ + ['tokens' => ['vendor'], '--type' => 'foo'], + << [ + ['tokens' => ['vendor-2/fancy'], '--format' => 'json'], + << [ + ['tokens' => ['invalid-package-name']], + ]; + } +} From 1f0bd51f5508c62e60d81d4efd5ee6c95c3aad5f Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 16 Aug 2022 10:08:03 +0100 Subject: [PATCH 237/618] GitHubDriver: stricter URL validation to avoid issues with undefined index owner (#10985) --- src/Composer/Repository/Vcs/GitHubDriver.php | 4 ++-- .../Test/Repository/Vcs/GitHubDriverTest.php | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Composer/Repository/Vcs/GitHubDriver.php b/src/Composer/Repository/Vcs/GitHubDriver.php index 96f7ed99604e..0cde0c871f33 100644 --- a/src/Composer/Repository/Vcs/GitHubDriver.php +++ b/src/Composer/Repository/Vcs/GitHubDriver.php @@ -59,7 +59,7 @@ class GitHubDriver extends VcsDriver */ public function initialize() { - if (!Preg::isMatch('#^(?:(?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/(.+?)(?:\.git|/)?$#', $this->url, $match)) { + if (!Preg::isMatch('#^(?:(?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/([^/]+?)(?:\.git|/)?$#', $this->url, $match)) { throw new \InvalidArgumentException(sprintf('The GitHub repository URL %s is invalid.', $this->url)); } @@ -390,7 +390,7 @@ public function getBranches() */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { - if (!Preg::isMatch('#^((?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/(.+?)(?:\.git|/)?$#', $url, $matches)) { + if (!Preg::isMatch('#^((?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/([^/]+?)(?:\.git|/)?$#', $url, $matches)) { return false; } diff --git a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php index fcffb583bfce..4bd45ab40361 100644 --- a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php @@ -342,14 +342,16 @@ public function testPrivateRepositoryNoInteraction() } /** + * @dataProvider invalidUrlProvider + * @param string $url * @return void */ - public function initializeInvalidReoUrl() + public function testInitializeInvalidReoUrl($url) { $this->setExpectedException('\InvalidArgumentException'); $repoConfig = array( - 'url' => 'https://github.com/acme', + 'url' => $url, ); $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); @@ -361,6 +363,18 @@ public function initializeInvalidReoUrl() $gitHubDriver->initialize(); } + /** + * @return list + */ + public function invalidUrlProvider() + { + return array( + array(false, 'https://github.com/acme'), + array(false, 'https://github.com/acme/repository/releases'), + array(false, 'https://github.com/acme/repository/pulls'), + ); + } + /** * @dataProvider supportsProvider * @param bool $expected @@ -382,6 +396,8 @@ public function supportsProvider() array(false, 'https://github.com/acme'), array(true, 'https://github.com/acme/repository'), array(true, 'git@github.com:acme/repository.git'), + array(false, 'https://github.com/acme/repository/releases'), + array(false, 'https://github.com/acme/repository/pulls'), ); } From 6457a88aa18cbc5972d076c46716c12b9f7fa551 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 11:15:52 +0200 Subject: [PATCH 238/618] Fix COMPOSER_NO_DEV to work with --update-no-dev for require/remove commands as well, refs #10995 --- src/Composer/Command/BaseCommand.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 59cbbe9abfb6..2438614f85cb 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -165,6 +165,11 @@ protected function initialize(InputInterface $input, OutputInterface $output) $input->setOption('no-dev', true); } } + if (true == $input->hasOption('update-no-dev')) { + if (!$input->getOption('update-no-dev') && true == Platform::getEnv('COMPOSER_NO_DEV')) { + $input->setOption('update-no-dev', true); + } + } parent::initialize($input, $output); } From 598c1c75732b59d37e7a9de9bc16036a0f2a0107 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 11:19:20 +0200 Subject: [PATCH 239/618] Fix phpstan error --- src/Composer/Command/BaseCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 2438614f85cb..00714d7a4d89 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -166,7 +166,7 @@ protected function initialize(InputInterface $input, OutputInterface $output) } } if (true == $input->hasOption('update-no-dev')) { - if (!$input->getOption('update-no-dev') && true == Platform::getEnv('COMPOSER_NO_DEV')) { + if (true !== $input->getOption('update-no-dev') && true == Platform::getEnv('COMPOSER_NO_DEV')) { $input->setOption('update-no-dev', true); } } From f2141dd3ea419745319ce3ac4ebdf583fef22e31 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 11:25:15 +0200 Subject: [PATCH 240/618] Fix tests from #10985 --- .../Composer/Test/Repository/Vcs/GitHubDriverTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php index 4bd45ab40361..58b9f7482626 100644 --- a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php @@ -346,7 +346,7 @@ public function testPrivateRepositoryNoInteraction() * @param string $url * @return void */ - public function testInitializeInvalidReoUrl($url) + public function testInitializeInvalidRepoUrl($url) { $this->setExpectedException('\InvalidArgumentException'); @@ -364,14 +364,14 @@ public function testInitializeInvalidReoUrl($url) } /** - * @return list + * @return list */ public function invalidUrlProvider() { return array( - array(false, 'https://github.com/acme'), - array(false, 'https://github.com/acme/repository/releases'), - array(false, 'https://github.com/acme/repository/pulls'), + array('https://github.com/acme'), + array('https://github.com/acme/repository/releases'), + array('https://github.com/acme/repository/pulls'), ); } From 2fd4275e62ef438373ec21cfb805bf1340dda180 Mon Sep 17 00:00:00 2001 From: chx Date: Tue, 16 Aug 2022 02:28:46 -0700 Subject: [PATCH 241/618] Update 03-cli.md (#10995) Crosslink COMPOSER_NO_DEV --- doc/03-cli.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 84ce09873820..eb1ae4c5a67a 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -109,7 +109,7 @@ resolution. installation and show you what would happen. * **--dev:** Install packages listed in `require-dev` (this is the default behavior). * **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader - generation skips the `autoload-dev` rules. + generation skips the `autoload-dev` rules. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--no-autoloader:** Skips autoloader generation. * **--no-progress:** Removes the progress display that can mess with some terminals or scripts which don't handle backspace characters. @@ -192,7 +192,7 @@ and this feature is only available for your root package dependencies. Passing this flag will override the config value. * **--dry-run:** Simulate the command without actually doing anything. * **--dev:** Install packages listed in `require-dev` (this is the default behavior). -* **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader generation skips the `autoload-dev` rules. +* **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader generation skips the `autoload-dev` rules. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--no-install:** Does not run the install step after updating the composer.lock file. * **--no-audit:** Does not run the audit steps after updating the composer.lock file. * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). @@ -271,7 +271,7 @@ If you do not specify a package, Composer will prompt you to search for a packag * **--no-install:** Does not run the install step after updating the composer.lock file. * **--no-audit:** Does not run the audit steps after updating the composer.lock file. * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--update-no-dev:** Run the dependency update with the `--no-dev` option. +* **--update-no-dev:** Run the dependency update with the `--no-dev` option. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--update-with-dependencies (-w):** Also update dependencies of the newly required packages, except those that are root requirements. * **--update-with-all-dependencies (-W):** Also update dependencies of the newly required packages, including those that are root requirements. * **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, @@ -317,7 +317,7 @@ uninstalled. * **--no-install:** Does not run the install step after updating the composer.lock file. * **--no-audit:** Does not run the audit steps after installation is complete. * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--update-no-dev:** Run the dependency update with the --no-dev option. +* **--update-no-dev:** Run the dependency update with the --no-dev option. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--update-with-dependencies (-w):** Also update dependencies of the removed packages. (Deprecated, is now default behavior) * **--update-with-all-dependencies (-W):** Allows all inherited dependencies to be updated, From 07c3a63fa32db09427e6c69328eede9e560a139e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 11:35:17 +0200 Subject: [PATCH 242/618] Fix phpstan error --- src/Composer/Command/BaseCommand.php | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 901c7f35e195..4e920cfc3dbe 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -244,22 +244,19 @@ protected function initialize(InputInterface $input, OutputInterface $output) } $envOptions = [ - 'COMPOSER_NO_DEV' => 'no-dev', - 'COMPOSER_PREFER_STABLE' => 'prefer-stable', - 'COMPOSER_PREFER_LOWEST' => 'prefer-lowest', + 'COMPOSER_NO_DEV' => ['no-dev', 'update-no-dev'], + 'COMPOSER_PREFER_STABLE' => ['prefer-stable'], + 'COMPOSER_PREFER_LOWEST' => ['prefer-lowest'], ]; - foreach ($envOptions as $envName => $optionName) { - if (true === $input->hasOption($optionName)) { - if (false === $input->getOption($optionName) && (bool) Platform::getEnv($envName)) { - $input->setOption($optionName, true); + foreach ($envOptions as $envName => $optionNames) { + foreach ($optionNames as $optionName) { + if (true === $input->hasOption($optionName)) { + if (false === $input->getOption($optionName) && (bool) Platform::getEnv($envName)) { + $input->setOption($optionName, true); + } } } } - if (true == $input->hasOption('update-no-dev')) { - if (true !== $input->getOption('update-no-dev') && true == Platform::getEnv('COMPOSER_NO_DEV')) { - $input->setOption('update-no-dev', true); - } - } if (true === $input->hasOption('ignore-platform-reqs')) { if (!$input->getOption('ignore-platform-reqs') && (bool) Platform::getEnv('COMPOSER_IGNORE_PLATFORM_REQS')) { From 104bf0d75d9b9b6b4d9c462d6f7061f41ec13cc8 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 11:44:21 +0200 Subject: [PATCH 243/618] Handle 404s gracefully when loading providers in ComposerRepo, fixes #10974 --- src/Composer/Repository/ComposerRepository.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 640001ceccf0..45accf11f747 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -607,7 +607,14 @@ public function getProviders($packageName) $result = array(); if ($this->providersApiUrl) { - $apiResult = $this->httpDownloader->get(str_replace('%package%', $packageName, $this->providersApiUrl), $this->options)->decodeJson(); + try { + $apiResult = $this->httpDownloader->get(str_replace('%package%', $packageName, $this->providersApiUrl), $this->options)->decodeJson(); + } catch (TransportException $e) { + if ($e->getStatusCode() === 404) { + return $result; + } + throw $e; + } foreach ($apiResult['providers'] as $provider) { $result[$provider['name']] = $provider; From 2152b20a9483ea72243008ab95ae6e3bd639b759 Mon Sep 17 00:00:00 2001 From: Christopher Charbonneau Wells <10456740+cdubz@users.noreply.github.com> Date: Tue, 16 Aug 2022 02:45:35 -0700 Subject: [PATCH 244/618] Correct prohibits/why-not example command (#10994) Running the example command `composer prohibits php:8` returns an error, "Not enough arguments (missing: "version")." --- doc/03-cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 1d262dfd778e..93451b13469f 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -617,7 +617,7 @@ Note that you can also specify platform requirements, for example to check whether you can upgrade your server to PHP 8.0: ```sh -php composer.phar prohibits php:8 +php composer.phar prohibits php 8 doctrine/cache v1.6.0 requires php (~5.5|~7.0) doctrine/common v2.6.1 requires php (~5.5|~7.0) doctrine/instantiator 1.0.5 requires php (>=5.3,<8.0-DEV) From 41d6467b3bf6e86262f90b6fd70f1d1e4b01fa72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=BCder?= Date: Tue, 16 Aug 2022 13:34:18 +0200 Subject: [PATCH 245/618] Added token refresh for GitLab to support GitLab 15+ (#10988) Co-authored-by: Jordi Boggiano --- phpstan/baseline.neon | 2 +- res/composer-schema.json | 19 +++- src/Composer/IO/BaseIO.php | 1 + src/Composer/Repository/Vcs/GitLabDriver.php | 4 + src/Composer/Util/GitLab.php | 108 ++++++++++++++++++- tests/Composer/Test/Util/GitLabTest.php | 4 +- 6 files changed, 131 insertions(+), 7 deletions(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 1dd2336c15f4..ce404836ca49 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -4585,7 +4585,7 @@ parameters: - message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#" - count: 1 + count: 2 path: ../src/Composer/Util/GitLab.php - diff --git a/res/composer-schema.json b/res/composer-schema.json index 19669a000418..c384e5b1ffba 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -340,9 +340,24 @@ }, "gitlab-oauth": { "type": "object", - "description": "An object of domain name => gitlab API oauth tokens, typically {\"gitlab.com\":\"\"}.", + "description": "An object of domain name => gitlab API oauth tokens, typically {\"gitlab.com\":{\"expires-at\":\"\", \"refresh-token\":\"\", \"token\":\"\"}}.", "additionalProperties": { - "type": "string" + "type": ["string", "object"], + "required": [ "token"], + "properties": { + "expires-at": { + "type": "integer", + "description": "The expiration date for this GitLab token" + }, + "refresh-token": { + "type": "string", + "description": "The refresh token used for GitLab authentication" + }, + "token": { + "type": "string", + "description": "The token used for GitLab authentication" + } + } } }, "gitlab-token": { diff --git a/src/Composer/IO/BaseIO.php b/src/Composer/IO/BaseIO.php index d53d0b0978ab..60eec1882b00 100644 --- a/src/Composer/IO/BaseIO.php +++ b/src/Composer/IO/BaseIO.php @@ -137,6 +137,7 @@ public function loadConfiguration(Config $config) } foreach ($gitlabOauth as $domain => $token) { + $token = is_array($token) ? $token["token"] : $token; $this->checkAndSetAuthentication($domain, $token, 'oauth2'); } diff --git a/src/Composer/Repository/Vcs/GitLabDriver.php b/src/Composer/Repository/Vcs/GitLabDriver.php index 7f2db1f55899..bbcd2a0052fa 100644 --- a/src/Composer/Repository/Vcs/GitLabDriver.php +++ b/src/Composer/Repository/Vcs/GitLabDriver.php @@ -537,6 +537,10 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res return parent::getContents($url); } + if ($gitLabUtil->isOAuthExpired($this->originUrl) && $gitLabUtil->authorizeOAuthRefresh($this->scheme, $this->originUrl)) { + return parent::getContents($url); + } + if (!$this->io->isInteractive()) { $this->attemptCloneFallback(); diff --git a/src/Composer/Util/GitLab.php b/src/Composer/Util/GitLab.php index ed05b46c5b3e..ce32e9535bdd 100644 --- a/src/Composer/Util/GitLab.php +++ b/src/Composer/Util/GitLab.php @@ -126,7 +126,8 @@ public function authorizeOAuthInteractively(string $scheme, string $originUrl, s } $this->io->writeError(sprintf('A token will be created and stored in "%s", your password will never be stored', $this->config->getAuthConfigSource()->getName())); - $this->io->writeError('To revoke access to this token you can visit '.$scheme.'://'.$originUrl.'/-/profile/personal_access_tokens'); + $this->io->writeError('To revoke access to this token you can visit '.$scheme.'://'.$originUrl.'/-/profile/applications'); + $this->io->writeError('Alternatively you can setup an personal access token on '.$scheme.'://'.$originUrl.'/-/profile/personal_access_token and store it under "gitlab-token" see https://getcomposer.org/doc/articles/authentication-for-private-packages.md#gitlab-token for more details.'); $attemptCounter = 0; @@ -160,7 +161,18 @@ public function authorizeOAuthInteractively(string $scheme, string $originUrl, s $this->io->setAuthentication($originUrl, $response['access_token'], 'oauth2'); // store value in user config in auth file - $this->config->getAuthConfigSource()->addConfigSetting('gitlab-oauth.'.$originUrl, $response['access_token']); + if (isset($response['expires_in'])) { + $this->config->getAuthConfigSource()->addConfigSetting( + 'gitlab-oauth.'.$originUrl, + [ + 'expires-at' => intval($response['created_at']) + intval($response['expires_in']), + 'refresh-token' => $response['refresh_token'], + 'token' => $response['access_token'], + ] + ); + } else { + $this->config->getAuthConfigSource()->addConfigSetting('gitlab-oauth.'.$originUrl, $response['access_token']); + } return true; } @@ -168,11 +180,46 @@ public function authorizeOAuthInteractively(string $scheme, string $originUrl, s throw new \RuntimeException('Invalid GitLab credentials 5 times in a row, aborting.'); } + /** + * Authorizes a GitLab domain interactively via OAuth. + * + * @param string $scheme Scheme used in the origin URL + * @param string $originUrl The host this GitLab instance is located at + * + * @throws \RuntimeException + * @throws TransportException|\Exception + * + * @return bool true on success + */ + public function authorizeOAuthRefresh(string $scheme, string $originUrl): bool + { + try { + $response = $this->refreshToken($scheme, $originUrl); + } catch (TransportException $e) { + $this->io->writeError("Couldn't refresh access token: ".$e->getMessage()); + return false; + } + + $this->io->setAuthentication($originUrl, $response['access_token'], 'oauth2'); + + // store value in user config in auth file + $this->config->getAuthConfigSource()->addConfigSetting( + 'gitlab-oauth.'.$originUrl, + [ + 'expires-at' => intval($response['created_at']) + intval($response['expires_in']), + 'refresh-token' => $response['refresh_token'], + 'token' => $response['access_token'], + ] + ); + + return true; + } + /** * @param string $scheme * @param string $originUrl * - * @return array{access_token: non-empty-string, token_type: non-empty-string, expires_in: positive-int} + * @return array{access_token: non-empty-string, refresh_token: non-empty-string, token_type: non-empty-string, expires_in?: positive-int, created_at: positive-int} * * @see https://docs.gitlab.com/ee/api/oauth2.html#resource-owner-password-credentials-flow */ @@ -204,4 +251,59 @@ private function createToken(string $scheme, string $originUrl): array return $token; } + + /** + * Is the OAuth access token expired? + * + * @return bool true on expired token, false if token is fresh or expiration date is not set + */ + public function isOAuthExpired(string $originUrl): bool + { + $authTokens = $this->config->get('gitlab-oauth'); + if (isset($authTokens[$originUrl]['expires-at'])) { + if ($authTokens[$originUrl]['expires-at'] < time()) { + return true; + } + } + + return false; + } + + /** + * @param string $scheme + * @param string $originUrl + * + * @return array{access_token: non-empty-string, refresh_token: non-empty-string, token_type: non-empty-string, expires_in: positive-int, created_at: positive-int} + * + * @see https://docs.gitlab.com/ee/api/oauth2.html#resource-owner-password-credentials-flow + */ + private function refreshToken(string $scheme, string $originUrl): array + { + $authTokens = $this->config->get('gitlab-oauth'); + if (!isset($authTokens[$originUrl]['refresh-token'])) { + throw new \RuntimeException('No GitLab refresh token present for '.$originUrl.'.'); + } + + $refreshToken = $authTokens[$originUrl]['refresh-token']; + $headers = array('Content-Type: application/x-www-form-urlencoded'); + + $data = http_build_query(array( + 'refresh_token' => $refreshToken, + 'grant_type' => 'refresh_token', + ), '', '&'); + $options = array( + 'retry-auth-failure' => false, + 'http' => array( + 'method' => 'POST', + 'header' => $headers, + 'content' => $data, + ), + ); + + $token = $this->httpDownloader->get($scheme.'://'.$originUrl.'/oauth/token', $options)->decodeJson(); + $this->io->writeError('GitLab token successfully refreshed', true, IOInterface::VERY_VERBOSE); + $this->io->writeError('To revoke access to this token you can visit '.$scheme.'://'.$originUrl.'/-/profile/applications', true, IOInterface::VERY_VERBOSE); + + return $token; + } } diff --git a/tests/Composer/Test/Util/GitLabTest.php b/tests/Composer/Test/Util/GitLabTest.php index d1f44d946469..1ce746176361 100644 --- a/tests/Composer/Test/Util/GitLabTest.php +++ b/tests/Composer/Test/Util/GitLabTest.php @@ -30,6 +30,8 @@ class GitLabTest extends TestCase private $origin = 'gitlab.com'; /** @var string */ private $token = 'gitlabtoken'; + /** @var string */ + private $refreshtoken = 'gitlabrefreshtoken'; public function testUsernamePasswordAuthenticationFlow(): void { @@ -54,7 +56,7 @@ public function testUsernamePasswordAuthenticationFlow(): void $httpDownloader = $this->getHttpDownloaderMock(); $httpDownloader->expects( - [['url' => sprintf('http://%s/oauth/token', $this->origin), 'body' => sprintf('{"access_token": "%s", "token_type": "bearer", "expires_in": 7200}', $this->token)]], + [['url' => sprintf('http://%s/oauth/token', $this->origin), 'body' => sprintf('{"access_token": "%s", "refresh_token": "%s", "token_type": "bearer", "expires_in": 7200, "created_at": 0}', $this->token, $this->refreshtoken)]], true ); From e82050b05d87a2c3e7cf503f00cc293f9e231cda Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 13:40:50 +0200 Subject: [PATCH 246/618] Fix remove command suggestions to only suggest required packages, fixes #10964 --- src/Composer/Command/RemoveCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 1efdad6501fe..cf04baaca315 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -44,7 +44,7 @@ protected function configure() ->setName('remove') ->setDescription('Removes a package from the require or require-dev') ->setDefinition(array( - new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestInstalledPackage(false, true)), + new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestRootRequirement()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), From 058beef20a0131546eb448ba097eea9244a2bd29 Mon Sep 17 00:00:00 2001 From: Jellyfrog Date: Tue, 16 Aug 2022 14:19:53 +0200 Subject: [PATCH 247/618] CheckPlatformReqs: Add json format output (#10979) Co-authored-by: Jordi Boggiano --- doc/03-cli.md | 6 +++ .../Command/CheckPlatformReqsCommand.php | 52 ++++++++++++++----- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index 04a3db408e63..fb6d03bf2018 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -413,6 +413,12 @@ Unlike update/install, this command will ignore config.platform settings and check the real platform packages so you can be certain you have the required platform dependencies. +### Options + +* **--lock:** Checks requirements only from the lock file, not from installed packages. +* **--no-dev:** Disables checking of require-dev packages requirements. +* **--format (-f):** Format of the output: text (default) or json + ## global The global command allows you to run other commands like `install`, `remove`, `require` diff --git a/src/Composer/Command/CheckPlatformReqsCommand.php b/src/Composer/Command/CheckPlatformReqsCommand.php index e8f13d5c91db..d7108e91ddd8 100644 --- a/src/Composer/Command/CheckPlatformReqsCommand.php +++ b/src/Composer/Command/CheckPlatformReqsCommand.php @@ -15,11 +15,12 @@ use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; +use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\PlatformRepository; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; +use Composer\Json\JsonFile; class CheckPlatformReqsCommand extends BaseCommand { @@ -33,6 +34,7 @@ protected function configure(): void ->setDefinition(array( new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables checking of require-dev packages requirements.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Checks requirements only from the lock file, not from installed packages.'), + new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), )) ->setHelp( <<getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), $link, - 'failed'.($candidate->getName() === $require ? '' : ' provided by '.$candidate->getPrettyName().''), + 'failed', + $candidate->getName() === $require ? '' : 'provided by '.$candidate->getPrettyName().'', ); // skip to next candidate @@ -139,7 +142,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $candidate->getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), null, - 'success'.($candidate->getName() === $require ? '' : ' provided by '.$candidate->getPrettyName().''), + 'success', + $candidate->getName() === $require ? '' : 'provided by '.$candidate->getPrettyName().'', ); // candidate matched, skip to next requirement @@ -158,13 +162,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int 'n/a', $links[0], 'missing', + '', ); $exitCode = max($exitCode, 2); } } - $this->printTable($output, $results); + $this->printTable($output, $results, $input->getOption('format')); return $exitCode; } @@ -174,22 +179,43 @@ protected function execute(InputInterface $input, OutputInterface $output): int * * @return void */ - protected function printTable(OutputInterface $output, array $results): void + protected function printTable(OutputInterface $output, array $results, string $format): void { $rows = array(); foreach ($results as $result) { /** * @var Link|null $link */ - list($platformPackage, $version, $link, $status) = $result; - $rows[] = array( - $platformPackage, - $version, - $link ? sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', - $status, - ); + list($platformPackage, $version, $link, $status, $provider) = $result; + + if ('json' === $format) { + $rows[] = array( + "name" => $platformPackage, + "version" => $version, + "status" => strip_tags($status), + "failed_requirement" => $link instanceof Link ? [ + 'source' => $link->getSource(), + 'type' => $link->getDescription(), + 'target' => $link->getTarget(), + 'constraint' => $link->getPrettyConstraint(), + ] : null, + "provider" => $provider === '' ? null : strip_tags($provider), + ); + } else { + $rows[] = array( + $platformPackage, + $version, + $link, + $link ? sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', + rtrim($status.' '.$provider), + ); + } } - $this->renderTable($rows, $output); + if ('json' === $format) { + $this->getIO()->write(JsonFile::encode($rows)); + } else { + $this->renderTable($rows, $output); + } } } From 82e3059c6ee347c7486522cc70ba23cc92072ec9 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 15:16:56 +0200 Subject: [PATCH 248/618] Fix plugin output to indicate when plugins are globally installed even while running global commands, fixes #10978 --- src/Composer/Factory.php | 4 ++++ src/Composer/Plugin/PluginManager.php | 26 +++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 0184961dab15..1a1f5e75a284 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -435,6 +435,10 @@ public function createComposer(IOInterface $io, $localConfig = null, $disablePlu $pm = $this->createPluginManager($io, $composer, $globalComposer, $disablePlugins); $composer->setPluginManager($pm); + if (realpath($config->get('home')) === $cwd) { + $pm->setRunningInGlobalDir(true); + } + $pm->loadInstalledPlugins(); } diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index 3f91832e59ee..2fc3566649f3 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -66,6 +66,9 @@ class PluginManager */ private $allowGlobalPluginRules; + /** @var bool */ + private $runningInGlobalDir = false; + /** @var int */ private static $classCounter = 0; @@ -83,6 +86,11 @@ public function __construct(IOInterface $io, Composer $composer, PartialComposer $this->allowGlobalPluginRules = $this->parseAllowedPlugins($globalComposer !== null ? $globalComposer->getConfig()->get('allow-plugins') : false); } + public function setRunningInGlobalDir(bool $runningInGlobalDir): void + { + $this->runningInGlobalDir = $runningInGlobalDir; + } + /** * Loads all plugins from currently installed plugin packages * @@ -174,20 +182,20 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl if ($requiresComposer->getPrettyString() === $this->getPluginApiVersion()) { $this->io->writeError('The "' . $package->getName() . '" plugin requires composer-plugin-api '.$this->getPluginApiVersion().', this *WILL* break in the future and it should be fixed ASAP (require ^'.$this->getPluginApiVersion().' instead for example).'); } elseif (!$requiresComposer->matches($currentPluginApiConstraint)) { - $this->io->writeError('The "' . $package->getName() . '" plugin '.($isGlobalPlugin ? '(installed globally) ' : '').'was skipped because it requires a Plugin API version ("' . $requiresComposer->getPrettyString() . '") that does not match your Composer installation ("' . $currentPluginApiVersion . '"). You may need to run composer update with the "--no-plugins" option.'); + $this->io->writeError('The "' . $package->getName() . '" plugin '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').'was skipped because it requires a Plugin API version ("' . $requiresComposer->getPrettyString() . '") that does not match your Composer installation ("' . $currentPluginApiVersion . '"). You may need to run composer update with the "--no-plugins" option.'); return; } if ($package->getName() === 'symfony/flex' && Preg::isMatch('{^[0-9.]+$}', $package->getVersion()) && version_compare($package->getVersion(), '1.9.8', '<')) { - $this->io->writeError('The "' . $package->getName() . '" plugin '.($isGlobalPlugin ? '(installed globally) ' : '').'was skipped because it is not compatible with Composer 2+. Make sure to update it to version 1.9.8 or greater.'); + $this->io->writeError('The "' . $package->getName() . '" plugin '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').'was skipped because it is not compatible with Composer 2+. Make sure to update it to version 1.9.8 or greater.'); return; } } if (!$this->isPluginAllowed($package->getName(), $isGlobalPlugin)) { - $this->io->writeError('Skipped loading "'.$package->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').'as it is not in config.allow-plugins', true, IOInterface::DEBUG); + $this->io->writeError('Skipped loading "'.$package->getName() . '" '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').'as it is not in config.allow-plugins', true, IOInterface::DEBUG); return; } @@ -279,7 +287,7 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl if (!is_a($class, 'Composer\Installer\InstallerInterface', true)) { throw new \RuntimeException('Could not activate plugin "'.$package->getName().'" as "'.$class.'" does not implement Composer\Installer\InstallerInterface'); } - $this->io->writeError('Loading "'.$package->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').'which is a legacy composer-installer built for Composer 1.x, it is likely to cause issues as you are running Composer 2.x.'); + $this->io->writeError('Loading "'.$package->getName() . '" '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').'which is a legacy composer-installer built for Composer 1.x, it is likely to cause issues as you are running Composer 2.x.'); $installer = new $class($this->io, $this->composer); $this->composer->getInstallationManager()->addInstaller($installer); $this->registeredPlugins[$package->getName()] = $installer; @@ -383,7 +391,7 @@ public function addPlugin(PluginInterface $plugin, bool $isGlobalPlugin = false, if ($sourcePackage === null) { trigger_error('Calling PluginManager::addPlugin without $sourcePackage is deprecated, if you are using this please get in touch with us to explain the use case', E_USER_DEPRECATED); } elseif (!$this->isPluginAllowed($sourcePackage->getName(), $isGlobalPlugin)) { - $this->io->writeError('Skipped loading "'.get_class($plugin).' from '.$sourcePackage->getName() . '" '.($isGlobalPlugin ? '(installed globally) ' : '').' as it is not in config.allow-plugins', true, IOInterface::DEBUG); + $this->io->writeError('Skipped loading "'.get_class($plugin).' from '.$sourcePackage->getName() . '" '.($isGlobalPlugin || $this->runningInGlobalDir ? '(installed globally) ' : '').' as it is not in config.allow-plugins', true, IOInterface::DEBUG); return; } @@ -392,7 +400,7 @@ public function addPlugin(PluginInterface $plugin, bool $isGlobalPlugin = false, if ($sourcePackage) { $details[] = 'from '.$sourcePackage->getName(); } - if ($isGlobalPlugin) { + if ($isGlobalPlugin || $this->runningInGlobalDir) { $details[] = 'installed globally'; } $this->io->writeError('Loading plugin '.get_class($plugin).($details ? ' ('.implode(', ', $details).')' : ''), true, IOInterface::DEBUG); @@ -725,7 +733,7 @@ public function isPluginAllowed(string $package, bool $isGlobalPlugin): bool if ($this->io->isInteractive()) { $composer = $isGlobalPlugin && $this->globalComposer !== null ? $this->globalComposer : $this->composer; - $this->io->writeError(''.$package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins'); + $this->io->writeError(''.$package.($isGlobalPlugin || $this->runningInGlobalDir ? ' (installed globally)' : '').' contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins'); $attempts = 0; while (true) { // do not allow more than 5 prints of the help message, at some point assume the @@ -767,8 +775,8 @@ public function isPluginAllowed(string $package, bool $isGlobalPlugin): bool } throw new PluginBlockedException( - $package.($isGlobalPlugin ? ' (installed globally)' : '').' contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe.'.PHP_EOL. - 'You can run "composer '.($isGlobalPlugin ? 'global ' : '').'config --no-plugins allow-plugins.'.$package.' [true|false]" to enable it (true) or disable it explicitly and suppress this exception (false)'.PHP_EOL. + $package.($isGlobalPlugin || $this->runningInGlobalDir ? ' (installed globally)' : '').' contains a Composer plugin which is blocked by your allow-plugins config. You may add it to the list if you consider it safe.'.PHP_EOL. + 'You can run "composer '.($isGlobalPlugin || $this->runningInGlobalDir ? 'global ' : '').'config --no-plugins allow-plugins.'.$package.' [true|false]" to enable it (true) or disable it explicitly and suppress this exception (false)'.PHP_EOL. 'See https://getcomposer.org/allow-plugins' ); } From cc33db92577f365c86b0c088b93323805f2ad964 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 16:53:57 +0300 Subject: [PATCH 249/618] Only fetch remote default branch for mirrored git repos, not local ones, refs #10949 (#10996) --- src/Composer/Repository/Vcs/GitDriver.php | 10 ++++++---- tests/Composer/Test/Repository/Vcs/GitDriverTest.php | 5 +---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php index 66650ce7b5dd..731c5bde0a23 100644 --- a/src/Composer/Repository/Vcs/GitDriver.php +++ b/src/Composer/Repository/Vcs/GitDriver.php @@ -95,12 +95,14 @@ public function getRootIdentifier(): string $this->rootIdentifier = 'master'; $gitUtil = new GitUtil($this->io, $this->config, $this->process, new Filesystem()); - $defaultBranch = $gitUtil->getMirrorDefaultBranch($this->url, $this->repoDir, Filesystem::isLocalPath($this->url)); - if ($defaultBranch !== null) { - return $this->rootIdentifier = $defaultBranch; + if (!Filesystem::isLocalPath($this->url)) { + $defaultBranch = $gitUtil->getMirrorDefaultBranch($this->url, $this->repoDir, false); + if ($defaultBranch !== null) { + return $this->rootIdentifier = $defaultBranch; + } } - // select currently checked out branch if master is not available + // select currently checked out branch as default branch $this->process->execute('git branch --no-color', $output, $this->repoDir); $branches = $this->process->splitLines($output); if (!in_array('* master', $branches)) { diff --git a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php index d40366158843..229ef130d76d 100644 --- a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php @@ -63,12 +63,9 @@ public function testGetRootIdentifierFromRemoteLocalRepository(): void $process ->expects([[ - 'cmd' => 'git remote show origin', - 'stdout' => $stdoutFailure, - ], [ 'cmd' => 'git branch --no-color', 'stdout' => $stdout, - ]]); + ]], true); $this->assertSame('main', $driver->getRootIdentifier()); } From ff65ee2662d22928cbe4e92dc0de098c630b3ef2 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 16:01:14 +0200 Subject: [PATCH 250/618] Update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2022f7f55239..d65c6f130a0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +### [2.4.0] 2022-08-16 + + * Added `json` format output to the new `audit` command (#10965) + * Added `json` format output to the `check-platform-reqs` command (#10979) + * Added GitLab 15+ token refresh support (#10988) + * Fixed `COMPOSER_NO_DEV` so it also works with `require` and `remove`'s `--update-no-dev` (#10995) + * Fixed various bash completion issues + ### [2.4.0-RC1] 2022-07-21 * Added bash completions for Composer commands, package names, etc (see [how to setup](https://getcomposer.org/doc/03-cli.md#bash-completions)) (#10320) @@ -1611,6 +1619,7 @@ * Initial release +[2.4.0]: https://github.com/composer/composer/compare/2.4.0-RC1...2.4.0 [2.4.0-RC1]: https://github.com/composer/composer/compare/2.3.10...2.4.0-RC1 [2.3.10]: https://github.com/composer/composer/compare/2.3.9...2.3.10 [2.3.9]: https://github.com/composer/composer/compare/2.3.8...2.3.9 From 037b11e35f2560d126989830bf60b02734b3043e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 16:06:56 +0200 Subject: [PATCH 251/618] Update baseline (1894, 99) --- phpstan/baseline-8.1.neon | 15 ----------- phpstan/baseline.neon | 54 ++------------------------------------- 2 files changed, 2 insertions(+), 67 deletions(-) diff --git a/phpstan/baseline-8.1.neon b/phpstan/baseline-8.1.neon index 12bfc559b027..b22aed2f6e5b 100644 --- a/phpstan/baseline-8.1.neon +++ b/phpstan/baseline-8.1.neon @@ -120,16 +120,6 @@ parameters: count: 1 path: ../src/Composer/Installer/BinaryInstaller.php - - - message: "#^Parameter \\#1 \\$callback of function call_user_func expects callable\\(\\)\\: mixed, int\\\\|int\\<2, max\\>\\|string given\\.$#" - count: 1 - path: ../src/Composer/Installer/InstallationManager.php - - - - message: "#^Parameter \\#2 \\$handler of function pcntl_signal expects \\(callable\\(\\)\\: mixed\\)\\|int, int\\|string given\\.$#" - count: 2 - path: ../src/Composer/Installer/InstallationManager.php - - message: "#^Only numeric types are allowed in \\-, int\\|false given on the left side\\.$#" count: 1 @@ -190,11 +180,6 @@ parameters: count: 15 path: ../src/Composer/Util/Git.php - - - message: "#^Parameter \\#1 \\$string of function trim expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Util/GitHub.php - - message: "#^Parameter \\#1 \\$string of function rawurlencode expects string, string\\|null given\\.$#" count: 2 diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index ce404836ca49..04cb1296d964 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -345,11 +345,6 @@ parameters: count: 1 path: ../src/Composer/Command/CreateProjectCommand.php - - - message: "#^Only booleans are allowed in an if condition, string\\|false given\\.$#" - count: 2 - path: ../src/Composer/Command/CreateProjectCommand.php - - message: "#^Parameter \\#3 \\$existingRepos of static method Composer\\\\Repository\\\\RepositoryFactory\\:\\:generateRepositoryName\\(\\) expects array\\, array\\ given\\.$#" count: 1 @@ -1260,11 +1255,6 @@ parameters: count: 2 path: ../src/Composer/Console/Application.php - - - message: "#^Only booleans are allowed in an if condition, Composer\\\\Composer\\|null given\\.$#" - count: 1 - path: ../src/Composer/Console/Application.php - - message: "#^Only booleans are allowed in an if condition, int given\\.$#" count: 1 @@ -2610,11 +2600,6 @@ parameters: count: 2 path: ../src/Composer/Installer/InstallationManager.php - - - message: "#^Constant PHP_WINDOWS_EVENT_CTRL_C not found\\.$#" - count: 1 - path: ../src/Composer/Installer/InstallationManager.php - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" count: 1 @@ -2625,11 +2610,6 @@ parameters: count: 2 path: ../src/Composer/Installer/InstallationManager.php - - - message: "#^Function sapi_windows_set_ctrl_handler not found\\.$#" - count: 3 - path: ../src/Composer/Installer/InstallationManager.php - - message: "#^Only booleans are allowed in &&, Composer\\\\EventDispatcher\\\\EventDispatcher\\|null given on the right side\\.$#" count: 2 @@ -2680,21 +2660,11 @@ parameters: count: 1 path: ../src/Composer/Installer/InstallationManager.php - - - message: "#^Parameter \\#1 \\$function of function call_user_func expects callable\\(\\)\\: mixed, int\\\\|int\\<2, max\\>\\|string given\\.$#" - count: 1 - path: ../src/Composer/Installer/InstallationManager.php - - message: "#^Parameter \\#1 \\$onFulfilled of method React\\\\Promise\\\\PromiseInterface\\:\\:then\\(\\) expects \\(callable\\(\\)\\: mixed\\)\\|null, React\\\\Promise\\\\PromiseInterface given\\.$#" count: 1 path: ../src/Composer/Installer/InstallationManager.php - - - message: "#^Parameter \\#2 \\$handle of function pcntl_signal expects \\(callable\\(\\)\\: mixed\\)\\|int, int\\|string given\\.$#" - count: 2 - path: ../src/Composer/Installer/InstallationManager.php - - message: "#^Parameter \\#2 \\$offset of function array_splice expects int, int\\|string given\\.$#" count: 1 @@ -3355,21 +3325,11 @@ parameters: count: 1 path: ../src/Composer/Package/Version/VersionParser.php - - - message: "#^Only booleans are allowed in &&, array\\\\> given on the left side\\.$#" - count: 1 - path: ../src/Composer/Package/Version/VersionSelector.php - - message: "#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#" count: 1 path: ../src/Composer/Package/Version/VersionSelector.php - - - message: "#^Only booleans are allowed in a negated boolean, array\\ given\\.$#" - count: 1 - path: ../src/Composer/Package/Version/VersionSelector.php - - message: "#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#" count: 1 @@ -3437,7 +3397,7 @@ parameters: - message: "#^Only booleans are allowed in an if condition, Composer\\\\Repository\\\\InstalledRepositoryInterface\\|null given\\.$#" - count: 2 + count: 1 path: ../src/Composer/Plugin/PluginManager.php - @@ -4558,21 +4518,11 @@ parameters: count: 2 path: ../src/Composer/Util/GitHub.php - - - message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" - count: 1 - path: ../src/Composer/Util/GitHub.php - - message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#" count: 1 path: ../src/Composer/Util/GitHub.php - - - message: "#^Parameter \\#1 \\$str of function trim expects string, string\\|null given\\.$#" - count: 1 - path: ../src/Composer/Util/GitHub.php - - message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" count: 2 @@ -4585,7 +4535,7 @@ parameters: - message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#" - count: 2 + count: 1 path: ../src/Composer/Util/GitLab.php - From 026d6de6ea2c913974a7756661a3faac135cb36e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 16:10:48 +0200 Subject: [PATCH 252/618] Release 2.4.0 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index e07bac101417..82d5731aeeec 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.4.999-dev+source'; + public const VERSION = '2.4.0'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-08-16 16:10:48'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From 55990a48a9603e53965bb3989f008de06b8494b4 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 16 Aug 2022 16:10:48 +0200 Subject: [PATCH 253/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 82d5731aeeec..e07bac101417 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.4.0'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-08-16 16:10:48'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.4.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 9b6d27f810967ee693f53c00126c3483303fe115 Mon Sep 17 00:00:00 2001 From: Jeffrey Cafferata Date: Wed, 17 Aug 2022 11:44:18 +0200 Subject: [PATCH 254/618] Environment variable for `--no-audit`. (#10998) Fixes #10997 --- doc/03-cli.md | 12 ++++++++---- src/Composer/Command/BaseCommand.php | 1 + src/Composer/Command/CreateProjectCommand.php | 2 +- src/Composer/Command/RemoveCommand.php | 2 +- src/Composer/Command/RequireCommand.php | 2 +- src/Composer/Command/UpdateCommand.php | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/doc/03-cli.md b/doc/03-cli.md index fb6d03bf2018..d7a2977ee2c2 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -194,7 +194,7 @@ and this feature is only available for your root package dependencies. * **--dev:** Install packages listed in `require-dev` (this is the default behavior). * **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader generation skips the `autoload-dev` rules. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--no-install:** Does not run the install step after updating the composer.lock file. -* **--no-audit:** Does not run the audit steps after updating the composer.lock file. +* **--no-audit:** Does not run the audit steps after updating the composer.lock file. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--lock:** Only updates the lock file hash to suppress warning about the lock file being out of date. @@ -269,7 +269,7 @@ If you do not specify a package, Composer will prompt you to search for a packag terminals or scripts which don't handle backspace characters. * **--no-update:** Disables the automatic update of the dependencies (implies --no-install). * **--no-install:** Does not run the install step after updating the composer.lock file. -* **--no-audit:** Does not run the audit steps after updating the composer.lock file. +* **--no-audit:** Does not run the audit steps after updating the composer.lock file. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--update-no-dev:** Run the dependency update with the `--no-dev` option. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--update-with-dependencies (-w):** Also update dependencies of the newly required packages, except those that are root requirements. @@ -315,7 +315,7 @@ uninstalled. terminals or scripts which don't handle backspace characters. * **--no-update:** Disables the automatic update of the dependencies (implies --no-install). * **--no-install:** Does not run the install step after updating the composer.lock file. -* **--no-audit:** Does not run the audit steps after installation is complete. +* **--no-audit:** Does not run the audit steps after installation is complete. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--update-no-dev:** Run the dependency update with the --no-dev option. Also see [COMPOSER_NO_DEV](#composer-no-dev). * **--update-with-dependencies (-w):** Also update dependencies of the removed packages. @@ -902,7 +902,7 @@ By default the command checks for the packages on packagist.org. mode. * **--remove-vcs:** Force-remove the VCS metadata without prompting. * **--no-install:** Disables installation of the vendors. -* **--no-audit:** Does not run the audit steps after installation is complete. +* **--no-audit:** Does not run the audit steps after installation is complete. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). * **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). * **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine does @@ -1245,6 +1245,10 @@ fully offline with `1`. If set to `1`, outputs information about events being dispatched, which can be useful for plugin authors to identify what is firing when exactly. +### COMPOSER_NO_AUDIT + +If set to `1`, it is the equivalent of passing the `--no-audit` option to `require`, `update`, `remove` or `create-project` command. + ### COMPOSER_NO_DEV If set to `1`, it is the equivalent of passing the `--no-dev` option to `install` or diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index 4e920cfc3dbe..f5fa9797c934 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -244,6 +244,7 @@ protected function initialize(InputInterface $input, OutputInterface $output) } $envOptions = [ + 'COMPOSER_NO_AUDIT' => ['no-audit'], 'COMPOSER_NO_DEV' => ['no-dev', 'update-no-dev'], 'COMPOSER_PREFER_STABLE' => ['prefer-stable'], 'COMPOSER_PREFER_LOWEST' => ['prefer-lowest'], diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index 23382834aee8..d34cd4225de2 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -93,7 +93,7 @@ protected function configure(): void new InputOption('keep-vcs', null, InputOption::VALUE_NONE, 'Whether to prevent deleting the vcs folder.'), new InputOption('remove-vcs', null, InputOption::VALUE_NONE, 'Whether to force deletion of the vcs folder without prompting.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Whether to skip installation of the package dependencies.'), - new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Whether to skip auditing of the installed package dependencies.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Whether to skip auditing of the installed package dependencies (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json" or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index cf04baaca315..73a28ff6b9e5 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -50,7 +50,7 @@ protected function configure() new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), - new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated with explicit dependencies. (Deprecrated, is now default behavior)'), diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index 50cba311d76c..b8014a9f507b 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -85,7 +85,7 @@ protected function configure() new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies (implies --no-install).'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), - new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', 'w', InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated, except those that are root requirements.'), diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index f3ee86fe50ba..f88ea539d170 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -61,7 +61,7 @@ protected function configure() new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Overwrites the lock file hash to suppress warning about the lock file being out of date without updating package versions. Package metadata like mirrors and URLs are updated if they changed.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Skip the install step after updating the composer.lock file.'), - new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file.'), + new InputOption('no-audit', null, InputOption::VALUE_NONE, 'Skip the audit step after updating the composer.lock file (can also be set via the COMPOSER_NO_AUDIT=1 env var).'), new InputOption('audit-format', null, InputOption::VALUE_REQUIRED, 'Audit output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_SUMMARY, Auditor::FORMATS), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'DEPRECATED: This flag does not exist anymore.'), From f95471f2217cce7effa8f24e0209f78163f94ea7 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 13:08:59 +0300 Subject: [PATCH 255/618] Show/outdated command fixes (#11000) * Fix show command showing the split of direct/transitive deps from outdated, fixes #10999 * Fix a few minor edge cases in show command, add tests for show and outdated commands --- src/Composer/Command/ShowCommand.php | 24 +- src/Composer/Repository/RepositoryUtils.php | 26 ++ .../Composer/Test/Command/ShowCommandTest.php | 236 ++++++++++++++++++ 3 files changed, 275 insertions(+), 11 deletions(-) create mode 100644 tests/Composer/Test/Command/ShowCommandTest.php diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index ef0c34475119..3471156fff6b 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -291,7 +291,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $hint .= ', try using --platform (-p) to show platform packages'; } if (!$input->getOption('all')) { - $hint .= ', try using --all (-a) to show all available packages'; + $hint .= ', try using --available (-a) to show all available packages'; } throw new \InvalidArgumentException('Package "' . $packageFilter . '" not found'.$hint.'.'); @@ -374,7 +374,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $packageFilterRegex = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i'; } - $packageListFilter = array(); + $packageListFilter = null; if ($input->getOption('direct')) { $packageListFilter = $this->getRootRequires(); } @@ -384,7 +384,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $input->setOption('path', false); } - foreach ($repos->getRepositories() as $repo) { + foreach (RepositoryUtils::flattenRepositories($repos) as $repo) { if ($repo === $platformRepo) { $type = 'platform'; } elseif ($lockedRepo !== null && $repo === $lockedRepo) { @@ -408,7 +408,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $package = $package->getAliasOf(); } if (!$packageFilterRegex || Preg::isMatch($packageFilterRegex, $package->getName())) { - if (!$packageListFilter || in_array($package->getName(), $packageListFilter, true)) { + if (null === $packageListFilter || in_array($package->getName(), $packageListFilter, true)) { $packages[$type][$package->getName()] = $package; } } @@ -535,6 +535,7 @@ protected function execute(InputInterface $input, OutputInterface $output) 'nameLength' => $nameLength, 'versionLength' => $versionLength, 'latestLength' => $latestLength, + 'writeLatest' => $writeLatest, ); if ($input->getOption('strict') && $hasOutdatedPackages) { $exitCode = 1; @@ -570,12 +571,13 @@ protected function execute(InputInterface $input, OutputInterface $output) $nameLength = $viewMetaData[$type]['nameLength']; $versionLength = $viewMetaData[$type]['versionLength']; $latestLength = $viewMetaData[$type]['latestLength']; + $writeLatest = $viewMetaData[$type]['writeLatest']; - $writeVersion = $nameLength + $versionLength + 3 <= $width; - $writeLatest = $nameLength + $versionLength + $latestLength + 3 <= $width; - $writeDescription = $nameLength + $versionLength + $latestLength + 24 <= $width; + $versionFits = $nameLength + $versionLength + 3 <= $width; + $latestFits = $nameLength + $versionLength + $latestLength + 3 <= $width; + $descriptionFits = $nameLength + $versionLength + $latestLength + 24 <= $width; - if ($writeLatest && !$io->isDecorated()) { + if ($latestFits && !$io->isDecorated()) { $latestLength += 2; } @@ -601,19 +603,19 @@ protected function execute(InputInterface $input, OutputInterface $output) $io->write(''); $io->write('Direct dependencies:'); if (\count($directDeps) > 0) { - $this->printPackages($io, $directDeps, $indent, $writeVersion, $writeLatest, $writeDescription, $width, $versionLength, $nameLength, $latestLength); + $this->printPackages($io, $directDeps, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } else { $io->write('Everything up to date'); } $io->write(''); $io->write('Transitive dependencies:'); if (\count($transitiveDeps) > 0) { - $this->printPackages($io, $transitiveDeps, $indent, $writeVersion, $writeLatest, $writeDescription, $width, $versionLength, $nameLength, $latestLength); + $this->printPackages($io, $transitiveDeps, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } else { $io->write('Everything up to date'); } } else { - $this->printPackages($io, $packages, $indent, $writeVersion, $writeLatest, $writeDescription, $width, $versionLength, $nameLength, $latestLength); + $this->printPackages($io, $packages, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } if ($showAllTypes) { diff --git a/src/Composer/Repository/RepositoryUtils.php b/src/Composer/Repository/RepositoryUtils.php index e62c9dfdf594..f963b34b544b 100644 --- a/src/Composer/Repository/RepositoryUtils.php +++ b/src/Composer/Repository/RepositoryUtils.php @@ -49,4 +49,30 @@ public static function filterRequiredPackages(array $packages, PackageInterface return $bucket; } + + /** + * Unwraps CompositeRepository, InstalledRepository and optionally FilterRepository to get a flat array of pure repository instances + * + * @return RepositoryInterface[] + */ + public static function flattenRepositories(RepositoryInterface $repo, bool $unwrapFilterRepos = true): array + { + // unwrap filter repos + if ($unwrapFilterRepos && $repo instanceof FilterRepository) { + $repo = $repo->getRepository(); + } + + if (!$repo instanceof CompositeRepository) { + return [$repo]; + } + + $repos = []; + foreach ($repo->getRepositories() as $r) { + foreach (self::flattenRepositories($r, $unwrapFilterRepos) as $r2) { + $repos[] = $r2; + } + } + + return $repos; + } } diff --git a/tests/Composer/Test/Command/ShowCommandTest.php b/tests/Composer/Test/Command/ShowCommandTest.php new file mode 100644 index 000000000000..9f44b3ce7a54 --- /dev/null +++ b/tests/Composer/Test/Command/ShowCommandTest.php @@ -0,0 +1,236 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Pcre\Preg; +use Composer\Pcre\Regex; +use Composer\Repository\PlatformRepository; +use Composer\Test\TestCase; + +class ShowCommandTest extends TestCase +{ + /** + * @dataProvider provideShow + * @param array $command + * @param array $requires + */ + public function testShow(array $command, string $expected, array $requires = []): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'vendor/package', 'description' => 'generic description', 'version' => '1.0.0'], + + ['name' => 'outdated/major', 'description' => 'outdated/major v1.0.0 description', 'version' => '1.0.0'], + ['name' => 'outdated/major', 'description' => 'outdated/major v1.0.1 description', 'version' => '1.0.1'], + ['name' => 'outdated/major', 'description' => 'outdated/major v1.1.0 description', 'version' => '1.1.0'], + ['name' => 'outdated/major', 'description' => 'outdated/major v1.1.1 description', 'version' => '1.1.1'], + ['name' => 'outdated/major', 'description' => 'outdated/major v2.0.0 description', 'version' => '2.0.0'], + + ['name' => 'outdated/minor', 'description' => 'outdated/minor v1.0.0 description', 'version' => '1.0.0'], + ['name' => 'outdated/minor', 'description' => 'outdated/minor v1.0.1 description', 'version' => '1.0.1'], + ['name' => 'outdated/minor', 'description' => 'outdated/minor v1.1.0 description', 'version' => '1.1.0'], + ['name' => 'outdated/minor', 'description' => 'outdated/minor v1.1.1 description', 'version' => '1.1.1'], + + ['name' => 'outdated/patch', 'description' => 'outdated/patch v1.0.0 description', 'version' => '1.0.0'], + ['name' => 'outdated/patch', 'description' => 'outdated/patch v1.0.1 description', 'version' => '1.0.1'], + ], + ], + ], + 'require' => $requires === [] ? new \stdClass : $requires, + ]); + + $pkg = $this->getPackage('vendor/package', '1.0.0'); + $pkg->setDescription('description of installed package'); + + $this->createInstalledJson([ + $pkg, + $this->getPackage('outdated/major', '1.0.0'), + $this->getPackage('outdated/minor', '1.0.0'), + $this->getPackage('outdated/patch', '1.0.0'), + ]); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'show'], $command)); + self::assertSame(trim($expected), trim($appTester->getDisplay(true))); + } + + public function provideShow(): \Generator + { + yield 'default shows installed with version and description' => [ + [], +'outdated/major 1.0.0 +outdated/minor 1.0.0 +outdated/patch 1.0.0 +vendor/package 1.0.0 description of installed package', + ]; + + yield 'with -a show available packages with description but no version' => [ + ['-a' => true], +'outdated/major outdated/major v2.0.0 description +outdated/minor outdated/minor v1.1.1 description +outdated/patch outdated/patch v1.0.1 description +vendor/package generic description', + ]; + + yield 'show with --direct shows nothing if no deps' => [ + ['--direct' => true], + '', + ]; + + yield 'show with --direct shows only root deps' => [ + ['--direct' => true], + 'outdated/major 1.0.0', + ['outdated/major' => '*'], + ]; + + yield 'outdated deps' => [ + ['command' => 'outdated'], +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible + +Direct dependencies: +Everything up to date + +Transitive dependencies: +outdated/major 1.0.0 ~ 2.0.0 +outdated/minor 1.0.0 ! 1.1.1 +outdated/patch 1.0.0 ! 1.0.1', + ]; + + yield 'outdated deps with --direct only show direct deps with updated' => [ + ['command' => 'outdated', '--direct' => true], +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible +outdated/major 1.0.0 ~ 2.0.0', + [ + 'vendor/package' => '*', + 'outdated/major' => '*', + ], + ]; + + yield 'outdated deps with --major-only only shows major updates' => [ + ['command' => 'outdated', '--major-only' => true], +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible + +Direct dependencies: +Everything up to date + +Transitive dependencies: +outdated/major 1.0.0 ~ 2.0.0', + ]; + + yield 'outdated deps with --minor-only only shows minor updates' => [ + ['command' => 'outdated', '--minor-only' => true], +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible + +Direct dependencies: +outdated/minor 1.0.0 ! 1.1.1 + +Transitive dependencies: +outdated/major 1.0.0 ! 1.1.1 +outdated/patch 1.0.0 ! 1.0.1', + ['outdated/minor' => '*'], + ]; + + yield 'outdated deps with --patch-only only shows patch updates' => [ + ['command' => 'outdated', '--patch-only' => true], +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible + +Direct dependencies: +Everything up to date + +Transitive dependencies: +outdated/major 1.0.0 ! 1.0.1 +outdated/minor 1.0.0 ! 1.0.1 +outdated/patch 1.0.0 ! 1.0.1', + ]; + } + + public function testShowPlatformOnlyShowsPlatformPackages(): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'vendor/package', 'description' => 'generic description', 'version' => '1.0.0'], + ], + ], + ], + ]); + + $this->createInstalledJson([ + $this->getPackage('vendor/package', '1.0.0'), + ]); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'show', '-p' => true]); + $output = trim($appTester->getDisplay(true)); + foreach (Regex::matchAll('{^(\w+)}m', $output)->matches as $m) { + self::assertTrue(PlatformRepository::isPlatformPackage((string) $m[1])); + } + } + + public function testShowAllShowsAllSections(): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'vendor/available', 'description' => 'generic description', 'version' => '1.0.0'], + ], + ], + ], + ]); + + $pkg = $this->getPackage('vendor/installed', '2.0.0'); + $pkg->setDescription('description of installed package'); + $this->createInstalledJson([ + $pkg, + ]); + + $pkg = $this->getPackage('vendor/locked', '3.0.0'); + $pkg->setDescription('description of locked package'); + $this->createComposerLock([ + $pkg, + ]); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'show', '--all' => true]); + $output = trim($appTester->getDisplay(true)); + $output = Preg::replace('{platform:(\n .*)+}', 'platform: wiped', $output); + + self::assertSame('platform: wiped + +locked: + vendor/locked 3.0.0 description of locked package + +available: + vendor/available generic description + +installed: + vendor/installed 2.0.0 description of installed package', $output); + } +} From 6e205a0c843b981719720ca402e408615f055889 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 13:23:16 +0200 Subject: [PATCH 256/618] Fix minor bug in process executor mock --- tests/Composer/Test/Mock/ProcessExecutorMock.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Composer/Test/Mock/ProcessExecutorMock.php b/tests/Composer/Test/Mock/ProcessExecutorMock.php index 6d2386c3b641..2f5c2ff23a7b 100644 --- a/tests/Composer/Test/Mock/ProcessExecutorMock.php +++ b/tests/Composer/Test/Mock/ProcessExecutorMock.php @@ -178,7 +178,7 @@ private function doExecute($command, string $cwd, bool $tty, &$output = null) } if ($stdout) { - call_user_func($callback, Process::STDOUT, $stdout); + call_user_func($callback, Process::OUT, $stdout); } if ($stderr) { call_user_func($callback, Process::ERR, $stderr); From 131da999ac571bcd5bc3dae535dd392d1a36cb53 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 15:20:07 +0300 Subject: [PATCH 257/618] Fix CS (#11003) --- .php-cs-fixer.php | 26 +- phpstan/baseline.neon | 20 +- src/Composer/Advisory/Auditor.php | 22 +- .../Advisory/PartialSecurityAdvisory.php | 10 + src/Composer/Advisory/SecurityAdvisory.php | 12 +- src/Composer/Autoload/AutoloadGenerator.php | 103 +-- src/Composer/Autoload/ClassMapGenerator.php | 5 +- src/Composer/Autoload/PhpFileCleaner.php | 36 +- src/Composer/Cache.php | 26 +- src/Composer/Command/AboutCommand.php | 3 - src/Composer/Command/ArchiveCommand.php | 12 +- src/Composer/Command/AuditCommand.php | 19 +- src/Composer/Command/BaseCommand.php | 11 +- .../Command/BaseDependencyCommand.php | 41 +- src/Composer/Command/BumpCommand.php | 17 +- .../Command/CheckPlatformReqsCommand.php | 47 +- src/Composer/Command/ClearCacheCommand.php | 15 +- src/Composer/Command/CompletionTrait.php | 7 +- src/Composer/Command/ConfigCommand.php | 256 +++--- src/Composer/Command/CreateProjectCommand.php | 59 +- src/Composer/Command/DependsCommand.php | 8 +- src/Composer/Command/DiagnoseCommand.php | 46 +- src/Composer/Command/DumpAutoloadCommand.php | 6 +- src/Composer/Command/ExecCommand.php | 5 +- src/Composer/Command/FundCommand.php | 17 +- src/Composer/Command/GlobalCommand.php | 9 +- src/Composer/Command/HomeCommand.php | 22 +- src/Composer/Command/InitCommand.php | 92 +-- src/Composer/Command/InstallCommand.php | 8 +- src/Composer/Command/LicensesCommand.php | 39 +- src/Composer/Command/OutdatedCommand.php | 11 +- .../Command/PackageDiscoveryTrait.php | 37 +- src/Composer/Command/ProhibitsCommand.php | 8 +- src/Composer/Command/ReinstallCommand.php | 17 +- src/Composer/Command/RemoveCommand.php | 16 +- src/Composer/Command/RequireCommand.php | 32 +- src/Composer/Command/RunScriptCommand.php | 20 +- src/Composer/Command/ScriptAliasCommand.php | 7 +- src/Composer/Command/SearchCommand.php | 15 +- src/Composer/Command/SelfUpdateCommand.php | 27 +- src/Composer/Command/ShowCommand.php | 176 ++-- src/Composer/Command/StatusCommand.php | 26 +- src/Composer/Command/SuggestsCommand.php | 15 +- src/Composer/Command/UpdateCommand.php | 19 +- src/Composer/Command/ValidateCommand.php | 37 +- src/Composer/Compiler.php | 34 +- src/Composer/Composer.php | 3 - src/Composer/Config.php | 115 +-- src/Composer/Config/ConfigSourceInterface.php | 24 - src/Composer/Config/JsonConfigSource.php | 44 +- src/Composer/Console/Application.php | 34 +- src/Composer/Console/GithubActionError.php | 15 - src/Composer/Console/HtmlOutputFormatter.php | 14 +- src/Composer/Console/Input/InputArgument.php | 2 +- src/Composer/Console/Input/InputOption.php | 2 +- src/Composer/DependencyResolver/Decisions.php | 77 +- .../DependencyResolver/DefaultPolicy.php | 26 +- .../DependencyResolver/GenericRule.php | 5 - .../DependencyResolver/LockTransaction.php | 17 +- .../DependencyResolver/MultiConflictRule.php | 5 - .../Operation/InstallOperation.php | 6 - .../Operation/MarkAliasInstalledOperation.php | 2 - .../MarkAliasUninstalledOperation.php | 2 - .../Operation/SolverOperation.php | 2 - .../Operation/UninstallOperation.php | 6 - .../Operation/UpdateOperation.php | 8 - .../DependencyResolver/PolicyInterface.php | 4 - src/Composer/DependencyResolver/Pool.php | 44 +- .../DependencyResolver/PoolBuilder.php | 76 +- .../DependencyResolver/PoolOptimizer.php | 84 +- src/Composer/DependencyResolver/Problem.php | 125 ++- src/Composer/DependencyResolver/Request.php | 45 +- src/Composer/DependencyResolver/Rule.php | 60 +- .../DependencyResolver/Rule2Literals.php | 6 +- src/Composer/DependencyResolver/RuleSet.php | 33 +- .../DependencyResolver/RuleSetGenerator.php | 46 +- .../DependencyResolver/RuleWatchChain.php | 3 - .../DependencyResolver/RuleWatchGraph.php | 6 +- .../DependencyResolver/RuleWatchNode.php | 4 - src/Composer/DependencyResolver/Solver.php | 75 +- .../DependencyResolver/SolverBugException.php | 3 - .../SolverProblemsException.php | 14 +- .../DependencyResolver/Transaction.php | 35 +- src/Composer/Downloader/ArchiveDownloader.php | 14 +- src/Composer/Downloader/DownloadManager.php | 36 +- .../Downloader/DownloaderInterface.php | 12 +- src/Composer/Downloader/FileDownloader.php | 48 +- .../Downloader/FilesystemException.php | 7 +- src/Composer/Downloader/FossilDownloader.php | 2 +- src/Composer/Downloader/GitDownloader.php | 69 +- src/Composer/Downloader/GzipDownloader.php | 6 - src/Composer/Downloader/HgDownloader.php | 2 +- src/Composer/Downloader/PathDownloader.php | 24 +- .../Downloader/PerforceDownloader.php | 16 +- src/Composer/Downloader/SvnDownloader.php | 14 +- .../Downloader/TransportException.php | 13 +- src/Composer/Downloader/VcsDownloader.php | 27 +- src/Composer/Downloader/ZipDownloader.php | 25 +- src/Composer/EventDispatcher/Event.php | 4 +- .../EventDispatcher/EventDispatcher.php | 67 +- src/Composer/Factory.php | 55 +- .../IgnoreAllPlatformRequirementFilter.php | 4 - .../IgnoreListPlatformRequirementFilter.php | 12 +- ...IgnoreNothingPlatformRequirementFilter.php | 1 - .../PlatformRequirementFilterFactory.php | 8 - .../PlatformRequirementFilterInterface.php | 4 - src/Composer/IO/BaseIO.php | 30 +- src/Composer/IO/BufferIO.php | 13 +- src/Composer/IO/ConsoleIO.php | 27 +- src/Composer/IO/IOInterface.php | 1 - src/Composer/Installer.php | 119 +-- src/Composer/Installer/BinaryInstaller.php | 48 +- .../Installer/InstallationManager.php | 130 +-- src/Composer/Installer/InstallerEvent.php | 22 - src/Composer/Installer/InstallerInterface.php | 8 +- src/Composer/Installer/LibraryInstaller.php | 12 +- .../Installer/MetapackageInstaller.php | 6 +- src/Composer/Installer/NoopInstaller.php | 6 +- src/Composer/Installer/PackageEvent.php | 20 - src/Composer/Installer/PluginInstaller.php | 6 +- src/Composer/Installer/ProjectInstaller.php | 13 +- .../Installer/SuggestedPackagesReporter.php | 36 +- src/Composer/Json/JsonFile.php | 25 +- src/Composer/Json/JsonFormatter.php | 2 - src/Composer/Json/JsonManipulator.php | 89 +-- src/Composer/Json/JsonValidationException.php | 3 +- .../PHPStan/ConfigReturnTypeExtension.php | 11 +- src/Composer/Package/AliasPackage.php | 10 +- .../Archiver/ArchivableFilesFilter.php | 7 +- .../Archiver/ArchivableFilesFinder.php | 6 +- .../Package/Archiver/ArchiveManager.php | 9 +- .../Package/Archiver/ArchiverInterface.php | 2 +- .../Package/Archiver/BaseExcludeFilter.php | 10 +- .../Package/Archiver/GitExcludeFilter.php | 4 +- .../Package/Archiver/PharArchiver.php | 10 +- src/Composer/Package/Archiver/ZipArchiver.php | 9 +- src/Composer/Package/BasePackage.php | 36 +- src/Composer/Package/Comparer/Comparer.php | 26 +- src/Composer/Package/CompletePackage.php | 16 +- .../Package/CompletePackageInterface.php | 22 - src/Composer/Package/Dumper/ArrayDumper.php | 12 +- src/Composer/Package/Link.php | 27 +- src/Composer/Package/Loader/ArrayLoader.php | 27 +- .../Package/Loader/RootPackageLoader.php | 30 +- .../Package/Loader/ValidatingArrayLoader.php | 62 +- src/Composer/Package/Locker.php | 61 +- src/Composer/Package/Package.php | 102 +-- src/Composer/Package/PackageInterface.php | 40 - src/Composer/Package/RootAliasPackage.php | 4 +- src/Composer/Package/RootPackage.php | 8 +- src/Composer/Package/RootPackageInterface.php | 38 - .../Package/Version/VersionBumper.php | 8 - .../Package/Version/VersionGuesser.php | 48 +- .../Package/Version/VersionParser.php | 22 +- .../Package/Version/VersionSelector.php | 24 +- src/Composer/PartialComposer.php | 36 - src/Composer/Platform/HhvmDetector.php | 8 +- src/Composer/Platform/Runtime.php | 27 +- src/Composer/Platform/Version.php | 29 +- src/Composer/Plugin/CommandEvent.php | 10 +- .../Plugin/PluginBlockedException.php | 2 +- src/Composer/Plugin/PluginInterface.php | 6 - src/Composer/Plugin/PluginManager.php | 85 +- src/Composer/Plugin/PostFileDownloadEvent.php | 8 - src/Composer/Plugin/PreCommandRunEvent.php | 5 - src/Composer/Plugin/PreFileDownloadEvent.php | 20 +- src/Composer/Plugin/PrePoolCreateEvent.php | 7 - .../Question/StrictConfirmationQuestion.php | 4 - src/Composer/Repository/ArrayRepository.php | 37 +- .../Repository/ArtifactRepository.php | 11 +- .../Repository/CanonicalPackagesTrait.php | 4 +- .../Repository/ComposerRepository.php | 223 +++--- .../Repository/CompositeRepository.php | 38 +- .../Repository/FilesystemRepository.php | 14 +- src/Composer/Repository/FilterRepository.php | 21 +- .../Repository/InstalledRepository.php | 35 +- src/Composer/Repository/PackageRepository.php | 2 +- src/Composer/Repository/PathRepository.php | 14 +- .../Repository/PlatformRepository.php | 75 +- src/Composer/Repository/RepositoryFactory.php | 41 +- .../Repository/RepositoryInterface.php | 2 +- src/Composer/Repository/RepositoryManager.php | 23 +- src/Composer/Repository/RepositorySet.php | 62 +- src/Composer/Repository/RepositoryUtils.php | 2 +- .../Repository/RootPackageRepository.php | 2 +- src/Composer/Repository/Vcs/FossilDriver.php | 12 +- .../Repository/Vcs/GitBitbucketDriver.php | 37 +- src/Composer/Repository/Vcs/GitDriver.php | 7 +- src/Composer/Repository/Vcs/GitHubDriver.php | 51 +- src/Composer/Repository/Vcs/GitLabDriver.php | 49 +- src/Composer/Repository/Vcs/HgDriver.php | 8 +- .../Repository/Vcs/PerforceDriver.php | 12 +- src/Composer/Repository/Vcs/SvnDriver.php | 17 +- src/Composer/Repository/Vcs/VcsDriver.php | 11 +- .../Repository/Vcs/VcsDriverInterface.php | 13 - src/Composer/Repository/VcsRepository.php | 38 +- .../Repository/VersionCacheInterface.php | 2 - .../Repository/WritableArrayRepository.php | 3 +- src/Composer/Script/Event.php | 12 +- src/Composer/SelfUpdate/Keys.php | 9 +- src/Composer/SelfUpdate/Versions.php | 14 +- src/Composer/Util/AuthHelper.php | 25 +- src/Composer/Util/Bitbucket.php | 43 +- src/Composer/Util/ComposerMirror.php | 34 +- src/Composer/Util/ConfigValidator.php | 22 +- src/Composer/Util/ErrorHandler.php | 9 +- src/Composer/Util/Filesystem.php | 62 +- src/Composer/Util/Git.php | 80 +- src/Composer/Util/GitHub.php | 22 +- src/Composer/Util/GitLab.php | 43 +- src/Composer/Util/Hg.php | 12 +- src/Composer/Util/Http/CurlDownloader.php | 109 +-- src/Composer/Util/Http/CurlResponse.php | 2 +- src/Composer/Util/Http/ProxyHelper.php | 19 +- src/Composer/Util/Http/ProxyManager.php | 29 +- src/Composer/Util/Http/RequestProxy.php | 2 - src/Composer/Util/Http/Response.php | 13 +- src/Composer/Util/HttpDownloader.php | 62 +- src/Composer/Util/IniHelper.php | 2 - src/Composer/Util/Loop.php | 16 +- src/Composer/Util/NoProxyPattern.php | 75 +- src/Composer/Util/PackageSorter.php | 16 +- src/Composer/Util/Perforce.php | 138 +--- src/Composer/Util/Platform.php | 20 +- src/Composer/Util/ProcessExecutor.php | 31 +- src/Composer/Util/RemoteFilesystem.php | 47 +- src/Composer/Util/Silencer.php | 4 +- src/Composer/Util/StreamContextFactory.php | 23 +- src/Composer/Util/Svn.php | 46 +- src/Composer/Util/SyncHelper.php | 11 +- src/Composer/Util/Tar.php | 11 +- src/Composer/Util/TlsHelper.php | 19 +- src/Composer/Util/Url.php | 11 - src/Composer/Util/Zip.php | 10 +- tests/Composer/Test/Advisory/AuditorTest.php | 43 +- tests/Composer/Test/AllFunctionalTest.php | 18 +- tests/Composer/Test/ApplicationTest.php | 1 - .../Test/Autoload/AutoloadGeneratorTest.php | 731 +++++++++-------- .../Test/Autoload/ClassLoaderTest.php | 10 +- tests/Composer/Test/CacheTest.php | 6 +- .../Test/Command/ArchiveCommandTest.php | 14 +- .../Composer/Test/Command/BumpCommandTest.php | 9 +- .../Test/Command/ConfigCommandTest.php | 4 - .../Test/Command/RunScriptCommandTest.php | 41 +- .../Test/CompletionFunctionalTest.php | 2 +- tests/Composer/Test/ComposerTest.php | 2 +- .../Test/Config/JsonConfigSourceTest.php | 46 +- tests/Composer/Test/ConfigTest.php | 276 ++++--- .../Test/Console/HtmlOutputFormatterTest.php | 4 +- .../DependencyResolver/DefaultPolicyTest.php | 60 +- .../DependencyResolver/PoolBuilderTest.php | 32 +- .../DependencyResolver/PoolOptimizerTest.php | 16 +- .../Test/DependencyResolver/PoolTest.php | 21 +- .../Test/DependencyResolver/RequestTest.php | 8 +- .../RuleSetIteratorTest.php | 32 +- .../Test/DependencyResolver/RuleSetTest.php | 62 +- .../Test/DependencyResolver/RuleTest.php | 30 +- .../Test/DependencyResolver/SolverTest.php | 503 ++++++------ .../DependencyResolver/TransactionTest.php | 76 +- .../Test/Downloader/ArchiveDownloaderTest.php | 33 +- .../Test/Downloader/DownloadManagerTest.php | 135 ++-- .../Test/Downloader/FileDownloaderTest.php | 25 +- .../Test/Downloader/FossilDownloaderTest.php | 19 +- .../Test/Downloader/GitDownloaderTest.php | 125 ++- .../Test/Downloader/HgDownloaderTest.php | 19 +- .../Downloader/PerforceDownloaderTest.php | 12 +- .../Test/Downloader/XzDownloaderTest.php | 2 +- .../Test/Downloader/ZipDownloaderTest.php | 21 +- .../EventDispatcher/EventDispatcherTest.php | 197 +++-- ...IgnoreAllPlatformRequirementFilterTest.php | 11 +- ...gnoreListPlatformRequirementFilterTest.php | 28 +- ...reNothingPlatformRequirementFilterTest.php | 10 +- .../PlatformRequirementFilterFactoryTest.php | 10 +- tests/Composer/Test/IO/BufferIOTest.php | 4 +- tests/Composer/Test/IO/ConsoleIOTest.php | 14 +- tests/Composer/Test/IO/NullIOTest.php | 6 +- tests/Composer/Test/InstalledVersionsTest.php | 184 ++--- .../Test/Installer/BinaryInstallerTest.php | 25 +- .../Installer/InstallationManagerTest.php | 14 +- .../Test/Installer/LibraryInstallerTest.php | 8 +- .../Installer/MetapackageInstallerTest.php | 2 +- .../SuggestedPackagesReporterTest.php | 34 +- tests/Composer/Test/InstallerTest.php | 135 ++-- .../Composer/Test/Json/ComposerSchemaTest.php | 27 +- tests/Composer/Test/Json/JsonFileTest.php | 28 +- .../Test/Json/JsonManipulatorTest.php | 185 ++--- .../Test/Json/JsonValidationExceptionTest.php | 10 +- tests/Composer/Test/Mock/FactoryMock.php | 16 +- .../Composer/Test/Mock/HttpDownloaderMock.php | 16 +- .../Test/Mock/InstallationManagerMock.php | 12 +- .../Test/Mock/ProcessExecutorMock.php | 25 +- .../Archiver/ArchivableFilesFinderTest.php | 34 +- .../Package/Archiver/ArchiveManagerTest.php | 8 - .../Test/Package/Archiver/ArchiverTest.php | 2 - .../Package/Archiver/GitExcludeFilterTest.php | 9 +- .../Package/Archiver/PharArchiverTest.php | 11 +- .../Test/Package/Archiver/ZipArchiverTest.php | 29 +- .../Composer/Test/Package/BasePackageTest.php | 48 +- .../Test/Package/CompletePackageTest.php | 19 +- .../Test/Package/Dumper/ArrayDumperTest.php | 187 +++-- .../Test/Package/Loader/ArrayLoaderTest.php | 180 +++-- .../Package/Loader/RootPackageLoaderTest.php | 52 +- .../Loader/ValidatingArrayLoaderTest.php | 527 ++++++------ tests/Composer/Test/Package/LockerTest.php | 64 +- .../Test/Package/RootAliasPackageTest.php | 20 +- .../Package/Version/VersionBumperTest.php | 7 +- .../Package/Version/VersionGuesserTest.php | 196 ++--- .../Package/Version/VersionParserTest.php | 38 +- .../Package/Version/VersionSelectorTest.php | 114 ++- tests/Composer/Test/Platform/VersionTest.php | 112 ++- .../Test/Plugin/PluginInstallerTest.php | 97 ++- .../StrictConfirmationQuestionTest.php | 53 +- .../Test/Repository/ArrayRepositoryTest.php | 18 +- .../Repository/ArtifactRepositoryTest.php | 14 +- .../Repository/ComposerRepositoryTest.php | 204 +++-- .../Repository/CompositeRepositoryTest.php | 27 +- .../Repository/FilesystemRepositoryTest.php | 39 +- .../Test/Repository/FilterRepositoryTest.php | 24 +- .../Repository/InstalledRepositoryTest.php | 14 +- .../Test/Repository/PathRepositoryTest.php | 57 +- .../Repository/PlatformRepositoryTest.php | 752 +++++++++--------- .../Test/Repository/RepositoryFactoryTest.php | 20 +- .../Test/Repository/RepositoryManagerTest.php | 31 +- .../Test/Repository/RepositoryUtilsTest.php | 1 - .../Test/Repository/Vcs/FossilDriverTest.php | 21 +- .../Repository/Vcs/GitBitbucketDriverTest.php | 102 ++- .../Test/Repository/Vcs/GitDriverTest.php | 23 +- .../Test/Repository/Vcs/GitHubDriverTest.php | 96 +-- .../Test/Repository/Vcs/GitLabDriverTest.php | 150 ++-- .../Test/Repository/Vcs/HgDriverTest.php | 39 +- .../Repository/Vcs/PerforceDriverTest.php | 22 +- .../Test/Repository/Vcs/SvnDriverTest.php | 45 +- .../Test/Repository/VcsRepositoryTest.php | 21 +- tests/Composer/Test/Script/EventTest.php | 3 - tests/Composer/Test/TestCase.php | 28 +- tests/Composer/Test/Util/AuthHelperTest.php | 161 ++-- tests/Composer/Test/Util/BitbucketTest.php | 107 ++- .../Test/Util/ConfigValidatorTest.php | 6 +- tests/Composer/Test/Util/ErrorHandlerTest.php | 4 +- tests/Composer/Test/Util/FilesystemTest.php | 220 +++-- tests/Composer/Test/Util/GitTest.php | 56 +- .../Test/Util/Http/ProxyHelperTest.php | 83 +- .../Test/Util/Http/ProxyManagerTest.php | 52 +- .../Test/Util/Http/RequestProxyTest.php | 29 +- .../Composer/Test/Util/HttpDownloaderTest.php | 26 +- tests/Composer/Test/Util/IniHelperTest.php | 18 +- .../Test/Util/MetadataMinifierTest.php | 20 +- .../Composer/Test/Util/NoProxyPatternTest.php | 86 +- .../Composer/Test/Util/PackageSorterTest.php | 173 ++-- tests/Composer/Test/Util/PerforceTest.php | 51 +- .../Test/Util/ProcessExecutorTest.php | 83 +- .../Test/Util/RemoteFilesystemTest.php | 103 +-- tests/Composer/Test/Util/SilencerTest.php | 4 +- .../Test/Util/StreamContextFactoryTest.php | 107 ++- tests/Composer/Test/Util/SvnTest.php | 54 +- tests/Composer/Test/Util/TlsHelperTest.php | 50 +- tests/Composer/Test/Util/UrlTest.php | 78 +- 357 files changed, 5949 insertions(+), 9180 deletions(-) diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 28db75b8bcb1..7eefc2970c5d 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -24,12 +24,12 @@ return $config->setRules([ '@PSR2' => true, 'binary_operator_spaces' => true, - 'blank_line_before_statement' => array('statements' => array('declare', 'return')), - 'cast_spaces' => array('space' => 'single'), - 'header_comment' => array('header' => $header), + 'blank_line_before_statement' => ['statements' => ['declare', 'return']], + 'cast_spaces' => ['space' => 'single'], + 'header_comment' => ['header' => $header], 'include' => true, - 'class_attributes_separation' => array('elements' => array('method' => 'one', 'trait_import' => 'none')), + 'class_attributes_separation' => ['elements' => ['method' => 'one', 'trait_import' => 'none']], 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_empty_statement' => true, @@ -40,6 +40,8 @@ 'object_operator_without_whitespace' => true, //'phpdoc_align' => true, 'phpdoc_indent' => true, + 'no_empty_comment' => true, + 'no_empty_phpdoc' => true, 'phpdoc_no_access' => true, 'phpdoc_no_package' => true, //'phpdoc_order' => true, @@ -62,13 +64,12 @@ 'single_import_per_statement' => true, // PHP 7.2 migration - // TODO later once 2.2 is more stable - // 'array_syntax' => true, - // 'list_syntax' => true, - // 'regular_callable_call' => true, - // 'static_lambda' => true, - // 'nullable_type_declaration_for_default_null_value' => true, - // 'explicit_indirect_variable' => true, + 'array_syntax' => true, + 'list_syntax' => true, + 'regular_callable_call' => true, + 'static_lambda' => true, + 'nullable_type_declaration_for_default_null_value' => true, + 'explicit_indirect_variable' => true, 'visibility_required' => ['elements' => ['property', 'method', 'const']], 'non_printable_character' => true, 'combine_nested_dirname' => true, @@ -76,6 +77,9 @@ 'ternary_to_null_coalescing' => true, 'phpdoc_to_param_type' => true, 'declare_strict_types' => true, + 'no_superfluous_phpdoc_tags' => [ + 'allow_mixed' => true, + ], // TODO php 7.4 migration (one day..) // 'phpdoc_to_property_type' => true, diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index 04cb1296d964..bfa6364bfcd0 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -865,11 +865,6 @@ parameters: count: 2 path: ../src/Composer/Command/ShowCommand.php - - - message: "#^Only booleans are allowed in a negated boolean, array\\ given\\.$#" - count: 1 - path: ../src/Composer/Command/ShowCommand.php - - message: "#^Only booleans are allowed in a negated boolean, array\\\\|string given\\.$#" count: 1 @@ -1415,6 +1410,16 @@ parameters: count: 4 path: ../src/Composer/DependencyResolver/PoolOptimizer.php + - + message: "#^Cannot access offset 'constraint' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" + count: 1 + path: ../src/Composer/DependencyResolver/Problem.php + + - + message: "#^Cannot access offset 'packageName' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" + count: 1 + path: ../src/Composer/DependencyResolver/Problem.php + - message: "#^Cannot call method getRepoName\\(\\) on Composer\\\\Repository\\\\RepositoryInterface\\|null\\.$#" count: 3 @@ -1530,6 +1535,11 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/Rule.php + - + message: "#^Method Composer\\\\DependencyResolver\\\\Rule\\:\\:getReason\\(\\) should return 2\\|3\\|6\\|7\\|10\\|12\\|13\\|14 but returns int\\.$#" + count: 1 + path: ../src/Composer/DependencyResolver/Rule.php + - message: "#^Only booleans are allowed in &&, array\\ given on the left side\\.$#" count: 1 diff --git a/src/Composer/Advisory/Auditor.php b/src/Composer/Advisory/Auditor.php index 7ceac1a1dd1c..c72645a83fa5 100644 --- a/src/Composer/Advisory/Auditor.php +++ b/src/Composer/Advisory/Auditor.php @@ -1,5 +1,15 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\Advisory; use Composer\IO\ConsoleIO; @@ -31,7 +41,6 @@ class Auditor ]; /** - * @param IOInterface $io * @param PackageInterface[] $packages * @param self::FORMAT_* $format The format that will be used to output audit results. * @param bool $warningOnly If true, outputs a warning. If false, outputs an error. @@ -43,6 +52,7 @@ public function audit(IOInterface $io, RepositorySet $repoSet, array $packages, $advisories = $repoSet->getMatchingSecurityAdvisories($packages, $format === self::FORMAT_SUMMARY); if (self::FORMAT_JSON === $format) { $io->write(JsonFile::encode(['advisories' => $advisories])); + return count($advisories); } @@ -73,14 +83,13 @@ private function countAdvisories(array $advisories): array foreach ($advisories as $packageAdvisories) { $count += count($packageAdvisories); } + return [count($advisories), $count]; } /** - * @param IOInterface $io * @param array> $advisories * @param self::FORMAT_* $format The format that will be used to output audit results. - * @return void */ private function outputAdvisories(IOInterface $io, array $advisories, string $format): void { @@ -90,13 +99,16 @@ private function outputAdvisories(IOInterface $io, array $advisories, string $fo throw new InvalidArgumentException('Cannot use table format with ' . get_class($io)); } $this->outputAvisoriesTable($io, $advisories); + return; case self::FORMAT_PLAIN: $this->outputAdvisoriesPlain($io, $advisories); + return; case self::FORMAT_SUMMARY: // We've already output the number of advisories in audit() $io->writeError('Run composer audit for a full list of advisories.'); + return; default: throw new InvalidArgumentException('Invalid format "'.$format.'".'); @@ -104,9 +116,7 @@ private function outputAdvisories(IOInterface $io, array $advisories, string $fo } /** - * @param ConsoleIO $io * @param array> $advisories - * @return void */ private function outputAvisoriesTable(ConsoleIO $io, array $advisories): void { @@ -138,9 +148,7 @@ private function outputAvisoriesTable(ConsoleIO $io, array $advisories): void } /** - * @param IOInterface $io * @param array> $advisories - * @return void */ private function outputAdvisoriesPlain(IOInterface $io, array $advisories): void { diff --git a/src/Composer/Advisory/PartialSecurityAdvisory.php b/src/Composer/Advisory/PartialSecurityAdvisory.php index 7a4cc7e12669..c5234591ba02 100644 --- a/src/Composer/Advisory/PartialSecurityAdvisory.php +++ b/src/Composer/Advisory/PartialSecurityAdvisory.php @@ -1,5 +1,15 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\Advisory; use Composer\Semver\Constraint\ConstraintInterface; diff --git a/src/Composer/Advisory/SecurityAdvisory.php b/src/Composer/Advisory/SecurityAdvisory.php index e8b53e925f35..a574ed4b00f2 100644 --- a/src/Composer/Advisory/SecurityAdvisory.php +++ b/src/Composer/Advisory/SecurityAdvisory.php @@ -1,5 +1,15 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\Advisory; use Composer\Semver\Constraint\ConstraintInterface; @@ -41,7 +51,7 @@ class SecurityAdvisory extends PartialSecurityAdvisory * @param non-empty-array $sources * @readonly */ - public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, \DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null) + public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null) { parent::__construct($packageName, $advisoryId, $affectedVersions); diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index a5b85e4d867b..2a20265df7cb 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -80,7 +80,7 @@ class AutoloadGenerator */ private $platformRequirementFilter; - public function __construct(EventDispatcher $eventDispatcher, IOInterface $io = null) + public function __construct(EventDispatcher $eventDispatcher, ?IOInterface $io = null) { $this->eventDispatcher = $eventDispatcher; $this->io = $io ?? new NullIO(); @@ -89,7 +89,6 @@ public function __construct(EventDispatcher $eventDispatcher, IOInterface $io = } /** - * @param bool $devMode * @return void */ public function setDevMode(bool $devMode = true) @@ -100,7 +99,6 @@ public function setDevMode(bool $devMode = true) /** * Whether generated autoloader considers the class map authoritative. * - * @param bool $classMapAuthoritative * @return void */ public function setClassMapAuthoritative(bool $classMapAuthoritative) @@ -111,8 +109,6 @@ public function setClassMapAuthoritative(bool $classMapAuthoritative) /** * Whether generated autoloader considers APCu caching. * - * @param bool $apcu - * @param string|null $apcuPrefix * @return void */ public function setApcu(bool $apcu, ?string $apcuPrefix = null) @@ -124,7 +120,6 @@ public function setApcu(bool $apcu, ?string $apcuPrefix = null) /** * Whether to run scripts or not * - * @param bool $runScripts * @return void */ public function setRunScripts(bool $runScripts = true) @@ -160,8 +155,6 @@ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface } /** - * @param string $targetDir - * @param bool $scanPsrPackages * @return ClassMap * @throws \Seld\JsonLint\ParsingException * @throws \RuntimeException @@ -193,9 +186,9 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro Platform::putEnv('COMPOSER_DEV_MODE', $this->devMode ? '1' : '0'); } - $this->eventDispatcher->dispatchScript(ScriptEvents::PRE_AUTOLOAD_DUMP, $this->devMode, array(), array( + $this->eventDispatcher->dispatchScript(ScriptEvents::PRE_AUTOLOAD_DUMP, $this->devMode, [], [ 'optimize' => $scanPsrPackages, - )); + ]); } $classMapGenerator = new ClassMapGenerator(['php', 'inc', 'hh']); @@ -257,7 +250,7 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro // Process the 'psr-0' base directories. foreach ($autoloads['psr-0'] as $namespace => $paths) { - $exportedPaths = array(); + $exportedPaths = []; foreach ($paths as $path) { $exportedPaths[] = $this->getPathCode($filesystem, $basePath, $vendorPath, $path); } @@ -269,7 +262,7 @@ public function dump(Config $config, InstalledRepositoryInterface $localRepo, Ro // Process the 'psr-4' base directories. foreach ($autoloads['psr-4'] as $namespace => $paths) { - $exportedPaths = array(); + $exportedPaths = []; foreach ($paths as $path) { $exportedPaths[] = $this->getPathCode($filesystem, $basePath, $vendorPath, $path); } @@ -322,12 +315,12 @@ public static function autoload(\$class) } if ($scanPsrPackages) { - $namespacesToScan = array(); + $namespacesToScan = []; // Scan the PSR-0/4 directories for class files, and add them to the class map - foreach (array('psr-4', 'psr-0') as $psrType) { + foreach (['psr-4', 'psr-0'] as $psrType) { foreach ($autoloads[$psrType] as $namespace => $paths) { - $namespacesToScan[$namespace][] = array('paths' => $paths, 'type' => $psrType); + $namespacesToScan[$namespace][] = ['paths' => $paths, 'type' => $psrType]; } } @@ -441,9 +434,9 @@ public static function autoload(\$class) $filesystem->safeCopy(__DIR__.'/../../../LICENSE', $targetDir.'/LICENSE'); if ($this->runScripts) { - $this->eventDispatcher->dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP, $this->devMode, array(), array( + $this->eventDispatcher->dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP, $this->devMode, [], [ 'optimize' => $scanPsrPackages, - )); + ]); } return $classMap; @@ -479,14 +472,13 @@ private function buildExclusionRegex(string $dir, ?array $excluded): ?string } /** - * @param InstallationManager $installationManager * @param PackageInterface[] $packages * @return array */ public function buildPackageMap(InstallationManager $installationManager, PackageInterface $rootPackage, array $packages) { // build package => install path map - $packageMap = array(array($rootPackage, '')); + $packageMap = [[$rootPackage, '']]; foreach ($packages as $package) { if ($package instanceof AliasPackage) { @@ -494,10 +486,10 @@ public function buildPackageMap(InstallationManager $installationManager, Packag } $this->validatePackage($package); - $packageMap[] = array( + $packageMap[] = [ $package, $installationManager->getInstallPath($package), - ); + ]; } return $packageMap; @@ -562,20 +554,19 @@ public function parseAutoloads(array $packageMap, PackageInterface $rootPackage, krsort($psr0); krsort($psr4); - return array( + return [ 'psr-0' => $psr0, 'psr-4' => $psr4, 'classmap' => $classmap, 'files' => $files, 'exclude-from-classmap' => $exclude, - ); + ]; } /** * Registers an autoloader based on an autoload-map returned by parseAutoloads * * @param array $autoloads see parseAutoloads return value - * @param null|string $vendorDir * @return ClassLoader */ public function createLoader(array $autoloads, ?string $vendorDir = null) @@ -619,18 +610,14 @@ public function createLoader(array $autoloads, ?string $vendorDir = null) /** * @param array $packageMap - * @param string $basePath - * @param string $vendorPath - * @param string $vendorPathCode - * @param string $appBaseDirCode * @return ?string */ protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem, string $basePath, string $vendorPath, string $vendorPathCode, string $appBaseDirCode) { - $includePaths = array(); + $includePaths = []; foreach ($packageMap as $item) { - list($package, $installPath) = $item; + [$package, $installPath] = $item; if (null !== $package->getTargetDir() && strlen($package->getTargetDir()) > 0) { $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); @@ -667,10 +654,6 @@ protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem /** * @param array $files - * @param string $basePath - * @param string $vendorPath - * @param string $vendorPathCode - * @param string $appBaseDirCode * @return ?string */ protected function getIncludeFilesFile(array $files, Filesystem $filesystem, string $basePath, string $vendorPath, string $vendorPathCode, string $appBaseDirCode) @@ -700,9 +683,6 @@ protected function getIncludeFilesFile(array $files, Filesystem $filesystem, str } /** - * @param string $basePath - * @param string $vendorPath - * @param string $path * @return string */ protected function getPathCode(Filesystem $filesystem, string $basePath, string $vendorPath, string $path) @@ -740,8 +720,8 @@ protected function getPathCode(Filesystem $filesystem, string $basePath, string protected function getPlatformCheck(array $packageMap, $checkPlatform, array $devPackageNames) { $lowestPhpVersion = Bound::zero(); - $requiredExtensions = array(); - $extensionProviders = array(); + $requiredExtensions = []; + $extensionProviders = []; foreach ($packageMap as $item) { $package = $item[0]; @@ -891,8 +871,6 @@ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $de } /** - * @param string $vendorPathToTargetDirCode - * @param string $suffix * @return string */ protected function getAutoloadFile(string $vendorPathToTargetDirCode, string $suffix) @@ -922,16 +900,9 @@ protected function getAutoloadFile(string $vendorPathToTargetDirCode, string $su } /** - * @param bool $useClassMap - * @param bool $useIncludePath - * @param null|string $targetDirLoader - * @param bool $useIncludeFiles * @param string $vendorPathCode unused in this method * @param string $appBaseDirCode unused in this method - * @param string $suffix - * @param bool $useGlobalIncludePath * @param string $prependAutoloader 'true'|'false' - * @param bool $checkPlatform * @return string */ protected function getAutoloadRealFile(bool $useClassMap, bool $useIncludePath, ?string $targetDirLoader, bool $useIncludeFiles, string $vendorPathCode, string $appBaseDirCode, string $suffix, bool $useGlobalIncludePath, string $prependAutoloader, bool $checkPlatform) @@ -1081,8 +1052,6 @@ function composerRequire$suffix(\$fileIdentifier, \$file) } /** - * @param string $suffix - * @param string $targetDir * @param string $vendorPath input for findShortestPathCode * @param string $basePath input for findShortestPathCode * @return string @@ -1134,9 +1103,9 @@ class ComposerStaticInit$suffix $prefix = "\0Composer\Autoload\ClassLoader\0"; $prefixLen = strlen($prefix); if (file_exists($targetDir . '/autoload_files.php')) { - $maps = array('files' => require $targetDir . '/autoload_files.php'); + $maps = ['files' => require $targetDir . '/autoload_files.php']; } else { - $maps = array(); + $maps = []; } foreach ((array) $loader as $prop => $value) { @@ -1148,12 +1117,12 @@ class ComposerStaticInit$suffix foreach ($maps as $prop => $value) { $value = strtr( var_export($value, true), - array( + [ $absoluteVendorPathCode => $vendorPathCode, $absoluteVendorPharPathCode => $vendorPharPathCode, $absoluteAppBaseDirCode => $appBaseDirCode, $absoluteAppBaseDirPharCode => $appBaseDirPharCode, - ) + ] ); $value = ltrim(Preg::replace('/^ */m', ' $0$0', $value)); @@ -1182,10 +1151,10 @@ public static function getInitializer(ClassLoader \$loader) */ protected function parseAutoloadsType(array $packageMap, string $type, RootPackageInterface $rootPackage) { - $autoloads = array(); + $autoloads = []; foreach ($packageMap as $item) { - list($package, $installPath) = $item; + [$package, $installPath] = $item; $autoload = $package->getAutoload(); if ($this->devMode && $package === $rootPackage) { @@ -1205,7 +1174,7 @@ protected function parseAutoloadsType(array $packageMap, string $type, RootPacka if (($type === 'files' || $type === 'classmap' || $type === 'exclude-from-classmap') && $package->getTargetDir() && !Filesystem::isReadable($installPath.'/'.$path)) { // remove target-dir from file paths of the root package if ($package === $rootPackage) { - $targetDir = str_replace('\\', '[\\\\/]', preg_quote(str_replace(array('/', '\\'), '', $package->getTargetDir()))); + $targetDir = str_replace('\\', '[\\\\/]', preg_quote(str_replace(['/', '\\'], '', $package->getTargetDir()))); $path = ltrim(Preg::replace('{^'.$targetDir.'}', '', ltrim($path, '\\/')), '\\/'); } else { // add target-dir from file paths that don't have it @@ -1218,7 +1187,7 @@ protected function parseAutoloadsType(array $packageMap, string $type, RootPacka $path = Preg::replace('{/+}', '/', preg_quote(trim(strtr($path, '\\', '/'), '/'))); // add support for wildcards * and ** - $path = strtr($path, array('\\*\\*' => '.+?', '\\*' => '[^/]+?')); + $path = strtr($path, ['\\*\\*' => '.+?', '\\*' => '[^/]+?']); // add support for up-level relative paths $updir = null; @@ -1266,7 +1235,6 @@ static function ($matches) use (&$updir): string { } /** - * @param string $path * @return string */ protected function getFileIdentifier(PackageInterface $package, string $path) @@ -1278,16 +1246,15 @@ protected function getFileIdentifier(PackageInterface $package, string $path) * Filters out dev-dependencies * * @param array $packageMap - * @param RootPackageInterface $rootPackage * @return array * * @phpstan-param array $packageMap */ protected function filterPackageMap(array $packageMap, RootPackageInterface $rootPackage) { - $packages = array(); - $include = array(); - $replacedBy = array(); + $packages = []; + $include = []; + $replacedBy = []; foreach ($packageMap as $item) { $package = $item[0]; @@ -1339,11 +1306,11 @@ static function ($item) use ($include): bool { */ protected function sortPackageMap(array $packageMap) { - $packages = array(); - $paths = array(); + $packages = []; + $paths = []; foreach ($packageMap as $item) { - list($package, $path) = $item; + [$package, $path] = $item; $name = $package->getName(); $packages[$name] = $package; $paths[$name] = $path; @@ -1351,11 +1318,11 @@ protected function sortPackageMap(array $packageMap) $sortedPackages = PackageSorter::sortPackages($packages); - $sortedPackageMap = array(); + $sortedPackageMap = []; foreach ($sortedPackages as $package) { $name = $package->getName(); - $sortedPackageMap[] = array($packages[$name], $paths[$name]); + $sortedPackageMap[] = [$packages[$name], $paths[$name]]; } return $sortedPackageMap; diff --git a/src/Composer/Autoload/ClassMapGenerator.php b/src/Composer/Autoload/ClassMapGenerator.php index 33dd0f324e41..316757fe9315 100644 --- a/src/Composer/Autoload/ClassMapGenerator.php +++ b/src/Composer/Autoload/ClassMapGenerator.php @@ -36,11 +36,10 @@ class ClassMapGenerator * * @param \Traversable|array $dirs Directories or a single path to search in * @param string $file The name of the class map file - * @return void */ public static function dump(iterable $dirs, string $file): void { - $maps = array(); + $maps = []; foreach ($dirs as $dir) { $maps = array_merge($maps, static::createMap($dir)); @@ -61,7 +60,7 @@ public static function dump(iterable $dirs, string $file): void * @return array A class map array * @throws \RuntimeException When the path is neither an existing file nor directory */ - public static function createMap($path, string $excluded = null, IOInterface $io = null, ?string $namespace = null, ?string $autoloadType = null, array &$scannedFiles = array()): array + public static function createMap($path, ?string $excluded = null, ?IOInterface $io = null, ?string $namespace = null, ?string $autoloadType = null, array &$scannedFiles = []): array { $generator = new \Composer\ClassMapGenerator\ClassMapGenerator(['php', 'inc', 'hh']); $fileList = new FileList(); diff --git a/src/Composer/Autoload/PhpFileCleaner.php b/src/Composer/Autoload/PhpFileCleaner.php index d6a840b6839f..0c00f878b9ad 100644 --- a/src/Composer/Autoload/PhpFileCleaner.php +++ b/src/Composer/Autoload/PhpFileCleaner.php @@ -49,25 +49,20 @@ class PhpFileCleaner /** * @param string[] $types - * @return void */ public static function setTypeConfig(array $types): void { foreach ($types as $type) { - self::$typeConfig[$type[0]] = array( + self::$typeConfig[$type[0]] = [ 'name' => $type, 'length' => \strlen($type), 'pattern' => '{.\b(?])'.$type.'\s++[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+}Ais', - ); + ]; } self::$restPattern = '{[^?"\'contents = $contents; @@ -75,9 +70,6 @@ public function __construct(string $contents, int $maxMatches) $this->maxMatches = $maxMatches; } - /** - * @return string - */ public function clean(): string { $clean = ''; @@ -149,9 +141,6 @@ public function clean(): string return $clean; } - /** - * @return void - */ private function skipToPhp(): void { while ($this->index < $this->len) { @@ -164,10 +153,6 @@ private function skipToPhp(): void } } - /** - * @param string $delimiter - * @return void - */ private function skipString(string $delimiter): void { $this->index += 1; @@ -184,9 +169,6 @@ private function skipString(string $delimiter): void } } - /** - * @return void - */ private function skipComment(): void { $this->index += 2; @@ -200,9 +182,6 @@ private function skipComment(): void } } - /** - * @return void - */ private function skipToNewline(): void { while ($this->index < $this->len) { @@ -213,10 +192,6 @@ private function skipToNewline(): void } } - /** - * @param string $delimiter - * @return void - */ private function skipHeredoc(string $delimiter): void { $firstDelimiterChar = $delimiter[0]; @@ -256,10 +231,6 @@ private function skipHeredoc(string $delimiter): void } } - /** - * @param string $char - * @return bool - */ private function peek(string $char): bool { return $this->index + 1 < $this->len && $this->contents[$this->index + 1] === $char; @@ -268,9 +239,8 @@ private function peek(string $char): bool /** * @param non-empty-string $regex * @param null|array $match - * @return bool */ - private function match($regex, array &$match = null): bool + private function match($regex, ?array &$match = null): bool { return Preg::isMatch($regex, $this->contents, $match, 0, $this->index); } diff --git a/src/Composer/Cache.php b/src/Composer/Cache.php index ccf990fca1f6..eddc402f2102 100644 --- a/src/Composer/Cache.php +++ b/src/Composer/Cache.php @@ -42,13 +42,12 @@ class Cache private $readOnly; /** - * @param IOInterface $io * @param string $cacheDir location of the cache * @param string $allowlist List of characters that are allowed in path names (used in a regex character class) * @param Filesystem $filesystem optional filesystem instance * @param bool $readOnly whether the cache is in readOnly mode */ - public function __construct(IOInterface $io, string $cacheDir, string $allowlist = 'a-z0-9.', Filesystem $filesystem = null, bool $readOnly = false) + public function __construct(IOInterface $io, string $cacheDir, string $allowlist = 'a-z0-9.', ?Filesystem $filesystem = null, bool $readOnly = false) { $this->io = $io; $this->root = rtrim($cacheDir, '/\\') . '/'; @@ -62,8 +61,6 @@ public function __construct(IOInterface $io, string $cacheDir, string $allowlist } /** - * @param bool $readOnly - * * @return void */ public function setReadOnly(bool $readOnly) @@ -80,8 +77,6 @@ public function isReadOnly() } /** - * @param string $path - * * @return bool */ public static function isUsable(string $path) @@ -121,8 +116,6 @@ public function getRoot() } /** - * @param string $file - * * @return string|false */ public function read(string $file) @@ -140,9 +133,6 @@ public function read(string $file) } /** - * @param string $file - * @param string $contents - * * @return bool */ public function write(string $file, string $contents) @@ -184,8 +174,6 @@ function_exists('disk_free_space') ? @disk_free_space(dirname($tempFileName)) : /** * Copy a file into the cache * - * @param string $file - * @param string $source * * @return bool */ @@ -210,8 +198,6 @@ public function copyFrom(string $file, string $source) /** * Copy a file out of the cache * - * @param string $file - * @param string $target * * @return bool */ @@ -259,8 +245,6 @@ public function gcIsNecessary() } /** - * @param string $file - * * @return bool */ public function remove(string $file) @@ -290,7 +274,6 @@ public function clear() } /** - * @param string $file * @return int|false * @phpstan-return int<0, max>|false */ @@ -307,9 +290,6 @@ public function getAge(string $file) } /** - * @param int $ttl - * @param int $maxSize - * * @return bool */ public function gc(int $ttl, int $maxSize) @@ -362,8 +342,6 @@ public function gcVcsCache(int $ttl): bool } /** - * @param string $file - * * @return string|false */ public function sha1(string $file) @@ -379,8 +357,6 @@ public function sha1(string $file) } /** - * @param string $file - * * @return string|false */ public function sha256(string $file) diff --git a/src/Composer/Command/AboutCommand.php b/src/Composer/Command/AboutCommand.php index 8568e3df1507..b4bd2296d8aa 100644 --- a/src/Composer/Command/AboutCommand.php +++ b/src/Composer/Command/AboutCommand.php @@ -21,9 +21,6 @@ */ class AboutCommand extends BaseCommand { - /** - * @return void - */ protected function configure(): void { $this diff --git a/src/Composer/Command/ArchiveCommand.php b/src/Composer/Command/ArchiveCommand.php index 63f684777ab0..a356cc50fb88 100644 --- a/src/Composer/Command/ArchiveCommand.php +++ b/src/Composer/Command/ArchiveCommand.php @@ -43,15 +43,12 @@ class ArchiveCommand extends BaseCommand private const FORMATS = ['tar', 'tar.gz', 'tar.bz2', 'zip']; - /** - * @return void - */ protected function configure(): void { $this ->setName('archive') ->setDescription('Creates an archive of this composer package') - ->setDefinition(array( + ->setDefinition([ new InputArgument('package', InputArgument::OPTIONAL, 'The package to archive instead of the current project', null, $this->suggestAvailablePackage()), new InputArgument('version', InputArgument::OPTIONAL, 'A version constraint to find the package to archive'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the resulting archive: tar, tar.gz, tar.bz2 or zip (default tar)', null, self::FORMATS), @@ -59,7 +56,7 @@ protected function configure(): void new InputOption('file', null, InputOption::VALUE_REQUIRED, 'Write the archive with the given file name.' .' Note that the format will be appended.'), new InputOption('ignore-filters', null, InputOption::VALUE_NONE, 'Ignore filters when saving package'), - )) + ]) ->setHelp( <<archive command creates an archive of the specified format @@ -150,9 +147,6 @@ protected function archive(IOInterface $io, Config $config, ?string $packageName } /** - * @param string $packageName - * @param string|null $version - * * @return (BasePackage&CompletePackageInterface)|false */ protected function selectPackage(IOInterface $io, string $packageName, ?string $version = null) @@ -161,7 +155,7 @@ protected function selectPackage(IOInterface $io, string $packageName, ?string $ if ($composer = $this->tryComposer()) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); - $repo = new CompositeRepository(array_merge(array($localRepo), $composer->getRepositoryManager()->getRepositories())); + $repo = new CompositeRepository(array_merge([$localRepo], $composer->getRepositoryManager()->getRepositories())); } else { $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $io->writeError('No composer.json found in the current directory, searching packages from ' . implode(', ', array_keys($defaultRepos))); diff --git a/src/Composer/Command/AuditCommand.php b/src/Composer/Command/AuditCommand.php index 497161ac701d..5a91a174326c 100644 --- a/src/Composer/Command/AuditCommand.php +++ b/src/Composer/Command/AuditCommand.php @@ -1,5 +1,15 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\Command; use Composer\Composer; @@ -19,11 +29,11 @@ protected function configure(): void $this ->setName('audit') ->setDescription('Checks for security vulnerability advisories for installed packages') - ->setDefinition(array( + ->setDefinition([ new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables auditing of require-dev packages.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Output format. Must be "table", "plain", "json", or "summary".', Auditor::FORMAT_TABLE, Auditor::FORMATS), new InputOption('locked', null, InputOption::VALUE_NONE, 'Audit based on the lock file instead of the installed packages.'), - )) + ]) ->setHelp( <<audit command checks for security vulnerability advisories for installed packages. @@ -43,6 +53,7 @@ protected function execute(InputInterface $input, OutputInterface $output) if (count($packages) === 0) { $this->getIO()->writeError('No packages - skipping audit.'); + return 0; } @@ -56,7 +67,6 @@ protected function execute(InputInterface $input, OutputInterface $output) } /** - * @param InputInterface $input * @return PackageInterface[] */ private function getPackages(Composer $composer, InputInterface $input): array @@ -66,11 +76,12 @@ private function getPackages(Composer $composer, InputInterface $input): array throw new \UnexpectedValueException('Valid composer.json and composer.lock files are required to run this command with --locked'); } $locker = $composer->getLocker(); + return $locker->getLockedRepository(!$input->getOption('no-dev'))->getPackages(); } $rootPkg = $composer->getPackage(); - $installedRepo = new InstalledRepository(array($composer->getRepositoryManager()->getLocalRepository())); + $installedRepo = new InstalledRepository([$composer->getRepositoryManager()->getLocalRepository()]); if ($input->getOption('no-dev')) { return RepositoryUtils::filterRequiredPackages($installedRepo->getPackages(), $rootPkg); diff --git a/src/Composer/Command/BaseCommand.php b/src/Composer/Command/BaseCommand.php index f5fa9797c934..b83fb00c4295 100644 --- a/src/Composer/Command/BaseCommand.php +++ b/src/Composer/Command/BaseCommand.php @@ -93,7 +93,7 @@ public function getComposer(bool $required = true, ?bool $disablePlugins = null, * @param bool|null $disableScripts If null, reads --no-scripts as default * @throws \RuntimeException */ - public function requireComposer(bool $disablePlugins = null, bool $disableScripts = null): Composer + public function requireComposer(?bool $disablePlugins = null, ?bool $disableScripts = null): Composer { if (null === $this->composer) { $application = parent::getApplication(); @@ -119,7 +119,7 @@ public function requireComposer(bool $disablePlugins = null, bool $disableScript * @param bool|null $disablePlugins If null, reads --no-plugins as default * @param bool|null $disableScripts If null, reads --no-scripts as default */ - public function tryComposer(bool $disablePlugins = null, bool $disableScripts = null): ?Composer + public function tryComposer(?bool $disablePlugins = null, ?bool $disableScripts = null): ?Composer { if (null === $this->composer) { $application = parent::getApplication(); @@ -239,7 +239,7 @@ protected function initialize(InputInterface $input, OutputInterface $output) $composer->getEventDispatcher()->dispatch($preCommandRunEvent->getName(), $preCommandRunEvent); } - if (true === $input->hasParameterOption(array('--no-ansi')) && $input->hasOption('no-progress')) { + if (true === $input->hasParameterOption(['--no-ansi']) && $input->hasOption('no-progress')) { $input->setOption('no-progress', true); } @@ -282,7 +282,6 @@ protected function initialize(InputInterface $input, OutputInterface $output) /** * Returns preferSource and preferDist values based on the configuration. * - * @param bool $keepVcsRequiresPreferSource * * @return bool[] An array composed of the preferSource and preferDist values */ @@ -336,7 +335,7 @@ protected function getPreferredInstallOptions(Config $config, InputInterface $in $preferDist = $input->getOption('prefer-dist'); } - return array($preferSource, $preferDist); + return [$preferSource, $preferDist]; } protected function getPlatformRequirementFilter(InputInterface $input): PlatformRequirementFilterInterface @@ -364,7 +363,7 @@ protected function getPlatformRequirementFilter(InputInterface $input): Platform */ protected function formatRequirements(array $requirements) { - $requires = array(); + $requires = []; $requirements = $this->normalizeRequirements($requirements); foreach ($requirements as $requirement) { if (!isset($requirement['version'])) { diff --git a/src/Composer/Command/BaseDependencyCommand.php b/src/Composer/Command/BaseDependencyCommand.php index 6bccf931db17..76a9c5fb646c 100644 --- a/src/Composer/Command/BaseDependencyCommand.php +++ b/src/Composer/Command/BaseDependencyCommand.php @@ -18,7 +18,6 @@ use Composer\Package\RootPackage; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\CompositeRepository; -use Composer\Repository\RepositoryInterface; use Composer\Repository\RootPackageRepository; use Composer\Repository\InstalledRepository; use Composer\Repository\PlatformRepository; @@ -77,19 +76,20 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo if (count($localRepo->getPackages()) === 0 && (count($rootPkg->getRequires()) > 0 || count($rootPkg->getDevRequires()) > 0)) { $output->writeln('No dependencies installed. Try running composer install or update, or use --locked.'); + return 1; } $repos[] = $localRepo; - $platformOverrides = $composer->getConfig()->get('platform') ?: array(); + $platformOverrides = $composer->getConfig()->get('platform') ?: []; $repos[] = new PlatformRepository([], $platformOverrides); } $installedRepo = new InstalledRepository($repos); // Parse package name and constraint - list($needle, $textConstraint) = array_pad( + [$needle, $textConstraint] = array_pad( explode(':', $input->getArgument(self::ARGUMENT_PACKAGE)), 2, $input->hasArgument(self::ARGUMENT_CONSTRAINT) ? $input->getArgument(self::ARGUMENT_CONSTRAINT) : '*' @@ -106,12 +106,12 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo if (!$installedRepo->findPackage($needle, $textConstraint)) { $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO(), $composer->getConfig(), $composer->getRepositoryManager())); if ($match = $defaultRepos->findPackage($needle, $textConstraint)) { - $installedRepo->addRepository(new InstalledArrayRepository(array(clone $match))); + $installedRepo->addRepository(new InstalledArrayRepository([clone $match])); } } // Include replaced packages for inverted lookups as they are then the actual starting point to consider - $needles = array($needle); + $needles = [$needle]; if ($inverted) { foreach ($packages as $package) { $needles = array_merge($needles, array_map(static function (Link $link): string { @@ -161,29 +161,27 @@ protected function doExecute(InputInterface $input, OutputInterface $output, boo * Assembles and prints a bottom-up table of the dependencies. * * @param array{PackageInterface, Link, mixed}[] $results - * - * @return void */ protected function printTable(OutputInterface $output, $results): void { - $table = array(); - $doubles = array(); + $table = []; + $doubles = []; do { - $queue = array(); - $rows = array(); + $queue = []; + $rows = []; foreach ($results as $result) { /** * @var PackageInterface $package * @var Link $link */ - list($package, $link, $children) = $result; + [$package, $link, $children] = $result; $unique = (string) $link; if (isset($doubles[$unique])) { continue; } $doubles[$unique] = true; $version = $package->getPrettyVersion() === RootPackage::DEFAULT_PRETTY_VERSION ? '-' : $package->getPrettyVersion(); - $rows[] = array($package->getPrettyName(), $version, $link->getDescription(), sprintf('%s (%s)', $link->getTarget(), $link->getPrettyConstraint())); + $rows[] = [$package->getPrettyName(), $version, $link->getDescription(), sprintf('%s (%s)', $link->getTarget(), $link->getPrettyConstraint())]; if ($children) { $queue = array_merge($queue, $children); } @@ -197,18 +195,16 @@ protected function printTable(OutputInterface $output, $results): void /** * Init styles for tree - * - * @return void */ protected function initStyles(OutputInterface $output): void { - $this->colors = array( + $this->colors = [ 'green', 'yellow', 'cyan', 'magenta', 'blue', - ); + ]; foreach ($this->colors as $color) { $style = new OutputFormatterStyle($color); @@ -222,15 +218,13 @@ protected function initStyles(OutputInterface $output): void * @param array{PackageInterface, Link, mixed[]|bool}[] $results Results to be printed at this level. * @param string $prefix Prefix of the current tree level. * @param int $level Current level of recursion. - * - * @return void */ protected function printTree(array $results, string $prefix = '', int $level = 1): void { $count = count($results); $idx = 0; foreach ($results as $result) { - list($package, $link, $children) = $result; + [$package, $link, $children] = $result; $color = $this->colors[$level % count($this->colors)]; $prevColor = $this->colors[($level - 1) % count($this->colors)]; @@ -246,16 +240,11 @@ protected function printTree(array $results, string $prefix = '', int $level = 1 } } - /** - * @param string $line - * - * @return void - */ private function writeTreeLine(string $line): void { $io = $this->getIO(); if (!$io->isDecorated()) { - $line = str_replace(array('└', '├', '──', '│'), array('`-', '|-', '-', '|'), $line); + $line = str_replace(['└', '├', '──', '│'], ['`-', '|-', '-', '|'], $line); } $io->write($line); diff --git a/src/Composer/Command/BumpCommand.php b/src/Composer/Command/BumpCommand.php index ae083ccf7005..d7ae3348846e 100644 --- a/src/Composer/Command/BumpCommand.php +++ b/src/Composer/Command/BumpCommand.php @@ -12,29 +12,18 @@ namespace Composer\Command; -use Composer\DependencyResolver\Request; use Composer\Package\AliasPackage; use Composer\Package\Locker; use Composer\Package\Version\VersionBumper; -use Composer\Package\Version\VersionSelector; use Composer\Util\Filesystem; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputArgument; use Composer\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Factory; -use Composer\Installer; -use Composer\Installer\InstallerEvents; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; -use Composer\Package\Version\VersionParser; -use Composer\Package\Loader\ArrayLoader; -use Composer\Package\BasePackage; -use Composer\Plugin\CommandEvent; -use Composer\Plugin\PluginEvents; -use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; -use Composer\IO\IOInterface; use Composer\Util\Silencer; /** @@ -52,11 +41,11 @@ protected function configure(): void $this ->setName('bump') ->setDescription('Increases the lower limit of your composer.json requirements to the currently installed versions') - ->setDefinition(array( + ->setDefinition([ new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name(s) to restrict which packages are bumped.', null, $this->suggestRootRequirement()), new InputOption('dev-only', 'D', InputOption::VALUE_NONE, 'Only bump requirements in "require-dev".'), new InputOption('no-dev-only', 'R', InputOption::VALUE_NONE, 'Only bump requirements in "require".'), - )) + ]) ->setHelp( <<bump command increases the lower limit of your composer.json requirements @@ -135,7 +124,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $tasks = []; if (!$input->getOption('no-dev-only')) { $tasks['require-dev'] = $composer->getPackage()->getDevRequires(); - }; + } if (!$input->getOption('dev-only')) { $tasks['require'] = $composer->getPackage()->getRequires(); } diff --git a/src/Composer/Command/CheckPlatformReqsCommand.php b/src/Composer/Command/CheckPlatformReqsCommand.php index d7108e91ddd8..5ac4d6594862 100644 --- a/src/Composer/Command/CheckPlatformReqsCommand.php +++ b/src/Composer/Command/CheckPlatformReqsCommand.php @@ -24,18 +24,15 @@ class CheckPlatformReqsCommand extends BaseCommand { - /** - * @return void - */ protected function configure(): void { $this->setName('check-platform-reqs') ->setDescription('Check that platform requirements are satisfied') - ->setDefinition(array( + ->setDefinition([ new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables checking of require-dev packages requirements.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Checks requirements only from the lock file, not from installed packages.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), - )) + ]) ->setHelp( <<requireComposer(); - $requires = array(); - $removePackages = array(); + $requires = []; + $removePackages = []; if ($input->getOption('lock')) { $this->getIO()->writeError('Checking '.($input->getOption('no-dev') ? 'non-dev ' : '').'platform requirements using the lock file'); $installedRepo = $composer->getLocker()->getLockedRepository(!$input->getOption('no-dev')); @@ -76,10 +73,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int } foreach ($requires as $require => $link) { - $requires[$require] = array($link); + $requires[$require] = [$link]; } - $installedRepo = new InstalledRepository(array($installedRepo, new RootPackageRepository(clone $composer->getPackage()))); + $installedRepo = new InstalledRepository([$installedRepo, new RootPackageRepository(clone $composer->getPackage())]); foreach ($installedRepo->getPackages() as $package) { if (in_array($package->getName(), $removePackages, true)) { continue; @@ -91,9 +88,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int ksort($requires); - $installedRepo->addRepository(new PlatformRepository(array(), array())); + $installedRepo->addRepository(new PlatformRepository([], [])); - $results = array(); + $results = []; $exitCode = 0; /** @@ -103,7 +100,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (PlatformRepository::isPlatformPackage($require)) { $candidates = $installedRepo->findPackagesWithReplacersAndProviders($require); if ($candidates) { - $reqResults = array(); + $reqResults = []; foreach ($candidates as $candidate) { $candidateConstraint = null; if ($candidate->getName() === $require) { @@ -125,26 +122,26 @@ protected function execute(InputInterface $input, OutputInterface $output): int foreach ($links as $link) { if (!$link->getConstraint()->matches($candidateConstraint)) { - $reqResults[] = array( + $reqResults[] = [ $candidate->getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), $link, 'failed', $candidate->getName() === $require ? '' : 'provided by '.$candidate->getPrettyName().'', - ); + ]; // skip to next candidate continue 2; } } - $results[] = array( + $results[] = [ $candidate->getName() === $require ? $candidate->getPrettyName() : $require, $candidateConstraint->getPrettyString(), null, 'success', $candidate->getName() === $require ? '' : 'provided by '.$candidate->getPrettyName().'', - ); + ]; // candidate matched, skip to next requirement continue 2; @@ -157,13 +154,13 @@ protected function execute(InputInterface $input, OutputInterface $output): int continue; } - $results[] = array( + $results[] = [ $require, 'n/a', $links[0], 'missing', '', - ); + ]; $exitCode = max($exitCode, 2); } @@ -176,20 +173,18 @@ protected function execute(InputInterface $input, OutputInterface $output): int /** * @param mixed[] $results - * - * @return void */ protected function printTable(OutputInterface $output, array $results, string $format): void { - $rows = array(); + $rows = []; foreach ($results as $result) { /** * @var Link|null $link */ - list($platformPackage, $version, $link, $status, $provider) = $result; + [$platformPackage, $version, $link, $status, $provider] = $result; if ('json' === $format) { - $rows[] = array( + $rows[] = [ "name" => $platformPackage, "version" => $version, "status" => strip_tags($status), @@ -200,15 +195,15 @@ protected function printTable(OutputInterface $output, array $results, string $f 'constraint' => $link->getPrettyConstraint(), ] : null, "provider" => $provider === '' ? null : strip_tags($provider), - ); + ]; } else { - $rows[] = array( + $rows[] = [ $platformPackage, $version, $link, $link ? sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', rtrim($status.' '.$provider), - ); + ]; } } diff --git a/src/Composer/Command/ClearCacheCommand.php b/src/Composer/Command/ClearCacheCommand.php index 98c8fbde1aa7..028aa4212639 100644 --- a/src/Composer/Command/ClearCacheCommand.php +++ b/src/Composer/Command/ClearCacheCommand.php @@ -23,18 +23,15 @@ */ class ClearCacheCommand extends BaseCommand { - /** - * @return void - */ protected function configure(): void { $this ->setName('clear-cache') - ->setAliases(array('clearcache', 'cc')) + ->setAliases(['clearcache', 'cc']) ->setDescription('Clears composer\'s internal package cache') - ->setDefinition(array( + ->setDefinition([ new InputOption('gc', null, InputOption::VALUE_NONE, 'Only run garbage collection, not a full cache clear'), - )) + ]) ->setHelp( <<clear-cache deletes all cached packages from composer's @@ -51,12 +48,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $config = Factory::createConfig(); $io = $this->getIO(); - $cachePaths = array( + $cachePaths = [ 'cache-vcs-dir' => $config->get('cache-vcs-dir'), 'cache-repo-dir' => $config->get('cache-repo-dir'), 'cache-files-dir' => $config->get('cache-files-dir'), 'cache-dir' => $config->get('cache-dir'), - ); + ]; foreach ($cachePaths as $key => $cachePath) { // only individual dirs get garbage collected @@ -83,7 +80,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($key === 'cache-files-dir') { $cache->gc($config->get('cache-files-ttl'), $config->get('cache-files-maxsize')); } elseif ($key === 'cache-repo-dir') { - $cache->gc($config->get('cache-ttl'), 1024*1024*1024 /* 1GB, this should almost never clear anything that is not outdated */); + $cache->gc($config->get('cache-ttl'), 1024 * 1024 * 1024 /* 1GB, this should almost never clear anything that is not outdated */); } elseif ($key === 'cache-vcs-dir') { $cache->gcVcsCache($config->get('cache-ttl')); } diff --git a/src/Composer/Command/CompletionTrait.php b/src/Composer/Command/CompletionTrait.php index 0aad31fe397e..1b936263ecad 100644 --- a/src/Composer/Command/CompletionTrait.php +++ b/src/Composer/Command/CompletionTrait.php @@ -33,7 +33,7 @@ trait CompletionTrait /** * @see BaseCommand::requireComposer() */ - abstract public function requireComposer(bool $disablePlugins = null, bool $disableScripts = null): Composer; + abstract public function requireComposer(?bool $disablePlugins = null, ?bool $disableScripts = null): Composer; /** * Suggestion values for "prefer-install" option @@ -80,9 +80,9 @@ private function suggestInstalledPackage(bool $includeRootPackage = true, bool $ $platformHint = []; if ($includePlatformPackages) { if ($locker->isLocked()) { - $platformRepo = new PlatformRepository(array(), $locker->getPlatformOverrides()); + $platformRepo = new PlatformRepository([], $locker->getPlatformOverrides()); } else { - $platformRepo = new PlatformRepository(array(), $composer->getConfig()->get('platform')); + $platformRepo = new PlatformRepository([], $composer->getConfig()->get('platform')); } if ($input->getCompletionValue() === '') { // to reduce noise, when no text is yet entered we list only two entries for ext- and lib- prefixes @@ -203,6 +203,7 @@ private function suggestPlatformPackage(): \Closure $repos = new PlatformRepository([], $this->requireComposer()->getConfig()->get('platform')); $pattern = BasePackage::packageNameToRegexp($input->getCompletionValue().'*'); + return array_filter(array_map(static function (PackageInterface $package) { return $package->getName(); }, $repos->getPackages()), static function (string $name) use ($pattern): bool { diff --git a/src/Composer/Command/ConfigCommand.php b/src/Composer/Command/ConfigCommand.php index f1fc6c3a176d..72c356b8b130 100644 --- a/src/Composer/Command/ConfigCommand.php +++ b/src/Composer/Command/ConfigCommand.php @@ -59,15 +59,12 @@ class ConfigCommand extends BaseCommand */ protected $authConfigSource; - /** - * @return void - */ protected function configure(): void { $this ->setName('config') ->setDescription('Sets config options') - ->setDefinition(array( + ->setDefinition([ new InputOption('global', 'g', InputOption::VALUE_NONE, 'Apply command to the global config file'), new InputOption('editor', 'e', InputOption::VALUE_NONE, 'Open editor'), new InputOption('auth', 'a', InputOption::VALUE_NONE, 'Affect auth config file (only used for --editor)'), @@ -81,7 +78,7 @@ protected function configure(): void new InputOption('source', null, InputOption::VALUE_NONE, 'Display where the config value is loaded from'), new InputArgument('setting-key', null, 'Setting key'), new InputArgument('setting-value', InputArgument::IS_ARRAY, 'Setting value'), - )) + ]) ->setHelp( <<getOption('global') && !$this->configFile->exists()) { touch($this->configFile->getPath()); - $this->configFile->write(array('config' => new \ArrayObject)); + $this->configFile->write(['config' => new \ArrayObject]); Silencer::call('chmod', $this->configFile->getPath(), 0600); } if ($input->getOption('global') && !$this->authConfigFile->exists()) { touch($this->authConfigFile->getPath()); - $this->authConfigFile->write(array('bitbucket-oauth' => new \ArrayObject, 'github-oauth' => new \ArrayObject, 'gitlab-oauth' => new \ArrayObject, 'gitlab-token' => new \ArrayObject, 'http-basic' => new \ArrayObject, 'bearer' => new \ArrayObject)); + $this->authConfigFile->write(['bitbucket-oauth' => new \ArrayObject, 'github-oauth' => new \ArrayObject, 'gitlab-oauth' => new \ArrayObject, 'gitlab-token' => new \ArrayObject, 'http-basic' => new \ArrayObject, 'bearer' => new \ArrayObject]); Silencer::call('chmod', $this->authConfigFile->getPath(), 0600); } @@ -219,7 +215,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (Platform::isWindows()) { $editor = 'notepad'; } else { - foreach (array('editor', 'vim', 'vi', 'nano', 'pico', 'ed') as $candidate) { + foreach (['editor', 'vim', 'vi', 'nano', 'pico', 'ed'] as $candidate) { if (exec('which '.$candidate)) { $editor = $candidate; break; @@ -238,7 +234,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (false === $input->getOption('global')) { $this->config->merge($this->configFile->read(), $this->configFile->getPath()); - $this->config->merge(array('config' => $this->authConfigFile->exists() ? $this->authConfigFile->read() : array()), $this->authConfigFile->getPath()); + $this->config->merge(['config' => $this->authConfigFile->exists() ? $this->authConfigFile->read() : []], $this->authConfigFile->getPath()); } // List the configuration of the file settings @@ -254,18 +250,18 @@ protected function execute(InputInterface $input, OutputInterface $output): int } // If the user enters in a config variable, parse it and save to file - if (array() !== $input->getArgument('setting-value') && $input->getOption('unset')) { + if ([] !== $input->getArgument('setting-value') && $input->getOption('unset')) { throw new \RuntimeException('You can not combine a setting value with --unset'); } // show the value if no value is provided - if (array() === $input->getArgument('setting-value') && !$input->getOption('unset')) { - $properties = array('name', 'type', 'description', 'homepage', 'version', 'minimum-stability', 'prefer-stable', 'keywords', 'license', 'extra'); + if ([] === $input->getArgument('setting-value') && !$input->getOption('unset')) { + $properties = ['name', 'type', 'description', 'homepage', 'version', 'minimum-stability', 'prefer-stable', 'keywords', 'license', 'extra']; $rawData = $this->configFile->read(); $data = $this->config->all(); if (Preg::isMatch('/^repos?(?:itories)?(?:\.(.+))?/', $settingKey, $matches)) { if (!isset($matches[1]) || $matches[1] === '') { - $value = $data['repositories'] ?? array(); + $value = $data['repositories'] ?? []; } else { if (!isset($data['repositories'][$matches[1]])) { throw new \InvalidArgumentException('There is no '.$matches[1].' repository defined'); @@ -321,36 +317,36 @@ protected function execute(InputInterface $input, OutputInterface $output): int $values = $input->getArgument('setting-value'); // what the user is trying to add/change $booleanValidator = static function ($val): bool { - return in_array($val, array('true', 'false', '1', '0'), true); + return in_array($val, ['true', 'false', '1', '0'], true); }; $booleanNormalizer = static function ($val): bool { return $val !== 'false' && (bool) $val; }; // handle config values - $uniqueConfigValues = array( - 'process-timeout' => array('is_numeric', 'intval'), - 'use-include-path' => array($booleanValidator, $booleanNormalizer), - 'use-github-api' => array($booleanValidator, $booleanNormalizer), - 'preferred-install' => array( + $uniqueConfigValues = [ + 'process-timeout' => ['is_numeric', 'intval'], + 'use-include-path' => [$booleanValidator, $booleanNormalizer], + 'use-github-api' => [$booleanValidator, $booleanNormalizer], + 'preferred-install' => [ static function ($val): bool { - return in_array($val, array('auto', 'source', 'dist'), true); + return in_array($val, ['auto', 'source', 'dist'], true); }, static function ($val) { return $val; }, - ), - 'gitlab-protocol' => array( + ], + 'gitlab-protocol' => [ static function ($val): bool { - return in_array($val, array('git', 'http', 'https'), true); + return in_array($val, ['git', 'http', 'https'], true); }, static function ($val) { return $val; }, - ), - 'store-auths' => array( + ], + 'store-auths' => [ static function ($val): bool { - return in_array($val, array('true', 'false', 'prompt'), true); + return in_array($val, ['true', 'false', 'prompt'], true); }, static function ($val) { if ('prompt' === $val) { @@ -359,56 +355,56 @@ static function ($val) { return $val !== 'false' && (bool) $val; }, - ), - 'notify-on-install' => array($booleanValidator, $booleanNormalizer), - 'vendor-dir' => array('is_string', static function ($val) { + ], + 'notify-on-install' => [$booleanValidator, $booleanNormalizer], + 'vendor-dir' => ['is_string', static function ($val) { return $val; - }), - 'bin-dir' => array('is_string', static function ($val) { + }], + 'bin-dir' => ['is_string', static function ($val) { return $val; - }), - 'archive-dir' => array('is_string', static function ($val) { + }], + 'archive-dir' => ['is_string', static function ($val) { return $val; - }), - 'archive-format' => array('is_string', static function ($val) { + }], + 'archive-format' => ['is_string', static function ($val) { return $val; - }), - 'data-dir' => array('is_string', static function ($val) { + }], + 'data-dir' => ['is_string', static function ($val) { return $val; - }), - 'cache-dir' => array('is_string', static function ($val) { + }], + 'cache-dir' => ['is_string', static function ($val) { return $val; - }), - 'cache-files-dir' => array('is_string', static function ($val) { + }], + 'cache-files-dir' => ['is_string', static function ($val) { return $val; - }), - 'cache-repo-dir' => array('is_string', static function ($val) { + }], + 'cache-repo-dir' => ['is_string', static function ($val) { return $val; - }), - 'cache-vcs-dir' => array('is_string', static function ($val) { + }], + 'cache-vcs-dir' => ['is_string', static function ($val) { return $val; - }), - 'cache-ttl' => array('is_numeric', 'intval'), - 'cache-files-ttl' => array('is_numeric', 'intval'), - 'cache-files-maxsize' => array( + }], + 'cache-ttl' => ['is_numeric', 'intval'], + 'cache-files-ttl' => ['is_numeric', 'intval'], + 'cache-files-maxsize' => [ static function ($val): bool { return Preg::isMatch('/^\s*([0-9.]+)\s*(?:([kmg])(?:i?b)?)?\s*$/i', $val); }, static function ($val) { return $val; }, - ), - 'bin-compat' => array( + ], + 'bin-compat' => [ static function ($val): bool { - return in_array($val, array('auto', 'full', 'symlink')); + return in_array($val, ['auto', 'full', 'symlink']); }, static function ($val) { return $val; }, - ), - 'discard-changes' => array( + ], + 'discard-changes' => [ static function ($val): bool { - return in_array($val, array('stash', 'true', 'false', '1', '0'), true); + return in_array($val, ['stash', 'true', 'false', '1', '0'], true); }, static function ($val) { if ('stash' === $val) { @@ -417,40 +413,40 @@ static function ($val) { return $val !== 'false' && (bool) $val; }, - ), - 'autoloader-suffix' => array('is_string', static function ($val) { + ], + 'autoloader-suffix' => ['is_string', static function ($val) { return $val === 'null' ? null : $val; - }), - 'sort-packages' => array($booleanValidator, $booleanNormalizer), - 'optimize-autoloader' => array($booleanValidator, $booleanNormalizer), - 'classmap-authoritative' => array($booleanValidator, $booleanNormalizer), - 'apcu-autoloader' => array($booleanValidator, $booleanNormalizer), - 'prepend-autoloader' => array($booleanValidator, $booleanNormalizer), - 'disable-tls' => array($booleanValidator, $booleanNormalizer), - 'secure-http' => array($booleanValidator, $booleanNormalizer), - 'cafile' => array( + }], + 'sort-packages' => [$booleanValidator, $booleanNormalizer], + 'optimize-autoloader' => [$booleanValidator, $booleanNormalizer], + 'classmap-authoritative' => [$booleanValidator, $booleanNormalizer], + 'apcu-autoloader' => [$booleanValidator, $booleanNormalizer], + 'prepend-autoloader' => [$booleanValidator, $booleanNormalizer], + 'disable-tls' => [$booleanValidator, $booleanNormalizer], + 'secure-http' => [$booleanValidator, $booleanNormalizer], + 'cafile' => [ static function ($val): bool { return file_exists($val) && Filesystem::isReadable($val); }, static function ($val) { return $val === 'null' ? null : $val; }, - ), - 'capath' => array( + ], + 'capath' => [ static function ($val): bool { return is_dir($val) && Filesystem::isReadable($val); }, static function ($val) { return $val === 'null' ? null : $val; }, - ), - 'github-expose-hostname' => array($booleanValidator, $booleanNormalizer), - 'htaccess-protect' => array($booleanValidator, $booleanNormalizer), - 'lock' => array($booleanValidator, $booleanNormalizer), - 'allow-plugins' => array($booleanValidator, $booleanNormalizer), - 'platform-check' => array( + ], + 'github-expose-hostname' => [$booleanValidator, $booleanNormalizer], + 'htaccess-protect' => [$booleanValidator, $booleanNormalizer], + 'lock' => [$booleanValidator, $booleanNormalizer], + 'allow-plugins' => [$booleanValidator, $booleanNormalizer], + 'platform-check' => [ static function ($val): bool { - return in_array($val, array('php-only', 'true', 'false', '1', '0'), true); + return in_array($val, ['php-only', 'true', 'false', '1', '0'], true); }, static function ($val) { if ('php-only' === $val) { @@ -459,10 +455,10 @@ static function ($val) { return $val !== 'false' && (bool) $val; }, - ), - 'use-parent-dir' => array( + ], + 'use-parent-dir' => [ static function ($val): bool { - return in_array($val, array('true', 'false', 'prompt'), true); + return in_array($val, ['true', 'false', 'prompt'], true); }, static function ($val) { if ('prompt' === $val) { @@ -471,17 +467,17 @@ static function ($val) { return $val !== 'false' && (bool) $val; }, - ), - ); - $multiConfigValues = array( - 'github-protocols' => array( + ], + ]; + $multiConfigValues = [ + 'github-protocols' => [ static function ($vals) { if (!is_array($vals)) { return 'array expected'; } foreach ($vals as $val) { - if (!in_array($val, array('git', 'https', 'ssh'))) { + if (!in_array($val, ['git', 'https', 'ssh'])) { return 'valid protocols include: git, https, ssh'; } } @@ -491,8 +487,8 @@ static function ($vals) { static function ($vals) { return $vals; }, - ), - 'github-domains' => array( + ], + 'github-domains' => [ static function ($vals) { if (!is_array($vals)) { return 'array expected'; @@ -503,8 +499,8 @@ static function ($vals) { static function ($vals) { return $vals; }, - ), - 'gitlab-domains' => array( + ], + 'gitlab-domains' => [ static function ($vals) { if (!is_array($vals)) { return 'array expected'; @@ -515,8 +511,8 @@ static function ($vals) { static function ($vals) { return $vals; }, - ), - ); + ], + ]; if ($input->getOption('unset') && (isset($uniqueConfigValues[$settingKey]) || isset($multiConfigValues[$settingKey]))) { if ($settingKey === 'disable-tls' && $this->config->get('disable-tls')) { @@ -545,7 +541,7 @@ static function ($vals) { return 0; } - list($validator) = $uniqueConfigValues['preferred-install']; + [$validator] = $uniqueConfigValues['preferred-install']; if (!$validator($values[0])) { throw new \RuntimeException('Invalid value for '.$settingKey.'. Should be one of: auto, source, or dist'); } @@ -578,34 +574,34 @@ static function ($vals) { } // handle properties - $uniqueProps = array( - 'name' => array('is_string', static function ($val) { + $uniqueProps = [ + 'name' => ['is_string', static function ($val) { return $val; - }), - 'type' => array('is_string', static function ($val) { + }], + 'type' => ['is_string', static function ($val) { return $val; - }), - 'description' => array('is_string', static function ($val) { + }], + 'description' => ['is_string', static function ($val) { return $val; - }), - 'homepage' => array('is_string', static function ($val) { + }], + 'homepage' => ['is_string', static function ($val) { return $val; - }), - 'version' => array('is_string', static function ($val) { + }], + 'version' => ['is_string', static function ($val) { return $val; - }), - 'minimum-stability' => array( + }], + 'minimum-stability' => [ static function ($val): bool { return isset(BasePackage::$stabilities[VersionParser::normalizeStability($val)]); }, static function ($val): string { return VersionParser::normalizeStability($val); }, - ), - 'prefer-stable' => array($booleanValidator, $booleanNormalizer), - ); - $multiProps = array( - 'keywords' => array( + ], + 'prefer-stable' => [$booleanValidator, $booleanNormalizer], + ]; + $multiProps = [ + 'keywords' => [ static function ($vals) { if (!is_array($vals)) { return 'array expected'; @@ -616,8 +612,8 @@ static function ($vals) { static function ($vals) { return $vals; }, - ), - 'license' => array( + ], + 'license' => [ static function ($vals) { if (!is_array($vals)) { return 'array expected'; @@ -628,8 +624,8 @@ static function ($vals) { static function ($vals) { return $vals; }, - ), - ); + ], + ]; if ($input->getOption('global') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]) || strpos($settingKey, 'extra.') === 0)) { throw new \InvalidArgumentException('The ' . $settingKey . ' property can not be set in the global config.json file. Use `composer global config` to apply changes to the global composer.json'); @@ -659,10 +655,10 @@ static function ($vals) { } if (2 === count($values)) { - $this->configSource->addRepository($matches[1], array( + $this->configSource->addRepository($matches[1], [ 'type' => $values[0], 'url' => $values[1], - ), $input->getOption('append')); + ], $input->getOption('append')); return 0; } @@ -727,7 +723,7 @@ static function ($vals) { } // handle unsetting extra/suggest - if (in_array($settingKey, array('suggest', 'extra'), true) && $input->getOption('unset')) { + if (in_array($settingKey, ['suggest', 'extra'], true) && $input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; @@ -767,11 +763,11 @@ static function ($vals) { throw new \RuntimeException('Expected two arguments (consumer-key, consumer-secret), got '.count($values)); } $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); - $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], array('consumer-key' => $values[0], 'consumer-secret' => $values[1])); + $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], ['consumer-key' => $values[0], 'consumer-secret' => $values[1]]); } elseif ($matches[1] === 'gitlab-token' && 2 === count($values)) { $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); - $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], array('username' => $values[0], 'token' => $values[1])); - } elseif (in_array($matches[1], array('github-oauth', 'gitlab-oauth', 'gitlab-token', 'bearer'), true)) { + $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], ['username' => $values[0], 'token' => $values[1]]); + } elseif (in_array($matches[1], ['github-oauth', 'gitlab-oauth', 'gitlab-token', 'bearer'], true)) { if (1 !== count($values)) { throw new \RuntimeException('Too many arguments, expected only one token'); } @@ -782,7 +778,7 @@ static function ($vals) { throw new \RuntimeException('Expected two arguments (username, password), got '.count($values)); } $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); - $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], array('username' => $values[0], 'password' => $values[1])); + $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], ['username' => $values[0], 'password' => $values[1]]); } return 0; @@ -812,16 +808,12 @@ static function ($vals) { } /** - * @param string $key * @param array{callable, callable} $callbacks Validator and normalizer callbacks * @param array $values - * @param string $method - * - * @return void */ protected function handleSingleValue(string $key, array $callbacks, array $values, string $method): void { - list($validator, $normalizer) = $callbacks; + [$validator, $normalizer] = $callbacks; if (1 !== count($values)) { throw new \RuntimeException('You can only pass one value. Example: php composer.phar config process-timeout 300'); } @@ -843,20 +835,16 @@ protected function handleSingleValue(string $key, array $callbacks, array $value } } - call_user_func(array($this->configSource, $method), $key, $normalizedValue); + call_user_func([$this->configSource, $method], $key, $normalizedValue); } /** - * @param string $key * @param array{callable, callable} $callbacks Validator and normalizer callbacks * @param array $values - * @param string $method - * - * @return void */ protected function handleMultiValue(string $key, array $callbacks, array $values, string $method): void { - list($validator, $normalizer) = $callbacks; + [$validator, $normalizer] = $callbacks; if (true !== $validation = $validator($values)) { throw new \RuntimeException(sprintf( '%s is an invalid value'.($validation ? ' ('.$validation.')' : ''), @@ -864,7 +852,7 @@ protected function handleMultiValue(string $key, array $callbacks, array $values )); } - call_user_func(array($this->configSource, $method), $key, $normalizer($values)); + call_user_func([$this->configSource, $method], $key, $normalizer($values)); } /** @@ -872,17 +860,13 @@ protected function handleMultiValue(string $key, array $callbacks, array $values * * @param array $contents * @param array $rawContents - * @param string|null $k - * @param bool $showSource - * - * @return void */ protected function listConfiguration(array $contents, array $rawContents, OutputInterface $output, ?string $k = null, bool $showSource = false): void { $origK = $k; $io = $this->getIO(); foreach ($contents as $key => $value) { - if ($k === null && !in_array($key, array('config', 'repositories'))) { + if ($k === null && !in_array($key, ['config', 'repositories'])) { continue; } diff --git a/src/Composer/Command/CreateProjectCommand.php b/src/Composer/Command/CreateProjectCommand.php index d34cd4225de2..c084feaa0b94 100644 --- a/src/Composer/Command/CreateProjectCommand.php +++ b/src/Composer/Command/CreateProjectCommand.php @@ -65,15 +65,12 @@ class CreateProjectCommand extends BaseCommand */ protected $suggestedPackagesReporter; - /** - * @return void - */ protected function configure(): void { $this ->setName('create-project') ->setDescription('Creates new project from a package into given directory') - ->setDefinition(array( + ->setDefinition([ new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed', null, $this->suggestAvailablePackage()), new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'), new InputArgument('version', InputArgument::OPTIONAL, 'Version, will default to latest'), @@ -98,7 +95,7 @@ protected function configure(): void new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('ask', null, InputOption::VALUE_NONE, 'Whether to ask for project directory.'), - )) + ]) ->setHelp( <<create-project command creates a new project from a given @@ -134,7 +131,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $config = Factory::createConfig(); $io = $this->getIO(); - list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input, true); + [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input, true); if ($input->getOption('dev')) { $io->writeError('You are using the deprecated option "dev". Dev packages are installed by default now.'); @@ -176,25 +173,11 @@ protected function execute(InputInterface $input, OutputInterface $output): int } /** - * @param string|null $packageName - * @param string|null $directory - * @param string|null $packageVersion - * @param string|null $stability - * @param bool $preferSource - * @param bool $preferDist - * @param bool $installDevPackages * @param string|array|null $repositories - * @param bool $disablePlugins - * @param bool $disableScripts - * @param bool $noProgress - * @param bool $noInstall - * @param bool $secureHttp - * @param bool $addRepository * - * @return int * @throws \Exception */ - public function installProject(IOInterface $io, Config $config, InputInterface $input, ?string $packageName = null, ?string $directory = null, ?string $packageVersion = null, ?string $stability = 'stable', bool $preferSource = false, bool $preferDist = false, bool $installDevPackages = false, $repositories = null, bool $disablePlugins = false, bool $disableScripts = false, bool $noProgress = false, bool $noInstall = false, PlatformRequirementFilterInterface $platformRequirementFilter = null, bool $secureHttp = true, bool $addRepository = false): int + public function installProject(IOInterface $io, Config $config, InputInterface $input, ?string $packageName = null, ?string $directory = null, ?string $packageVersion = null, ?string $stability = 'stable', bool $preferSource = false, bool $preferDist = false, bool $installDevPackages = false, $repositories = null, bool $disablePlugins = false, bool $disableScripts = false, bool $noProgress = false, bool $noInstall = false, ?PlatformRequirementFilterInterface $platformRequirementFilter = null, bool $secureHttp = true, bool $addRepository = false): int { $oldCwd = Platform::getCwd(); @@ -230,8 +213,8 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ $configSource = new JsonConfigSource(new JsonFile('composer.json')); if ( - (isset($repoConfig['packagist']) && $repoConfig === array('packagist' => false)) - || (isset($repoConfig['packagist.org']) && $repoConfig === array('packagist.org' => false)) + (isset($repoConfig['packagist']) && $repoConfig === ['packagist' => false]) + || (isset($repoConfig['packagist.org']) && $repoConfig === ['packagist.org' => false]) ) { $configSource->addRepository('packagist.org', false); } else { @@ -250,7 +233,7 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ // use the new config including the newly installed project $config = $composer->getConfig(); - list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); + [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); // install dependencies of the created project if ($noInstall === false) { @@ -300,7 +283,7 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ ) { $finder = new Finder(); $finder->depth(0)->directories()->in(Platform::getCwd())->ignoreVCS(false)->ignoreDotFiles(false); - foreach (array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg', '.fslckout', '_FOSSIL_') as $vcsName) { + foreach (['.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg', '.fslckout', '_FOSSIL_'] as $vcsName) { $finder->name($vcsName); } @@ -349,30 +332,18 @@ public function installProject(IOInterface $io, Config $config, InputInterface $ } /** - * @param string $packageName - * @param string|null $directory - * @param string|null $packageVersion - * @param string|null $stability - * @param bool $preferSource - * @param bool $preferDist - * @param bool $installDevPackages * @param array|null $repositories - * @param bool $disablePlugins - * @param bool $disableScripts - * @param bool $noProgress - * @param bool $secureHttp * - * @return bool * @throws \Exception */ - protected function installRootPackage(IOInterface $io, Config $config, string $packageName, PlatformRequirementFilterInterface $platformRequirementFilter, ?string $directory = null, ?string $packageVersion = null, ?string $stability = 'stable', bool $preferSource = false, bool $preferDist = false, bool $installDevPackages = false, array $repositories = null, bool $disablePlugins = false, bool $disableScripts = false, bool $noProgress = false, bool $secureHttp = true): bool + protected function installRootPackage(IOInterface $io, Config $config, string $packageName, PlatformRequirementFilterInterface $platformRequirementFilter, ?string $directory = null, ?string $packageVersion = null, ?string $stability = 'stable', bool $preferSource = false, bool $preferDist = false, bool $installDevPackages = false, ?array $repositories = null, bool $disablePlugins = false, bool $disableScripts = false, bool $noProgress = false, bool $secureHttp = true): bool { if (!$secureHttp) { - $config->merge(array('config' => array('secure-http' => false)), Config::SOURCE_COMMAND); + $config->merge(['config' => ['secure-http' => false]], Config::SOURCE_COMMAND); } $parser = new VersionParser(); - $requirements = $parser->parseNameVersionPairs(array($packageName)); + $requirements = $parser->parseNameVersionPairs([$packageName]); $name = strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; @@ -428,8 +399,8 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p foreach ($repositories as $repo) { $repoConfig = RepositoryFactory::configFromString($io, $config, $repo, true); if ( - (isset($repoConfig['packagist']) && $repoConfig === array('packagist' => false)) - || (isset($repoConfig['packagist.org']) && $repoConfig === array('packagist.org' => false)) + (isset($repoConfig['packagist']) && $repoConfig === ['packagist' => false]) + || (isset($repoConfig['packagist.org']) && $repoConfig === ['packagist.org' => false]) ) { continue; } @@ -438,7 +409,7 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p } $platformOverrides = $config->get('platform'); - $platformRepo = new PlatformRepository(array(), $platformOverrides); + $platformRepo = new PlatformRepository([], $platformOverrides); // find the latest version if there are multiple $versionSelector = new VersionSelector($repositorySet, $platformRepo); @@ -487,7 +458,7 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p $im = $composer->getInstallationManager(); $im->setOutputProgress(!$noProgress); $im->addInstaller($projectInstaller); - $im->execute(new InstalledArrayRepository(), array(new InstallOperation($package))); + $im->execute(new InstalledArrayRepository(), [new InstallOperation($package)]); $im->notifyInstalls($io); // collect suggestions diff --git a/src/Composer/Command/DependsCommand.php b/src/Composer/Command/DependsCommand.php index 17425fb895f4..ea0b0eab628b 100644 --- a/src/Composer/Command/DependsCommand.php +++ b/src/Composer/Command/DependsCommand.php @@ -26,21 +26,19 @@ class DependsCommand extends BaseDependencyCommand /** * Configure command metadata. - * - * @return void */ protected function configure(): void { $this ->setName('depends') - ->setAliases(array('why')) + ->setAliases(['why']) ->setDescription('Shows which packages cause the given package to be installed') - ->setDefinition(array( + ->setDefinition([ new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestInstalledPackage(true, true)), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Read dependency information from composer.lock'), - )) + ]) ->setHelp( <<merge(array('config' => array('secure-http' => false)), Config::SOURCE_COMMAND); + $config->merge(['config' => ['secure-http' => false]], Config::SOURCE_COMMAND); $config->prohibitUrlByConfig('http://repo.packagist.org', new NullIO); $this->httpDownloader = Factory::createHttpDownloader($io, $config); @@ -162,8 +159,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $io->write(sprintf('Composer version: %s', Composer::getVersion())); - $platformOverrides = $config->get('platform') ?: array(); - $platformRepo = new PlatformRepository(array(), $platformOverrides); + $platformOverrides = $config->get('platform') ?: []; + $platformRepo = new PlatformRepository([], $platformOverrides); $phpPkg = $platformRepo->findPackage('php', '*'); $phpVersion = $phpPkg->getPrettyVersion(); if ($phpPkg instanceof CompletePackageInterface && false !== strpos($phpPkg->getDescription(), 'overridden')) { @@ -182,7 +179,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $finder = new ExecutableFinder; $hasSystemUnzip = (bool) $finder->find('unzip'); $bin7zip = ''; - if ($hasSystem7zip = (bool) $finder->find('7z', null, array('C:\Program Files\7-Zip'))) { + if ($hasSystem7zip = (bool) $finder->find('7z', null, ['C:\Program Files\7-Zip'])) { $bin7zip = '7z'; } if (!Platform::isWindows() && !$hasSystem7zip && $hasSystem7zip = (bool) $finder->find('7zz')) { @@ -205,13 +202,13 @@ protected function execute(InputInterface $input, OutputInterface $output) private function checkComposerSchema() { $validator = new ConfigValidator($this->getIO()); - list($errors, , $warnings) = $validator->validate(Factory::getComposerFile()); + [$errors, , $warnings] = $validator->validate(Factory::getComposerFile()); if ($errors || $warnings) { - $messages = array( + $messages = [ 'error' => $errors, 'warning' => $warnings, - ); + ]; $output = ''; foreach ($messages as $style => $msgs) { @@ -250,8 +247,6 @@ private function checkGit(): string } /** - * @param string $proto - * * @return string|string[]|true */ private function checkHttp(string $proto, Config $config) @@ -261,7 +256,7 @@ private function checkHttp(string $proto, Config $config) return $result; } - $result = array(); + $result = []; if ($proto === 'https' && $config->get('disable-tls') === true) { $tlsWarning = 'Composer is configured to disable SSL/TLS protection. This will leave remote HTTPS requests vulnerable to Man-In-The-Middle attacks.'; } @@ -319,9 +314,6 @@ private function checkHttpProxy() } /** - * @param string $domain - * @param string $token - * * @return string|true|\Exception */ private function checkGithubOauth(string $domain, string $token) @@ -335,9 +327,9 @@ private function checkGithubOauth(string $domain, string $token) try { $url = $domain === 'github.com' ? 'https://api.'.$domain.'/' : 'https://'.$domain.'/api/v3/'; - $this->httpDownloader->get($url, array( + $this->httpDownloader->get($url, [ 'retry-auth-failure' => false, - )); + ]); return true; } catch (\Exception $e) { @@ -350,12 +342,11 @@ private function checkGithubOauth(string $domain, string $token) } /** - * @param string $domain * @param string $token * @throws TransportException * @return mixed|string */ - private function getGithubRateLimit(string $domain, string $token = null) + private function getGithubRateLimit(string $domain, ?string $token = null) { $result = $this->checkConnectivity(); if ($result !== true) { @@ -367,7 +358,7 @@ private function getGithubRateLimit(string $domain, string $token = null) } $url = $domain === 'github.com' ? 'https://api.'.$domain.'/rate_limit' : 'https://'.$domain.'/api/rate_limit'; - $data = $this->httpDownloader->get($url, array('retry-auth-failure' => false))->decodeJson(); + $data = $this->httpDownloader->get($url, ['retry-auth-failure' => false])->decodeJson(); return $data['resources']['core']; } @@ -397,7 +388,7 @@ private function checkDiskSpace(Config $config) private function checkPubKeys(Config $config) { $home = $config->get('home'); - $errors = array(); + $errors = []; $io = $this->getIO(); if (file_exists($home.'/keys.tags.pub') && file_exists($home.'/keys.dev.pub')) { @@ -447,9 +438,6 @@ private function checkVersion(Config $config) return true; } - /** - * @return string - */ private function getCurlVersion(): string { if (extension_loaded('curl')) { @@ -469,8 +457,6 @@ private function getCurlVersion(): string /** * @param bool|string|string[]|\Exception $result - * - * @return void */ private function outputResult($result): void { @@ -492,7 +478,7 @@ private function outputResult($result): void $hadError = true; } else { if (!is_array($result)) { - $result = array($result); + $result = [$result]; } foreach ($result as $message) { if (false !== strpos($message, '')) { @@ -529,8 +515,8 @@ private function checkPlatform() }; // code below taken from getcomposer.org/installer, any changes should be made there and replicated here - $errors = array(); - $warnings = array(); + $errors = []; + $warnings = []; $displayIniMessage = false; $iniMessage = PHP_EOL.PHP_EOL.IniHelper::getMessage(); diff --git a/src/Composer/Command/DumpAutoloadCommand.php b/src/Composer/Command/DumpAutoloadCommand.php index 23a7e278289b..c53c966a653b 100644 --- a/src/Composer/Command/DumpAutoloadCommand.php +++ b/src/Composer/Command/DumpAutoloadCommand.php @@ -30,9 +30,9 @@ protected function configure() { $this ->setName('dump-autoload') - ->setAliases(array('dumpautoload')) + ->setAliases(['dumpautoload']) ->setDescription('Dumps the autoloader') - ->setDefinition(array( + ->setDefinition([ new InputOption('optimize', 'o', InputOption::VALUE_NONE, 'Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize`.'), new InputOption('apcu', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), @@ -42,7 +42,7 @@ protected function configure() new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputOption('strict-psr', null, InputOption::VALUE_NONE, 'Return a failed status code (1) if PSR-4 or PSR-0 mapping errors are present. Requires --optimize to work.'), - )) + ]) ->setHelp( <<php composer.phar dump-autoload diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index 3d18d3d52e1d..abaa1aff358d 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -30,7 +30,7 @@ protected function configure() $this ->setName('exec') ->setDescription('Executes a vendored binary/script') - ->setDefinition(array( + ->setDefinition([ new InputOption('list', 'l', InputOption::VALUE_NONE), new InputArgument('binary', InputArgument::OPTIONAL, 'The binary to run, e.g. phpunit', null, function () { return $this->getBinaries(false); @@ -40,7 +40,7 @@ protected function configure() InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Arguments to pass to the binary. Use -- to separate from composer arguments' ), - )) + ]) ->setHelp( <<setName('fund') ->setDescription('Discover how to help fund the maintenance of your dependencies') - ->setDefinition(array( + ->setDefinition([ new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['text', 'json']), - )) + ]) ; } @@ -49,9 +46,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int $repo = $composer->getRepositoryManager()->getLocalRepository(); $remoteRepos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); - $fundings = array(); + $fundings = []; - $packagesToLoad = array(); + $packagesToLoad = []; foreach ($repo->getPackages() as $package) { if ($package instanceof AliasPackage) { continue; @@ -60,7 +57,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int } // load all packages dev versions in parallel - $result = $remoteRepos->loadPackages($packagesToLoad, array('dev' => BasePackage::STABILITY_DEV), array()); + $result = $remoteRepos->loadPackages($packagesToLoad, ['dev' => BasePackage::STABILITY_DEV], []); // collect funding data from default branches foreach ($result['packages'] as $package) { @@ -92,7 +89,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $io = $this->getIO(); $format = $input->getOption('format'); - if (!in_array($format, array('text', 'json'))) { + if (!in_array($format, ['text', 'json'])) { $io->writeError(sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; @@ -137,7 +134,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int private function insertFundingData(array $fundings, CompletePackageInterface $package): array { foreach ($package->getFunding() as $fundingOption) { - list($vendor, $packageName) = explode('/', $package->getPrettyName()); + [$vendor, $packageName] = explode('/', $package->getPrettyName()); // ignore malformed funding entries if (empty($fundingOption['url'])) { continue; diff --git a/src/Composer/Command/GlobalCommand.php b/src/Composer/Command/GlobalCommand.php index 8fc6ba9bbd2f..1d8996624f45 100644 --- a/src/Composer/Command/GlobalCommand.php +++ b/src/Composer/Command/GlobalCommand.php @@ -51,18 +51,15 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti } } - /** - * @return void - */ protected function configure(): void { $this ->setName('global') ->setDescription('Allows running commands in the global composer dir ($COMPOSER_HOME)') - ->setDefinition(array( + ->setDefinition([ new InputArgument('command-name', InputArgument::REQUIRED, ''), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), - )) + ]) ->setHelp( <<__toString()); - $args = array(); + $args = []; foreach ($tokens as $token) { if ($token && $token[0] !== '-') { $args[] = $token; diff --git a/src/Composer/Command/HomeCommand.php b/src/Composer/Command/HomeCommand.php index 8fcd2b78a2b3..5aec6f4c181f 100644 --- a/src/Composer/Command/HomeCommand.php +++ b/src/Composer/Command/HomeCommand.php @@ -32,20 +32,18 @@ class HomeCommand extends BaseCommand /** * @inheritDoc - * - * @return void */ protected function configure(): void { $this ->setName('browse') - ->setAliases(array('home')) + ->setAliases(['home']) ->setDescription('Opens the package\'s repository URL or homepage in your browser') - ->setDefinition(array( + ->setDefinition([ new InputArgument('packages', InputArgument::IS_ARRAY, 'Package(s) to browse to.', null, $this->suggestInstalledPackage()), new InputOption('homepage', 'H', InputOption::VALUE_NONE, 'Open the homepage instead of the repository URL.'), new InputOption('show', 's', InputOption::VALUE_NONE, 'Only show the homepage or repository URL.'), - )) + ]) ->setHelp( <<getArgument('packages'); if (count($packages) === 0) { $io->writeError('No package specified, opening homepage for the root package'); - $packages = array($this->requireComposer()->getPackage()->getName()); + $packages = [$this->requireComposer()->getPackage()->getName()]; } foreach ($packages as $packageName) { @@ -98,11 +96,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int return $return; } - /** - * @param bool $showHomepage - * @param bool $showOnly - * @return bool - */ private function handlePackage(CompletePackageInterface $package, bool $showHomepage, bool $showOnly): bool { $support = $package->getSupport(); @@ -126,9 +119,6 @@ private function handlePackage(CompletePackageInterface $package, bool $showHome /** * opens a url in your system default browser - * - * @param string $url - * @return void */ private function openBrowser(string $url): void { @@ -166,8 +156,8 @@ private function initializeRepos(): array if ($composer) { return array_merge( - array(new RootPackageRepository(clone $composer->getPackage())), // root package - array($composer->getRepositoryManager()->getLocalRepository()), // installed packages + [new RootPackageRepository(clone $composer->getPackage())], // root package + [$composer->getRepositoryManager()->getLocalRepository()], // installed packages $composer->getRepositoryManager()->getRepositories() // remotes ); } diff --git a/src/Composer/Command/InitCommand.php b/src/Composer/Command/InitCommand.php index c2ca0d24d57d..7cd11e666bd8 100644 --- a/src/Composer/Command/InitCommand.php +++ b/src/Composer/Command/InitCommand.php @@ -53,7 +53,7 @@ protected function configure() $this ->setName('init') ->setDescription('Creates a basic composer.json file in current directory') - ->setDefinition(array( + ->setDefinition([ new InputOption('name', null, InputOption::VALUE_REQUIRED, 'Name of the package'), new InputOption('description', null, InputOption::VALUE_REQUIRED, 'Description of package'), new InputOption('author', null, InputOption::VALUE_REQUIRED, 'Author name of package'), @@ -65,7 +65,7 @@ protected function configure() new InputOption('license', 'l', InputOption::VALUE_REQUIRED, 'License of package'), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories, either by URL or using JSON arrays'), new InputOption('autoload', 'a', InputOption::VALUE_REQUIRED, 'Add PSR-4 autoload mapping. Maps your package\'s namespace to the provided directory. (Expects a relative path, e.g. src/)'), - )) + ]) ->setHelp( <<init command creates a basic composer.json file @@ -86,7 +86,7 @@ protected function execute(InputInterface $input, OutputInterface $output) { $io = $this->getIO(); - $allowlist = array('name', 'description', 'author', 'type', 'homepage', 'require', 'require-dev', 'stability', 'license', 'autoload'); + $allowlist = ['name', 'description', 'author', 'type', 'homepage', 'require', 'require-dev', 'stability', 'license', 'autoload']; $options = array_filter(array_intersect_key($input->getOptions(), array_flip($allowlist))); if (isset($options['name']) && !Preg::isMatch('{^[a-z0-9_.-]+/[a-z0-9_.-]+$}D', $options['name'])) { @@ -114,13 +114,13 @@ protected function execute(InputInterface $input, OutputInterface $output) } $options['require'] = isset($options['require']) ? $this->formatRequirements($options['require']) : new \stdClass; - if (array() === $options['require']) { + if ([] === $options['require']) { $options['require'] = new \stdClass; } if (isset($options['require-dev'])) { $options['require-dev'] = $this->formatRequirements($options['require-dev']); - if (array() === $options['require-dev']) { + if ([] === $options['require-dev']) { $options['require-dev'] = new \stdClass; } } @@ -130,18 +130,18 @@ protected function execute(InputInterface $input, OutputInterface $output) if (isset($options['autoload'])) { $autoloadPath = $options['autoload']; $namespace = $this->namespaceFromPackageName((string) $input->getOption('name')); - $options['autoload'] = (object) array( - 'psr-4' => array( + $options['autoload'] = (object) [ + 'psr-4' => [ $namespace . '\\' => $autoloadPath, - ), - ); + ], + ]; } $file = new JsonFile(Factory::getComposerFile()); $json = JsonFile::encode($options); if ($input->isInteractive()) { - $io->writeError(array('', $json, '')); + $io->writeError(['', $json, '']); if (!$io->askConfirmation('Do you confirm generation [yes]? ')) { $io->writeError('Command aborted'); @@ -229,13 +229,13 @@ protected function interact(InputInterface $input, OutputInterface $output) $io->loadConfiguration($config); $repoManager = RepositoryFactory::manager($io, $config); - $repos = array(new PlatformRepository); + $repos = [new PlatformRepository]; $createDefaultPackagistRepo = true; foreach ($repositories as $repo) { $repoConfig = RepositoryFactory::configFromString($io, $config, $repo, true); if ( - (isset($repoConfig['packagist']) && $repoConfig === array('packagist' => false)) - || (isset($repoConfig['packagist.org']) && $repoConfig === array('packagist.org' => false)) + (isset($repoConfig['packagist']) && $repoConfig === ['packagist' => false]) + || (isset($repoConfig['packagist.org']) && $repoConfig === ['packagist.org' => false]) ) { $createDefaultPackagistRepo = false; continue; @@ -244,28 +244,28 @@ protected function interact(InputInterface $input, OutputInterface $output) } if ($createDefaultPackagistRepo) { - $repos[] = RepositoryFactory::createRepo($io, $config, array( + $repos[] = RepositoryFactory::createRepo($io, $config, [ 'type' => 'composer', 'url' => 'https://repo.packagist.org', - ), $repoManager); + ], $repoManager); } $this->repos = new CompositeRepository($repos); unset($repos, $config, $repositories); } - $io->writeError(array( + $io->writeError([ '', $formatter->formatBlock('Welcome to the Composer config generator', 'bg=blue;fg=white', true), '', - )); + ]); // namespace - $io->writeError(array( + $io->writeError([ '', 'This command will guide you through creating your composer.json config.', '', - )); + ]); $cwd = realpath("."); @@ -397,7 +397,7 @@ static function ($value) use ($minimumStability) { ); $input->setOption('license', $license); - $io->writeError(array('', 'Define your dependencies.', '')); + $io->writeError(['', 'Define your dependencies.', '']); // prepare to resolve dependencies $repos = $this->getRepos(); @@ -414,7 +414,7 @@ static function ($value) use ($minimumStability) { $question = 'Would you like to define your dependencies (require) interactively [yes]? '; $require = $input->getOption('require'); - $requirements = array(); + $requirements = []; if (count($require) > 0 || $io->askConfirmation($question)) { $requirements = $this->determineRequirements($input, $output, $require, $platformRepo, $preferredStability); } @@ -422,7 +422,7 @@ static function ($value) use ($minimumStability) { $question = 'Would you like to define your dev dependencies (require-dev) interactively [yes]? '; $requireDev = $input->getOption('require-dev'); - $devRequirements = array(); + $devRequirements = []; if (count($requireDev) > 0 || $io->askConfirmation($question)) { $devRequirements = $this->determineRequirements($input, $output, $requireDev, $platformRepo, $preferredStability); } @@ -460,7 +460,6 @@ static function ($value) use ($autoload) { } /** - * @param string $author * @return array{name: string, email: string|null} */ private function parseAuthorString(string $author): array @@ -471,10 +470,10 @@ private function parseAuthorString(string $author): array throw new \InvalidArgumentException('Invalid email "'.$match['email'].'"'); } - return array( + return [ 'name' => trim($match['name']), 'email' => $hasEmail ? $match['email'] : null, - ); + ]; } throw new \InvalidArgumentException( @@ -484,8 +483,6 @@ private function parseAuthorString(string $author): array } /** - * @param string $author - * * @return array */ protected function formatAuthors(string $author): array @@ -495,17 +492,13 @@ protected function formatAuthors(string $author): array unset($author['email']); } - return array($author); + return [$author]; } /** * Extract namespace from package's vendor name. * * new_projects.acme-extra/package-name becomes "NewProjectsAcmeExtra\PackageName" - * - * @param string $packageName - * - * @return string|null */ public function namespaceFromPackageName(string $packageName): ?string { @@ -538,11 +531,11 @@ protected function getGitConfig(): array $finder = new ExecutableFinder(); $gitBin = $finder->find('git'); - $cmd = new Process(array($gitBin, 'config', '-l')); + $cmd = new Process([$gitBin, 'config', '-l']); $cmd->run(); if ($cmd->isSuccessful()) { - $this->gitConfig = array(); + $this->gitConfig = []; Preg::matchAll('{^([^=]+)=(.*)$}m', $cmd->getOutput(), $matches); foreach ($matches[1] as $key => $match) { $this->gitConfig[$match] = $matches[2][$key]; @@ -551,7 +544,7 @@ protected function getGitConfig(): array return $this->gitConfig; } - return $this->gitConfig = array(); + return $this->gitConfig = []; } /** @@ -564,11 +557,6 @@ protected function getGitConfig(): array * "/$vendor/" * "/$vendor/*" * "$vendor/*" - * - * @param string $ignoreFile - * @param string $vendor - * - * @return bool */ protected function hasVendorIgnore(string $ignoreFile, string $vendor = 'vendor'): bool { @@ -588,12 +576,6 @@ protected function hasVendorIgnore(string $ignoreFile, string $vendor = 'vendor' return false; } - /** - * @param string $ignoreFile - * @param string $vendor - * - * @return void - */ protected function addVendorIgnore(string $ignoreFile, string $vendor = '/vendor/'): void { $contents = ""; @@ -608,11 +590,6 @@ protected function addVendorIgnore(string $ignoreFile, string $vendor = '/vendor file_put_contents($ignoreFile, $contents . $vendor. "\n"); } - /** - * @param string $email - * - * @return bool - */ protected function isValidEmail(string $email): bool { // assume it's valid if we can't validate it @@ -623,29 +600,23 @@ protected function isValidEmail(string $email): bool return false !== filter_var($email, FILTER_VALIDATE_EMAIL); } - /** - * @return void - */ private function updateDependencies(OutputInterface $output): void { try { $updateCommand = $this->getApplication()->find('update'); $this->getApplication()->resetComposer(); - $updateCommand->run(new ArrayInput(array()), $output); + $updateCommand->run(new ArrayInput([]), $output); } catch (\Exception $e) { $this->getIO()->writeError('Could not update dependencies. Run `composer update` to see more information.'); } } - /** - * @return void - */ private function runDumpAutoloadCommand(OutputInterface $output): void { try { $command = $this->getApplication()->find('dump-autoload'); $this->getApplication()->resetComposer(); - $command->run(new ArrayInput(array()), $output); + $command->run(new ArrayInput([]), $output); } catch (\Exception $e) { $this->getIO()->writeError('Could not run dump-autoload.'); } @@ -653,12 +624,11 @@ private function runDumpAutoloadCommand(OutputInterface $output): void /** * @param array> $options - * @return bool */ private function hasDependencies(array $options): bool { $requires = (array) $options['require']; - $devRequires = isset($options['require-dev']) ? (array) $options['require-dev'] : array(); + $devRequires = isset($options['require-dev']) ? (array) $options['require-dev'] : []; return !empty($requires) || !empty($devRequires); } diff --git a/src/Composer/Command/InstallCommand.php b/src/Composer/Command/InstallCommand.php index 0e5dbdf9b498..87d7986dae50 100644 --- a/src/Composer/Command/InstallCommand.php +++ b/src/Composer/Command/InstallCommand.php @@ -39,9 +39,9 @@ protected function configure() { $this ->setName('install') - ->setAliases(array('i')) + ->setAliases(['i']) ->setDescription('Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json') - ->setDefinition(array( + ->setDefinition([ new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), @@ -62,7 +62,7 @@ protected function configure() new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.'), - )) + ]) ->setHelp( <<install command reads the composer.lock file from @@ -113,7 +113,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $install = Installer::create($io, $composer); $config = $composer->getConfig(); - list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); + [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); diff --git a/src/Composer/Command/LicensesCommand.php b/src/Composer/Command/LicensesCommand.php index 7b7069f66cf1..9305eceee53b 100644 --- a/src/Composer/Command/LicensesCommand.php +++ b/src/Composer/Command/LicensesCommand.php @@ -17,8 +17,6 @@ use Composer\Package\CompletePackageInterface; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; -use Composer\Package\PackageInterface; -use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositoryUtils; use Composer\Util\PackageInfo; use Composer\Util\PackageSorter; @@ -33,18 +31,15 @@ */ class LicensesCommand extends BaseCommand { - /** - * @return void - */ protected function configure(): void { $this ->setName('licenses') ->setDescription('Shows information about licenses of dependencies') - ->setDefinition(array( + ->setDefinition([ new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text, json or summary', 'text', ['text', 'json', 'summary']), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), - )) + ]) ->setHelp( <<setStyle('compact'); - $table->setHeaders(array('Name', 'Version', 'Licenses')); + $table->setHeaders(['Name', 'Version', 'Licenses']); foreach ($packages as $package) { $link = PackageInfo::getViewSourceOrHomepageUrl($package); if ($link !== null) { @@ -94,36 +89,36 @@ protected function execute(InputInterface $input, OutputInterface $output): int $name = $package->getPrettyName(); } - $table->addRow(array( + $table->addRow([ $name, $package->getFullPrettyVersion(), - implode(', ', $package instanceof CompletePackageInterface ? $package->getLicense() : array()) ?: 'none', - )); + implode(', ', $package instanceof CompletePackageInterface ? $package->getLicense() : []) ?: 'none', + ]); } $table->render(); break; case 'json': - $dependencies = array(); + $dependencies = []; foreach ($packages as $package) { - $dependencies[$package->getPrettyName()] = array( + $dependencies[$package->getPrettyName()] = [ 'version' => $package->getFullPrettyVersion(), - 'license' => $package instanceof CompletePackageInterface ? $package->getLicense() : array(), - ); + 'license' => $package instanceof CompletePackageInterface ? $package->getLicense() : [], + ]; } - $io->write(JsonFile::encode(array( + $io->write(JsonFile::encode([ 'name' => $root->getPrettyName(), 'version' => $root->getFullPrettyVersion(), 'license' => $root->getLicense(), 'dependencies' => $dependencies, - ))); + ])); break; case 'summary': - $usedLicenses = array(); + $usedLicenses = []; foreach ($packages as $package) { - $licenses = $package instanceof CompletePackageInterface ? $package->getLicense() : array(); + $licenses = $package instanceof CompletePackageInterface ? $package->getLicense() : []; if (count($licenses) === 0) { $licenses[] = 'none'; } @@ -138,14 +133,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int // Sort licenses so that the most used license will appear first arsort($usedLicenses, SORT_NUMERIC); - $rows = array(); + $rows = []; foreach ($usedLicenses as $usedLicense => $numberOfDependencies) { - $rows[] = array($usedLicense, $numberOfDependencies); + $rows[] = [$usedLicense, $numberOfDependencies]; } $symfonyIo = new SymfonyStyle($input, $output); $symfonyIo->table( - array('License', 'Number of dependencies'), + ['License', 'Number of dependencies'], $rows ); break; diff --git a/src/Composer/Command/OutdatedCommand.php b/src/Composer/Command/OutdatedCommand.php index b711f8ca0a5a..05f22ebbb2b6 100644 --- a/src/Composer/Command/OutdatedCommand.php +++ b/src/Composer/Command/OutdatedCommand.php @@ -25,15 +25,12 @@ class OutdatedCommand extends BaseCommand { use CompletionTrait; - /** - * @return void - */ protected function configure(): void { $this ->setName('outdated') ->setDescription('Shows a list of installed packages that have updates available, including their latest version') - ->setDefinition(array( + ->setDefinition([ new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestInstalledPackage(false)), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated (this is the default, but present here for compat with `show`'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show all installed packages with their latest versions'), @@ -48,7 +45,7 @@ protected function configure(): void new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), - )) + ]) ->setHelp( << 'show', '--latest' => true, - ); + ]; if (!$input->getOption('all')) { $args['--outdated'] = true; } diff --git a/src/Composer/Command/PackageDiscoveryTrait.php b/src/Composer/Command/PackageDiscoveryTrait.php index bc84a9c6f2c9..a7cd22c42bdc 100644 --- a/src/Composer/Command/PackageDiscoveryTrait.php +++ b/src/Composer/Command/PackageDiscoveryTrait.php @@ -39,14 +39,11 @@ trait PackageDiscoveryTrait /** @var RepositorySet[] */ private $repositorySets; - /** - * @return CompositeRepository - */ protected function getRepos(): CompositeRepository { if (null === $this->repos) { $this->repos = new CompositeRepository(array_merge( - array(new PlatformRepository), + [new PlatformRepository], RepositoryFactory::defaultReposWithDefaultManager($this->getIO()) )); } @@ -89,11 +86,11 @@ private function getMinimumStability(InputInterface $input): string * @return array * @throws \Exception */ - final protected function determineRequirements(InputInterface $input, OutputInterface $output, array $requires = array(), ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $checkProvidedVersions = true, bool $fixed = false): array + final protected function determineRequirements(InputInterface $input, OutputInterface $output, array $requires = [], ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $checkProvidedVersions = true, bool $fixed = false): array { if (count($requires) > 0) { $requires = $this->normalizeRequirements($requires); - $result = array(); + $result = []; $io = $this->getIO(); foreach ($requires as $requirement) { @@ -103,7 +100,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte if (!isset($requirement['version'])) { // determine the best version automatically - list($name, $version) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, $fixed); + [$name, $version] = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, $fixed); $requirement['version'] = $version; // replace package name from packagist.org @@ -130,7 +127,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte if (null !== $composer) { $installedRepo = $composer->getRepositoryManager()->getLocalRepository(); } - $existingPackages = array(); + $existingPackages = []; if (null !== $installedRepo) { foreach ($installedRepo->getPackages() as $package) { $existingPackages[] = $package->getName(); @@ -163,10 +160,10 @@ final protected function determineRequirements(InputInterface $input, OutputInte if (!$exactMatch) { $providers = $this->getRepos()->getProviders($package); if (count($providers) > 0) { - array_unshift($matches, array('name' => $package, 'description' => '')); + array_unshift($matches, ['name' => $package, 'description' => '']); } - $choices = array(); + $choices = []; foreach ($matches as $position => $foundPackage) { $abandoned = ''; if (isset($foundPackage['abandoned'])) { @@ -181,11 +178,11 @@ final protected function determineRequirements(InputInterface $input, OutputInte $choices[] = sprintf(' %5s %s %s', "[$position]", $foundPackage['name'], $abandoned); } - $io->writeError(array( + $io->writeError([ '', sprintf('Found %s packages matching %s', count($matches), $package), '', - )); + ]); $io->writeError($choices); $io->writeError(''); @@ -242,7 +239,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte ); if (false === $constraint) { - list(, $constraint) = $this->findBestVersionAndNameForPackage($input, $package, $platformRepo, $preferredStability); + [, $constraint] = $this->findBestVersionAndNameForPackage($input, $package, $platformRepo, $preferredStability); $io->writeError(sprintf( 'Using version %s for %s', @@ -292,7 +289,7 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string // platform packages can not be found in the pool in versions other than the local platform's has // so if platform reqs are ignored we just take the user's word for it if ($platformRequirementFilter->isIgnored($name)) { - return array($name, '*'); + return [$name, '*']; } // Check if it is a virtual package provided by others @@ -308,7 +305,7 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string }, 3, '*'); } - return array($name, $constraint); + return [$name, $constraint]; } // Check whether the package requirements were the problem @@ -371,10 +368,10 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string )); } - return array( + return [ $package->getPrettyName(), $fixed ? $package->getPrettyVersion() : $versionSelector->findRecommendedRequireVersion($package), - ); + ]; } /** @@ -393,9 +390,9 @@ private function findSimilar(string $package): array } // ignore search errors - return array(); + return []; } - $similarPackages = array(); + $similarPackages = []; $installedRepo = $this->requireComposer()->getRepositoryManager()->getLocalRepository(); @@ -413,7 +410,7 @@ private function findSimilar(string $package): array private function getPlatformExceptionDetails(PackageInterface $candidate, ?PlatformRepository $platformRepo = null): string { - $details = array(); + $details = []; if (null === $platformRepo) { return ''; } diff --git a/src/Composer/Command/ProhibitsCommand.php b/src/Composer/Command/ProhibitsCommand.php index 8300ccf703d5..06d03a8ce6f7 100644 --- a/src/Composer/Command/ProhibitsCommand.php +++ b/src/Composer/Command/ProhibitsCommand.php @@ -26,22 +26,20 @@ class ProhibitsCommand extends BaseDependencyCommand /** * Configure command metadata. - * - * @return void */ protected function configure(): void { $this ->setName('prohibits') - ->setAliases(array('why-not')) + ->setAliases(['why-not']) ->setDescription('Shows which packages prevent the given package from being installed') - ->setDefinition(array( + ->setDefinition([ new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect', null, $this->suggestAvailablePackage()), new InputArgument(self::ARGUMENT_CONSTRAINT, InputArgument::REQUIRED, 'Version constraint, which version you expected to be installed'), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), new InputOption('locked', null, InputOption::VALUE_NONE, 'Read dependency information from composer.lock'), - )) + ]) ->setHelp( <<setName('reinstall') ->setDescription('Uninstalls and reinstalls the given package names') - ->setDefinition(array( + ->setDefinition([ new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist (default behavior).'), new InputOption('prefer-install', null, InputOption::VALUE_REQUIRED, 'Forces installation from package dist|source|auto (auto chooses source for dev versions, dist for the rest).', null, $this->suggestPreferInstall()), @@ -55,7 +52,7 @@ protected function configure(): void new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages).'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'List of package names to reinstall, can include a wildcard (*) to match any substring.', null, $this->suggestInstalledPackage(false)), - )) + ]) ->setHelp( <<reinstall command looks up installed packages by name, @@ -78,8 +75,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int $composer = $this->requireComposer(); $localRepo = $composer->getRepositoryManager()->getLocalRepository(); - $packagesToReinstall = array(); - $packageNamesToReinstall = array(); + $packagesToReinstall = []; + $packageNamesToReinstall = []; foreach ($input->getArgument('packages') as $pattern) { $patternRegexp = BasePackage::packageNameToRegexp($pattern); $matched = false; @@ -102,7 +99,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 1; } - $uninstallOperations = array(); + $uninstallOperations = []; foreach ($packagesToReinstall as $package) { $uninstallOperations[] = new UninstallOperation($package); } @@ -119,7 +116,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $installOperations = $transaction->getOperations(); // reverse-sort the uninstalls based on the install order - $installOrder = array(); + $installOrder = []; foreach ($installOperations as $index => $op) { if ($op instanceof InstallOperation && !$op->getPackage() instanceof AliasPackage) { $installOrder[$op->getPackage()->getName()] = $index; @@ -134,7 +131,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $eventDispatcher->dispatch($commandEvent->getName(), $commandEvent); $config = $composer->getConfig(); - list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); + [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); $installationManager = $composer->getInstallationManager(); $downloadManager = $composer->getDownloadManager(); diff --git a/src/Composer/Command/RemoveCommand.php b/src/Composer/Command/RemoveCommand.php index 73a28ff6b9e5..eb1757b470c6 100644 --- a/src/Composer/Command/RemoveCommand.php +++ b/src/Composer/Command/RemoveCommand.php @@ -43,7 +43,7 @@ protected function configure() $this ->setName('remove') ->setDescription('Removes a package from the require or require-dev') - ->setDefinition(array( + ->setDefinition([ new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.', null, $this->suggestRootRequirement()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), @@ -64,7 +64,7 @@ protected function configure() new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), - )) + ]) ->setHelp( <<remove command removes a package from the current @@ -92,7 +92,7 @@ protected function interact(InputInterface $input, OutputInterface $output) $lockedPackages = $locker->getLockedRepository()->getPackages(); - $required = array(); + $required = []; foreach (array_merge($composer->getPackage()->getRequires(), $composer->getPackage()->getDevRequires()) as $link) { $required[$link->getTarget()] = true; } @@ -113,7 +113,7 @@ protected function interact(InputInterface $input, OutputInterface $output) } } while ($found); - $unused = array(); + $unused = []; foreach ($lockedPackages as $package) { $unused[] = $package->getName(); } @@ -154,7 +154,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } // make sure name checks are done case insensitively - foreach (array('require', 'require-dev') as $linkType) { + foreach (['require', 'require-dev'] as $linkType) { if (isset($composer[$linkType])) { foreach ($composer[$linkType] as $name => $version) { $composer[$linkType][strtolower($name)] = $name; @@ -163,7 +163,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $dryRun = $input->getOption('dry-run'); - $toRemove = array(); + $toRemove = []; foreach ($packages as $package) { if (isset($composer[$type][$package])) { if ($dryRun) { @@ -224,10 +224,10 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($dryRun) { $rootPackage = $composer->getPackage(); - $links = array( + $links = [ 'require' => $rootPackage->getRequires(), 'require-dev' => $rootPackage->getDevRequires(), - ); + ]; foreach ($toRemove as $type => $names) { foreach ($names as $name) { unset($links[$type][$name]); diff --git a/src/Composer/Command/RequireCommand.php b/src/Composer/Command/RequireCommand.php index b8014a9f507b..83c33aed636e 100644 --- a/src/Composer/Command/RequireCommand.php +++ b/src/Composer/Command/RequireCommand.php @@ -14,7 +14,6 @@ use Composer\DependencyResolver\Request; use Composer\Package\CompletePackageInterface; -use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Composer\Util\PackageSorter; use Seld\Signal\SignalHandler; @@ -71,9 +70,9 @@ protected function configure() { $this ->setName('require') - ->setAliases(array('r')) + ->setAliases(['r']) ->setDescription('Adds required packages to your composer.json and installs them') - ->setDefinition(array( + ->setDefinition([ new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"', null, $this->suggestAvailablePackageInclPlatform()), new InputOption('dev', null, InputOption::VALUE_NONE, 'Add requirement to require-dev.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), @@ -101,7 +100,7 @@ protected function configure() new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-autoloader-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu-autoloader'), - )) + ]) ->setHelp( <<getConfig()->get('platform'); // initialize $this->repos as it is used by the PackageDiscoveryTrait $this->repos = new CompositeRepository(array_merge( - array($platformRepo = new PlatformRepository(array(), $platformOverrides)), + [$platformRepo = new PlatformRepository([], $platformOverrides)], $repos )); @@ -285,7 +284,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } $input->setOption('dev', true); - list($requireKey, $removeKey) = array($removeKey, $requireKey); + [$requireKey, $removeKey] = [$removeKey, $requireKey]; } } } @@ -334,13 +333,12 @@ protected function execute(InputInterface $input, OutputInterface $output) /** * @param array $newRequirements - * @param string $requireKey * @return string[] */ private function getInconsistentRequireKeys(array $newRequirements, string $requireKey): array { $requireKeys = $this->getPackagesByRequireKey(); - $inconsistentRequirements = array(); + $inconsistentRequirements = []; foreach ($requireKeys as $package => $packageRequireKey) { if (!isset($newRequirements[$package])) { continue; @@ -359,8 +357,8 @@ private function getInconsistentRequireKeys(array $newRequirements, string $requ private function getPackagesByRequireKey(): array { $composerDefinition = $this->json->read(); - $require = array(); - $requireDev = array(); + $require = []; + $requireDev = []; if (isset($composerDefinition['require'])) { $require = $composerDefinition['require']; @@ -378,9 +376,6 @@ private function getPackagesByRequireKey(): array /** * @param array $requirements - * @param string $requireKey - * @param string $removeKey - * @return int * @throws \Exception */ private function doUpdate(InputInterface $input, OutputInterface $output, IOInterface $io, array $requirements, string $requireKey, string $removeKey): int @@ -396,10 +391,10 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte if ($input->getOption('dry-run')) { $rootPackage = $composer->getPackage(); - $links = array( + $links = [ 'require' => $rootPackage->getRequires(), 'require-dev' => $rootPackage->getDevRequires(), - ); + ]; $loader = new ArrayLoader(); $newLinks = $loader->parseLinks($rootPackage->getName(), $rootPackage->getPrettyVersion(), BasePackage::$supportedLinkTypes[$requireKey]['method'], $requirements); $links[$requireKey] = array_merge($links[$requireKey], $newLinks); @@ -435,7 +430,7 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte $install = Installer::create($io, $composer); - list($preferSource, $preferDist) = $this->getPreferredInstallOptions($composer->getConfig(), $input); + [$preferSource, $preferDist] = $this->getPreferredInstallOptions($composer->getConfig(), $input); $install ->setDryRun($input->getOption('dry-run')) @@ -480,10 +475,6 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte /** * @param array $new - * @param string $requireKey - * @param string $removeKey - * @param bool $sortPackages - * @return bool */ private function updateFileCleanly(JsonFile $json, array $new, string $requireKey, string $removeKey, bool $sortPackages): bool { @@ -509,7 +500,6 @@ private function updateFileCleanly(JsonFile $json, array $new, string $requireKe protected function interact(InputInterface $input, OutputInterface $output): void { - } private function revertComposerFile(): void diff --git a/src/Composer/Command/RunScriptCommand.php b/src/Composer/Command/RunScriptCommand.php index 27aa32f4cf9b..4e1bccd27035 100644 --- a/src/Composer/Command/RunScriptCommand.php +++ b/src/Composer/Command/RunScriptCommand.php @@ -29,7 +29,7 @@ class RunScriptCommand extends BaseCommand /** * @var string[] Array with command events */ - protected $scriptEvents = array( + protected $scriptEvents = [ ScriptEvents::PRE_INSTALL_CMD, ScriptEvents::POST_INSTALL_CMD, ScriptEvents::PRE_UPDATE_CMD, @@ -42,18 +42,15 @@ class RunScriptCommand extends BaseCommand ScriptEvents::POST_ARCHIVE_CMD, ScriptEvents::PRE_AUTOLOAD_DUMP, ScriptEvents::POST_AUTOLOAD_DUMP, - ); + ]; - /** - * @return void - */ protected function configure(): void { $this ->setName('run-script') - ->setAliases(array('run')) + ->setAliases(['run']) ->setDescription('Runs the scripts defined in composer.json') - ->setDefinition(array( + ->setDefinition([ new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.', null, function () { return array_keys($this->requireComposer()->getPackage()->getScripts()); }), @@ -62,7 +59,7 @@ protected function configure(): void new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'), new InputOption('list', 'l', InputOption::VALUE_NONE, 'List scripts.'), - )) + ]) ->setHelp( <<run-script command runs scripts defined in composer.json: @@ -115,9 +112,6 @@ protected function execute(InputInterface $input, OutputInterface $output): int return $composer->getEventDispatcher()->dispatchScript($script, $devMode, $args); } - /** - * @return int - */ protected function listScripts(OutputInterface $output): int { $scripts = $this->requireComposer()->getPackage()->getScripts(); @@ -128,7 +122,7 @@ protected function listScripts(OutputInterface $output): int $io = $this->getIO(); $io->writeError('scripts:'); - $table = array(); + $table = []; foreach ($scripts as $name => $script) { $description = ''; try { @@ -139,7 +133,7 @@ protected function listScripts(OutputInterface $output): int } catch (\Symfony\Component\Console\Exception\CommandNotFoundException $e) { // ignore scripts that have no command associated, like native Composer script listeners } - $table[] = array(' '.$name, $description); + $table[] = [' '.$name, $description]; } $this->renderTable($table, $output); diff --git a/src/Composer/Command/ScriptAliasCommand.php b/src/Composer/Command/ScriptAliasCommand.php index 9d3b9bf312dc..34a41e0585a2 100644 --- a/src/Composer/Command/ScriptAliasCommand.php +++ b/src/Composer/Command/ScriptAliasCommand.php @@ -35,19 +35,16 @@ public function __construct(string $script, ?string $description) parent::__construct(); } - /** - * @return void - */ protected function configure(): void { $this ->setName($this->script) ->setDescription($this->description) - ->setDefinition(array( + ->setDefinition([ new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), - )) + ]) ->setHelp( <<run-script command runs scripts defined in composer.json: diff --git a/src/Composer/Command/SearchCommand.php b/src/Composer/Command/SearchCommand.php index fd0e75b4334b..9552517318ac 100644 --- a/src/Composer/Command/SearchCommand.php +++ b/src/Composer/Command/SearchCommand.php @@ -30,21 +30,18 @@ */ class SearchCommand extends BaseCommand { - /** - * @return void - */ protected function configure(): void { $this ->setName('search') ->setDescription('Searches for packages') - ->setDefinition(array( + ->setDefinition([ new InputOption('only-name', 'N', InputOption::VALUE_NONE, 'Search only in package names'), new InputOption('only-vendor', 'O', InputOption::VALUE_NONE, 'Search only for vendor / organization names, returns only "vendor" as result'), new InputOption('type', 't', InputOption::VALUE_REQUIRED, 'Search for a specific package type'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text', ['json', 'text']), new InputArgument('tokens', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'tokens to search for'), - )) + ]) ->setHelp( <<getIO(); $format = $input->getOption('format'); - if (!in_array($format, array('text', 'json'))) { + if (!in_array($format, ['text', 'json'])) { $io->writeError(sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; } if (!($composer = $this->tryComposer())) { - $composer = Factory::create($this->getIO(), array(), $input->hasParameterOption('--no-plugins')); + $composer = Factory::create($this->getIO(), [], $input->hasParameterOption('--no-plugins')); } $localRepo = $composer->getRepositoryManager()->getLocalRepository(); - $installedRepo = new CompositeRepository(array($localRepo, $platformRepo)); - $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories())); + $installedRepo = new CompositeRepository([$localRepo, $platformRepo]); + $repos = new CompositeRepository(array_merge([$installedRepo], $composer->getRepositoryManager()->getRepositories())); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'search', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index abbfb726e1fe..518ca592e7e4 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -39,16 +39,13 @@ class SelfUpdateCommand extends BaseCommand private const HOMEPAGE = 'getcomposer.org'; private const OLD_INSTALL_EXT = '-old.phar'; - /** - * @return void - */ protected function configure(): void { $this ->setName('self-update') - ->setAliases(array('selfupdate')) + ->setAliases(['selfupdate']) ->setDescription('Updates composer.phar to the latest version') - ->setDefinition(array( + ->setDefinition([ new InputOption('rollback', 'r', InputOption::VALUE_NONE, 'Revert to an older installation of composer'), new InputOption('clean-backups', null, InputOption::VALUE_NONE, 'Delete old backups during an update. This makes the current version of composer the only backup available after the update'), new InputArgument('version', InputArgument::OPTIONAL, 'The version to update to'), @@ -61,7 +58,7 @@ protected function configure(): void new InputOption('2', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 2.x versions'), new InputOption('2.2', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 2.2.x LTS versions'), new InputOption('set-channel-only', null, InputOption::VALUE_NONE, 'Only store the channel as the default one and then exit'), - )) + ]) ->setHelp( <<self-update command checks getcomposer.org for newer @@ -361,7 +358,6 @@ class_exists('Composer\Downloader\FilesystemException'); } /** - * @return void * @throws \Exception */ protected function fetchKeys(IOInterface $io, Config $config): void @@ -410,9 +406,6 @@ protected function fetchKeys(IOInterface $io, Config $config): void } /** - * @param string $rollbackDir - * @param string $localFilename - * @return int * @throws FilesystemException */ protected function rollback(OutputInterface $output, string $rollbackDir, string $localFilename): int @@ -449,7 +442,7 @@ protected function rollback(OutputInterface $output, string $rollbackDir, string * @throws FilesystemException If the file cannot be moved * @return bool Whether the phar is valid and has been moved */ - protected function setLocalPhar(string $localFilename, string $newFilename, string $backupTarget = null): bool + protected function setLocalPhar(string $localFilename, string $newFilename, ?string $backupTarget = null): bool { $io = $this->getIO(); $perms = @fileperms($localFilename); @@ -498,12 +491,6 @@ protected function setLocalPhar(string $localFilename, string $newFilename, stri } } - /** - * @param string $rollbackDir - * @param string|null $except - * - * @return void - */ protected function cleanBackups(string $rollbackDir, ?string $except = null): void { $finder = $this->getOldInstallationFinder($rollbackDir); @@ -533,10 +520,6 @@ protected function getLastBackupVersion(string $rollbackDir): ?string return null; } - /** - * @param string $rollbackDir - * @return Finder - */ protected function getOldInstallationFinder(string $rollbackDir): Finder { return Finder::create() @@ -583,8 +566,6 @@ protected function validatePhar(string $pharFile, ?string &$error): bool /** * Returns true if this is a non-admin Windows user account - * - * @return bool */ protected function isWindowsNonAdminUser(): bool { diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 3471156fff6b..7506113ce0a4 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -75,9 +75,9 @@ protected function configure() { $this ->setName('show') - ->setAliases(array('info')) + ->setAliases(['info']) ->setDescription('Shows information about packages') - ->setDefinition(array( + ->setDefinition([ new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.', null, $this->suggestPackageBasedOnMode()), new InputArgument('version', InputArgument::OPTIONAL, 'Version or version constraint to inspect'), new InputOption('all', null, InputOption::VALUE_NONE, 'List all packages'), @@ -101,7 +101,7 @@ protected function configure() new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages). Use with the --outdated option'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore all platform requirements (php & ext- packages). Use with the --outdated option'), - )) + ]) ->setHelp( <<getOption('format'); - if (!in_array($format, array('text', 'json'))) { + if (!in_array($format, ['text', 'json'])) { $io->writeError(sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; @@ -188,11 +188,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $platformReqFilter = $this->getPlatformRequirementFilter($input); // init repos - $platformOverrides = array(); + $platformOverrides = []; if ($composer) { $platformOverrides = $composer->getConfig()->get('platform'); } - $platformRepo = new PlatformRepository(array(), $platformOverrides); + $platformRepo = new PlatformRepository([], $platformOverrides); $lockedRepo = null; if ($input->getOption('self')) { @@ -205,11 +205,11 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($input->getArgument('package')) { throw new \InvalidArgumentException('You cannot use --self together with a package name'); } - $repos = $installedRepo = new InstalledRepository(array(new RootPackageRepository($package))); + $repos = $installedRepo = new InstalledRepository([new RootPackageRepository($package)]); } elseif ($input->getOption('platform')) { - $repos = $installedRepo = new InstalledRepository(array($platformRepo)); + $repos = $installedRepo = new InstalledRepository([$platformRepo]); } elseif ($input->getOption('available')) { - $installedRepo = new InstalledRepository(array($platformRepo)); + $installedRepo = new InstalledRepository([$platformRepo]); if ($composer) { $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $installedRepo->addRepository($composer->getRepositoryManager()->getLocalRepository()); @@ -223,36 +223,36 @@ protected function execute(InputInterface $input, OutputInterface $output) $locker = $composer->getLocker(); if ($locker->isLocked()) { $lockedRepo = $locker->getLockedRepository(true); - $installedRepo = new InstalledRepository(array($lockedRepo, $localRepo, $platformRepo)); + $installedRepo = new InstalledRepository([$lockedRepo, $localRepo, $platformRepo]); } else { - $installedRepo = new InstalledRepository(array($localRepo, $platformRepo)); + $installedRepo = new InstalledRepository([$localRepo, $platformRepo]); } - $repos = new CompositeRepository(array_merge(array(new FilterRepository($installedRepo, array('canonical' => false))), $composer->getRepositoryManager()->getRepositories())); + $repos = new CompositeRepository(array_merge([new FilterRepository($installedRepo, ['canonical' => false])], $composer->getRepositoryManager()->getRepositories())); } elseif ($input->getOption('all')) { $defaultRepos = RepositoryFactory::defaultReposWithDefaultManager($io); $io->writeError('No composer.json found in the current directory, showing available packages from ' . implode(', ', array_keys($defaultRepos))); - $installedRepo = new InstalledRepository(array($platformRepo)); - $repos = new CompositeRepository(array_merge(array($installedRepo), $defaultRepos)); + $installedRepo = new InstalledRepository([$platformRepo]); + $repos = new CompositeRepository(array_merge([$installedRepo], $defaultRepos)); } elseif ($input->getOption('locked')) { if (!$composer || !$composer->getLocker()->isLocked()) { throw new \UnexpectedValueException('A valid composer.json and composer.lock files is required to run this command with --locked'); } $locker = $composer->getLocker(); $lockedRepo = $locker->getLockedRepository(!$input->getOption('no-dev')); - $repos = $installedRepo = new InstalledRepository(array($lockedRepo)); + $repos = $installedRepo = new InstalledRepository([$lockedRepo]); } else { // --installed / default case if (!$composer) { $composer = $this->requireComposer(); } $rootPkg = $composer->getPackage(); - $repos = $installedRepo = new InstalledRepository(array($composer->getRepositoryManager()->getLocalRepository())); + $repos = $installedRepo = new InstalledRepository([$composer->getRepositoryManager()->getLocalRepository()]); if ($input->getOption('no-dev')) { $packages = RepositoryUtils::filterRequiredPackages($installedRepo->getPackages(), $rootPkg); - $repos = $installedRepo = new InstalledRepository(array(new InstalledArrayRepository(array_map(static function ($pkg): PackageInterface { + $repos = $installedRepo = new InstalledRepository([new InstalledArrayRepository(array_map(static function ($pkg): PackageInterface { return clone $pkg; - }, $packages)))); + }, $packages))]); } if (!$installedRepo->getPackages() && ($rootPkg->getRequires() || $rootPkg->getDevRequires())) { @@ -274,9 +274,9 @@ protected function execute(InputInterface $input, OutputInterface $output) // show single package or single version if (isset($package)) { - $versions = array($package->getPrettyVersion() => $package->getVersion()); + $versions = [$package->getPrettyVersion() => $package->getVersion()]; } elseif (null !== $packageFilter && !str_contains($packageFilter, '*')) { - list($package, $versions) = $this->getPackage($installedRepo, $repos, $packageFilter, $input->getArgument('version')); + [$package, $versions] = $this->getPackage($installedRepo, $repos, $packageFilter, $input->getArgument('version')); if (!isset($package)) { $options = $input->getOptions(); @@ -306,9 +306,9 @@ protected function execute(InputInterface $input, OutputInterface $output) $arrayTree = $this->generatePackageTree($package, $installedRepo, $repos); if ('json' === $format) { - $io->write(JsonFile::encode(array('installed' => array($arrayTree)))); + $io->write(JsonFile::encode(['installed' => [$arrayTree]])); } else { - $this->displayPackageTree(array($arrayTree)); + $this->displayPackageTree([$arrayTree]); } return $exitCode; @@ -350,7 +350,7 @@ protected function execute(InputInterface $input, OutputInterface $output) usort($packages, static function (BasePackage $a, BasePackage $b): int { return strcmp((string) $a, (string) $b); }); - $arrayTree = array(); + $arrayTree = []; foreach ($packages as $package) { if (in_array($package->getName(), $rootRequires, true)) { $arrayTree[] = $this->generatePackageTree($package, $installedRepo, $repos); @@ -358,7 +358,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } if ('json' === $format) { - $io->write(JsonFile::encode(array('installed' => $arrayTree))); + $io->write(JsonFile::encode(['installed' => $arrayTree])); } else { $this->displayPackageTree($arrayTree); } @@ -368,7 +368,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // list packages /** @var array> $packages */ - $packages = array(); + $packages = []; $packageFilterRegex = null; if (null !== $packageFilter) { $packageFilterRegex = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i'; @@ -430,11 +430,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $ignoredPackages = array_map('strtolower', $input->getOption('ignore')); $indent = $showAllTypes ? ' ' : ''; /** @var PackageInterface[] $latestPackages */ - $latestPackages = array(); + $latestPackages = []; $exitCode = 0; - $viewData = array(); - $viewMetaData = array(); - foreach (array('platform' => true, 'locked' => true, 'available' => false, 'installed' => true) as $type => $showVersion) { + $viewData = []; + $viewMetaData = []; + foreach (['platform' => true, 'locked' => true, 'available' => false, 'installed' => true] as $type => $showVersion) { if (isset($packages[$type])) { ksort($packages[$type]); @@ -460,9 +460,9 @@ protected function execute(InputInterface $input, OutputInterface $output) $hasOutdatedPackages = false; - $viewData[$type] = array(); + $viewData[$type] = []; foreach ($packages[$type] as $package) { - $packageViewData = array(); + $packageViewData = []; if (is_object($package)) { $latestPackage = null; if ($showLatest && isset($latestPackages[$package->getPrettyName()])) { @@ -531,12 +531,12 @@ protected function execute(InputInterface $input, OutputInterface $output) } $viewData[$type][] = $packageViewData; } - $viewMetaData[$type] = array( + $viewMetaData[$type] = [ 'nameLength' => $nameLength, 'versionLength' => $versionLength, 'latestLength' => $latestLength, 'writeLatest' => $writeLatest, - ); + ]; if ($input->getOption('strict') && $hasOutdatedPackages) { $exitCode = 1; break; @@ -647,7 +647,7 @@ private function printPackages(IOInterface $io, array $packages, string $indent, $updateStatus = $package['latest-status']; $style = $this->updateStatusToVersionStyle($updateStatus); if (!$io->isDecorated()) { - $latestVersion = str_replace(array('up-to-date', 'semver-safe-update', 'update-possible'), array('=', '!', '~'), $updateStatus) . ' ' . $latestVersion; + $latestVersion = str_replace(['up-to-date', 'semver-safe-update', 'update-possible'], ['=', '!', '~'], $updateStatus) . ' ' . $latestVersion; } $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '', false); } @@ -696,7 +696,6 @@ protected function getVersionStyle(PackageInterface $latestPackage, PackageInter /** * finds a package by name and version if provided * - * @param string $name * @param ConstraintInterface|string $version * @throws \InvalidArgumentException * @return array{CompletePackageInterface|null, array} @@ -712,7 +711,7 @@ protected function getPackage(InstalledRepository $installedRepo, RepositoryInte $repositorySet->addRepository($repos); $matchedPackage = null; - $versions = array(); + $versions = []; if (PlatformRepository::isPlatformPackage($name)) { $pool = $repositorySet->createPoolWithAllPackages(); } else { @@ -739,18 +738,15 @@ protected function getPackage(InstalledRepository $installedRepo, RepositoryInte $matchedPackage = $pool->literalToPackage($preferred[0]); } - return array($matchedPackage, $versions); + return [$matchedPackage, $versions]; } /** * Prints package info. * * @param array $versions - * @param PackageInterface|null $latestPackage - * - * @return void */ - protected function printPackageInfo(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, PackageInterface $latestPackage = null): void + protected function printPackageInfo(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, ?PackageInterface $latestPackage = null): void { $io = $this->getIO(); @@ -774,16 +770,13 @@ protected function printPackageInfo(CompletePackageInterface $package, array $ve * Prints package metadata. * * @param array $versions - * @param PackageInterface|null $latestPackage - * - * @return void */ - protected function printMeta(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, PackageInterface $latestPackage = null): void + protected function printMeta(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, ?PackageInterface $latestPackage = null): void { $io = $this->getIO(); $io->write('name : ' . $package->getPrettyName()); $io->write('descrip. : ' . $package->getDescription()); - $io->write('keywords : ' . implode(', ', $package->getKeywords() ?: array())); + $io->write('keywords : ' . implode(', ', $package->getKeywords() ?: [])); $this->printVersions($package, $versions, $installedRepo); if ($latestPackage) { $style = $this->getVersionStyle($latestPackage, $package); @@ -843,8 +836,6 @@ protected function printMeta(CompletePackageInterface $package, array $versions, * Prints all available versions of this package and highlights the installed one if any. * * @param array $versions - * - * @return void */ protected function printVersions(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo): void { @@ -870,12 +861,9 @@ protected function printVersions(CompletePackageInterface $package, array $versi /** * print link objects * - * @param string $linkType * @param string $title - * - * @return void */ - protected function printLinks(CompletePackageInterface $package, string $linkType, string $title = null): void + protected function printLinks(CompletePackageInterface $package, string $linkType, ?string $title = null): void { $title = $title ?: $linkType; $io = $this->getIO(); @@ -890,8 +878,6 @@ protected function printLinks(CompletePackageInterface $package, string $linkTyp /** * Prints the licenses of a package with metadata - * - * @return void */ protected function printLicenses(CompletePackageInterface $package): void { @@ -922,19 +908,17 @@ protected function printLicenses(CompletePackageInterface $package): void * Prints package info in JSON format. * * @param array $versions - * - * @return void */ - protected function printPackageInfoAsJson(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, PackageInterface $latestPackage = null): void + protected function printPackageInfoAsJson(CompletePackageInterface $package, array $versions, InstalledRepository $installedRepo, ?PackageInterface $latestPackage = null): void { - $json = array( + $json = [ 'name' => $package->getPrettyName(), 'description' => $package->getDescription(), - 'keywords' => $package->getKeywords() ?: array(), + 'keywords' => $package->getKeywords() ?: [], 'type' => $package->getType(), 'homepage' => $package->getHomepage(), 'names' => $package->getNames(), - ); + ]; $json = $this->appendVersions($json, $versions); $json = $this->appendLicenses($json, $package); @@ -946,19 +930,19 @@ protected function printPackageInfoAsJson(CompletePackageInterface $package, arr } if (null !== $package->getSourceType()) { - $json['source'] = array( + $json['source'] = [ 'type' => $package->getSourceType(), 'url' => $package->getSourceUrl(), 'reference' => $package->getSourceReference(), - ); + ]; } if (null !== $package->getDistType()) { - $json['dist'] = array( + $json['dist'] = [ 'type' => $package->getDistType(), 'url' => $package->getDistUrl(), 'reference' => $package->getDistReference(), - ); + ]; } if ($installedRepo->hasPackage($package)) { @@ -1021,11 +1005,11 @@ private function appendLicenses(array $json, CompletePackageInterface $package): return $licenseId; } - return array( + return [ 'name' => $license[0], 'osi' => $licenseId, 'url' => $license[2], - ); + ]; }, $licenses); } @@ -1039,11 +1023,11 @@ private function appendLicenses(array $json, CompletePackageInterface $package): private function appendAutoload(array $json, CompletePackageInterface $package): array { if ($package->getAutoload()) { - $autoload = array(); + $autoload = []; foreach ($package->getAutoload() as $type => $autoloads) { if ($type === 'psr-0' || $type === 'psr-4') { - $psr = array(); + $psr = []; foreach ($autoloads as $name => $path) { if (!$path) { @@ -1080,7 +1064,6 @@ private function appendLinks(array $json, CompletePackageInterface $package): ar /** * @param array $json - * @param string $linkType * @return array */ private function appendLink(array $json, CompletePackageInterface $package, string $linkType): array @@ -1088,7 +1071,7 @@ private function appendLink(array $json, CompletePackageInterface $package, stri $links = $package->{'get' . ucfirst($linkType)}(); if ($links) { - $json[$linkType] = array(); + $json[$linkType] = []; foreach ($links as $link) { $json[$linkType][$link->getTarget()] = $link->getPrettyConstraint(); @@ -1100,18 +1083,16 @@ private function appendLink(array $json, CompletePackageInterface $package, stri /** * Init styles for tree - * - * @return void */ protected function initStyles(OutputInterface $output): void { - $this->colors = array( + $this->colors = [ 'green', 'yellow', 'cyan', 'magenta', 'blue', - ); + ]; foreach ($this->colors as $color) { $style = new OutputFormatterStyle($color); @@ -1123,7 +1104,6 @@ protected function initStyles(OutputInterface $output): void * Display the tree * * @param array> $arrayTree - * @return void */ protected function displayPackageTree(array $arrayTree): void { @@ -1162,7 +1142,7 @@ protected function displayPackageTree(array $arrayTree): void $this->writeTreeLine($info); $treeBar = str_replace('└', ' ', $treeBar); - $packagesInTree = array($package['name'], $requireName); + $packagesInTree = [$package['name'], $requireName]; $this->displayTree($require, $packagesInTree, $treeBar, $level + 1); } @@ -1182,14 +1162,14 @@ protected function generatePackageTree( ): array { $requires = $package->getRequires(); ksort($requires); - $children = array(); + $children = []; foreach ($requires as $requireName => $require) { - $packagesInTree = array($package->getName(), $requireName); + $packagesInTree = [$package->getName(), $requireName]; - $treeChildDesc = array( + $treeChildDesc = [ 'name' => $requireName, 'version' => $require->getPrettyConstraint(), - ); + ]; $deepChildren = $this->addTree($requireName, $require, $installedRepo, $remoteRepos, $packagesInTree); @@ -1199,11 +1179,11 @@ protected function generatePackageTree( $children[] = $treeChildDesc; } - $tree = array( + $tree = [ 'name' => $package->getPrettyName(), 'version' => $package->getPrettyVersion(), 'description' => $package instanceof CompletePackageInterface ? $package->getDescription() : '', - ); + ]; if ($children) { $tree['requires'] = $children; @@ -1217,10 +1197,6 @@ protected function generatePackageTree( * * @param array>|string|null>|string $package * @param array $packagesInTree - * @param string $previousTreeBar - * @param int $level - * - * @return void */ protected function displayTree( $package, @@ -1270,7 +1246,6 @@ protected function displayTree( /** * Display a package tree * - * @param string $name * @param string[] $packagesInTree * @return array>|string>> */ @@ -1281,8 +1256,8 @@ protected function addTree( RepositoryInterface $remoteRepos, array $packagesInTree ): array { - $children = array(); - list($package) = $this->getPackage( + $children = []; + [$package] = $this->getPackage( $installedRepo, $remoteRepos, $name, @@ -1294,10 +1269,10 @@ protected function addTree( foreach ($requires as $requireName => $require) { $currentTree = $packagesInTree; - $treeChildDesc = array( + $treeChildDesc = [ 'name' => $requireName, 'version' => $require->getPrettyConstraint(), - ); + ]; if (!in_array($requireName, $currentTree, true)) { $currentTree[] = $requireName; @@ -1314,21 +1289,14 @@ protected function addTree( return $children; } - /** - * @param string $updateStatus - * @return string - */ private function updateStatusToVersionStyle(string $updateStatus): string { // 'up-to-date' is printed green // 'semver-safe-update' is printed red // 'update-possible' is printed yellow - return str_replace(array('up-to-date', 'semver-safe-update', 'update-possible'), array('info', 'highlight', 'comment'), $updateStatus); + return str_replace(['up-to-date', 'semver-safe-update', 'update-possible'], ['info', 'highlight', 'comment'], $updateStatus); } - /** - * @return string - */ private function getUpdateStatus(PackageInterface $latestPackage, PackageInterface $package): string { if ($latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion()) { @@ -1348,16 +1316,11 @@ private function getUpdateStatus(PackageInterface $latestPackage, PackageInterfa return 'update-possible'; } - /** - * @param string $line - * - * @return void - */ private function writeTreeLine(string $line): void { $io = $this->getIO(); if (!$io->isDecorated()) { - $line = str_replace(array('└', '├', '──', '│'), array('`-', '|-', '-', '|'), $line); + $line = str_replace(['└', '├', '──', '│'], ['`-', '|-', '-', '|'], $line); } $io->write($line); @@ -1419,9 +1382,6 @@ private function findLatestPackage(PackageInterface $package, Composer $composer return $candidate !== false ? $candidate : null; } - /** - * @return RepositorySet - */ private function getRepositorySet(Composer $composer): RepositorySet { if (!$this->repositorySet) { diff --git a/src/Composer/Command/StatusCommand.php b/src/Composer/Command/StatusCommand.php index b1e2b843e4b5..417d166a433a 100644 --- a/src/Composer/Command/StatusCommand.php +++ b/src/Composer/Command/StatusCommand.php @@ -37,7 +37,6 @@ class StatusCommand extends BaseCommand private const EXIT_CODE_VERSION_CHANGES = 4; /** - * @return void * @throws \Symfony\Component\Console\Exception\InvalidArgumentException */ protected function configure(): void @@ -45,9 +44,9 @@ protected function configure(): void $this ->setName('status') ->setDescription('Shows a list of locally modified packages') - ->setDefinition(array( + ->setDefinition([ new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Show modified files for each directory that contains changes.'), - )) + ]) ->setHelp( <<getDownloadManager(); $im = $composer->getInstallationManager(); - $errors = array(); + $errors = []; $io = $this->getIO(); - $unpushedChanges = array(); - $vcsVersionChanges = array(); + $unpushedChanges = []; + $vcsVersionChanges = []; $parser = new VersionParser; $guesser = new VersionGuesser($composer->getConfig(), $composer->getLoop()->getProcessExecutor() ?? new ProcessExecutor($io), $parser); @@ -130,16 +126,16 @@ private function doExecute(InputInterface $input): int $currentVersion = $guesser->guessVersion($dumper->dump($package), $targetDir); if ($previousRef && $currentVersion && $currentVersion['commit'] !== $previousRef) { - $vcsVersionChanges[$targetDir] = array( - 'previous' => array( + $vcsVersionChanges[$targetDir] = [ + 'previous' => [ 'version' => $package->getPrettyVersion(), 'ref' => $previousRef, - ), - 'current' => array( + ], + 'current' => [ 'version' => $currentVersion['pretty_version'], 'ref' => $currentVersion['commit'], - ), - ); + ], + ]; } } } diff --git a/src/Composer/Command/SuggestsCommand.php b/src/Composer/Command/SuggestsCommand.php index 63bc19ef942e..df63b3eb4222 100644 --- a/src/Composer/Command/SuggestsCommand.php +++ b/src/Composer/Command/SuggestsCommand.php @@ -25,22 +25,19 @@ class SuggestsCommand extends BaseCommand { use CompletionTrait; - /** - * @return void - */ protected function configure(): void { $this ->setName('suggests') ->setDescription('Shows package suggestions') - ->setDefinition(array( + ->setDefinition([ new InputOption('by-package', null, InputOption::VALUE_NONE, 'Groups output by suggesting package (default)'), new InputOption('by-suggestion', null, InputOption::VALUE_NONE, 'Groups output by suggested package'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show suggestions from all dependencies, including transitive ones'), new InputOption('list', null, InputOption::VALUE_NONE, 'Show only list of suggested package names'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Exclude suggestions from require-dev packages'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that you want to list suggestions from.', null, $this->suggestInstalledPackage()), - )) + ]) ->setHelp( <<requireComposer(); - $installedRepos = array( + $installedRepos = [ new RootPackageRepository(clone $composer->getPackage()), - ); + ]; $locker = $composer->getLocker(); if ($locker->isLocked()) { - $installedRepos[] = new PlatformRepository(array(), $locker->getPlatformOverrides()); + $installedRepos[] = new PlatformRepository([], $locker->getPlatformOverrides()); $installedRepos[] = $locker->getLockedRepository(!$input->getOption('no-dev')); } else { - $installedRepos[] = new PlatformRepository(array(), $composer->getConfig()->get('platform')); + $installedRepos[] = new PlatformRepository([], $composer->getConfig()->get('platform')); $installedRepos[] = $composer->getRepositoryManager()->getLocalRepository(); } diff --git a/src/Composer/Command/UpdateCommand.php b/src/Composer/Command/UpdateCommand.php index f88ea539d170..5a0469d325ca 100644 --- a/src/Composer/Command/UpdateCommand.php +++ b/src/Composer/Command/UpdateCommand.php @@ -21,10 +21,7 @@ use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Package\Version\VersionParser; -use Composer\Semver\Constraint\ConstraintInterface; use Composer\Util\HttpDownloader; -use Composer\Semver\Constraint\MultiConstraint; -use Composer\Package\Link; use Composer\Advisory\Auditor; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; @@ -48,9 +45,9 @@ protected function configure() { $this ->setName('update') - ->setAliases(array('u', 'upgrade')) + ->setAliases(['u', 'upgrade']) ->setDescription('Updates your dependencies to the latest version according to composer.json, and updates the composer.lock file') - ->setDefinition(array( + ->setDefinition([ new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.', null, $this->suggestInstalledPackage(false)), new InputOption('with', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), @@ -79,7 +76,7 @@ protected function configure() new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies (can also be set via the COMPOSER_PREFER_LOWEST=1 env var).'), new InputOption('interactive', 'i', InputOption::VALUE_NONE, 'Interactive interface with autocompletion to select the packages to update.'), new InputOption('root-reqs', null, InputOption::VALUE_NONE, 'Restricts the update to your first degree dependencies.'), - )) + ]) ->setHelp( <<update command reads the composer.json file from the @@ -180,7 +177,7 @@ protected function execute(InputInterface $input, OutputInterface $output) // the arguments lock/nothing/mirrors are not package names but trigger a mirror update instead // they are further mutually exclusive with listing actual package names $filteredPackages = array_filter($packages, static function ($package): bool { - return !in_array($package, array('lock', 'nothing', 'mirrors'), true); + return !in_array($package, ['lock', 'nothing', 'mirrors'], true); }); $updateMirrors = $input->getOption('lock') || count($filteredPackages) !== count($packages); $packages = $filteredPackages; @@ -199,7 +196,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $install = Installer::create($io, $composer); $config = $composer->getConfig(); - list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); + [$preferSource, $preferDist] = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); @@ -257,7 +254,7 @@ private function getPackagesInteractively(IOInterface $io, InputInterface $input $composer->getPackage()->getRequires(), $composer->getPackage()->getDevRequires() ); - $autocompleterValues = array(); + $autocompleterValues = []; foreach ($requires as $require) { $target = $require->getTarget(); $autocompleterValues[strtolower($target)] = $target; @@ -294,9 +291,9 @@ private function getPackagesInteractively(IOInterface $io, InputInterface $input } $table = new Table($output); - $table->setHeaders(array('Selected packages')); + $table->setHeaders(['Selected packages']); foreach ($packages as $package) { - $table->addRow(array($package)); + $table->addRow([$package]); } $table->render(); diff --git a/src/Composer/Command/ValidateCommand.php b/src/Composer/Command/ValidateCommand.php index 79b41bd2120b..42f7f4fbfe69 100644 --- a/src/Composer/Command/ValidateCommand.php +++ b/src/Composer/Command/ValidateCommand.php @@ -36,14 +36,13 @@ class ValidateCommand extends BaseCommand { /** * configure - * @return void */ protected function configure(): void { $this ->setName('validate') ->setDescription('Validates a composer.json and composer.lock') - ->setDefinition(array( + ->setDefinition([ new InputOption('no-check-all', null, InputOption::VALUE_NONE, 'Do not validate requires for overly strict/loose constraints'), new InputOption('check-lock', null, InputOption::VALUE_NONE, 'Check if lock file is up to date (even when config.lock is false)'), new InputOption('no-check-lock', null, InputOption::VALUE_NONE, 'Do not check if lock file is up to date'), @@ -52,7 +51,7 @@ protected function configure(): void new InputOption('with-dependencies', 'A', InputOption::VALUE_NONE, 'Also validate the composer.json of all installed dependencies'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code for warnings as well as errors'), new InputArgument('file', InputArgument::OPTIONAL, 'path to composer.json file'), - )) + ]) ->setHelp( <<getOption('no-check-lock'); $checkVersion = $input->getOption('no-check-version') ? 0 : ConfigValidator::CHECK_VERSION; $isStrict = $input->getOption('strict'); - list($errors, $publishErrors, $warnings) = $validator->validate($file, $checkAll, $checkVersion); + [$errors, $publishErrors, $warnings] = $validator->validate($file, $checkAll, $checkVersion); - $lockErrors = array(); + $lockErrors = []; $composer = Factory::create($io, $file, $input->hasParameterOption('--no-plugins')); // config.lock = false ~= implicit --no-check-lock; --check-lock overrides $checkLock = ($checkLock && $composer->getConfig()->get('lock')) || $input->getOption('check-lock'); @@ -102,14 +101,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($locker->isLocked()) { $missingRequirements = false; - $sets = array( - array('repo' => $locker->getLockedRepository(false), 'method' => 'getRequires', 'description' => 'Required'), - array('repo' => $locker->getLockedRepository(true), 'method' => 'getDevRequires', 'description' => 'Required (in require-dev)'), - ); + $sets = [ + ['repo' => $locker->getLockedRepository(false), 'method' => 'getRequires', 'description' => 'Required'], + ['repo' => $locker->getLockedRepository(true), 'method' => 'getDevRequires', 'description' => 'Required (in require-dev)'], + ]; foreach ($sets as $set) { - $installedRepo = new InstalledRepository(array($set['repo'])); + $installedRepo = new InstalledRepository([$set['repo']]); - foreach (call_user_func(array($composer->getPackage(), $set['method'])) as $link) { + foreach (call_user_func([$composer->getPackage(), $set['method']]) as $link) { if (PlatformRepository::isPlatformPackage($link->getTarget())) { continue; } @@ -143,7 +142,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $path = $composer->getInstallationManager()->getInstallPath($package); $file = $path . '/composer.json'; if (is_dir($path) && file_exists($file)) { - list($errors, $publishErrors, $warnings) = $validator->validate($file, $checkAll, $checkVersion); + [$errors, $publishErrors, $warnings] = $validator->validate($file, $checkAll, $checkVersion); $this->outputResult($io, $package->getPrettyName(), $errors, $warnings, $checkPublish, $publishErrors); @@ -161,18 +160,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int } /** - * @param string $name * @param string[] $errors * @param string[] $warnings - * @param bool $checkPublish * @param string[] $publishErrors - * @param bool $checkLock * @param string[] $lockErrors - * @param bool $printSchemaUrl - * - * @return void */ - private function outputResult(IOInterface $io, string $name, array &$errors, array &$warnings, bool $checkPublish = false, array $publishErrors = array(), bool $checkLock = false, array $lockErrors = array(), bool $printSchemaUrl = false): void + private function outputResult(IOInterface $io, string $name, array &$errors, array &$warnings, bool $checkPublish = false, array $publishErrors = [], bool $checkLock = false, array $lockErrors = [], bool $printSchemaUrl = false): void { $doPrintSchemaUrl = false; @@ -209,7 +202,7 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr } // Avoid setting the exit code to 1 in case --strict and --no-check-publish/--no-check-lock are combined - $extraWarnings = array(); + $extraWarnings = []; // If checking publish errors, display them as errors, otherwise just show them as warnings if ($publishErrors) { @@ -237,10 +230,10 @@ private function outputResult(IOInterface $io, string $name, array &$errors, arr } } - $messages = array( + $messages = [ 'error' => $errors, 'warning' => array_merge($warnings, $extraWarnings), - ); + ]; foreach ($messages as $style => $msgs) { foreach ($msgs as $msg) { diff --git a/src/Composer/Compiler.php b/src/Composer/Compiler.php index 08c805e7275a..53c252b0320b 100644 --- a/src/Composer/Compiler.php +++ b/src/Composer/Compiler.php @@ -40,7 +40,6 @@ class Compiler * * @param string $pharFile The full path to the file to create * - * @return void * * @throws \RuntimeException */ @@ -50,13 +49,13 @@ public function compile(string $pharFile = 'composer.phar'): void unlink($pharFile); } - $process = new Process(array('git', 'log', '--pretty=%H', '-n1', 'HEAD'), __DIR__); + $process = new Process(['git', 'log', '--pretty=%H', '-n1', 'HEAD'], __DIR__); if ($process->run() !== 0) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } $this->version = trim($process->getOutput()); - $process = new Process(array('git', 'log', '-n1', '--pretty=%ci', 'HEAD'), __DIR__); + $process = new Process(['git', 'log', '-n1', '--pretty=%ci', 'HEAD'], __DIR__); if ($process->run() !== 0) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } @@ -64,7 +63,7 @@ public function compile(string $pharFile = 'composer.phar'): void $this->versionDate = new \DateTime(trim($process->getOutput())); $this->versionDate->setTimezone(new \DateTimeZone('UTC')); - $process = new Process(array('git', 'describe', '--tags', '--exact-match', 'HEAD'), __DIR__); + $process = new Process(['git', 'describe', '--tags', '--exact-match', 'HEAD'], __DIR__); if ($process->run() === 0) { $this->version = trim($process->getOutput()); } else { @@ -132,19 +131,19 @@ public function compile(string $pharFile = 'composer.phar'): void ; $extraFiles = []; - foreach (array( + foreach ([ __DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-exceptions.json', __DIR__ . '/../../vendor/composer/spdx-licenses/res/spdx-licenses.json', CaBundle::getBundledCaBundlePath(), __DIR__ . '/../../vendor/symfony/console/Resources/bin/hiddeninput.exe', __DIR__ . '/../../vendor/symfony/console/Resources/completion.bash', - ) as $file) { + ] as $file) { $extraFiles[$file] = realpath($file); if (!file_exists($file)) { throw new \RuntimeException('Extra file listed is missing from the filesystem: '.$file); } } - $unexpectedFiles = array(); + $unexpectedFiles = []; foreach ($finder as $file) { if (false !== ($index = array_search($file->getRealPath(), $extraFiles, true))) { @@ -197,10 +196,6 @@ public function compile(string $pharFile = 'composer.phar'): void ]); } - /** - * @param \SplFileInfo $file - * @return string - */ private function getRelativeFilePath(\SplFileInfo $file): string { $realPath = $file->getRealPath(); @@ -212,11 +207,6 @@ private function getRelativeFilePath(\SplFileInfo $file): string return strtr($relativePath, '\\', '/'); } - /** - * @param bool $strip - * - * @return void - */ private function addFile(\Phar $phar, \SplFileInfo $file, bool $strip = true): void { $path = $this->getRelativeFilePath($file); @@ -230,11 +220,11 @@ private function addFile(\Phar $phar, \SplFileInfo $file, bool $strip = true): v if ($path === 'src/Composer/Composer.php') { $content = strtr( $content, - array( + [ '@package_version@' => $this->version, '@package_branch_alias_version@' => $this->branchAliasVersion, '@release_date@' => $this->versionDate->format('Y-m-d H:i:s'), - ) + ] ); $content = Preg::replace('{SOURCE_VERSION = \'[^\']+\';}', 'SOURCE_VERSION = \'\';', $content); } @@ -242,9 +232,6 @@ private function addFile(\Phar $phar, \SplFileInfo $file, bool $strip = true): v $phar->addFromString($path, $content); } - /** - * @return void - */ private function addComposerBin(\Phar $phar): void { $content = file_get_contents(__DIR__.'/../../bin/composer'); @@ -268,7 +255,7 @@ private function stripWhitespace(string $source): string foreach (token_get_all($source) as $token) { if (is_string($token)) { $output .= $token; - } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) { + } elseif (in_array($token[0], [T_COMMENT, T_DOC_COMMENT])) { $output .= str_repeat("\n", substr_count($token[1], "\n")); } elseif (T_WHITESPACE === $token[0]) { // reduce wide spaces @@ -286,9 +273,6 @@ private function stripWhitespace(string $source): string return $output; } - /** - * @return string - */ private function getStub(): string { $stub = <<<'EOF' diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index e07bac101417..c6f083dfdb51 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -67,9 +67,6 @@ class Composer extends PartialComposer */ public const RUNTIME_API_VERSION = '2.2.2'; - /** - * @return string - */ public static function getVersion(): string { // no replacement done, this must be a source checkout diff --git a/src/Composer/Config.php b/src/Composer/Config.php index 6ed4d46dcdeb..141efa6ff01f 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -31,14 +31,14 @@ class Config public const RELATIVE_PATHS = 1; /** @var array */ - public static $defaultConfig = array( + public static $defaultConfig = [ 'process-timeout' => 300, 'use-include-path' => false, - 'allow-plugins' => array(), + 'allow-plugins' => [], 'use-parent-dir' => 'prompt', 'preferred-install' => 'dist', 'notify-on-install' => true, - 'github-protocols' => array('https', 'ssh', 'git'), + 'github-protocols' => ['https', 'ssh', 'git'], 'gitlab-protocol' => null, 'vendor-dir' => 'vendor', 'bin-dir' => '{$vendor-dir}/bin', @@ -59,38 +59,38 @@ class Config 'classmap-authoritative' => false, 'apcu-autoloader' => false, 'prepend-autoloader' => true, - 'github-domains' => array('github.com'), + 'github-domains' => ['github.com'], 'bitbucket-expose-hostname' => true, 'disable-tls' => false, 'secure-http' => true, - 'secure-svn-domains' => array(), + 'secure-svn-domains' => [], 'cafile' => null, 'capath' => null, 'github-expose-hostname' => true, - 'gitlab-domains' => array('gitlab.com'), + 'gitlab-domains' => ['gitlab.com'], 'store-auths' => 'prompt', - 'platform' => array(), + 'platform' => [], 'archive-format' => 'tar', 'archive-dir' => '.', 'htaccess-protect' => true, 'use-github-api' => true, 'lock' => true, 'platform-check' => 'php-only', - 'bitbucket-oauth' => array(), - 'github-oauth' => array(), - 'gitlab-oauth' => array(), - 'gitlab-token' => array(), - 'http-basic' => array(), - 'bearer' => array(), - ); + 'bitbucket-oauth' => [], + 'github-oauth' => [], + 'gitlab-oauth' => [], + 'gitlab-token' => [], + 'http-basic' => [], + 'bearer' => [], + ]; /** @var array */ - public static $defaultRepositories = array( - 'packagist.org' => array( + public static $defaultRepositories = [ + 'packagist.org' => [ 'type' => 'composer', 'url' => 'https://repo.packagist.org', - ), - ); + ], + ]; /** @var array */ private $config; @@ -105,11 +105,11 @@ class Config /** @var bool */ private $useEnvironment; /** @var array */ - private $warnedHosts = array(); + private $warnedHosts = []; /** @var array */ - private $sslVerifyWarnedHosts = array(); + private $sslVerifyWarnedHosts = []; /** @var array */ - private $sourceOfConfigValue = array(); + private $sourceOfConfigValue = []; /** * @param bool $useEnvironment Use COMPOSER_ environment variables to replace config settings @@ -133,33 +133,21 @@ public function __construct(bool $useEnvironment = true, ?string $baseDir = null } } - /** - * @return void - */ public function setConfigSource(ConfigSourceInterface $source): void { $this->configSource = $source; } - /** - * @return ConfigSourceInterface - */ public function getConfigSource(): ConfigSourceInterface { return $this->configSource; } - /** - * @return void - */ public function setAuthConfigSource(ConfigSourceInterface $source): void { $this->authConfigSource = $source; } - /** - * @return ConfigSourceInterface - */ public function getAuthConfigSource(): ConfigSourceInterface { return $this->authConfigSource; @@ -169,33 +157,30 @@ public function getAuthConfigSource(): ConfigSourceInterface * Merges new config values with the existing ones (overriding) * * @param array{config?: array, repositories?: array} $config - * @param string $source - * - * @return void */ public function merge(array $config, string $source = self::SOURCE_UNKNOWN): void { // override defaults with given config if (!empty($config['config']) && is_array($config['config'])) { foreach ($config['config'] as $key => $val) { - if (in_array($key, array('bitbucket-oauth', 'github-oauth', 'gitlab-oauth', 'gitlab-token', 'http-basic', 'bearer'), true) && isset($this->config[$key])) { + if (in_array($key, ['bitbucket-oauth', 'github-oauth', 'gitlab-oauth', 'gitlab-token', 'http-basic', 'bearer'], true) && isset($this->config[$key])) { $this->config[$key] = array_merge($this->config[$key], $val); $this->setSourceOfConfigValue($val, $key, $source); - } elseif (in_array($key, array('allow-plugins'), true) && isset($this->config[$key]) && is_array($this->config[$key]) && is_array($val)) { + } elseif (in_array($key, ['allow-plugins'], true) && isset($this->config[$key]) && is_array($this->config[$key]) && is_array($val)) { // merging $val first to get the local config on top of the global one, then appending the global config, // then merging local one again to make sure the values from local win over global ones for keys present in both $this->config[$key] = array_merge($val, $this->config[$key], $val); $this->setSourceOfConfigValue($val, $key, $source); - } elseif (in_array($key, array('gitlab-domains', 'github-domains'), true) && isset($this->config[$key])) { + } elseif (in_array($key, ['gitlab-domains', 'github-domains'], true) && isset($this->config[$key])) { $this->config[$key] = array_unique(array_merge($this->config[$key], $val)); $this->setSourceOfConfigValue($val, $key, $source); } elseif ('preferred-install' === $key && isset($this->config[$key])) { if (is_array($val) || is_array($this->config[$key])) { if (is_string($val)) { - $val = array('*' => $val); + $val = ['*' => $val]; } if (is_string($this->config[$key])) { - $this->config[$key] = array('*' => $this->config[$key]); + $this->config[$key] = ['*' => $this->config[$key]]; $this->sourceOfConfigValue[$key . '*'] = $source; } $this->config[$key] = array_merge($this->config[$key], $val); @@ -267,7 +252,6 @@ public function getRepositories(): array /** * Returns a setting * - * @param string $key * @param int $flags Options (see class constants) * @throws \RuntimeException * @@ -379,7 +363,7 @@ public function get(string $key, int $flags = 0) case 'bin-compat': $value = $this->getComposerEnv('COMPOSER_BIN_COMPAT') ?: $this->config[$key]; - if (!in_array($value, array('auto', 'full', 'proxy', 'symlink'))) { + if (!in_array($value, ['auto', 'full', 'proxy', 'symlink'])) { throw new \RuntimeException( "Invalid value for 'bin-compat': {$value}. Expected auto, full or proxy" ); @@ -393,7 +377,7 @@ public function get(string $key, int $flags = 0) case 'discard-changes': if ($env = $this->getComposerEnv('COMPOSER_DISCARD_CHANGES')) { - if (!in_array($env, array('stash', 'true', 'false', '1', '0'), true)) { + if (!in_array($env, ['stash', 'true', 'false', '1', '0'], true)) { throw new \RuntimeException( "Invalid value for COMPOSER_DISCARD_CHANGES: {$env}. Expected 1, 0, true, false or stash" ); @@ -406,7 +390,7 @@ public function get(string $key, int $flags = 0) return $env !== 'false' && (bool) $env; } - if (!in_array($this->config[$key], array(true, false, 'stash'), true)) { + if (!in_array($this->config[$key], [true, false, 'stash'], true)) { throw new \RuntimeException( "Invalid value for 'discard-changes': {$this->config[$key]}. Expected true, false or stash" ); @@ -442,15 +426,13 @@ public function get(string $key, int $flags = 0) } /** - * @param int $flags - * * @return array */ public function all(int $flags = 0): array { - $all = array( + $all = [ 'repositories' => $this->getRepositories(), - ); + ]; foreach (array_keys($this->config) as $key) { $all['config'][$key] = $this->get($key, $flags); } @@ -458,10 +440,6 @@ public function all(int $flags = 0): array return $all; } - /** - * @param string $key - * @return string - */ public function getSourceOfValue(string $key): string { $this->get($key); @@ -471,10 +449,6 @@ public function getSourceOfValue(string $key): string /** * @param mixed $configValue - * @param string $path - * @param string $source - * - * @return void */ private function setSourceOfConfigValue($configValue, string $path, string $source): void { @@ -492,17 +466,14 @@ private function setSourceOfConfigValue($configValue, string $path, string $sour */ public function raw(): array { - return array( + return [ 'repositories' => $this->getRepositories(), 'config' => $this->config, - ); + ]; } /** * Checks whether a setting exists - * - * @param string $key - * @return bool */ public function has(string $key): bool { @@ -532,9 +503,6 @@ private function process($value, int $flags) * Turns relative paths in absolute paths without realpath() * * Since the dirs might not exist yet we can not call realpath or it will fail. - * - * @param string $path - * @return string */ private function realpath(string $path): string { @@ -551,7 +519,6 @@ private function realpath(string $path): string * This should be used to read COMPOSER_ environment variables * that overload config values. * - * @param string $var * @return string|bool */ private function getComposerEnv(string $var) @@ -563,11 +530,6 @@ private function getComposerEnv(string $var) return false; } - /** - * @param string $name - * - * @return void - */ private function disableRepoByName(string $name): void { if (isset($this->repositories[$name])) { @@ -580,13 +542,10 @@ private function disableRepoByName(string $name): void /** * Validates that the passed URL is allowed to be used by current config, or throws an exception. * - * @param string $url * @param IOInterface $io * @param mixed[] $repoOptions - * - * @return void */ - public function prohibitUrlByConfig(string $url, IOInterface $io = null, array $repoOptions = []): void + public function prohibitUrlByConfig(string $url, ?IOInterface $io = null, array $repoOptions = []): void { // Return right away if the URL is malformed or custom (see issue #5173) if (false === filter_var($url, FILTER_VALIDATE_URL)) { @@ -596,7 +555,7 @@ public function prohibitUrlByConfig(string $url, IOInterface $io = null, array $ // Extract scheme and throw exception on known insecure protocols $scheme = parse_url($url, PHP_URL_SCHEME); $hostname = parse_url($url, PHP_URL_HOST); - if (in_array($scheme, array('http', 'git', 'ftp', 'svn'))) { + if (in_array($scheme, ['http', 'git', 'ftp', 'svn'])) { if ($this->get('secure-http')) { if ($scheme === 'svn') { if (in_array($hostname, $this->get('secure-svn-domains'), true)) { @@ -608,7 +567,7 @@ public function prohibitUrlByConfig(string $url, IOInterface $io = null, array $ throw new TransportException("Your configuration does not allow connections to $url. See https://getcomposer.org/doc/06-config.md#secure-http for details."); } - if ($io !== null) { + if ($io !== null) { if (is_string($hostname)) { if (!isset($this->warnedHosts[$hostname])) { $io->writeError("Warning: Accessing $hostname over $scheme which is an insecure protocol."); @@ -644,8 +603,6 @@ public function prohibitUrlByConfig(string $url, IOInterface $io = null, array $ * "vendor/bin/long-running-script --watch" * ] * } - * - * @return void */ public static function disableProcessTimeout(): void { diff --git a/src/Composer/Config/ConfigSourceInterface.php b/src/Composer/Config/ConfigSourceInterface.php index f94ab630e6e0..31f21f0e0b73 100644 --- a/src/Composer/Config/ConfigSourceInterface.php +++ b/src/Composer/Config/ConfigSourceInterface.php @@ -26,17 +26,11 @@ interface ConfigSourceInterface * @param string $name Name * @param mixed[]|false $config Configuration * @param bool $append Whether the repo should be appended (true) or prepended (false) - * - * @return void */ public function addRepository(string $name, $config, bool $append = true): void; /** * Remove a repository - * - * @param string $name - * - * @return void */ public function removeRepository(string $name): void; @@ -45,17 +39,11 @@ public function removeRepository(string $name): void; * * @param string $name Name * @param mixed $value Value - * - * @return void */ public function addConfigSetting(string $name, $value): void; /** * Remove a config setting - * - * @param string $name - * - * @return void */ public function removeConfigSetting(string $name): void; @@ -64,17 +52,11 @@ public function removeConfigSetting(string $name): void; * * @param string $name Name * @param string|string[] $value Value - * - * @return void */ public function addProperty(string $name, $value): void; /** * Remove a property - * - * @param string $name - * - * @return void */ public function removeProperty(string $name): void; @@ -84,8 +66,6 @@ public function removeProperty(string $name): void; * @param string $type Type (require, require-dev, provide, suggest, replace, conflict) * @param string $name Name * @param string $value Value - * - * @return void */ public function addLink(string $type, string $name, string $value): void; @@ -94,15 +74,11 @@ public function addLink(string $type, string $name, string $value): void; * * @param string $type Type (require, require-dev, provide, suggest, replace, conflict) * @param string $name Name - * - * @return void */ public function removeLink(string $type, string $name): void; /** * Gives a user-friendly name to this source (file path or so) - * - * @return string */ public function getName(): string; } diff --git a/src/Composer/Config/JsonConfigSource.php b/src/Composer/Config/JsonConfigSource.php index a4f82d3223e9..bff50d8694d9 100644 --- a/src/Composer/Config/JsonConfigSource.php +++ b/src/Composer/Config/JsonConfigSource.php @@ -39,9 +39,6 @@ class JsonConfigSource implements ConfigSourceInterface /** * Constructor - * - * @param JsonFile $file - * @param bool $authConfig */ public function __construct(JsonFile $file, bool $authConfig = false) { @@ -70,7 +67,7 @@ public function addRepository(string $name, $config, bool $append = true): void if ($index === $repo) { continue; } - if (is_numeric($index) && ($val === array('packagist' => false) || $val === array('packagist.org' => false))) { + if (is_numeric($index) && ($val === ['packagist' => false] || $val === ['packagist.org' => false])) { unset($config['repositories'][$index]); $config['repositories']['packagist.org'] = false; break; @@ -81,7 +78,7 @@ public function addRepository(string $name, $config, bool $append = true): void if ($append) { $config['repositories'][$repo] = $repoConfig; } else { - $config['repositories'] = array($repo => $repoConfig) + $config['repositories']; + $config['repositories'] = [$repo => $repoConfig] + $config['repositories']; } }, $name, $config, $append); } @@ -104,7 +101,7 @@ public function addConfigSetting(string $name, $value): void $authConfig = $this->authConfig; $this->manipulateJson('addConfigSetting', static function (&$config, $key, $val) use ($authConfig): void { if (Preg::isMatch('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\.}', $key)) { - list($key, $host) = explode('.', $key, 2); + [$key, $host] = explode('.', $key, 2); if ($authConfig) { $config[$key][$host] = $val; } else { @@ -124,7 +121,7 @@ public function removeConfigSetting(string $name): void $authConfig = $this->authConfig; $this->manipulateJson('removeConfigSetting', static function (&$config, $key) use ($authConfig): void { if (Preg::isMatch('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\.}', $key)) { - list($key, $host) = explode('.', $key, 2); + [$key, $host] = explode('.', $key, 2); if ($authConfig) { unset($config[$key][$host]); } else { @@ -148,7 +145,7 @@ public function addProperty(string $name, $value): void $arr = &$config[reset($bits)]; foreach ($bits as $bit) { if (!isset($arr[$bit])) { - $arr[$bit] = array(); + $arr[$bit] = []; } $arr = &$arr[$bit]; } @@ -208,11 +205,7 @@ public function removeLink(string $type, string $name): void } /** - * @param string $method - * @param callable $fallback * @param mixed ...$args - * - * @return void */ private function manipulateJson(string $method, callable $fallback, ...$args): void { @@ -239,38 +232,38 @@ private function manipulateJson(string $method, callable $fallback, ...$args): v // override manipulator method for auth config files if ($this->authConfig && $method === 'addConfigSetting') { $method = 'addSubNode'; - list($mainNode, $name) = explode('.', $args[0], 2); - $args = array($mainNode, $name, $args[1]); + [$mainNode, $name] = explode('.', $args[0], 2); + $args = [$mainNode, $name, $args[1]]; } elseif ($this->authConfig && $method === 'removeConfigSetting') { $method = 'removeSubNode'; - list($mainNode, $name) = explode('.', $args[0], 2); - $args = array($mainNode, $name); + [$mainNode, $name] = explode('.', $args[0], 2); + $args = [$mainNode, $name]; } // try to update cleanly - if (call_user_func_array(array($manipulator, $method), $args)) { + if (call_user_func_array([$manipulator, $method], $args)) { file_put_contents($this->file->getPath(), $manipulator->getContents()); } else { // on failed clean update, call the fallback and rewrite the whole file $config = $this->file->read(); $this->arrayUnshiftRef($args, $config); - call_user_func_array($fallback, $args); + $fallback(...$args); // avoid ending up with arrays for keys that should be objects - foreach (array('require', 'require-dev', 'conflict', 'provide', 'replace', 'suggest', 'config', 'autoload', 'autoload-dev', 'scripts', 'scripts-descriptions', 'support') as $prop) { - if (isset($config[$prop]) && $config[$prop] === array()) { + foreach (['require', 'require-dev', 'conflict', 'provide', 'replace', 'suggest', 'config', 'autoload', 'autoload-dev', 'scripts', 'scripts-descriptions', 'support'] as $prop) { + if (isset($config[$prop]) && $config[$prop] === []) { $config[$prop] = new \stdClass; } } - foreach (array('psr-0', 'psr-4') as $prop) { - if (isset($config['autoload'][$prop]) && $config['autoload'][$prop] === array()) { + foreach (['psr-0', 'psr-4'] as $prop) { + if (isset($config['autoload'][$prop]) && $config['autoload'][$prop] === []) { $config['autoload'][$prop] = new \stdClass; } - if (isset($config['autoload-dev'][$prop]) && $config['autoload-dev'][$prop] === array()) { + if (isset($config['autoload-dev'][$prop]) && $config['autoload-dev'][$prop] === []) { $config['autoload-dev'][$prop] = new \stdClass; } } - foreach (array('platform', 'http-basic', 'bearer', 'gitlab-token', 'gitlab-oauth', 'github-oauth', 'preferred-install') as $prop) { - if (isset($config['config'][$prop]) && $config['config'][$prop] === array()) { + foreach (['platform', 'http-basic', 'bearer', 'gitlab-token', 'gitlab-oauth', 'github-oauth', 'preferred-install'] as $prop) { + if (isset($config['config'][$prop]) && $config['config'][$prop] === []) { $config['config'][$prop] = new \stdClass; } } @@ -295,7 +288,6 @@ private function manipulateJson(string $method, callable $fallback, ...$args): v * * @param mixed[] $array * @param mixed $value - * @return int */ private function arrayUnshiftRef(array &$array, &$value): int { diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index fc0144bd4e5d..5e4d846161b6 100644 --- a/src/Composer/Console/Application.php +++ b/src/Composer/Console/Application.php @@ -129,7 +129,7 @@ public function __destruct() $this->signalHandler->unregister(); } - public function run(InputInterface $input = null, OutputInterface $output = null): int + public function run(?InputInterface $input = null, ?OutputInterface $output = null): int { if (null === $output) { $output = Factory::createOutput(); @@ -148,9 +148,9 @@ public function doRun(InputInterface $input, OutputInterface $output): int $input->setInteractive(false); } - $io = $this->io = new ConsoleIO($input, $output, new HelperSet(array( + $io = $this->io = new ConsoleIO($input, $output, new HelperSet([ new QuestionHelper(), - ))); + ])); // Register error handler again to pass it the IO instance ErrorHandler::register($io); @@ -183,7 +183,7 @@ public function doRun(InputInterface $input, OutputInterface $output): int } // prompt user for dir change if no composer.json is present in current dir - if ($io->isInteractive() && null === $newWorkDir && !in_array($commandName, array('', 'list', 'init', 'about', 'help', 'diagnose', 'self-update', 'global', 'create-project', 'outdated'), true) && !file_exists(Factory::getComposerFile()) && ($useParentDirIfNoJsonAvailable = $this->getUseParentDirConfigValue()) !== false) { + if ($io->isInteractive() && null === $newWorkDir && !in_array($commandName, ['', 'list', 'init', 'about', 'help', 'diagnose', 'self-update', 'global', 'create-project', 'outdated'], true) && !file_exists(Factory::getComposerFile()) && ($useParentDirIfNoJsonAvailable = $this->getUseParentDirConfigValue()) !== false) { $dir = dirname(Platform::getCwd(true)); $home = realpath(Platform::getEnv('HOME') ?: Platform::getEnv('USERPROFILE') ?: '/'); @@ -207,12 +207,12 @@ public function doRun(InputInterface $input, OutputInterface $output): int // avoid loading plugins/initializing the Composer instance earlier than necessary if no plugin command is needed // if showing the version, we never need plugin commands - $mayNeedPluginCommand = false === $input->hasParameterOption(array('--version', '-V')) + $mayNeedPluginCommand = false === $input->hasParameterOption(['--version', '-V']) && ( // not a composer command, so try loading plugin ones false === $commandName // list command requires plugin commands to show them - || in_array($commandName, array('', 'list', 'help'), true) + || in_array($commandName, ['', 'list', 'help'], true) ); if ($mayNeedPluginCommand && !$this->disablePluginsByDefault && !$this->hasPluginCommands) { @@ -389,14 +389,13 @@ function_exists('php_uname') ? php_uname('s') . ' / ' . php_uname('r') : 'Unknow } /** - * @param InputInterface $input * @throws \RuntimeException * @return ?string */ private function getNewWorkingDir(InputInterface $input): ?string { /** @var string|null $workingDir */ - $workingDir = $input->getParameterOption(array('--working-dir', '-d'), null, true); + $workingDir = $input->getParameterOption(['--working-dir', '-d'], null, true); if (null !== $workingDir && !is_dir($workingDir)) { throw new \RuntimeException('Invalid working directory specified, '.$workingDir.' does not exist.'); } @@ -404,9 +403,6 @@ private function getNewWorkingDir(InputInterface $input): ?string return $workingDir; } - /** - * @return void - */ private function hintCommonErrors(\Throwable $exception, OutputInterface $output): void { $io = $this->getIO(); @@ -457,9 +453,6 @@ private function hintCommonErrors(\Throwable $exception, OutputInterface $output } /** - * @param bool $required - * @param bool|null $disablePlugins - * @param bool|null $disableScripts * @throws JsonValidationException * @throws \InvalidArgumentException * @return ?Composer If $required is true then the return value is guaranteed @@ -496,8 +489,6 @@ public function getComposer(bool $required = true, ?bool $disablePlugins = null, /** * Removes the cached composer instance - * - * @return void */ public function resetComposer(): void { @@ -507,9 +498,6 @@ public function resetComposer(): void } } - /** - * @return IOInterface - */ public function getIO(): IOInterface { return $this->io; @@ -526,7 +514,7 @@ public function getHelp(): string */ protected function getDefaultCommands(): array { - $commands = array_merge(parent::getDefaultCommands(), array( + $commands = array_merge(parent::getDefaultCommands(), [ new Command\AboutCommand(), new Command\ConfigCommand(), new Command\DependsCommand(), @@ -557,7 +545,7 @@ protected function getDefaultCommands(): array new Command\FundCommand(), new Command\ReinstallCommand(), new Command\BumpCommand(), - )); + ]); if (strpos(__FILE__, 'phar:') === 0 || '1' === Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING')) { $commands[] = new Command\SelfUpdateCommand(); @@ -599,7 +587,7 @@ protected function getDefaultInputDefinition(): InputDefinition */ private function getPluginCommands(): array { - $commands = array(); + $commands = []; $composer = $this->getComposer(false, false); if (null === $composer) { @@ -608,7 +596,7 @@ private function getPluginCommands(): array if (null !== $composer) { $pm = $composer->getPluginManager(); - foreach ($pm->getPluginCapabilities('Composer\Plugin\Capability\CommandProvider', array('composer' => $composer, 'io' => $this->io)) as $capability) { + foreach ($pm->getPluginCapabilities('Composer\Plugin\Capability\CommandProvider', ['composer' => $composer, 'io' => $this->io]) as $capability) { $newCommands = $capability->getCommands(); if (!is_array($newCommands)) { throw new \UnexpectedValueException('Plugin capability '.get_class($capability).' failed to return an array from getCommands'); diff --git a/src/Composer/Console/GithubActionError.php b/src/Composer/Console/GithubActionError.php index 7489a9a389ef..8a19a19455ad 100644 --- a/src/Composer/Console/GithubActionError.php +++ b/src/Composer/Console/GithubActionError.php @@ -27,13 +27,6 @@ public function __construct(IOInterface $io) $this->io = $io; } - /** - * @param string $message - * @param null|string $file - * @param null|int $line - * - * @return void - */ public function emit(string $message, ?string $file = null, ?int $line = null): void { if (Platform::getEnv('GITHUB_ACTIONS') && !Platform::getEnv('COMPOSER_TESTS_ARE_RUNNING')) { @@ -51,10 +44,6 @@ public function emit(string $message, ?string $file = null, ?int $line = null): } } - /** - * @param string $data - * @return string - */ private function escapeData(string $data): string { // see https://github.com/actions/toolkit/blob/4f7fb6513a355689f69f0849edeb369a4dc81729/packages/core/src/command.ts#L80-L85 @@ -65,10 +54,6 @@ private function escapeData(string $data): string return $data; } - /** - * @param string $property - * @return string - */ private function escapeProperty(string $property): string { // see https://github.com/actions/toolkit/blob/4f7fb6513a355689f69f0849edeb369a4dc81729/packages/core/src/command.ts#L87-L94 diff --git a/src/Composer/Console/HtmlOutputFormatter.php b/src/Composer/Console/HtmlOutputFormatter.php index 04afda4fcddb..84254cc64adb 100644 --- a/src/Composer/Console/HtmlOutputFormatter.php +++ b/src/Composer/Console/HtmlOutputFormatter.php @@ -23,7 +23,7 @@ class HtmlOutputFormatter extends OutputFormatter { /** @var array */ - private static $availableForegroundColors = array( + private static $availableForegroundColors = [ 30 => 'black', 31 => 'red', 32 => 'green', @@ -32,9 +32,9 @@ class HtmlOutputFormatter extends OutputFormatter 35 => 'magenta', 36 => 'cyan', 37 => 'white', - ); + ]; /** @var array */ - private static $availableBackgroundColors = array( + private static $availableBackgroundColors = [ 40 => 'black', 41 => 'red', 42 => 'green', @@ -43,20 +43,20 @@ class HtmlOutputFormatter extends OutputFormatter 45 => 'magenta', 46 => 'cyan', 47 => 'white', - ); + ]; /** @var array */ - private static $availableOptions = array( + private static $availableOptions = [ 1 => 'bold', 4 => 'underscore', //5 => 'blink', //7 => 'reverse', //8 => 'conceal' - ); + ]; /** * @param array $styles Array of "name => FormatterStyle" instances */ - public function __construct(array $styles = array()) + public function __construct(array $styles = []) { parent::__construct(true, $styles); } diff --git a/src/Composer/Console/Input/InputArgument.php b/src/Composer/Console/Input/InputArgument.php index 69c6dfb02c23..a73cd49213d4 100644 --- a/src/Composer/Console/Input/InputArgument.php +++ b/src/Composer/Console/Input/InputArgument.php @@ -44,7 +44,7 @@ class InputArgument extends BaseInputArgument * * @throws InvalidArgumentException When argument mode is not valid */ - public function __construct(string $name, int $mode = null, string $description = '', $default = null, $suggestedValues = []) + public function __construct(string $name, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) { parent::__construct($name, $mode, $description, $default); diff --git a/src/Composer/Console/Input/InputOption.php b/src/Composer/Console/Input/InputOption.php index 2d370ba5135e..aa5cfde971bc 100644 --- a/src/Composer/Console/Input/InputOption.php +++ b/src/Composer/Console/Input/InputOption.php @@ -43,7 +43,7 @@ class InputOption extends BaseInputOption * * @throws InvalidArgumentException If option mode is invalid or incompatible */ - public function __construct(string $name, $shortcut = null, int $mode = null, string $description = '', $default = null, $suggestedValues = []) + public function __construct(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) { parent::__construct($name, $shortcut, $mode, $description, $default); diff --git a/src/Composer/DependencyResolver/Decisions.php b/src/Composer/DependencyResolver/Decisions.php index 543ab2efafbc..931e8347546e 100644 --- a/src/Composer/DependencyResolver/Decisions.php +++ b/src/Composer/DependencyResolver/Decisions.php @@ -30,32 +30,23 @@ class Decisions implements \Iterator, \Countable /** * @var array */ - protected $decisionQueue = array(); + protected $decisionQueue = []; public function __construct(Pool $pool) { $this->pool = $pool; - $this->decisionMap = array(); + $this->decisionMap = []; } - /** - * @param int $literal - * @param int $level - * @return void - */ public function decide(int $literal, int $level, Rule $why): void { $this->addDecision($literal, $level); - $this->decisionQueue[] = array( + $this->decisionQueue[] = [ self::DECISION_LITERAL => $literal, self::DECISION_REASON => $why, - ); + ]; } - /** - * @param int $literal - * @return bool - */ public function satisfy(int $literal): bool { $packageId = abs($literal); @@ -66,10 +57,6 @@ public function satisfy(int $literal): bool ); } - /** - * @param int $literal - * @return bool - */ public function conflict(int $literal): bool { $packageId = abs($literal); @@ -80,28 +67,16 @@ public function conflict(int $literal): bool ); } - /** - * @param int $literalOrPackageId - * @return bool - */ public function decided(int $literalOrPackageId): bool { return !empty($this->decisionMap[abs($literalOrPackageId)]); } - /** - * @param int $literalOrPackageId - * @return bool - */ public function undecided(int $literalOrPackageId): bool { return empty($this->decisionMap[abs($literalOrPackageId)]); } - /** - * @param int $literalOrPackageId - * @return bool - */ public function decidedInstall(int $literalOrPackageId): bool { $packageId = abs($literalOrPackageId); @@ -109,10 +84,6 @@ public function decidedInstall(int $literalOrPackageId): bool return isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0; } - /** - * @param int $literalOrPackageId - * @return int - */ public function decisionLevel(int $literalOrPackageId): int { $packageId = abs($literalOrPackageId); @@ -123,10 +94,6 @@ public function decisionLevel(int $literalOrPackageId): int return 0; } - /** - * @param int $literalOrPackageId - * @return Rule|null - */ public function decisionRule(int $literalOrPackageId): ?Rule { $packageId = abs($literalOrPackageId); @@ -141,7 +108,6 @@ public function decisionRule(int $literalOrPackageId): ?Rule } /** - * @param int $queueOffset * @return array{0: int, 1: Rule} a literal and decision reason */ public function atOffset(int $queueOffset): array @@ -149,34 +115,21 @@ public function atOffset(int $queueOffset): array return $this->decisionQueue[$queueOffset]; } - /** - * @param int $queueOffset - * @return bool - */ public function validOffset(int $queueOffset): bool { return $queueOffset >= 0 && $queueOffset < \count($this->decisionQueue); } - /** - * @return Rule - */ public function lastReason(): Rule { return $this->decisionQueue[\count($this->decisionQueue) - 1][self::DECISION_REASON]; } - /** - * @return int - */ public function lastLiteral(): int { return $this->decisionQueue[\count($this->decisionQueue) - 1][self::DECISION_LITERAL]; } - /** - * @return void - */ public function reset(): void { while ($decision = array_pop($this->decisionQueue)) { @@ -184,10 +137,6 @@ public function reset(): void } } - /** - * @param int $offset - * @return void - */ public function resetToOffset(int $offset): void { while (\count($this->decisionQueue) > $offset + 1) { @@ -196,9 +145,6 @@ public function resetToOffset(int $offset): void } } - /** - * @return void - */ public function revertLast(): void { $this->decisionMap[abs($this->lastLiteral())] = 0; @@ -239,26 +185,18 @@ public function valid(): bool return false !== current($this->decisionQueue); } - /** - * @return bool - */ public function isEmpty(): bool { return \count($this->decisionQueue) === 0; } - /** - * @param int $literal - * @param int $level - * @return void - */ protected function addDecision(int $literal, int $level): void { $packageId = abs($literal); $previousDecision = $this->decisionMap[$packageId] ?? 0; if ($previousDecision !== 0) { - $literalString = $this->pool->literalToPrettyString($literal, array()); + $literalString = $this->pool->literalToPrettyString($literal, []); $package = $this->pool->literalToPackage($literal); throw new SolverBugException( "Trying to decide $literalString on level $level, even though $package was previously decided as ".$previousDecision."." @@ -272,10 +210,7 @@ protected function addDecision(int $literal, int $level): void } } - /** - * @return string - */ - public function toString(Pool $pool = null): string + public function toString(?Pool $pool = null): string { $decisionMap = $this->decisionMap; ksort($decisionMap); diff --git a/src/Composer/DependencyResolver/DefaultPolicy.php b/src/Composer/DependencyResolver/DefaultPolicy.php index 545ce2baa97c..52cbff350e5f 100644 --- a/src/Composer/DependencyResolver/DefaultPolicy.php +++ b/src/Composer/DependencyResolver/DefaultPolicy.php @@ -32,10 +32,6 @@ class DefaultPolicy implements PolicyInterface /** @var array> */ private $sortingCachePerPool; - /** - * @param bool $preferStable - * @param bool $preferLowest - */ public function __construct(bool $preferStable = false, bool $preferLowest = false) { $this->preferStable = $preferStable; @@ -44,7 +40,6 @@ public function __construct(bool $preferStable = false, bool $preferLowest = fal /** * @param string $operator One of Constraint::STR_OP_* - * @return bool * * @phpstan-param Constraint::STR_OP_* $operator */ @@ -65,7 +60,7 @@ public function versionCompare(PackageInterface $a, PackageInterface $b, string * @param string $requiredPackage * @return int[] */ - public function selectPreferredPackages(Pool $pool, array $literals, string $requiredPackage = null): array + public function selectPreferredPackages(Pool $pool, array $literals, ?string $requiredPackage = null): array { sort($literals); $resultCacheKey = implode(',', $literals).$requiredPackage; @@ -94,7 +89,7 @@ public function selectPreferredPackages(Pool $pool, array $literals, string $req $sortedLiterals = $this->pruneRemoteAliases($pool, $sortedLiterals); } - $selected = \call_user_func_array('array_merge', array_values($packages)); + $selected = array_merge(...array_values($packages)); // now sort the result across all packages to respect replaces across packages usort($selected, function ($a, $b) use ($pool, $requiredPackage, $poolId): int { @@ -116,12 +111,12 @@ public function selectPreferredPackages(Pool $pool, array $literals, string $req */ protected function groupLiteralsByName(Pool $pool, array $literals): array { - $packages = array(); + $packages = []; foreach ($literals as $literal) { $packageName = $pool->literalToPackage($literal)->getName(); if (!isset($packages[$packageName])) { - $packages[$packageName] = array(); + $packages[$packageName] = []; } $packages[$packageName][] = $literal; } @@ -131,9 +126,6 @@ protected function groupLiteralsByName(Pool $pool, array $literals): array /** * @protected - * @param null|string $requiredPackage - * @param bool $ignoreReplace - * @return int */ public function compareByPriority(Pool $pool, BasePackage $a, BasePackage $b, ?string $requiredPackage = null, bool $ignoreReplace = false): int { @@ -185,8 +177,6 @@ public function compareByPriority(Pool $pool, BasePackage $a, BasePackage $b, ?s * * Replace constraints are ignored. This method should only be used for * prioritisation, not for actual constraint verification. - * - * @return bool */ protected function replaces(BasePackage $source, BasePackage $target): bool { @@ -194,7 +184,7 @@ protected function replaces(BasePackage $source, BasePackage $target): bool if ($link->getTarget() === $target->getName() // && (null === $link->getConstraint() || // $link->getConstraint()->matches(new Constraint('==', $target->getVersion())))) { - ) { + ) { return true; } } @@ -209,7 +199,7 @@ protected function replaces(BasePackage $source, BasePackage $target): bool protected function pruneToBestVersion(Pool $pool, array $literals): array { $operator = $this->preferLowest ? '<' : '>'; - $bestLiterals = array($literals[0]); + $bestLiterals = [$literals[0]]; $bestPackage = $pool->literalToPackage($literals[0]); foreach ($literals as $i => $literal) { if (0 === $i) { @@ -220,7 +210,7 @@ protected function pruneToBestVersion(Pool $pool, array $literals): array if ($this->versionCompare($package, $bestPackage, $operator)) { $bestPackage = $package; - $bestLiterals = array($literal); + $bestLiterals = [$literal]; } elseif ($this->versionCompare($package, $bestPackage, '==')) { $bestLiterals[] = $literal; } @@ -254,7 +244,7 @@ protected function pruneRemoteAliases(Pool $pool, array $literals): array return $literals; } - $selected = array(); + $selected = []; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); diff --git a/src/Composer/DependencyResolver/GenericRule.php b/src/Composer/DependencyResolver/GenericRule.php index d119d944be2b..f7cf7f23c32d 100644 --- a/src/Composer/DependencyResolver/GenericRule.php +++ b/src/Composer/DependencyResolver/GenericRule.php @@ -64,9 +64,6 @@ public function equals(Rule $rule): bool return $this->literals === $rule->getLiterals(); } - /** - * @return bool - */ public function isAssertion(): bool { return 1 === \count($this->literals); @@ -74,8 +71,6 @@ public function isAssertion(): bool /** * Formats a rule as a string of the format (Literal1|Literal2|...) - * - * @return string */ public function __toString(): string { diff --git a/src/Composer/DependencyResolver/LockTransaction.php b/src/Composer/DependencyResolver/LockTransaction.php index 8e407b1fe3aa..a9f8b7d0ad2d 100644 --- a/src/Composer/DependencyResolver/LockTransaction.php +++ b/src/Composer/DependencyResolver/LockTransaction.php @@ -59,12 +59,10 @@ public function __construct(Pool $pool, array $presentMap, array $unlockableMap, } // TODO make this a bit prettier instead of the two text indexes? - /** - * @return void - */ + public function setResultPackages(Pool $pool, Decisions $decisions): void { - $this->resultPackages = array('all' => array(), 'non-dev' => array(), 'dev' => array()); + $this->resultPackages = ['all' => [], 'non-dev' => [], 'dev' => []]; foreach ($decisions as $i => $decision) { $literal = $decision[Decisions::DECISION_LITERAL]; @@ -79,15 +77,12 @@ public function setResultPackages(Pool $pool, Decisions $decisions): void } } - /** - * @return void - */ public function setNonDevPackages(LockTransaction $extractionResult): void { $packages = $extractionResult->getNewLockPackages(false); $this->resultPackages['dev'] = $this->resultPackages['non-dev']; - $this->resultPackages['non-dev'] = array(); + $this->resultPackages['non-dev'] = []; foreach ($packages as $package) { foreach ($this->resultPackages['dev'] as $i => $resultPackage) { @@ -102,13 +97,11 @@ public function setNonDevPackages(LockTransaction $extractionResult): void // TODO additionalFixedRepository needs to be looked at here as well? /** - * @param bool $devMode - * @param bool $updateMirrors * @return BasePackage[] */ public function getNewLockPackages(bool $devMode, bool $updateMirrors = false): array { - $packages = array(); + $packages = []; foreach ($this->resultPackages[$devMode ? 'dev' : 'non-dev'] as $package) { if (!$package instanceof AliasPackage) { // if we're just updating mirrors we need to reset references to the same as currently "present" packages' references to keep the lock file as-is @@ -139,7 +132,7 @@ public function getNewLockPackages(bool $devMode, bool $updateMirrors = false): */ public function getAliases(array $aliases): array { - $usedAliases = array(); + $usedAliases = []; foreach ($this->resultPackages['all'] as $package) { if ($package instanceof AliasPackage) { diff --git a/src/Composer/DependencyResolver/MultiConflictRule.php b/src/Composer/DependencyResolver/MultiConflictRule.php index d065a2a309c8..4826489d258a 100644 --- a/src/Composer/DependencyResolver/MultiConflictRule.php +++ b/src/Composer/DependencyResolver/MultiConflictRule.php @@ -74,9 +74,6 @@ public function equals(Rule $rule): bool return false; } - /** - * @return bool - */ public function isAssertion(): bool { return false; @@ -93,8 +90,6 @@ public function disable(): void /** * Formats a rule as a string of the format (Literal1|Literal2|...) - * - * @return string */ public function __toString(): string { diff --git a/src/Composer/DependencyResolver/Operation/InstallOperation.php b/src/Composer/DependencyResolver/Operation/InstallOperation.php index 7869402ab3f7..6aa24f49d65a 100644 --- a/src/Composer/DependencyResolver/Operation/InstallOperation.php +++ b/src/Composer/DependencyResolver/Operation/InstallOperation.php @@ -35,8 +35,6 @@ public function __construct(PackageInterface $package) /** * Returns package instance. - * - * @return PackageInterface */ public function getPackage(): PackageInterface { @@ -51,10 +49,6 @@ public function show($lock): string return self::format($this->package, $lock); } - /** - * @param bool $lock - * @return string - */ public static function format(PackageInterface $package, bool $lock = false): string { return ($lock ? 'Locking ' : 'Installing ').''.$package->getPrettyName().' ('.$package->getFullPrettyVersion().')'; diff --git a/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php b/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php index 84d48e3c4fea..5deac963201a 100644 --- a/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php +++ b/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php @@ -35,8 +35,6 @@ public function __construct(AliasPackage $package) /** * Returns package instance. - * - * @return AliasPackage */ public function getPackage(): AliasPackage { diff --git a/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php b/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php index b28e4942c130..9988f6ca7280 100644 --- a/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php +++ b/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php @@ -35,8 +35,6 @@ public function __construct(AliasPackage $package) /** * Returns package instance. - * - * @return AliasPackage */ public function getPackage(): AliasPackage { diff --git a/src/Composer/DependencyResolver/Operation/SolverOperation.php b/src/Composer/DependencyResolver/Operation/SolverOperation.php index 2eb9804baaf6..66f0da50f1ee 100644 --- a/src/Composer/DependencyResolver/Operation/SolverOperation.php +++ b/src/Composer/DependencyResolver/Operation/SolverOperation.php @@ -26,8 +26,6 @@ abstract class SolverOperation implements OperationInterface /** * Returns operation type. - * - * @return string */ public function getOperationType(): string { diff --git a/src/Composer/DependencyResolver/Operation/UninstallOperation.php b/src/Composer/DependencyResolver/Operation/UninstallOperation.php index 9caa3248cb01..f6f5a4735431 100644 --- a/src/Composer/DependencyResolver/Operation/UninstallOperation.php +++ b/src/Composer/DependencyResolver/Operation/UninstallOperation.php @@ -35,8 +35,6 @@ public function __construct(PackageInterface $package) /** * Returns package instance. - * - * @return PackageInterface */ public function getPackage(): PackageInterface { @@ -51,10 +49,6 @@ public function show($lock): string return self::format($this->package, $lock); } - /** - * @param bool $lock - * @return string - */ public static function format(PackageInterface $package, bool $lock = false): string { return 'Removing '.$package->getPrettyName().' ('.$package->getFullPrettyVersion().')'; diff --git a/src/Composer/DependencyResolver/Operation/UpdateOperation.php b/src/Composer/DependencyResolver/Operation/UpdateOperation.php index f9f0fd4f5fa3..48010fb1a426 100644 --- a/src/Composer/DependencyResolver/Operation/UpdateOperation.php +++ b/src/Composer/DependencyResolver/Operation/UpdateOperation.php @@ -46,8 +46,6 @@ public function __construct(PackageInterface $initial, PackageInterface $target) /** * Returns initial package. - * - * @return PackageInterface */ public function getInitialPackage(): PackageInterface { @@ -56,8 +54,6 @@ public function getInitialPackage(): PackageInterface /** * Returns target package. - * - * @return PackageInterface */ public function getTargetPackage(): PackageInterface { @@ -72,10 +68,6 @@ public function show($lock): string return self::format($this->initialPackage, $this->targetPackage, $lock); } - /** - * @param bool $lock - * @return string - */ public static function format(PackageInterface $initialPackage, PackageInterface $targetPackage, bool $lock = false): string { $fromVersion = $initialPackage->getFullPrettyVersion(); diff --git a/src/Composer/DependencyResolver/PolicyInterface.php b/src/Composer/DependencyResolver/PolicyInterface.php index 655ea7191db3..928e7e0a9733 100644 --- a/src/Composer/DependencyResolver/PolicyInterface.php +++ b/src/Composer/DependencyResolver/PolicyInterface.php @@ -21,16 +21,12 @@ interface PolicyInterface { /** - * @param string $operator - * @return bool - * * @phpstan-param Constraint::STR_OP_* $operator */ public function versionCompare(PackageInterface $a, PackageInterface $b, string $operator): bool; /** * @param int[] $literals - * @param null|string $requiredPackage * @return int[] */ public function selectPreferredPackages(Pool $pool, array $literals, ?string $requiredPackage = null): array; diff --git a/src/Composer/DependencyResolver/Pool.php b/src/Composer/DependencyResolver/Pool.php index 73a9052b84bc..48f47cb2c893 100644 --- a/src/Composer/DependencyResolver/Pool.php +++ b/src/Composer/DependencyResolver/Pool.php @@ -27,19 +27,19 @@ class Pool implements \Countable { /** @var BasePackage[] */ - protected $packages = array(); + protected $packages = []; /** @var array */ - protected $packageByName = array(); + protected $packageByName = []; /** @var VersionParser */ protected $versionParser; /** @var array> */ - protected $providerCache = array(); + protected $providerCache = []; /** @var BasePackage[] */ protected $unacceptableFixedOrLockedPackages; /** @var array> Map of package name => normalized version => pretty version */ - protected $removedVersions = array(); + protected $removedVersions = []; /** @var array> Map of package object hash => removed normalized versions => removed pretty version */ - protected $removedVersionsByPackage = array(); + protected $removedVersionsByPackage = []; /** * @param BasePackage[] $packages @@ -47,7 +47,7 @@ class Pool implements \Countable * @param array> $removedVersions * @param array> $removedVersionsByPackage */ - public function __construct(array $packages = array(), array $unacceptableFixedOrLockedPackages = array(), array $removedVersions = array(), array $removedVersionsByPackage = array()) + public function __construct(array $packages = [], array $unacceptableFixedOrLockedPackages = [], array $removedVersions = [], array $removedVersionsByPackage = []) { $this->versionParser = new VersionParser; $this->setPackages($packages); @@ -57,16 +57,15 @@ public function __construct(array $packages = array(), array $unacceptableFixedO } /** - * @param string $name * @return array */ public function getRemovedVersions(string $name, ConstraintInterface $constraint): array { if (!isset($this->removedVersions[$name])) { - return array(); + return []; } - $result = array(); + $result = []; foreach ($this->removedVersions[$name] as $version => $prettyVersion) { if ($constraint->matches(new Constraint('==', $version))) { $result[$version] = $prettyVersion; @@ -77,13 +76,12 @@ public function getRemovedVersions(string $name, ConstraintInterface $constraint } /** - * @param string $objectHash * @return array */ public function getRemovedVersionsByPackage(string $objectHash): array { if (!isset($this->removedVersionsByPackage[$objectHash])) { - return array(); + return []; } return $this->removedVersionsByPackage[$objectHash]; @@ -91,7 +89,6 @@ public function getRemovedVersionsByPackage(string $objectHash): array /** * @param BasePackage[] $packages - * @return void */ private function setPackages(array $packages): void { @@ -118,9 +115,6 @@ public function getPackages(): array /** * Retrieves the package object for a given package id. - * - * @param int $id - * @return BasePackage */ public function packageById(int $id): BasePackage { @@ -143,7 +137,7 @@ public function count(): int * packages must match or null to return all * @return BasePackage[] A set of packages */ - public function whatProvides(string $name, ConstraintInterface $constraint = null): array + public function whatProvides(string $name, ?ConstraintInterface $constraint = null): array { $key = (string) $constraint; if (isset($this->providerCache[$name][$key])) { @@ -159,13 +153,13 @@ public function whatProvides(string $name, ConstraintInterface $constraint = nul * packages must match or null to return all * @return BasePackage[] */ - private function computeWhatProvides(string $name, ConstraintInterface $constraint = null): array + private function computeWhatProvides(string $name, ?ConstraintInterface $constraint = null): array { if (!isset($this->packageByName[$name])) { - return array(); + return []; } - $matches = array(); + $matches = []; foreach ($this->packageByName[$name] as $candidate) { if ($this->match($candidate, $name, $constraint)) { @@ -176,10 +170,6 @@ private function computeWhatProvides(string $name, ConstraintInterface $constrai return $matches; } - /** - * @param int $literal - * @return BasePackage - */ public function literalToPackage(int $literal): BasePackage { $packageId = abs($literal); @@ -188,9 +178,7 @@ public function literalToPackage(int $literal): BasePackage } /** - * @param int $literal * @param array $installedMap - * @return string */ public function literalToPrettyString(int $literal, array $installedMap): string { @@ -210,9 +198,8 @@ public function literalToPrettyString(int $literal, array $installedMap): string * provided or replaced packages * * @param string $name Name of the package to be matched - * @return bool */ - public function match(BasePackage $candidate, string $name, ConstraintInterface $constraint = null): bool + public function match(BasePackage $candidate, string $name, ?ConstraintInterface $constraint = null): bool { $candidateName = $candidate->getName(); $candidateVersion = $candidate->getVersion(); @@ -252,9 +239,6 @@ public function match(BasePackage $candidate, string $name, ConstraintInterface return false; } - /** - * @return bool - */ public function isUnacceptableFixedOrLockedPackage(BasePackage $package): bool { return \in_array($package, $this->unacceptableFixedOrLockedPackages, true); diff --git a/src/Composer/DependencyResolver/PoolBuilder.php b/src/Composer/DependencyResolver/PoolBuilder.php index cb9732ff23f1..9de4bed7146f 100644 --- a/src/Composer/DependencyResolver/PoolBuilder.php +++ b/src/Composer/DependencyResolver/PoolBuilder.php @@ -78,34 +78,34 @@ class PoolBuilder * @var array[] * @phpstan-var array */ - private $aliasMap = array(); + private $aliasMap = []; /** * @var ConstraintInterface[] * @phpstan-var array */ - private $packagesToLoad = array(); + private $packagesToLoad = []; /** * @var ConstraintInterface[] * @phpstan-var array */ - private $loadedPackages = array(); + private $loadedPackages = []; /** * @var array[] * @phpstan-var array>> */ - private $loadedPerRepo = array(); + private $loadedPerRepo = []; /** * @var BasePackage[] */ - private $packages = array(); + private $packages = []; /** * @var BasePackage[] */ - private $unacceptableFixedOrLockedPackages = array(); + private $unacceptableFixedOrLockedPackages = []; /** @var string[] */ - private $updateAllowList = array(); + private $updateAllowList = []; /** @var array> */ - private $skippedLoad = array(); + private $skippedLoad = []; /** * Keeps a list of dependencies which are locked but were auto-unlocked as they are path repositories @@ -115,7 +115,7 @@ class PoolBuilder * * @var array */ - private $pathRepoUnlocked = array(); + private $pathRepoUnlocked = []; /** * Keeps a list of dependencies which are root requirements, and as such @@ -127,12 +127,12 @@ class PoolBuilder * * @var array */ - private $maxExtendedReqs = array(); + private $maxExtendedReqs = []; /** * @var array * @phpstan-var array */ - private $updateAllowWarned = array(); + private $updateAllowWarned = []; /** @var int */ private $indexCounter = 0; @@ -148,7 +148,7 @@ class PoolBuilder * @phpstan-param array $rootReferences * @param array $temporaryConstraints Runtime temporary constraints that will be used to filter packages */ - public function __construct(array $acceptableStabilities, array $stabilityFlags, array $rootAliases, array $rootReferences, IOInterface $io, EventDispatcher $eventDispatcher = null, PoolOptimizer $poolOptimizer = null, array $temporaryConstraints = []) + public function __construct(array $acceptableStabilities, array $stabilityFlags, array $rootAliases, array $rootReferences, IOInterface $io, ?EventDispatcher $eventDispatcher = null, ?PoolOptimizer $poolOptimizer = null, array $temporaryConstraints = []) { $this->acceptableStabilities = $acceptableStabilities; $this->stabilityFlags = $stabilityFlags; @@ -162,7 +162,6 @@ public function __construct(array $acceptableStabilities, array $stabilityFlags, /** * @param RepositoryInterface[] $repositories - * @return Pool */ public function buildPool(array $repositories, Request $request): Pool { @@ -248,7 +247,7 @@ public function buildPool(array $repositories, Request $request): Pool } $constraint = $this->temporaryConstraints[$package->getName()]; - $packageAndAliases = array($i => $package); + $packageAndAliases = [$i => $package]; if (isset($this->aliasMap[spl_object_hash($package)])) { $packageAndAliases += $this->aliasMap[spl_object_hash($package)]; } @@ -287,14 +286,14 @@ public function buildPool(array $repositories, Request $request): Pool $pool = new Pool($this->packages, $this->unacceptableFixedOrLockedPackages); - $this->aliasMap = array(); - $this->packagesToLoad = array(); - $this->loadedPackages = array(); - $this->loadedPerRepo = array(); - $this->packages = array(); - $this->unacceptableFixedOrLockedPackages = array(); - $this->maxExtendedReqs = array(); - $this->skippedLoad = array(); + $this->aliasMap = []; + $this->packagesToLoad = []; + $this->loadedPackages = []; + $this->loadedPerRepo = []; + $this->packages = []; + $this->unacceptableFixedOrLockedPackages = []; + $this->maxExtendedReqs = []; + $this->skippedLoad = []; $this->indexCounter = 0; $this->io->debug('Built pool.'); @@ -306,10 +305,6 @@ public function buildPool(array $repositories, Request $request): Pool return $pool; } - /** - * @param string $name - * @return void - */ private function markPackageNameForLoading(Request $request, string $name, ConstraintInterface $constraint): void { // Skip platform requires at this stage @@ -344,7 +339,7 @@ private function markPackageNameForLoading(Request $request, string $name, Const } // extend the constraint to be loaded - $constraint = Intervals::compactConstraint(MultiConstraint::create(array($this->packagesToLoad[$name], $constraint), false)); + $constraint = Intervals::compactConstraint(MultiConstraint::create([$this->packagesToLoad[$name], $constraint], false)); } $this->packagesToLoad[$name] = $constraint; @@ -361,13 +356,12 @@ private function markPackageNameForLoading(Request $request, string $name, Const // We have already loaded that package but not in the constraint that's // required. We extend the constraint and mark that package as not being loaded // yet so we get the required package versions - $this->packagesToLoad[$name] = Intervals::compactConstraint(MultiConstraint::create(array($this->loadedPackages[$name], $constraint), false)); + $this->packagesToLoad[$name] = Intervals::compactConstraint(MultiConstraint::create([$this->loadedPackages[$name], $constraint], false)); unset($this->loadedPackages[$name]); } /** * @param RepositoryInterface[] $repositories - * @return void */ private function loadPackagesMarkedForLoading(Request $request, array $repositories): void { @@ -376,7 +370,7 @@ private function loadPackagesMarkedForLoading(Request $request, array $repositor } $packageBatch = $this->packagesToLoad; - $this->packagesToLoad = array(); + $this->packagesToLoad = []; foreach ($repositories as $repoIndex => $repository) { if (empty($packageBatch)) { @@ -388,7 +382,7 @@ private function loadPackagesMarkedForLoading(Request $request, array $repositor if ($repository instanceof PlatformRepository || $repository === $request->getLockedRepository()) { continue; } - $result = $repository->loadPackages($packageBatch, $this->acceptableStabilities, $this->stabilityFlags, $this->loadedPerRepo[$repoIndex] ?? array()); + $result = $repository->loadPackages($packageBatch, $this->acceptableStabilities, $this->stabilityFlags, $this->loadedPerRepo[$repoIndex] ?? []); foreach ($result['namesFound'] as $name) { // avoid loading the same package again from other repositories once it has been found @@ -402,9 +396,7 @@ private function loadPackagesMarkedForLoading(Request $request, array $repositor } /** - * @param bool $propagateUpdate * @param RepositoryInterface[] $repositories - * @return void */ private function loadPackage(Request $request, array $repositories, BasePackage $package, bool $propagateUpdate): void { @@ -509,7 +501,6 @@ private function loadPackage(Request $request, array $repositories, BasePackage * Checks if a particular name is required directly in the request * * @param string $name packageName - * @return bool */ private function isRootRequire(Request $request, string $name): bool { @@ -519,17 +510,16 @@ private function isRootRequire(Request $request, string $name): bool } /** - * @param string $name * @return string[] */ private function getSkippedRootRequires(Request $request, string $name): array { if (!isset($this->skippedLoad[$name])) { - return array(); + return []; } $rootRequires = $request->getRequires(); - $matches = array(); + $matches = []; if (isset($rootRequires[$name])) { return array_map(static function (PackageInterface $package) use ($name): string { @@ -562,8 +552,6 @@ private function getSkippedRootRequires(Request $request, string $name): array /** * Checks whether the update allow list allows this package in the lock file to be updated - * - * @return bool */ private function isUpdateAllowed(BasePackage $package): bool { @@ -577,9 +565,6 @@ private function isUpdateAllowed(BasePackage $package): bool return false; } - /** - * @return void - */ private function warnAboutNonMatchingUpdateAllowList(Request $request): void { foreach ($this->updateAllowList as $pattern => $void) { @@ -609,8 +594,6 @@ private function warnAboutNonMatchingUpdateAllowList(Request $request): void * found that this package actually needs to be updated * * @param RepositoryInterface[] $repositories - * @param string $name - * @return void */ private function unlockPackage(Request $request, array $repositories, string $name): void { @@ -675,8 +658,6 @@ private function unlockPackage(Request $request, array $repositories, string $na /** * @param RepositoryInterface[] $repositories - * @param int $index - * @return void */ private function removeLoadedPackage(Request $request, array $repositories, BasePackage $package, int $index): void { @@ -693,9 +674,6 @@ private function removeLoadedPackage(Request $request, array $repositories, Base } } - /** - * @return Pool - */ private function runOptimizer(Request $request, Pool $pool): Pool { if (null === $this->poolOptimizer) { diff --git a/src/Composer/DependencyResolver/PoolOptimizer.php b/src/Composer/DependencyResolver/PoolOptimizer.php index d2f37c89c123..c53891fb63e8 100644 --- a/src/Composer/DependencyResolver/PoolOptimizer.php +++ b/src/Composer/DependencyResolver/PoolOptimizer.php @@ -36,41 +36,38 @@ class PoolOptimizer /** * @var array */ - private $irremovablePackages = array(); + private $irremovablePackages = []; /** * @var array> */ - private $requireConstraintsPerPackage = array(); + private $requireConstraintsPerPackage = []; /** * @var array> */ - private $conflictConstraintsPerPackage = array(); + private $conflictConstraintsPerPackage = []; /** * @var array */ - private $packagesToRemove = array(); + private $packagesToRemove = []; /** * @var array */ - private $aliasesPerPackage = array(); + private $aliasesPerPackage = []; /** * @var array> */ - private $removedVersionsByPackage = array(); + private $removedVersionsByPackage = []; public function __construct(PolicyInterface $policy) { $this->policy = $policy; } - /** - * @return Pool - */ public function optimize(Request $request, Pool $pool): Pool { $this->prepare($request, $pool); @@ -86,22 +83,19 @@ public function optimize(Request $request, Pool $pool): Pool // even more gains when ran again. Might change // in the future with additional optimizations. - $this->irremovablePackages = array(); - $this->requireConstraintsPerPackage = array(); - $this->conflictConstraintsPerPackage = array(); - $this->packagesToRemove = array(); - $this->aliasesPerPackage = array(); - $this->removedVersionsByPackage = array(); + $this->irremovablePackages = []; + $this->requireConstraintsPerPackage = []; + $this->conflictConstraintsPerPackage = []; + $this->packagesToRemove = []; + $this->aliasesPerPackage = []; + $this->removedVersionsByPackage = []; return $optimizedPool; } - /** - * @return void - */ private function prepare(Request $request, Pool $pool): void { - $irremovablePackageConstraintGroups = array(); + $irremovablePackageConstraintGroups = []; // Mark fixed or locked packages as irremovable foreach ($request->getFixedOrLockedPackages() as $package) { @@ -131,7 +125,7 @@ private function prepare(Request $request, Pool $pool): void } } - $irremovablePackageConstraints = array(); + $irremovablePackageConstraints = []; foreach ($irremovablePackageConstraintGroups as $packageName => $constraints) { $irremovablePackageConstraints[$packageName] = 1 === \count($constraints) ? $constraints[0] : new MultiConstraint($constraints, false); } @@ -149,9 +143,6 @@ private function prepare(Request $request, Pool $pool): void } } - /** - * @return void - */ private function markPackageIrremovable(BasePackage $package): void { $this->irremovablePackages[$package->id] = true; @@ -172,8 +163,8 @@ private function markPackageIrremovable(BasePackage $package): void */ private function applyRemovalsToPool(Pool $pool): Pool { - $packages = array(); - $removedVersions = array(); + $packages = []; + $removedVersions = []; foreach ($pool->getPackages() as $package) { if (!isset($this->packagesToRemove[$package->id])) { $packages[] = $package; @@ -187,13 +178,10 @@ private function applyRemovalsToPool(Pool $pool): Pool return $optimizedPool; } - /** - * @return void - */ private function optimizeByIdenticalDependencies(Request $request, Pool $pool): void { - $identicalDefinitionsPerPackage = array(); - $packageIdenticalDefinitionLookup = array(); + $identicalDefinitionsPerPackage = []; + $packageIdenticalDefinitionLookup = []; foreach ($pool->getPackages() as $package) { @@ -213,7 +201,7 @@ private function optimizeByIdenticalDependencies(Request $request, Pool $pool): } foreach ($this->requireConstraintsPerPackage[$packageName] as $requireConstraint) { - $groupHashParts = array(); + $groupHashParts = []; if (CompilingMatcher::match($requireConstraint, Constraint::OP_EQ, $package->getVersion())) { $groupHashParts[] = 'require:' . (string) $requireConstraint; @@ -242,7 +230,7 @@ private function optimizeByIdenticalDependencies(Request $request, Pool $pool): $groupHash = implode('', $groupHashParts); $identicalDefinitionsPerPackage[$packageName][$groupHash][$dependencyHash][] = $package; - $packageIdenticalDefinitionLookup[$package->id][$packageName] = array('groupHash' => $groupHash, 'dependencyHash' => $dependencyHash); + $packageIdenticalDefinitionLookup[$package->id][$packageName] = ['groupHash' => $groupHash, 'dependencyHash' => $dependencyHash]; } } } @@ -258,7 +246,7 @@ private function optimizeByIdenticalDependencies(Request $request, Pool $pool): // Otherwise we find out which one is the preferred package in this constraint group which is // then not allowed to be removed either - $literals = array(); + $literals = []; foreach ($packages as $package) { $literals[] = $package->id; @@ -272,19 +260,16 @@ private function optimizeByIdenticalDependencies(Request $request, Pool $pool): } } - /** - * @return string - */ private function calculateDependencyHash(BasePackage $package): string { $hash = ''; - $hashRelevantLinks = array( + $hashRelevantLinks = [ 'requires' => $package->getRequires(), 'conflicts' => $package->getConflicts(), 'replaces' => $package->getReplaces(), 'provides' => $package->getProvides(), - ); + ]; foreach ($hashRelevantLinks as $key => $links) { if (0 === \count($links)) { @@ -294,7 +279,7 @@ private function calculateDependencyHash(BasePackage $package): string // start new hash section $hash .= $key . ':'; - $subhash = array(); + $subhash = []; foreach ($links as $link) { // To get the best dependency hash matches we should use Intervals::compactConstraint() here. @@ -315,10 +300,6 @@ private function calculateDependencyHash(BasePackage $package): string return $hash; } - /** - * @param int $id - * @return void - */ private function markPackageForRemoval(int $id): void { // We are not allowed to remove packages if they have been marked as irremovable @@ -332,7 +313,6 @@ private function markPackageForRemoval(int $id): void /** * @param array>>> $identicalDefinitionsPerPackage * @param array> $packageIdenticalDefinitionLookup - * @return void */ private function keepPackage(BasePackage $package, array $identicalDefinitionsPerPackage, array $packageIdenticalDefinitionLookup): void { @@ -388,8 +368,6 @@ private function keepPackage(BasePackage $package, array $identicalDefinitionsPe * Use the list of locked packages to constrain the loaded packages * This will reduce packages with significant numbers of historical versions to a smaller number * and reduce the resulting rule set that is generated - * - * @return void */ private function optimizeImpossiblePackagesAway(Request $request, Pool $pool): void { @@ -397,7 +375,7 @@ private function optimizeImpossiblePackagesAway(Request $request, Pool $pool): v return; } - $packageIndex = array(); + $packageIndex = []; foreach ($pool->getPackages() as $package) { $id = $package->id; @@ -455,11 +433,9 @@ private function optimizeImpossiblePackagesAway(Request $request, Pool $pool): v * two require constraint groups in order for us to keep the best matching package for "^2.14" AND "^3.3" as otherwise, we'd * only keep either one which can cause trouble (e.g. when using --prefer-lowest). * - * @param string $package - * @param ConstraintInterface $constraint * @return void */ - private function extractRequireConstraintsPerPackage($package, ConstraintInterface $constraint) + private function extractRequireConstraintsPerPackage(string $package, ConstraintInterface $constraint) { foreach ($this->expandDisjunctiveMultiConstraints($constraint) as $expanded) { $this->requireConstraintsPerPackage[$package][(string) $expanded] = $expanded; @@ -471,11 +447,9 @@ private function extractRequireConstraintsPerPackage($package, ConstraintInterfa * two conflict constraint groups in order for us to keep the best matching package for "^2.14" AND "^3.3" as otherwise, we'd * only keep either one which can cause trouble (e.g. when using --prefer-lowest). * - * @param string $package - * @param ConstraintInterface $constraint * @return void */ - private function extractConflictConstraintsPerPackage($package, ConstraintInterface $constraint) + private function extractConflictConstraintsPerPackage(string $package, ConstraintInterface $constraint) { foreach ($this->expandDisjunctiveMultiConstraints($constraint) as $expanded) { $this->conflictConstraintsPerPackage[$package][(string) $expanded] = $expanded; @@ -483,8 +457,6 @@ private function extractConflictConstraintsPerPackage($package, ConstraintInterf } /** - * - * @param ConstraintInterface $constraint * @return ConstraintInterface[] */ private function expandDisjunctiveMultiConstraints(ConstraintInterface $constraint) @@ -498,6 +470,6 @@ private function expandDisjunctiveMultiConstraints(ConstraintInterface $constrai } // Regular constraints and conjunctive MultiConstraints - return array($constraint); + return [$constraint]; } } diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index fd38b5f23750..9ded041f4f43 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -43,7 +43,7 @@ class Problem * A set of reasons for the problem, each is a rule or a root require and a rule * @var array> */ - protected $reasons = array(); + protected $reasons = []; /** @var int */ protected $section = 0; @@ -52,7 +52,6 @@ class Problem * Add a rule as a reason * * @param Rule $rule A rule which is a reason for this problem - * @return void */ public function addRule(Rule $rule): void { @@ -72,22 +71,20 @@ public function getReasons(): array /** * A human readable textual representation of the problem's reasons * - * @param bool $isVerbose * @param array $installedMap A map of all present packages * @param array $learnedPool - * @return string */ - public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = array(), array $learnedPool = array()): string + public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []): string { // TODO doesn't this entirely defeat the purpose of the problem sections? what's the point of sections? - $reasons = call_user_func_array('array_merge', array_reverse($this->reasons)); + $reasons = array_merge(...array_reverse($this->reasons)); if (count($reasons) === 1) { reset($reasons); $rule = current($reasons); - if (!in_array($rule->getReason(), array(Rule::RULE_ROOT_REQUIRE, Rule::RULE_FIXED), true)) { - throw new \LogicException("Single reason problems must contain a request rule."); + if ($rule->getReason() !== Rule::RULE_ROOT_REQUIRE) { + throw new \LogicException("Single reason problems must contain a root require rule."); } $reasonData = $rule->getReasonData(); @@ -97,7 +94,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, if (isset($constraint)) { $packages = $pool->whatProvides($packageName, $constraint); } else { - $packages = array(); + $packages = []; } if (empty($packages)) { @@ -110,19 +107,16 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, /** * @param Rule[] $rules - * @param string $indent - * @param bool $isVerbose * @param array $installedMap A map of all present packages * @param array $learnedPool - * @return string * @internal */ - public static function formatDeduplicatedRules(array $rules, string $indent, RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = array(), array $learnedPool = array()): string + public static function formatDeduplicatedRules(array $rules, string $indent, RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []): string { - $messages = array(); - $templates = array(); + $messages = []; + $templates = []; $parser = new VersionParser; - $deduplicatableRuleTypes = array(Rule::RULE_PACKAGE_REQUIRES, Rule::RULE_PACKAGE_CONFLICT); + $deduplicatableRuleTypes = [Rule::RULE_PACKAGE_REQUIRES, Rule::RULE_PACKAGE_CONFLICT]; foreach ($rules as $rule) { $message = $rule->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool); if (in_array($rule->getReason(), $deduplicatableRuleTypes, true) && Preg::isMatch('{^(?P\S+) (?P\S+) (?Prequires|conflicts)}', $message, $m)) { @@ -138,7 +132,7 @@ public static function formatDeduplicatedRules(array $rules, string $indent, Rep } } - $result = array(); + $result = []; foreach (array_unique($messages) as $message) { if (isset($templates[$message])) { foreach ($templates[$message] as $package => $versions) { @@ -162,9 +156,6 @@ public static function formatDeduplicatedRules(array $rules, string $indent, Rep return "\n$indent- ".implode("\n$indent- ", $result); } - /** - * @return bool - */ public function isCausedByLock(RepositorySet $repositorySet, Request $request, Pool $pool): bool { foreach ($this->reasons as $sectionRules) { @@ -183,7 +174,6 @@ public function isCausedByLock(RepositorySet $repositorySet, Request $request, P * * @param string $id A canonical identifier for the reason * @param Rule $reason The reason descriptor - * @return void */ protected function addReason(string $id, Rule $reason): void { @@ -196,9 +186,6 @@ protected function addReason(string $id, Rule $reason): void } } - /** - * @return void - */ public function nextSection(): void { $this->section++; @@ -206,11 +193,9 @@ public function nextSection(): void /** * @internal - * @param bool $isVerbose - * @param string $packageName * @return array{0: string, 1: string} */ - public static function getMissingPackageReason(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, string $packageName, ConstraintInterface $constraint = null): array + public static function getMissingPackageReason(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, string $packageName, ?ConstraintInterface $constraint = null): array { if (PlatformRepository::isPlatformPackage($packageName)) { // handle php/php-*/hhvm @@ -220,24 +205,24 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $msg = "- Root composer.json requires ".$packageName.self::constraintToText($constraint).' but '; if (defined('HHVM_VERSION') || ($packageName === 'hhvm' && count($pool->whatProvides($packageName)) > 0)) { - return array($msg, 'your HHVM version does not satisfy that requirement.'); + return [$msg, 'your HHVM version does not satisfy that requirement.']; } if ($packageName === 'hhvm') { - return array($msg, 'HHVM was not detected on this machine, make sure it is in your PATH.'); + return [$msg, 'HHVM was not detected on this machine, make sure it is in your PATH.']; } if (null === $version) { - return array($msg, 'the '.$packageName.' package is disabled by your platform config. Enable it again with "composer config platform.'.$packageName.' --unset".'); + return [$msg, 'the '.$packageName.' package is disabled by your platform config. Enable it again with "composer config platform.'.$packageName.' --unset".']; } - return array($msg, 'your '.$packageName.' version ('. $version .') does not satisfy that requirement.'); + return [$msg, 'your '.$packageName.' version ('. $version .') does not satisfy that requirement.']; } // handle php extensions if (0 === stripos($packageName, 'ext-')) { if (false !== strpos($packageName, ' ')) { - return array('- ', "PHP extension ".$packageName.' should be required as '.str_replace(' ', '-', $packageName).'.'); + return ['- ', "PHP extension ".$packageName.' should be required as '.str_replace(' ', '-', $packageName).'.']; } $ext = substr($packageName, 4); @@ -246,16 +231,16 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $version = self::getPlatformPackageVersion($pool, $packageName, phpversion($ext) ?: '0'); if (null === $version) { if (extension_loaded($ext)) { - return array( + return [ $msg, 'the '.$packageName.' package is disabled by your platform config. Enable it again with "composer config platform.'.$packageName.' --unset".', - ); + ]; } - return array($msg, 'it is missing from your system. Install or enable PHP\'s '.$ext.' extension.'); + return [$msg, 'it is missing from your system. Install or enable PHP\'s '.$ext.' extension.']; } - return array($msg, 'it has the wrong version installed ('.$version.').'); + return [$msg, 'it has the wrong version installed ('.$version.').']; } // handle linked libs @@ -263,10 +248,10 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req if (strtolower($packageName) === 'lib-icu') { $error = extension_loaded('intl') ? 'it has the wrong version installed, try upgrading the intl extension.' : 'it is missing from your system, make sure the intl extension is loaded.'; - return array("- Root composer.json requires linked library ".$packageName.self::constraintToText($constraint).' but ', $error); + return ["- Root composer.json requires linked library ".$packageName.self::constraintToText($constraint).' but ', $error]; } - return array("- Root composer.json requires linked library ".$packageName.self::constraintToText($constraint).' but ', 'it has the wrong version installed or is missing from your system, make sure to load the extension providing it.'); + return ["- Root composer.json requires linked library ".$packageName.self::constraintToText($constraint).' but ', 'it has the wrong version installed or is missing from your system, make sure to load the extension providing it.']; } } @@ -275,7 +260,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req if ($package->getName() === $packageName) { $lockedPackage = $package; if ($pool->isUnacceptableFixedOrLockedPackage($package)) { - return array("- ", $package->getPrettyName().' is fixed to '.$package->getPrettyVersion().' (lock file version) by a partial update but that version is rejected by your minimum-stability. Make sure you list it as an argument for the update command.'); + return ["- ", $package->getPrettyName().' is fixed to '.$package->getPrettyVersion().' (lock file version) by a partial update but that version is rejected by your minimum-stability. Make sure you list it as an argument for the update command.']; } break; } @@ -290,7 +275,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req return $rootReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); }); if (0 === count($filtered)) { - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts').' with your root composer.json require ('.$rootReqs[$packageName]->getPrettyString().').'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts').' with your root composer.json require ('.$rootReqs[$packageName]->getPrettyString().').']; } } @@ -300,7 +285,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req return $tempReqs[$packageName]->matches(new Constraint('==', $p->getVersion())); }); if (0 === count($filtered)) { - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts').' with your temporary update constraint ('.$packageName.':'.$tempReqs[$packageName]->getPrettyString().').'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these conflict' : 'it conflicts').' with your temporary update constraint ('.$packageName.':'.$tempReqs[$packageName]->getPrettyString().').']; } } @@ -310,7 +295,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req return $fixedConstraint->matches(new Constraint('==', $p->getVersion())); }); if (0 === count($filtered)) { - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but the package is fixed to '.$lockedPackage->getPrettyVersion().' (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but the package is fixed to '.$lockedPackage->getPrettyVersion().' (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.']; } } @@ -319,10 +304,10 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req }); if (!$nonLockedPackages) { - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' in the lock file but not in remote repositories, make sure you avoid updating this package to keep the one from the lock file.'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' in the lock file but not in remote repositories, make sure you avoid updating this package to keep the one from the lock file.']; } - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but these were not loaded, likely because '.(self::hasMultipleNames($packages) ? 'they conflict' : 'it conflicts').' with another require.'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but these were not loaded, likely because '.(self::hasMultipleNames($packages) ? 'they conflict' : 'it conflicts').' with another require.']; } // check if the package is found when bypassing stability checks @@ -332,7 +317,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req return self::computeCheckForLowerPrioRepo($pool, $isVerbose, $packageName, $packages, $allReposPackages, 'minimum-stability', $constraint); } - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these do' : 'it does').' not match your minimum-stability.'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these do' : 'it does').' not match your minimum-stability.']; } // check if the package is found when bypassing the constraint and stability checks @@ -345,7 +330,7 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $suffix = ''; if ($constraint instanceof Constraint && $constraint->getVersion() === 'dev-master') { foreach ($packages as $candidate) { - if (in_array($candidate->getVersion(), array('dev-default', 'dev-main'), true)) { + if (in_array($candidate->getVersion(), ['dev-default', 'dev-main'], true)) { $suffix = ' Perhaps dev-master was renamed to '.$candidate->getPrettyVersion().'?'; break; } @@ -359,13 +344,13 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $suffix = ' See https://getcomposer.org/dep-on-root for details and assistance.'; } - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these do' : 'it does').' not match the constraint.' . $suffix); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found '.self::getPackageList($packages, $isVerbose, $pool, $constraint).' but '.(self::hasMultipleNames($packages) ? 'these do' : 'it does').' not match the constraint.' . $suffix]; } if (!Preg::isMatch('{^[A-Za-z0-9_./-]+$}', $packageName)) { $illegalChars = Preg::replace('{[A-Za-z0-9_./-]+}', '', $packageName); - return array("- Root composer.json requires $packageName, it ", 'could not be found, it looks like its name is invalid, "'.$illegalChars.'" is not allowed in package names.'); + return ["- Root composer.json requires $packageName, it ", 'could not be found, it looks like its name is invalid, "'.$illegalChars.'" is not allowed in package names.']; } if ($providers = $repositorySet->getProviders($packageName)) { @@ -379,23 +364,20 @@ public static function getMissingPackageReason(RepositorySet $repositorySet, Req $providersStr .= ' ... and '.(count($providers) - $maxProviders).' more.'."\n"; } - return array("- Root composer.json requires $packageName".self::constraintToText($constraint).", it ", "could not be found in any version, but the following packages provide it:\n".$providersStr." Consider requiring one of these to satisfy the $packageName requirement."); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint).", it ", "could not be found in any version, but the following packages provide it:\n".$providersStr." Consider requiring one of these to satisfy the $packageName requirement."]; } - return array("- Root composer.json requires $packageName, it ", "could not be found in any version, there may be a typo in the package name."); + return ["- Root composer.json requires $packageName, it ", "could not be found in any version, there may be a typo in the package name."]; } /** * @internal * @param PackageInterface[] $packages - * @param bool $isVerbose - * @param bool $useRemovedVersionGroup - * @return string */ - public static function getPackageList(array $packages, bool $isVerbose, Pool $pool = null, ConstraintInterface $constraint = null, bool $useRemovedVersionGroup = false): string + public static function getPackageList(array $packages, bool $isVerbose, ?Pool $pool = null, ?ConstraintInterface $constraint = null, bool $useRemovedVersionGroup = false): string { - $prepared = array(); - $hasDefaultBranch = array(); + $prepared = []; + $hasDefaultBranch = []; foreach ($packages as $package) { $prepared[$package->getName()]['name'] = $package->getPrettyName(); $prepared[$package->getName()]['versions'][$package->getVersion()] = $package->getPrettyVersion().($package instanceof AliasPackage ? ' (alias of '.$package->getAliasOf()->getPrettyVersion().')' : ''); @@ -414,7 +396,7 @@ public static function getPackageList(array $packages, bool $isVerbose, Pool $po } } - $preparedStrings = array(); + $preparedStrings = []; foreach ($prepared as $name => $package) { // remove the implicit default branch alias to avoid cruft in the display if (isset($package['versions'][VersionParser::DEFAULT_BRANCH_ALIAS], $hasDefaultBranch[$name])) { @@ -433,7 +415,6 @@ public static function getPackageList(array $packages, bool $isVerbose, Pool $po } /** - * @param string $packageName * @param string $version the effective runtime version of the platform package * @return ?string a version string or null if it appears the package was artificially disabled */ @@ -477,8 +458,6 @@ private static function getPlatformPackageVersion(Pool $pool, string $packageNam /** * @param string[] $versions an array of pretty versions, with normalized versions as keys - * @param int $max - * @param int $maxDev * @return list a list of pretty versions and '...' where versions were removed */ private static function condenseVersionList(array $versions, int $max, int $maxDev = 16): array @@ -487,8 +466,8 @@ private static function condenseVersionList(array $versions, int $max, int $maxD return $versions; } - $filtered = array(); - $byMajor = array(); + $filtered = []; + $byMajor = []; foreach ($versions as $version => $pretty) { if (0 === stripos($version, 'dev-')) { $byMajor['dev'][] = $pretty; @@ -513,7 +492,6 @@ private static function condenseVersionList(array $versions, int $max, int $maxD /** * @param PackageInterface[] $packages - * @return bool */ private static function hasMultipleNames(array $packages): bool { @@ -530,16 +508,13 @@ private static function hasMultipleNames(array $packages): bool } /** - * @param bool $isVerbose - * @param string $packageName * @param PackageInterface[] $higherRepoPackages * @param PackageInterface[] $allReposPackages - * @param string $reason * @return array{0: string, 1: string} */ - private static function computeCheckForLowerPrioRepo(Pool $pool, bool $isVerbose, string $packageName, array $higherRepoPackages, array $allReposPackages, string $reason, ConstraintInterface $constraint = null): array + private static function computeCheckForLowerPrioRepo(Pool $pool, bool $isVerbose, string $packageName, array $higherRepoPackages, array $allReposPackages, string $reason, ?ConstraintInterface $constraint = null): array { - $nextRepoPackages = array(); + $nextRepoPackages = []; $nextRepo = null; foreach ($allReposPackages as $package) { @@ -554,10 +529,10 @@ private static function computeCheckForLowerPrioRepo(Pool $pool, bool $isVerbose if ($higherRepoPackages) { $topPackage = reset($higherRepoPackages); if ($topPackage instanceof RootPackageInterface) { - return array( + return [ "- Root composer.json requires $packageName".self::constraintToText($constraint).', it is ', 'satisfiable by '.self::getPackageList($nextRepoPackages, $isVerbose, $pool, $constraint).' from '.$nextRepo->getRepoName().' but '.$topPackage->getPrettyName().' is the root package and cannot be modified. See https://getcomposer.org/dep-on-root for details and assistance.', - ); + ]; } } @@ -573,20 +548,18 @@ private static function computeCheckForLowerPrioRepo(Pool $pool, bool $isVerbose } } - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', ', 'found ' . self::getPackageList($higherRepoPackages, $isVerbose, $pool, $constraint).' but ' . ($singular ? 'it does' : 'these do') . ' not match your '.$reason.' and ' . ($singular ? 'is' : 'are') . ' therefore not installable. '.$suggestion, - ); + ]; } - return array("- Root composer.json requires $packageName".self::constraintToText($constraint) . ', it is ', 'satisfiable by '.self::getPackageList($nextRepoPackages, $isVerbose, $pool, $constraint).' from '.$nextRepo->getRepoName().' but '.self::getPackageList($higherRepoPackages, $isVerbose, $pool, $constraint).' from '.reset($higherRepoPackages)->getRepository()->getRepoName().' has higher repository priority. The packages from the higher priority repository do not match your '.$reason.' and are therefore not installable. That repository is canonical so the lower priority repo\'s packages are not installable. See https://getcomposer.org/repoprio for details and assistance.'); + return ["- Root composer.json requires $packageName".self::constraintToText($constraint) . ', it is ', 'satisfiable by '.self::getPackageList($nextRepoPackages, $isVerbose, $pool, $constraint).' from '.$nextRepo->getRepoName().' but '.self::getPackageList($higherRepoPackages, $isVerbose, $pool, $constraint).' from '.reset($higherRepoPackages)->getRepository()->getRepoName().' has higher repository priority. The packages from the higher priority repository do not match your '.$reason.' and are therefore not installable. That repository is canonical so the lower priority repo\'s packages are not installable. See https://getcomposer.org/repoprio for details and assistance.']; } /** * Turns a constraint into text usable in a sentence describing a request - * - * @return string */ - protected static function constraintToText(ConstraintInterface $constraint = null): string + protected static function constraintToText(?ConstraintInterface $constraint = null): string { return $constraint ? ' '.$constraint->getPrettyString() : ''; } diff --git a/src/Composer/DependencyResolver/Request.php b/src/Composer/DependencyResolver/Request.php index e08ae06c70e2..edd26308684b 100644 --- a/src/Composer/DependencyResolver/Request.php +++ b/src/Composer/DependencyResolver/Request.php @@ -43,28 +43,24 @@ class Request /** @var ?LockArrayRepository */ protected $lockedRepository; /** @var array */ - protected $requires = array(); + protected $requires = []; /** @var array */ - protected $fixedPackages = array(); + protected $fixedPackages = []; /** @var array */ - protected $lockedPackages = array(); + protected $lockedPackages = []; /** @var array */ - protected $fixedLockedPackages = array(); + protected $fixedLockedPackages = []; /** @var string[] */ - protected $updateAllowList = array(); + protected $updateAllowList = []; /** @var false|self::UPDATE_* */ protected $updateAllowTransitiveDependencies = false; - public function __construct(LockArrayRepository $lockedRepository = null) + public function __construct(?LockArrayRepository $lockedRepository = null) { $this->lockedRepository = $lockedRepository; } - /** - * @param string $packageName - * @return void - */ - public function requireName(string $packageName, ConstraintInterface $constraint = null): void + public function requireName(string $packageName, ?ConstraintInterface $constraint = null): void { $packageName = strtolower($packageName); @@ -82,8 +78,6 @@ public function requireName(string $packageName, ConstraintInterface $constraint * * This is used for platform packages which cannot be modified by Composer. A rule enforcing their installation is * generated for dependency resolution. Partial updates with dependencies cannot in any way modify these packages. - * - * @return void */ public function fixPackage(BasePackage $package): void { @@ -99,8 +93,6 @@ public function fixPackage(BasePackage $package): void * However unlike fixed packages there will not be a special rule enforcing their installation for the solver, so * if nothing requires these packages they will be removed. Additionally in a partial update these packages can be * unlocked, meaning other versions can be installed if explicitly requested as part of the update. - * - * @return void */ public function lockPackage(BasePackage $package): void { @@ -113,8 +105,6 @@ public function lockPackage(BasePackage $package): void * This is necessary for the composer install step which verifies the lock file integrity and should not allow * removal of any packages. At the same time lock packages there cannot simply be marked fixed, as error reporting * would then report them as platform packages, so this still marks them as locked packages at the same time. - * - * @return void */ public function fixLockedPackage(BasePackage $package): void { @@ -122,9 +112,6 @@ public function fixLockedPackage(BasePackage $package): void $this->fixedLockedPackages[spl_object_hash($package)] = $package; } - /** - * @return void - */ public function unlockPackage(BasePackage $package): void { unset($this->lockedPackages[spl_object_hash($package)]); @@ -133,7 +120,6 @@ public function unlockPackage(BasePackage $package): void /** * @param string[] $updateAllowList * @param false|self::UPDATE_* $updateAllowTransitiveDependencies - * @return void */ public function setUpdateAllowList(array $updateAllowList, $updateAllowTransitiveDependencies): void { @@ -149,17 +135,11 @@ public function getUpdateAllowList(): array return $this->updateAllowList; } - /** - * @return bool - */ public function getUpdateAllowTransitiveDependencies(): bool { return $this->updateAllowTransitiveDependencies !== self::UPDATE_ONLY_LISTED; } - /** - * @return bool - */ public function getUpdateAllowTransitiveRootDependencies(): bool { return $this->updateAllowTransitiveDependencies === self::UPDATE_LISTED_WITH_TRANSITIVE_DEPS; @@ -181,9 +161,6 @@ public function getFixedPackages(): array return $this->fixedPackages; } - /** - * @return bool - */ public function isFixedPackage(BasePackage $package): bool { return isset($this->fixedPackages[spl_object_hash($package)]); @@ -197,9 +174,6 @@ public function getLockedPackages(): array return $this->lockedPackages; } - /** - * @return bool - */ public function isLockedPackage(PackageInterface $package): bool { return isset($this->lockedPackages[spl_object_hash($package)]) || isset($this->fixedLockedPackages[spl_object_hash($package)]); @@ -214,7 +188,6 @@ public function getFixedOrLockedPackages(): array } /** - * @param bool $packageIds * @return array * * @TODO look into removing the packageIds option, the only place true is used @@ -224,7 +197,7 @@ public function getFixedOrLockedPackages(): array */ public function getPresentMap(bool $packageIds = false): array { - $presentMap = array(); + $presentMap = []; if ($this->lockedRepository) { foreach ($this->lockedRepository->getPackages() as $package) { @@ -244,7 +217,7 @@ public function getPresentMap(bool $packageIds = false): array */ public function getFixedPackagesMap(): array { - $fixedPackagesMap = array(); + $fixedPackagesMap = []; foreach ($this->fixedPackages as $package) { $fixedPackagesMap[$package->getId()] = $package; diff --git a/src/Composer/DependencyResolver/Rule.php b/src/Composer/DependencyResolver/Rule.php index cb5a7f1c65d1..dba29ed1b54e 100644 --- a/src/Composer/DependencyResolver/Rule.php +++ b/src/Composer/DependencyResolver/Rule.php @@ -80,14 +80,10 @@ abstract public function getHash(); abstract public function __toString(): string; - /** - * @param Rule $rule - * @return bool - */ abstract public function equals(Rule $rule): bool; /** - * @return int + * @return self::RULE_* */ public function getReason(): int { @@ -102,9 +98,6 @@ public function getReasonData() return $this->reasonData; } - /** - * @return string|null - */ public function getRequiredPackage(): ?string { $reason = $this->getReason(); @@ -126,61 +119,39 @@ public function getRequiredPackage(): ?string /** * @param RuleSet::TYPE_* $type - * @return void */ public function setType($type): void { $this->bitfield = ($this->bitfield & ~(255 << self::BITFIELD_TYPE)) | ((255 & $type) << self::BITFIELD_TYPE); } - /** - * @return int - */ public function getType(): int { return ($this->bitfield & (255 << self::BITFIELD_TYPE)) >> self::BITFIELD_TYPE; } - /** - * @return void - */ public function disable(): void { $this->bitfield = ($this->bitfield & ~(255 << self::BITFIELD_DISABLED)) | (1 << self::BITFIELD_DISABLED); } - /** - * @return void - */ public function enable(): void { $this->bitfield &= ~(255 << self::BITFIELD_DISABLED); } - /** - * @return bool - */ public function isDisabled(): bool { return (bool) (($this->bitfield & (255 << self::BITFIELD_DISABLED)) >> self::BITFIELD_DISABLED); } - /** - * @return bool - */ public function isEnabled(): bool { return !(($this->bitfield & (255 << self::BITFIELD_DISABLED)) >> self::BITFIELD_DISABLED); } - /** - * @return bool - */ abstract public function isAssertion(): bool; - /** - * @return bool - */ public function isCausedByLock(RepositorySet $repositorySet, Request $request, Pool $pool): bool { if ($this->getReason() === self::RULE_PACKAGE_REQUIRES) { @@ -230,7 +201,6 @@ public function isCausedByLock(RepositorySet $repositorySet, Request $request, P /** * @internal - * @return BasePackage */ public function getSourcePackage(Pool $pool): BasePackage { @@ -244,7 +214,7 @@ public function getSourcePackage(Pool $pool): BasePackage if ($reasonData = $this->getReasonData()) { // swap literals if they are not in the right order with package2 being the conflicter if ($reasonData->getSource() === $package1->getName()) { - list($package2, $package1) = array($package1, $package2); + [$package2, $package1] = [$package1, $package2]; } } @@ -262,12 +232,10 @@ public function getSourcePackage(Pool $pool): BasePackage } /** - * @param bool $isVerbose * @param BasePackage[] $installedMap * @param array $learnedPool - * @return string */ - public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = array(), array $learnedPool = array()): string + public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, array $installedMap = [], array $learnedPool = []): string { $literals = $this->getLiterals(); @@ -312,7 +280,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, // swap literals if they are not in the right order with package2 being the conflicter if ($reasonData->getSource() === $package1->getName()) { - list($package2, $package1) = array($package1, $package2); + [$package2, $package1] = [$package1, $package2]; $conflictTarget = $package1->getPrettyName().' '.$reasonData->getPrettyConstraint(); } @@ -349,7 +317,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, /** @var Link */ $reasonData = $this->reasonData; - $requires = array(); + $requires = []; foreach ($literals as $literal) { $requires[] = $pool->literalToPackage($literal); } @@ -368,7 +336,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, return $text; case self::RULE_PACKAGE_SAME_NAME: - $packageNames = array(); + $packageNames = []; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); $packageNames[$package->getName()] = true; @@ -394,8 +362,8 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $reason .= $replacedName.' and thus cannot coexist with it.'; } - $installedPackages = array(); - $removablePackages = array(); + $installedPackages = []; + $removablePackages = []; foreach ($literals as $literal) { if (isset($installedMap[abs($literal)])) { $installedPackages[] = $pool->literalToPackage($literal); @@ -425,7 +393,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, if (count($literals) === 1) { $ruleText = $pool->literalToPrettyString($literals[0], $installedMap); } else { - $groups = array(); + $groups = []; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if (isset($installedMap[$package->id])) { @@ -436,7 +404,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $groups[$group][] = $this->deduplicateDefaultBranchAlias($package); } - $ruleTexts = array(); + $ruleTexts = []; foreach ($groups as $group => $packages) { $ruleTexts[] = $group . (count($packages) > 1 ? ' one of' : '').' ' . $this->formatPackagesUnique($pool, $packages, $isVerbose); } @@ -481,11 +449,8 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, /** * @param array $packages An array containing packages or literals - * @param bool $isVerbose - * @param bool $useRemovedVersionGroup - * @return string */ - protected function formatPackagesUnique(Pool $pool, array $packages, bool $isVerbose, ConstraintInterface $constraint = null, bool $useRemovedVersionGroup = false): string + protected function formatPackagesUnique(Pool $pool, array $packages, bool $isVerbose, ?ConstraintInterface $constraint = null, bool $useRemovedVersionGroup = false): string { foreach ($packages as $index => $package) { if (!\is_object($package)) { @@ -496,9 +461,6 @@ protected function formatPackagesUnique(Pool $pool, array $packages, bool $isVer return Problem::getPackageList($packages, $isVerbose, $pool, $constraint, $useRemovedVersionGroup); } - /** - * @return BasePackage - */ private function deduplicateDefaultBranchAlias(BasePackage $package): BasePackage { if ($package instanceof AliasPackage && $package->getPrettyVersion() === VersionParser::DEFAULT_BRANCH_ALIAS) { diff --git a/src/Composer/DependencyResolver/Rule2Literals.php b/src/Composer/DependencyResolver/Rule2Literals.php index 94a9a979193f..17bfaf8ce158 100644 --- a/src/Composer/DependencyResolver/Rule2Literals.php +++ b/src/Composer/DependencyResolver/Rule2Literals.php @@ -24,8 +24,6 @@ class Rule2Literals extends Rule protected $literal2; /** - * @param int $literal1 - * @param int $literal2 * @param Rule::RULE_* $reason A RULE_* constant * @param mixed $reasonData * @@ -49,7 +47,7 @@ public function __construct(int $literal1, int $literal2, $reason, $reasonData) */ public function getLiterals(): array { - return array($this->literal1, $this->literal2); + return [$this->literal1, $this->literal2]; } /** @@ -107,8 +105,6 @@ public function isAssertion(): bool /** * Formats a rule as a string of the format (Literal1|Literal2|...) - * - * @return string */ public function __toString(): string { diff --git a/src/Composer/DependencyResolver/RuleSet.php b/src/Composer/DependencyResolver/RuleSet.php index 0eb714238aba..e59112383af3 100644 --- a/src/Composer/DependencyResolver/RuleSet.php +++ b/src/Composer/DependencyResolver/RuleSet.php @@ -30,14 +30,14 @@ class RuleSet implements \IteratorAggregate, \Countable * * @var array */ - public $ruleById = array(); + public $ruleById = []; /** @var array<0|1|4, string> */ - protected static $types = array( + protected static $types = [ self::TYPE_PACKAGE => 'PACKAGE', self::TYPE_REQUEST => 'REQUEST', self::TYPE_LEARNED => 'LEARNED', - ); + ]; /** @var array */ protected $rules; @@ -46,18 +46,17 @@ class RuleSet implements \IteratorAggregate, \Countable protected $nextRuleId = 0; /** @var array */ - protected $rulesByHash = array(); + protected $rulesByHash = []; public function __construct() { foreach ($this->getTypes() as $type) { - $this->rules[$type] = array(); + $this->rules[$type] = []; } } /** * @param self::TYPE_* $type - * @return void */ public function add(Rule $rule, $type): void { @@ -84,7 +83,7 @@ public function add(Rule $rule, $type): void } if (!isset($this->rules[$type])) { - $this->rules[$type] = array(); + $this->rules[$type] = []; } $this->rules[$type][] = $rule; @@ -99,7 +98,7 @@ public function add(Rule $rule, $type): void $this->rulesByHash[$hash][] = $rule; } else { $originalRule = $this->rulesByHash[$hash]; - $this->rulesByHash[$hash] = array($originalRule, $rule); + $this->rulesByHash[$hash] = [$originalRule, $rule]; } } @@ -108,10 +107,6 @@ public function count(): int return $this->nextRuleId; } - /** - * @param int $id - * @return Rule - */ public function ruleById(int $id): Rule { return $this->ruleById[$id]; @@ -130,18 +125,17 @@ public function getIterator(): RuleSetIterator /** * @param self::TYPE_*|array $types - * @return RuleSetIterator */ public function getIteratorFor($types): RuleSetIterator { if (!\is_array($types)) { - $types = array($types); + $types = [$types]; } $allRules = $this->getRules(); /** @var array $rules */ - $rules = array(); + $rules = []; foreach ($types as $type) { $rules[$type] = $allRules[$type]; @@ -152,12 +146,11 @@ public function getIteratorFor($types): RuleSetIterator /** * @param array|self::TYPE_* $types - * @return RuleSetIterator */ public function getIteratorWithout($types): RuleSetIterator { if (!\is_array($types)) { - $types = array($types); + $types = [$types]; } $rules = $this->getRules(); @@ -177,11 +170,7 @@ public function getTypes(): array return array_keys($types); } - /** - * @param bool $isVerbose - * @return string - */ - public function getPrettyString(RepositorySet $repositorySet = null, Request $request = null, Pool $pool = null, bool $isVerbose = false): string + public function getPrettyString(?RepositorySet $repositorySet = null, ?Request $request = null, ?Pool $pool = null, bool $isVerbose = false): string { $string = "\n"; foreach ($this->rules as $type => $rules) { diff --git a/src/Composer/DependencyResolver/RuleSetGenerator.php b/src/Composer/DependencyResolver/RuleSetGenerator.php index 59eefdf606da..afd735e7fb08 100644 --- a/src/Composer/DependencyResolver/RuleSetGenerator.php +++ b/src/Composer/DependencyResolver/RuleSetGenerator.php @@ -31,9 +31,9 @@ class RuleSetGenerator /** @var RuleSet */ protected $rules; /** @var array */ - protected $addedMap = array(); + protected $addedMap = []; /** @var array */ - protected $addedPackagesByNames = array(); + protected $addedPackagesByNames = []; public function __construct(PolicyInterface $policy, Pool $pool) { @@ -58,7 +58,7 @@ public function __construct(PolicyInterface $policy, Pool $pool) */ protected function createRequireRule(BasePackage $package, array $providers, $reason, $reasonData = null): ?Rule { - $literals = array(-$package->id); + $literals = [-$package->id]; foreach ($providers as $provider) { // self fulfilling rule? @@ -87,7 +87,7 @@ protected function createRequireRule(BasePackage $package, array $providers, $re */ protected function createInstallOneOfRule(array $packages, $reason, $reasonData): Rule { - $literals = array(); + $literals = []; foreach ($packages as $package) { $literals[] = $package->id; } @@ -123,13 +123,12 @@ protected function createRule2Literals(BasePackage $issuer, BasePackage $provide * @param BasePackage[] $packages * @param Rule::RULE_* $reason A RULE_* constant * @param mixed $reasonData - * @return Rule * * @phpstan-param ReasonData $reasonData */ protected function createMultiConflictRule(array $packages, $reason, $reasonData): Rule { - $literals = array(); + $literals = []; foreach ($packages as $package) { $literals[] = -$package->id; } @@ -149,10 +148,8 @@ protected function createMultiConflictRule(array $packages, $reason, $reasonData * * @param RuleSet::TYPE_* $type A TYPE_* constant defining the rule type * @param Rule $newRule The rule about to be added - * - * @return void */ - private function addRule($type, Rule $newRule = null): void + private function addRule($type, ?Rule $newRule = null): void { if (!$newRule) { return; @@ -161,9 +158,6 @@ private function addRule($type, Rule $newRule = null): void $this->rules->add($newRule, $type); } - /** - * @return void - */ protected function addRulesForPackage(BasePackage $package, PlatformRequirementFilterInterface $platformRequirementFilter): void { /** @var \SplQueue */ @@ -184,10 +178,10 @@ protected function addRulesForPackage(BasePackage $package, PlatformRequirementF } } else { $workQueue->enqueue($package->getAliasOf()); - $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, array($package->getAliasOf()), Rule::RULE_PACKAGE_ALIAS, $package)); + $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, [$package->getAliasOf()], Rule::RULE_PACKAGE_ALIAS, $package)); // aliases must be installed with their main package, so create a rule the other way around as well - $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package->getAliasOf(), array($package), Rule::RULE_PACKAGE_INVERSE_ALIAS, $package->getAliasOf())); + $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package->getAliasOf(), [$package], Rule::RULE_PACKAGE_INVERSE_ALIAS, $package->getAliasOf())); // if alias package has no self.version requires, its requirements do not // need to be added as the aliased package processing will take care of it @@ -215,9 +209,6 @@ protected function addRulesForPackage(BasePackage $package, PlatformRequirementF } } - /** - * @return void - */ protected function addConflictRules(PlatformRequirementFilterInterface $platformRequirementFilter): void { /** @var BasePackage $package */ @@ -256,9 +247,6 @@ protected function addConflictRules(PlatformRequirementFilterInterface $platform } } - /** - * @return void - */ protected function addRulesForRequest(Request $request, PlatformRequirementFilterInterface $platformRequirementFilter): void { foreach ($request->getFixedPackages() as $package) { @@ -274,9 +262,9 @@ protected function addRulesForRequest(Request $request, PlatformRequirementFilte $this->addRulesForPackage($package, $platformRequirementFilter); - $rule = $this->createInstallOneOfRule(array($package), Rule::RULE_FIXED, array( + $rule = $this->createInstallOneOfRule([$package], Rule::RULE_FIXED, [ 'package' => $package, - )); + ]); $this->addRule(RuleSet::TYPE_REQUEST, $rule); } @@ -293,18 +281,15 @@ protected function addRulesForRequest(Request $request, PlatformRequirementFilte $this->addRulesForPackage($package, $platformRequirementFilter); } - $rule = $this->createInstallOneOfRule($packages, Rule::RULE_ROOT_REQUIRE, array( + $rule = $this->createInstallOneOfRule($packages, Rule::RULE_ROOT_REQUIRE, [ 'packageName' => $packageName, 'constraint' => $constraint, - )); + ]); $this->addRule(RuleSet::TYPE_REQUEST, $rule); } } } - /** - * @return void - */ protected function addRulesForRootAliases(PlatformRequirementFilterInterface $platformRequirementFilter): void { foreach ($this->pool->getPackages() as $package) { @@ -320,10 +305,7 @@ protected function addRulesForRootAliases(PlatformRequirementFilterInterface $pl } } - /** - * @return RuleSet - */ - public function getRulesFor(Request $request, PlatformRequirementFilterInterface $platformRequirementFilter = null): RuleSet + public function getRulesFor(Request $request, ?PlatformRequirementFilterInterface $platformRequirementFilter = null): RuleSet { $platformRequirementFilter = $platformRequirementFilter ?: PlatformRequirementFilterFactory::ignoreNothing(); @@ -334,7 +316,7 @@ public function getRulesFor(Request $request, PlatformRequirementFilterInterface $this->addConflictRules($platformRequirementFilter); // Remove references to packages - $this->addedMap = $this->addedPackagesByNames = array(); + $this->addedMap = $this->addedPackagesByNames = []; $rules = $this->rules; diff --git a/src/Composer/DependencyResolver/RuleWatchChain.php b/src/Composer/DependencyResolver/RuleWatchChain.php index f9b90d4a9779..ddd596033cb9 100644 --- a/src/Composer/DependencyResolver/RuleWatchChain.php +++ b/src/Composer/DependencyResolver/RuleWatchChain.php @@ -27,7 +27,6 @@ class RuleWatchChain extends \SplDoublyLinkedList * Moves the internal iterator to the specified offset * * @param int $offset The offset to seek to. - * @return void */ public function seek(int $offset): void { @@ -42,8 +41,6 @@ public function seek(int $offset): void * incorrectly sets the internal iterator if you delete the current value * this method sets the internal iterator back to the following element * using the seek method. - * - * @return void */ public function remove(): void { diff --git a/src/Composer/DependencyResolver/RuleWatchGraph.php b/src/Composer/DependencyResolver/RuleWatchGraph.php index 375563863a5e..6a13b40ceae5 100644 --- a/src/Composer/DependencyResolver/RuleWatchGraph.php +++ b/src/Composer/DependencyResolver/RuleWatchGraph.php @@ -25,7 +25,7 @@ class RuleWatchGraph { /** @var array */ - protected $watchChains = array(); + protected $watchChains = []; /** * Inserts a rule node into the appropriate chains within the graph @@ -38,7 +38,6 @@ class RuleWatchGraph * watch changes in any literals. * * @param RuleWatchNode $node The rule node to be inserted into the graph - * @return void */ public function insert(RuleWatchNode $node): void { @@ -47,7 +46,7 @@ public function insert(RuleWatchNode $node): void } if (!$node->getRule() instanceof MultiConflictRule) { - foreach (array($node->watch1, $node->watch2) as $literal) { + foreach ([$node->watch1, $node->watch2] as $literal) { if (!isset($this->watchChains[$literal])) { $this->watchChains[$literal] = new RuleWatchChain; } @@ -154,7 +153,6 @@ public function propagateLiteral(int $decidedLiteral, int $level, Decisions $dec * @param int $fromLiteral A literal the node used to watch * @param int $toLiteral A literal the node should watch now * @param RuleWatchNode $node The rule node to be moved - * @return void */ protected function moveWatch(int $fromLiteral, int $toLiteral, RuleWatchNode $node): void { diff --git a/src/Composer/DependencyResolver/RuleWatchNode.php b/src/Composer/DependencyResolver/RuleWatchNode.php index f102086e6357..79c1fcba7f88 100644 --- a/src/Composer/DependencyResolver/RuleWatchNode.php +++ b/src/Composer/DependencyResolver/RuleWatchNode.php @@ -52,7 +52,6 @@ public function __construct(Rule $rule) * likely to quickly lead to further decisions. * * @param Decisions $decisions The decisions made so far by the solver - * @return void */ public function watch2OnHighest(Decisions $decisions): void { @@ -77,8 +76,6 @@ public function watch2OnHighest(Decisions $decisions): void /** * Returns the rule this node wraps - * - * @return Rule */ public function getRule(): Rule { @@ -105,7 +102,6 @@ public function getOtherWatch(int $literal): int * * @param int $from The previously watched literal * @param int $to The literal to be watched now - * @return void */ public function moveWatch(int $from, int $to): void { diff --git a/src/Composer/DependencyResolver/Solver.php b/src/Composer/DependencyResolver/Solver.php index 05d2a39df1ad..2d9e6bad4d2f 100644 --- a/src/Composer/DependencyResolver/Solver.php +++ b/src/Composer/DependencyResolver/Solver.php @@ -44,13 +44,13 @@ class Solver /** @var int */ protected $propagateIndex; /** @var mixed[] */ - protected $branches = array(); + protected $branches = []; /** @var Problem[] */ - protected $problems = array(); + protected $problems = []; /** @var array */ - protected $learnedPool = array(); + protected $learnedPool = []; /** @var array */ - protected $learnedWhy = array(); + protected $learnedWhy = []; /** @var bool */ public $testFlagLearnedPositiveLiteral = false; @@ -65,17 +65,11 @@ public function __construct(PolicyInterface $policy, Pool $pool, IOInterface $io $this->pool = $pool; } - /** - * @return int - */ public function getRuleSetSize(): int { return \count($this->rules); } - /** - * @return Pool - */ public function getPool(): Pool { return $this->pool; @@ -83,9 +77,6 @@ public function getPool(): Pool // aka solver_makeruledecisions - /** - * @return void - */ private function makeAssertionRuleDecisions(): void { $decisionStart = \count($this->decisions) - 1; @@ -156,20 +147,14 @@ private function makeAssertionRuleDecisions(): void } } - /** - * @return void - */ protected function setupFixedMap(Request $request): void { - $this->fixedMap = array(); + $this->fixedMap = []; foreach ($request->getFixedPackages() as $package) { $this->fixedMap[$package->id] = $package; } } - /** - * @return void - */ protected function checkForRootRequireProblems(Request $request, PlatformRequirementFilterInterface $platformRequirementFilter): void { foreach ($request->getRequires() as $packageName => $constraint) { @@ -181,16 +166,13 @@ protected function checkForRootRequireProblems(Request $request, PlatformRequire if (!$this->pool->whatProvides($packageName, $constraint)) { $problem = new Problem(); - $problem->addRule(new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => $packageName, 'constraint' => $constraint))); + $problem->addRule(new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => $packageName, 'constraint' => $constraint])); $this->problems[] = $problem; } } } - /** - * @return LockTransaction - */ - public function solve(Request $request, PlatformRequirementFilterInterface $platformRequirementFilter = null): LockTransaction + public function solve(Request $request, ?PlatformRequirementFilterInterface $platformRequirementFilter = null): LockTransaction { $platformRequirementFilter = $platformRequirementFilter ?: PlatformRequirementFilterFactory::ignoreNothing(); @@ -230,7 +212,6 @@ public function solve(Request $request, PlatformRequirementFilterInterface $plat * Evaluates each term affected by the decision (linked through watches) * If we find unit rules we make new decisions based on them * - * @param int $level * @return Rule|null A rule on conflict, otherwise null. */ protected function propagate(int $level): ?Rule @@ -256,10 +237,6 @@ protected function propagate(int $level): ?Rule /** * Reverts a decision at the given level. - * - * @param int $level - * - * @return void */ private function revert(int $level): void { @@ -298,9 +275,7 @@ private function revert(int $level): void * * returns the new solver level or 0 if unsolvable * - * @param int $level * @param string|int $literal - * @return int */ private function setPropagateLearn(int $level, $literal, Rule $rule): int { @@ -320,7 +295,7 @@ private function setPropagateLearn(int $level, $literal, Rule $rule): int } // conflict - list($learnLiteral, $newLevel, $newRule, $why) = $this->analyze($level, $rule); + [$learnLiteral, $newLevel, $newRule, $why] = $this->analyze($level, $rule); if ($newLevel <= 0 || $newLevel >= $level) { throw new SolverBugException( @@ -347,9 +322,7 @@ private function setPropagateLearn(int $level, $literal, Rule $rule): int } /** - * @param int $level * @param int[] $decisionQueue - * @return int */ private function selectAndInstall(int $level, array $decisionQueue, Rule $rule): int { @@ -360,14 +333,13 @@ private function selectAndInstall(int $level, array $decisionQueue, Rule $rule): // if there are multiple candidates, then branch if (\count($literals)) { - $this->branches[] = array($literals, $level); + $this->branches[] = [$literals, $level]; } return $this->setPropagateLearn($level, $selectedLiteral, $rule); } /** - * @param int $level * @return array{int, int, GenericRule, int} */ protected function analyze(int $level, Rule $rule): array @@ -376,12 +348,12 @@ protected function analyze(int $level, Rule $rule): array $ruleLevel = 1; $num = 0; $l1num = 0; - $seen = array(); - $learnedLiterals = array(null); + $seen = []; + $learnedLiterals = [null]; $decisionId = \count($this->decisions); - $this->learnedPool[] = array(); + $this->learnedPool[] = []; while (true) { $this->learnedPool[\count($this->learnedPool) - 1][] = $rule; @@ -511,12 +483,11 @@ protected function analyze(int $level, Rule $rule): array $newRule = new GenericRule($learnedLiterals, Rule::RULE_LEARNED, $why); - return array($learnedLiterals[0], $ruleLevel, $newRule, $why); + return [$learnedLiterals[0], $ruleLevel, $newRule, $why]; } /** * @param array $ruleSeen - * @return void */ private function analyzeUnsolvableRule(Problem $problem, Rule $conflictRule, array &$ruleSeen): void { @@ -545,21 +516,18 @@ private function analyzeUnsolvableRule(Problem $problem, Rule $conflictRule, arr $problem->addRule($conflictRule); } - /** - * @return int - */ private function analyzeUnsolvable(Rule $conflictRule): int { $problem = new Problem(); $problem->addRule($conflictRule); - $ruleSeen = array(); + $ruleSeen = []; $this->analyzeUnsolvableRule($problem, $conflictRule, $ruleSeen); $this->problems[] = $problem; - $seen = array(); + $seen = []; $literals = $conflictRule->getLiterals(); foreach ($literals as $literal) { @@ -603,8 +571,6 @@ private function analyzeUnsolvable(Rule $conflictRule): int * we have enabled or disabled some of our rules. We now re-enable all * of our learnt rules except the ones that were learnt from rules that * are now disabled. - * - * @return void */ private function enableDisableLearnedRules(): void { @@ -628,9 +594,6 @@ private function enableDisableLearnedRules(): void } } - /** - * @return void - */ private function runSat(): void { $this->propagateIndex = 0; @@ -665,7 +628,7 @@ private function runSat(): void $iterator = $this->rules->getIteratorFor(RuleSet::TYPE_REQUEST); foreach ($iterator as $rule) { if ($rule->isEnabled()) { - $decisionQueue = array(); + $decisionQueue = []; $noneSatisfied = true; foreach ($rule->getLiterals() as $literal) { @@ -680,7 +643,7 @@ private function runSat(): void if ($noneSatisfied && \count($decisionQueue)) { // if any of the options in the decision queue are fixed, only use those - $prunedQueue = array(); + $prunedQueue = []; foreach ($decisionQueue as $literal) { if (isset($this->fixedMap[abs($literal)])) { $prunedQueue[] = $literal; @@ -741,7 +704,7 @@ private function runSat(): void continue; } - $decisionQueue = array(); + $decisionQueue = []; // make sure that // * all negative literals are installed @@ -792,7 +755,7 @@ private function runSat(): void $lastBranchOffset = 0; for ($i = \count($this->branches) - 1; $i >= 0; $i--) { - list($literals, $l) = $this->branches[$i]; + [$literals, $l] = $this->branches[$i]; foreach ($literals as $offset => $literal) { if ($literal && $literal > 0 && $this->decisions->decisionLevel($literal) > $l + 1) { diff --git a/src/Composer/DependencyResolver/SolverBugException.php b/src/Composer/DependencyResolver/SolverBugException.php index 394958a8f6a3..7ac72671d354 100644 --- a/src/Composer/DependencyResolver/SolverBugException.php +++ b/src/Composer/DependencyResolver/SolverBugException.php @@ -17,9 +17,6 @@ */ class SolverBugException extends \RuntimeException { - /** - * @param string $message - */ public function __construct(string $message) { parent::__construct( diff --git a/src/Composer/DependencyResolver/SolverProblemsException.php b/src/Composer/DependencyResolver/SolverProblemsException.php index d2cd5decf0ba..5870c0cae0f3 100644 --- a/src/Composer/DependencyResolver/SolverProblemsException.php +++ b/src/Composer/DependencyResolver/SolverProblemsException.php @@ -41,18 +41,13 @@ public function __construct(array $problems, array $learnedPool) parent::__construct('Failed resolving dependencies with '.count($problems).' problems, call getPrettyString to get formatted details', self::ERROR_DEPENDENCY_RESOLUTION_FAILED); } - /** - * @param bool $isVerbose - * @param bool $isDevExtraction - * @return string - */ public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, bool $isVerbose, bool $isDevExtraction = false): string { $installedMap = $request->getPresentMap(true); - $missingExtensions = array(); + $missingExtensions = []; $isCausedByLock = false; - $problems = array(); + $problems = []; foreach ($this->problems as $problem) { $problems[] = $problem->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $this->learnedPool)."\n"; @@ -67,7 +62,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $text .= " Problem ".($i++).$problem; } - $hints = array(); + $hints = []; if (!$isDevExtraction && (strpos($text, 'could not be found') || strpos($text, 'no matching package found'))) { $hints[] = "Potential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see for more details.\n - It's a private package and you forgot to add a custom repository to find it\n\nRead for further common problems."; } @@ -107,7 +102,6 @@ public function getProblems(): array /** * @param string[] $missingExtensions - * @return string */ private function createExtensionHint(array $missingExtensions): string { @@ -139,7 +133,7 @@ private function createExtensionHint(array $missingExtensions): string */ private function getExtensionProblems(array $reasonSets): array { - $missingExtensions = array(); + $missingExtensions = []; foreach ($reasonSets as $reasonSet) { foreach ($reasonSet as $rule) { $required = $rule->getRequiredPackage(); diff --git a/src/Composer/DependencyResolver/Transaction.php b/src/Composer/DependencyResolver/Transaction.php index 2c7d06fa6fa0..ef6860c11712 100644 --- a/src/Composer/DependencyResolver/Transaction.php +++ b/src/Composer/DependencyResolver/Transaction.php @@ -44,7 +44,7 @@ class Transaction /** * @var array */ - protected $resultPackagesByName = array(); + protected $resultPackagesByName = []; /** * @param PackageInterface[] $presentPackages @@ -67,7 +67,6 @@ public function getOperations(): array /** * @param PackageInterface[] $resultPackages - * @return void */ private function setResultPackageMaps(array $resultPackages): void { @@ -84,7 +83,7 @@ private function setResultPackageMaps(array $resultPackages): void return strcmp($b->getName(), $a->getName()); }; - $this->resultPackageMap = array(); + $this->resultPackageMap = []; foreach ($resultPackages as $package) { $this->resultPackageMap[spl_object_hash($package)] = $package; foreach ($package->getNames() as $name) { @@ -103,12 +102,12 @@ private function setResultPackageMaps(array $resultPackages): void */ protected function calculateOperations(): array { - $operations = array(); + $operations = []; - $presentPackageMap = array(); - $removeMap = array(); - $presentAliasMap = array(); - $removeAliasMap = array(); + $presentPackageMap = []; + $removeMap = []; + $presentAliasMap = []; + $removeAliasMap = []; foreach ($this->presentPackages as $package) { if ($package instanceof AliasPackage) { $presentAliasMap[$package->getName().'::'.$package->getVersion()] = $package; @@ -121,8 +120,8 @@ protected function calculateOperations(): array $stack = $this->getRootPackages(); - $visited = array(); - $processed = array(); + $visited = []; + $processed = []; while (!empty($stack)) { $package = array_pop($stack); @@ -247,7 +246,7 @@ protected function getRootPackages(): array protected function getProvidersInResult(Link $link): array { if (!isset($this->resultPackagesByName[$link->getTarget()])) { - return array(); + return []; } return $this->resultPackagesByName[$link->getTarget()]; @@ -268,12 +267,12 @@ protected function getProvidersInResult(Link $link): array */ private function movePluginsToFront(array $operations): array { - $dlModifyingPluginsNoDeps = array(); - $dlModifyingPluginsWithDeps = array(); - $dlModifyingPluginRequires = array(); - $pluginsNoDeps = array(); - $pluginsWithDeps = array(); - $pluginRequires = array(); + $dlModifyingPluginsNoDeps = []; + $dlModifyingPluginsWithDeps = []; + $dlModifyingPluginRequires = []; + $pluginsNoDeps = []; + $pluginsWithDeps = []; + $pluginRequires = []; foreach (array_reverse($operations, true) as $idx => $op) { if ($op instanceof Operation\InstallOperation) { @@ -345,7 +344,7 @@ private function movePluginsToFront(array $operations): array */ private function moveUninstallsToFront(array $operations): array { - $uninstOps = array(); + $uninstOps = []; foreach ($operations as $idx => $op) { if ($op instanceof Operation\UninstallOperation || $op instanceof Operation\MarkAliasUninstalledOperation) { $uninstOps[] = $op; diff --git a/src/Composer/Downloader/ArchiveDownloader.php b/src/Composer/Downloader/ArchiveDownloader.php index 11390f319400..c31ac31ea650 100644 --- a/src/Composer/Downloader/ArchiveDownloader.php +++ b/src/Composer/Downloader/ArchiveDownloader.php @@ -30,22 +30,16 @@ abstract class ArchiveDownloader extends FileDownloader /** * @var array */ - protected $cleanupExecuted = array(); + protected $cleanupExecuted = []; - /** - * @return PromiseInterface - */ - public function prepare(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { unset($this->cleanupExecuted[$package->getName()]); return parent::prepare($type, $package, $path, $prevPackage); } - /** - * @return PromiseInterface - */ - public function cleanup(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { $this->cleanupExecuted[$package->getName()] = true; @@ -55,9 +49,7 @@ public function cleanup(string $type, PackageInterface $package, string $path, P /** * @inheritDoc * - * @param bool $output * - * @return PromiseInterface * * @throws \RuntimeException * @throws \UnexpectedValueException diff --git a/src/Composer/Downloader/DownloadManager.php b/src/Composer/Downloader/DownloadManager.php index c4d6cb3e49d9..7f7ad2c3a773 100644 --- a/src/Composer/Downloader/DownloadManager.php +++ b/src/Composer/Downloader/DownloadManager.php @@ -33,11 +33,11 @@ class DownloadManager /** @var bool */ private $preferSource; /** @var array */ - private $packagePreferences = array(); + private $packagePreferences = []; /** @var Filesystem */ private $filesystem; /** @var array */ - private $downloaders = array(); + private $downloaders = []; /** * Initializes download manager. @@ -46,7 +46,7 @@ class DownloadManager * @param bool $preferSource prefer downloading from source * @param Filesystem|null $filesystem custom Filesystem object */ - public function __construct(IOInterface $io, bool $preferSource = false, Filesystem $filesystem = null) + public function __construct(IOInterface $io, bool $preferSource = false, ?Filesystem $filesystem = null) { $this->io = $io; $this->preferSource = $preferSource; @@ -113,7 +113,6 @@ public function setDownloader(string $type, DownloaderInterface $downloader): se * * @param string $type installation type * @throws \InvalidArgumentException if downloader for provided type is not registered - * @return DownloaderInterface */ public function getDownloader(string $type): DownloaderInterface { @@ -132,7 +131,6 @@ public function getDownloader(string $type): DownloaderInterface * @throws \InvalidArgumentException if package has no installation source specified * @throws \LogicException if specific downloader used to load package with * wrong type - * @return DownloaderInterface|null */ public function getDownloaderForPackage(PackageInterface $package): ?DownloaderInterface { @@ -165,9 +163,6 @@ public function getDownloaderForPackage(PackageInterface $package): ?DownloaderI return $downloader; } - /** - * @return string - */ public function getDownloaderType(DownloaderInterface $downloader): string { return array_search($downloader, $this->downloaders); @@ -182,9 +177,8 @@ public function getDownloaderType(DownloaderInterface $downloader): string * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException - * @return PromiseInterface */ - public function download(PackageInterface $package, string $targetDir, PackageInterface $prevPackage = null): PromiseInterface + public function download(PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null): PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $this->filesystem->ensureDirectoryExists(dirname($targetDir)); @@ -247,10 +241,8 @@ public function download(PackageInterface $package, string $targetDir, PackageIn * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates - * - * @return PromiseInterface */ - public function prepare(string $type, PackageInterface $package, string $targetDir, PackageInterface $prevPackage = null): PromiseInterface + public function prepare(string $type, PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null): PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($package); @@ -269,7 +261,6 @@ public function prepare(string $type, PackageInterface $package, string $targetD * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException - * @return PromiseInterface */ public function install(PackageInterface $package, string $targetDir): PromiseInterface { @@ -290,7 +281,6 @@ public function install(PackageInterface $package, string $targetDir): PromiseIn * @param string $targetDir target dir * * @throws \InvalidArgumentException if initial package is not installed - * @return PromiseInterface */ public function update(PackageInterface $initial, PackageInterface $target, string $targetDir): PromiseInterface { @@ -338,8 +328,6 @@ public function update(PackageInterface $initial, PackageInterface $target, stri * * @param PackageInterface $package package instance * @param string $targetDir target dir - * - * @return PromiseInterface */ public function remove(PackageInterface $package, string $targetDir): PromiseInterface { @@ -359,10 +347,8 @@ public function remove(PackageInterface $package, string $targetDir): PromiseInt * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates - * - * @return PromiseInterface */ - public function cleanup(string $type, PackageInterface $package, string $targetDir, PackageInterface $prevPackage = null): PromiseInterface + public function cleanup(string $type, PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null): PromiseInterface { $targetDir = $this->normalizeTargetDir($targetDir); $downloader = $this->getDownloaderForPackage($package); @@ -377,8 +363,6 @@ public function cleanup(string $type, PackageInterface $package, string $targetD * Determines the install preference of a package * * @param PackageInterface $package package instance - * - * @return string */ protected function resolvePackageInstallPreference(PackageInterface $package): string { @@ -400,13 +384,13 @@ protected function resolvePackageInstallPreference(PackageInterface $package): s * @return string[] * @phpstan-return array<'dist'|'source'>&non-empty-array */ - private function getAvailableSources(PackageInterface $package, PackageInterface $prevPackage = null): array + private function getAvailableSources(PackageInterface $package, ?PackageInterface $prevPackage = null): array { $sourceType = $package->getSourceType(); $distType = $package->getDistType(); // add source before dist by default - $sources = array(); + $sources = []; if ($sourceType) { $sources[] = 'source'; } @@ -445,10 +429,6 @@ private function getAvailableSources(PackageInterface $package, PackageInterface * Downloaders expect a /path/to/dir without trailing slash * * If any Installer provides a path with a trailing slash, this can cause bugs so make sure we remove them - * - * @param string $dir - * - * @return string */ private function normalizeTargetDir(string $dir): string { diff --git a/src/Composer/Downloader/DownloaderInterface.php b/src/Composer/Downloader/DownloaderInterface.php index 5ed8cfc68c93..8e135d7256de 100644 --- a/src/Composer/Downloader/DownloaderInterface.php +++ b/src/Composer/Downloader/DownloaderInterface.php @@ -34,9 +34,8 @@ public function getInstallationSource(): string; * This should do any network-related tasks to prepare for an upcoming install/update * * @param string $path download path - * @return PromiseInterface */ - public function download(PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface; + public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface; /** * Do anything that needs to be done between all downloads have been completed and the actual operation is executed @@ -50,16 +49,14 @@ public function download(PackageInterface $package, string $path, PackageInterfa * @param PackageInterface $package package instance * @param string $path download path * @param PackageInterface $prevPackage previous package instance in case of an update - * @return PromiseInterface */ - public function prepare(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface; + public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface; /** * Installs specific package into specific folder. * * @param PackageInterface $package package instance * @param string $path download path - * @return PromiseInterface */ public function install(PackageInterface $package, string $path): PromiseInterface; @@ -69,7 +66,6 @@ public function install(PackageInterface $package, string $path): PromiseInterfa * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path - * @return PromiseInterface */ public function update(PackageInterface $initial, PackageInterface $target, string $path): PromiseInterface; @@ -78,7 +74,6 @@ public function update(PackageInterface $initial, PackageInterface $target, stri * * @param PackageInterface $package package instance * @param string $path download path - * @return PromiseInterface */ public function remove(PackageInterface $package, string $path): PromiseInterface; @@ -93,7 +88,6 @@ public function remove(PackageInterface $package, string $path): PromiseInterfac * @param PackageInterface $package package instance * @param string $path download path * @param PackageInterface $prevPackage previous package instance in case of an update - * @return PromiseInterface */ - public function cleanup(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface; + public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface; } diff --git a/src/Composer/Downloader/FileDownloader.php b/src/Composer/Downloader/FileDownloader.php index cd8e189353e4..04d672c6363f 100644 --- a/src/Composer/Downloader/FileDownloader.php +++ b/src/Composer/Downloader/FileDownloader.php @@ -63,14 +63,14 @@ class FileDownloader implements DownloaderInterface, ChangeReportInterface * @private * @internal */ - public static $downloadMetadata = array(); + public static $downloadMetadata = []; /** * @var array Map of package name to cache key */ - private $lastCacheWrites = array(); + private $lastCacheWrites = []; /** @var array Map of package name to list of paths */ - private $additionalCleanupPaths = array(); + private $additionalCleanupPaths = []; /** * Constructor. @@ -82,7 +82,7 @@ class FileDownloader implements DownloaderInterface, ChangeReportInterface * @param Cache $cache Cache instance * @param Filesystem $filesystem The filesystem */ - public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null, Cache $cache = null, Filesystem $filesystem = null, ProcessExecutor $process = null) + public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $eventDispatcher = null, ?Cache $cache = null, ?Filesystem $filesystem = null, ?ProcessExecutor $process = null) { $this->io = $io; $this->config = $config; @@ -108,10 +108,8 @@ public function getInstallationSource(): string /** * @inheritDoc - * - * @param bool $output */ - public function download(PackageInterface $package, string $path, PackageInterface $prevPackage = null, bool $output = true): PromiseInterface + public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = true): PromiseInterface { if (!$package->getDistUrl()) { throw new \InvalidArgumentException('The given package is missing url information'); @@ -126,10 +124,10 @@ public function download(PackageInterface $package, string $path, PackageInterfa $retries = 3; $distUrls = $package->getDistUrls(); /** @var array $urls */ - $urls = array(); + $urls = []; foreach ($distUrls as $index => $url) { $processedUrl = $this->processUrl($package, $url); - $urls[$index] = array( + $urls[$index] = [ 'base' => $url, 'processed' => $processedUrl, // we use the complete download url here to avoid conflicting entries @@ -137,7 +135,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa // in a third party repo to pre-populate the cache for the same package in // packagist for example. 'cacheKey' => $cacheKeyGenerator($package, $processedUrl), - ); + ]; } $fileName = $this->getFileName($package, $path); @@ -252,7 +250,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa if ($e instanceof TransportException) { // if we got an http response with a proper code, then requesting again will probably not help, abort - if ((0 !== $e->getCode() && !in_array($e->getCode(), array(500, 502, 503, 504))) || !$retries) { + if ((0 !== $e->getCode() && !in_array($e->getCode(), [500, 502, 503, 504])) || !$retries) { $retries = 0; } } @@ -260,7 +258,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa // special error code returned when network is being artificially disabled if ($e instanceof TransportException && $e->getStatusCode() === 499) { $retries = 0; - $urls = array(); + $urls = []; } if ($retries) { @@ -294,7 +292,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa /** * @inheritDoc */ - public function prepare(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { return \React\Promise\resolve(null); } @@ -302,18 +300,18 @@ public function prepare(string $type, PackageInterface $package, string $path, P /** * @inheritDoc */ - public function cleanup(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { $fileName = $this->getFileName($package, $path); if (file_exists($fileName)) { $this->filesystem->unlink($fileName); } - $dirsToCleanUp = array( + $dirsToCleanUp = [ $this->config->get('vendor-dir').'/composer/', $this->config->get('vendor-dir'), $path, - ); + ]; if (isset($this->additionalCleanupPaths[$package->getName()])) { foreach ($this->additionalCleanupPaths[$package->getName()] as $path) { @@ -332,8 +330,6 @@ public function cleanup(string $type, PackageInterface $package, string $path, P /** * @inheritDoc - * - * @param bool $output */ public function install(PackageInterface $package, string $path, bool $output = true): PromiseInterface { @@ -358,9 +354,6 @@ public function install(PackageInterface $package, string $path, bool $output = return \React\Promise\resolve(null); } - /** - * @return void - */ protected function clearLastCacheWrite(PackageInterface $package): void { if ($this->cache && isset($this->lastCacheWrites[$package->getName()])) { @@ -369,21 +362,11 @@ protected function clearLastCacheWrite(PackageInterface $package): void } } - /** - * @param string $path - * - * @return void - */ protected function addCleanupPath(PackageInterface $package, string $path): void { $this->additionalCleanupPaths[$package->getName()][] = $path; } - /** - * @param string $path - * - * @return void - */ protected function removeCleanupPath(PackageInterface $package, string $path): void { if (isset($this->additionalCleanupPaths[$package->getName()])) { @@ -410,8 +393,6 @@ public function update(PackageInterface $initial, PackageInterface $target, stri /** * @inheritDoc - * - * @param bool $output */ public function remove(PackageInterface $package, string $path, bool $output = true): PromiseInterface { @@ -444,7 +425,6 @@ protected function getFileName(PackageInterface $package, string $path): string * * @param PackageInterface $package package instance * @param string $path download path - * @return string */ protected function getInstallOperationAppendix(PackageInterface $package, string $path): string { diff --git a/src/Composer/Downloader/FilesystemException.php b/src/Composer/Downloader/FilesystemException.php index 5aff2f089bb5..8dbc8313ea81 100644 --- a/src/Composer/Downloader/FilesystemException.php +++ b/src/Composer/Downloader/FilesystemException.php @@ -19,12 +19,7 @@ */ class FilesystemException extends \Exception { - /** - * @param string $message - * @param int $code - * @param \Exception|null $previous - */ - public function __construct(string $message = '', int $code = 0, \Exception $previous = null) + public function __construct(string $message = '', int $code = 0, ?\Exception $previous = null) { parent::__construct("Filesystem exception: \n".$message, $code, $previous); } diff --git a/src/Composer/Downloader/FossilDownloader.php b/src/Composer/Downloader/FossilDownloader.php index 8e8d19c1e15e..6634771dc0e1 100644 --- a/src/Composer/Downloader/FossilDownloader.php +++ b/src/Composer/Downloader/FossilDownloader.php @@ -25,7 +25,7 @@ class FossilDownloader extends VcsDownloader /** * @inheritDoc */ - protected function doDownload(PackageInterface $package, string $path, string $url, PackageInterface $prevPackage = null): PromiseInterface + protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface { return \React\Promise\resolve(null); } diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index c5676df2755e..d11a37958038 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -33,12 +33,12 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface * @var bool[] * @phpstan-var array */ - private $hasStashedChanges = array(); + private $hasStashedChanges = []; /** * @var bool[] * @phpstan-var array */ - private $hasDiscardedChanges = array(); + private $hasDiscardedChanges = []; /** * @var GitUtil */ @@ -47,9 +47,9 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface * @var array * @phpstan-var array> */ - private $cachedPackages = array(); + private $cachedPackages = []; - public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, Filesystem $fs = null) + public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?Filesystem $fs = null) { parent::__construct($io, $config, $process, $fs); $this->gitUtil = new GitUtil($this->io, $this->config, $this->process, $this->filesystem); @@ -58,7 +58,7 @@ public function __construct(IOInterface $io, Config $config, ProcessExecutor $pr /** * @inheritDoc */ - protected function doDownload(PackageInterface $package, string $path, string $url, PackageInterface $prevPackage = null): PromiseInterface + protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface { GitUtil::cleanEnv(); @@ -116,13 +116,13 @@ protected function doInstall(PackageInterface $package, string $path, string $ur $commandCallable = static function (string $url) use ($path, $command, $cachePath): string { return str_replace( - array('%url%', '%path%', '%cachePath%', '%sanitizedUrl%'), - array( + ['%url%', '%path%', '%cachePath%', '%sanitizedUrl%'], + [ ProcessExecutor::escape($url), ProcessExecutor::escape($path), ProcessExecutor::escape($cachePath), ProcessExecutor::escape(Preg::replace('{://([^@]+?):(.+?)@}', '://', $url)), - ), + ], $command ); }; @@ -174,13 +174,13 @@ protected function doUpdate(PackageInterface $initial, PackageInterface $target, $commandCallable = static function ($url) use ($ref, $command, $cachePath): string { return str_replace( - array('%url%', '%ref%', '%cachePath%', '%sanitizedUrl%'), - array( + ['%url%', '%ref%', '%cachePath%', '%sanitizedUrl%'], + [ ProcessExecutor::escape($url), ProcessExecutor::escape($ref.'^{commit}'), ProcessExecutor::escape($cachePath), ProcessExecutor::escape(Preg::replace('{://([^@]+?):(.+?)@}', '://', $url)), - ), + ], $command ); }; @@ -230,9 +230,6 @@ public function getLocalChanges(PackageInterface $package, string $path): ?strin return strlen($output) > 0 ? $output : null; } - /** - * @return null|string - */ public function getUnpushedChanges(PackageInterface $package, string $path): ?string { GitUtil::cleanEnv(); @@ -266,7 +263,7 @@ public function getUnpushedChanges(PackageInterface $package, string $path): ?st // do two passes, as if we find anything we want to fetch and then re-try for ($i = 0; $i <= 1; $i++) { - $remoteBranches = array(); + $remoteBranches = []; // try to find matching branch names in remote repos foreach ($candidateBranches as $candidate) { @@ -397,12 +394,12 @@ protected function cleanChanges(PackageInterface $package, string $path, bool $u case '?': default: help : - $this->io->writeError(array( + $this->io->writeError([ ' y - discard changes and apply the '.($update ? 'update' : 'uninstall'), ' n - abort the '.($update ? 'update' : 'uninstall').' and let you manually clean things up', ' v - view modified files', ' d - view local modifications (diff)', - )); + ]); if ($update) { $this->io->writeError(' s - stash changes and try to reapply them after the update'); } @@ -434,9 +431,6 @@ protected function reapplyChanges(string $path): void /** * Updates the given path to the given commit ref * - * @param string $path - * @param string $reference - * @param string $prettyVersion * @throws \RuntimeException * @return null|string if a string is returned, it is the commit reference that was checked out if the original could not be found */ @@ -501,24 +495,12 @@ protected function updateToCommit(PackageInterface $package, string $path, strin throw new \RuntimeException(Url::sanitize('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput() . $exceptionExtra)); } - /** - * @param string $path - * @param string $url - * - * @return void - */ protected function updateOriginUrl(string $path, string $url): void { $this->process->execute(sprintf('git remote set-url origin -- %s', ProcessExecutor::escape($url)), $output, $path); $this->setPushUrl($path, $url); } - /** - * @param string $path - * @param string $url - * - * @return void - */ protected function setPushUrl(string $path, string $url): void { // set push url for github projects @@ -549,10 +531,6 @@ protected function getCommitLogs(string $fromReference, string $toReference, str } /** - * @param string $path - * - * @return PromiseInterface - * * @throws \RuntimeException */ protected function discardChanges(string $path): PromiseInterface @@ -568,10 +546,6 @@ protected function discardChanges(string $path): PromiseInterface } /** - * @param string $path - * - * @return PromiseInterface - * * @throws \RuntimeException */ protected function stashChanges(string $path): PromiseInterface @@ -587,10 +561,6 @@ protected function stashChanges(string $path): PromiseInterface } /** - * @param string $path - * - * @return void - * * @throws \RuntimeException */ protected function viewDiff(string $path): void @@ -603,16 +573,11 @@ protected function viewDiff(string $path): void $this->io->writeError($output); } - /** - * @param string $path - * - * @return string - */ protected function normalizePath(string $path): string { if (Platform::isWindows() && strlen($path) > 0) { $basePath = $path; - $removed = array(); + $removed = []; while (!is_dir($basePath) && $basePath !== '\\') { array_unshift($removed, basename($basePath)); @@ -639,10 +604,6 @@ protected function hasMetadataRepository(string $path): bool return is_dir($path.'/.git'); } - /** - * @param string $reference - * @return string - */ protected function getShortHash(string $reference): string { if (!$this->io->isVerbose() && Preg::isMatch('{^[0-9a-f]{40}$}', $reference)) { diff --git a/src/Composer/Downloader/GzipDownloader.php b/src/Composer/Downloader/GzipDownloader.php index 32fb8e42c4d1..9037f5226d14 100644 --- a/src/Composer/Downloader/GzipDownloader.php +++ b/src/Composer/Downloader/GzipDownloader.php @@ -54,12 +54,6 @@ protected function extract(PackageInterface $package, string $file, string $path return \React\Promise\resolve(null); } - /** - * @param string $file - * @param string $targetFilepath - * - * @return void - */ private function extractUsingExt(string $file, string $targetFilepath): void { $archiveFile = gzopen($file, 'rb'); diff --git a/src/Composer/Downloader/HgDownloader.php b/src/Composer/Downloader/HgDownloader.php index c1b71a29932e..b0cc9cd7da2d 100644 --- a/src/Composer/Downloader/HgDownloader.php +++ b/src/Composer/Downloader/HgDownloader.php @@ -25,7 +25,7 @@ class HgDownloader extends VcsDownloader /** * @inheritDoc */ - protected function doDownload(PackageInterface $package, string $path, string $url, PackageInterface $prevPackage = null): PromiseInterface + protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface { if (null === HgUtils::getVersion($this->process)) { throw new \RuntimeException('hg was not found in your PATH, skipping source download'); diff --git a/src/Composer/Downloader/PathDownloader.php b/src/Composer/Downloader/PathDownloader.php index a998f47746dd..791521bd62bc 100644 --- a/src/Composer/Downloader/PathDownloader.php +++ b/src/Composer/Downloader/PathDownloader.php @@ -39,7 +39,7 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter /** * @inheritDoc */ - public function download(PackageInterface $package, string $path, PackageInterface $prevPackage = null, bool $output = true): PromiseInterface + public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = true): PromiseInterface { $path = Filesystem::trimTrailingSlash($path); $url = $package->getDistUrl(); @@ -90,9 +90,9 @@ public function install(PackageInterface $package, string $path, bool $output = } // Get the transport options with default values - $transportOptions = $package->getTransportOptions() + array('relative' => true); + $transportOptions = $package->getTransportOptions() + ['relative' => true]; - list($currentStrategy, $allowedStrategies) = $this->computeAllowedStrategies($transportOptions); + [$currentStrategy, $allowedStrategies] = $this->computeAllowedStrategies($transportOptions); $symfonyFilesystem = new SymfonyFilesystem(); $this->filesystem->removeDirectory($path); @@ -147,7 +147,7 @@ public function install(PackageInterface $package, string $path, bool $output = if ($output) { $this->io->writeError(sprintf('%sMirroring from %s', $isFallback ? ' ' : '', $url), false); } - $iterator = new ArchivableFilesFinder($realUrl, array()); + $iterator = new ArchivableFilesFinder($realUrl, []); $symfonyFilesystem->mirror($realUrl, $path, $iterator); } @@ -232,7 +232,7 @@ protected function getInstallOperationAppendix(PackageInterface $package, string return ': Source already present'; } - list($currentStrategy) = $this->computeAllowedStrategies($package->getTransportOptions()); + [$currentStrategy] = $this->computeAllowedStrategies($package->getTransportOptions()); if ($currentStrategy === self::STRATEGY_SYMLINK) { if (Platform::isWindows()) { @@ -254,7 +254,7 @@ private function computeAllowedStrategies(array $transportOptions): array { // When symlink transport option is null, both symlink and mirror are allowed $currentStrategy = self::STRATEGY_SYMLINK; - $allowedStrategies = array(self::STRATEGY_SYMLINK, self::STRATEGY_MIRROR); + $allowedStrategies = [self::STRATEGY_SYMLINK, self::STRATEGY_MIRROR]; $mirrorPathRepos = Platform::getEnv('COMPOSER_MIRROR_PATH_REPOS'); if ($mirrorPathRepos) { @@ -265,10 +265,10 @@ private function computeAllowedStrategies(array $transportOptions): array if (true === $symlinkOption) { $currentStrategy = self::STRATEGY_SYMLINK; - $allowedStrategies = array(self::STRATEGY_SYMLINK); + $allowedStrategies = [self::STRATEGY_SYMLINK]; } elseif (false === $symlinkOption) { $currentStrategy = self::STRATEGY_MIRROR; - $allowedStrategies = array(self::STRATEGY_MIRROR); + $allowedStrategies = [self::STRATEGY_MIRROR]; } // Check we can use junctions safely if we are on Windows @@ -277,7 +277,7 @@ private function computeAllowedStrategies(array $transportOptions): array throw new \RuntimeException('You are on an old Windows / old PHP combo which does not allow Composer to use junctions/symlinks and this path repository has symlink:true in its options so copying is not allowed'); } $currentStrategy = self::STRATEGY_MIRROR; - $allowedStrategies = array(self::STRATEGY_MIRROR); + $allowedStrategies = [self::STRATEGY_MIRROR]; } // Check we can use symlink() otherwise @@ -286,10 +286,10 @@ private function computeAllowedStrategies(array $transportOptions): array throw new \RuntimeException('Your PHP has the symlink() function disabled which does not allow Composer to use symlinks and this path repository has symlink:true in its options so copying is not allowed'); } $currentStrategy = self::STRATEGY_MIRROR; - $allowedStrategies = array(self::STRATEGY_MIRROR); + $allowedStrategies = [self::STRATEGY_MIRROR]; } - return array($currentStrategy, $allowedStrategies); + return [$currentStrategy, $allowedStrategies]; } /** @@ -302,8 +302,6 @@ private function computeAllowedStrategies(array $transportOptions): array * system rmdir which will preserve target content if given a junction. * * The PHP bug was fixed in 7.2.16 and 7.3.3 (requires at least Windows 7). - * - * @return bool */ private function safeJunctions(): bool { diff --git a/src/Composer/Downloader/PerforceDownloader.php b/src/Composer/Downloader/PerforceDownloader.php index e78abc513e4f..faf159e3fb7c 100644 --- a/src/Composer/Downloader/PerforceDownloader.php +++ b/src/Composer/Downloader/PerforceDownloader.php @@ -28,7 +28,7 @@ class PerforceDownloader extends VcsDownloader /** * @inheritDoc */ - protected function doDownload(PackageInterface $package, string $path, string $url, PackageInterface $prevPackage = null): PromiseInterface + protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface { return \React\Promise\resolve(null); } @@ -53,11 +53,6 @@ public function doInstall(PackageInterface $package, string $path, string $url): return \React\Promise\resolve(null); } - /** - * @param string $ref - * - * @return string|null - */ private function getLabelFromSourceReference(string $ref): ?string { $pos = strpos($ref, '@'); @@ -68,12 +63,6 @@ private function getLabelFromSourceReference(string $ref): ?string return null; } - /** - * @param string $path - * @param string $url - * - * @return void - */ public function initPerforce(PackageInterface $package, string $path, string $url): void { if (!empty($this->perforce)) { @@ -124,9 +113,6 @@ protected function getCommitLogs(string $fromReference, string $toReference, str return $this->perforce->getCommitLogs($fromReference, $toReference); } - /** - * @return void - */ public function setPerforce(Perforce $perforce): void { $this->perforce = $perforce; diff --git a/src/Composer/Downloader/SvnDownloader.php b/src/Composer/Downloader/SvnDownloader.php index 66f86224b09e..637ce8193806 100644 --- a/src/Composer/Downloader/SvnDownloader.php +++ b/src/Composer/Downloader/SvnDownloader.php @@ -31,7 +31,7 @@ class SvnDownloader extends VcsDownloader /** * @inheritDoc */ - protected function doDownload(PackageInterface $package, string $path, string $url, PackageInterface $prevPackage = null): PromiseInterface + protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface { SvnUtil::cleanEnv(); $util = new SvnUtil($url, $this->io, $this->config, $this->process); @@ -112,9 +112,8 @@ public function getLocalChanges(PackageInterface $package, string $path): ?strin * @param string $cwd Working directory * @param string $path Target for a checkout * @throws \RuntimeException - * @return string */ - protected function execute(PackageInterface $package, string $baseUrl, string $command, string $url, string $cwd = null, string $path = null): string + protected function execute(PackageInterface $package, string $baseUrl, string $command, string $url, ?string $cwd = null, ?string $path = null): string { $util = new SvnUtil($baseUrl, $this->io, $this->config, $this->process); $util->setCacheCredentials($this->cacheCredentials); @@ -175,12 +174,12 @@ protected function cleanChanges(PackageInterface $package, string $path, bool $u case '?': default: - $this->io->writeError(array( + $this->io->writeError([ ' y - discard changes and apply the '.($update ? 'update' : 'uninstall'), ' n - abort the '.($update ? 'update' : 'uninstall').' and let you manually clean things up', ' v - view modified files', ' ? - print help', - )); + ]); break; } } @@ -231,11 +230,6 @@ protected function getCommitLogs(string $fromReference, string $toReference, str return "Could not retrieve changes between $fromReference and $toReference due to missing revision information"; } - /** - * @param string $path - * - * @return PromiseInterface - */ protected function discardChanges(string $path): PromiseInterface { if (0 !== $this->process->execute('svn revert -R .', $output, $path)) { diff --git a/src/Composer/Downloader/TransportException.php b/src/Composer/Downloader/TransportException.php index 3a9209be45bb..c91897c1c144 100644 --- a/src/Composer/Downloader/TransportException.php +++ b/src/Composer/Downloader/TransportException.php @@ -24,12 +24,10 @@ class TransportException extends \RuntimeException /** @var ?int */ protected $statusCode; /** @var array */ - protected $responseInfo = array(); + protected $responseInfo = []; /** * @param array $headers - * - * @return void */ public function setHeaders(array $headers): void { @@ -44,11 +42,6 @@ public function getHeaders(): ?array return $this->headers; } - /** - * @param null|string $response - * - * @return void - */ public function setResponse(?string $response): void { $this->response = $response; @@ -64,8 +57,6 @@ public function getResponse(): ?string /** * @param ?int $statusCode - * - * @return void */ public function setStatusCode($statusCode): void { @@ -90,8 +81,6 @@ public function getResponseInfo(): array /** * @param array $responseInfo - * - * @return void */ public function setResponseInfo(array $responseInfo): void { diff --git a/src/Composer/Downloader/VcsDownloader.php b/src/Composer/Downloader/VcsDownloader.php index 6fab1172ad9c..de67d16ee87d 100644 --- a/src/Composer/Downloader/VcsDownloader.php +++ b/src/Composer/Downloader/VcsDownloader.php @@ -39,9 +39,9 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa /** @var Filesystem */ protected $filesystem; /** @var array */ - protected $hasCleanedChanges = array(); + protected $hasCleanedChanges = []; - public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, Filesystem $fs = null) + public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?Filesystem $fs = null) { $this->io = $io; $this->config = $config; @@ -60,7 +60,7 @@ public function getInstallationSource(): string /** * @inheritDoc */ - public function download(PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { if (!$package->getSourceReference()) { throw new \InvalidArgumentException('Package '.$package->getPrettyName().' is missing reference information'); @@ -93,7 +93,7 @@ public function download(PackageInterface $package, string $path, PackageInterfa /** * @inheritDoc */ - public function prepare(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { if ($type === 'update') { $this->cleanChanges($prevPackage, $path, true); @@ -110,7 +110,7 @@ public function prepare(string $type, PackageInterface $package, string $path, P /** * @inheritDoc */ - public function cleanup(string $type, PackageInterface $package, string $path, PackageInterface $prevPackage = null): PromiseInterface + public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface { if ($type === 'update' && isset($this->hasCleanedChanges[$prevPackage->getUniqueName()])) { $this->reapplyChanges($path); @@ -255,12 +255,9 @@ public function getVcsReference(PackageInterface $package, string $path): ?strin /** * Prompt the user to check if changes should be stashed/removed or the operation aborted * - * @param PackageInterface $package - * @param string $path * @param bool $update if true (update) the changes can be stashed and reapplied after an update, * if false (remove) the changes should be assumed to be lost if the operation is not aborted * - * @return PromiseInterface * * @throws \RuntimeException in case the operation must be aborted */ @@ -277,9 +274,7 @@ protected function cleanChanges(PackageInterface $package, string $path, bool $u /** * Reapply previously stashes changes if applicable, only called after an update (regardless if successful or not) * - * @param string $path * - * @return void * * @throws \RuntimeException in case the operation must be aborted or the patch does not apply cleanly */ @@ -294,10 +289,8 @@ protected function reapplyChanges(string $path): void * @param string $path download path * @param string $url package url * @param PackageInterface|null $prevPackage previous package (in case of an update) - * - * @return PromiseInterface */ - abstract protected function doDownload(PackageInterface $package, string $path, string $url, PackageInterface $prevPackage = null): PromiseInterface; + abstract protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface; /** * Downloads specific package into specific folder. @@ -305,8 +298,6 @@ abstract protected function doDownload(PackageInterface $package, string $path, * @param PackageInterface $package package instance * @param string $path download path * @param string $url package url - * - * @return PromiseInterface */ abstract protected function doInstall(PackageInterface $package, string $path, string $url): PromiseInterface; @@ -317,8 +308,6 @@ abstract protected function doInstall(PackageInterface $package, string $path, s * @param PackageInterface $target updated package * @param string $path download path * @param string $url package url - * - * @return PromiseInterface */ abstract protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url): PromiseInterface; @@ -328,16 +317,12 @@ abstract protected function doUpdate(PackageInterface $initial, PackageInterface * @param string $fromReference the source reference * @param string $toReference the target reference * @param string $path the package path - * @return string */ abstract protected function getCommitLogs(string $fromReference, string $toReference, string $path): string; /** * Checks if VCS metadata repository has been initialized * repository example: .git|.svn|.hg - * - * @param string $path - * @return bool */ abstract protected function hasMetadataRepository(string $path): bool; diff --git a/src/Composer/Downloader/ZipDownloader.php b/src/Composer/Downloader/ZipDownloader.php index 93ee29162b0e..4a4095e5dc5e 100644 --- a/src/Composer/Downloader/ZipDownloader.php +++ b/src/Composer/Downloader/ZipDownloader.php @@ -40,28 +40,28 @@ class ZipDownloader extends ArchiveDownloader /** * @inheritDoc */ - public function download(PackageInterface $package, string $path, PackageInterface $prevPackage = null, bool $output = true): PromiseInterface + public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null, bool $output = true): PromiseInterface { if (null === self::$unzipCommands) { - self::$unzipCommands = array(); + self::$unzipCommands = []; $finder = new ExecutableFinder; - if (Platform::isWindows() && ($cmd = $finder->find('7z', null, array('C:\Program Files\7-Zip')))) { - self::$unzipCommands[] = array('7z', ProcessExecutor::escape($cmd).' x -bb0 -y %s -o%s'); + if (Platform::isWindows() && ($cmd = $finder->find('7z', null, ['C:\Program Files\7-Zip']))) { + self::$unzipCommands[] = ['7z', ProcessExecutor::escape($cmd).' x -bb0 -y %s -o%s']; } if ($cmd = $finder->find('unzip')) { - self::$unzipCommands[] = array('unzip', ProcessExecutor::escape($cmd).' -qq %s -d %s'); + self::$unzipCommands[] = ['unzip', ProcessExecutor::escape($cmd).' -qq %s -d %s']; } if (!Platform::isWindows() && ($cmd = $finder->find('7z'))) { // 7z linux/macOS support is only used if unzip is not present - self::$unzipCommands[] = array('7z', ProcessExecutor::escape($cmd).' x -bb0 -y %s -o%s'); + self::$unzipCommands[] = ['7z', ProcessExecutor::escape($cmd).' x -bb0 -y %s -o%s']; } if (!Platform::isWindows() && ($cmd = $finder->find('7zz'))) { // 7zz linux/macOS support is only used if unzip is not present - self::$unzipCommands[] = array('7zz', ProcessExecutor::escape($cmd).' x -bb0 -y %s -o%s'); + self::$unzipCommands[] = ['7zz', ProcessExecutor::escape($cmd).' x -bb0 -y %s -o%s']; } } $procOpenMissing = false; if (!function_exists('proc_open')) { - self::$unzipCommands = array(); + self::$unzipCommands = []; $procOpenMissing = true; } @@ -105,7 +105,6 @@ public function download(PackageInterface $package, string $path, PackageInterfa * * @param string $file File to extract * @param string $path Path where to extract file - * @return PromiseInterface */ private function extractWithSystemUnzip(PackageInterface $package, string $file, string $path): PromiseInterface { @@ -129,7 +128,7 @@ private function extractWithSystemUnzip(PackageInterface $package, string $file, } $executable = $commandSpec[0]; - if (!$warned7ZipLinux && !Platform::isWindows() && in_array($executable, array('7z', '7zz'), true)) { + if (!$warned7ZipLinux && !Platform::isWindows() && in_array($executable, ['7z', '7zz'], true)) { $warned7ZipLinux = true; if (0 === $this->process->execute($executable, $output)) { if (Preg::isMatch('{^\s*7-Zip(?: \[64\])? ([0-9.]+)}', $output, $match) && version_compare($match[1], '21.01', '<')) { @@ -182,7 +181,6 @@ private function extractWithSystemUnzip(PackageInterface $package, string $file, * * @param string $file File to extract * @param string $path Path where to extract file - * @return PromiseInterface */ private function extractWithZipArchive(PackageInterface $package, string $file, string $path): PromiseInterface { @@ -222,7 +220,6 @@ private function extractWithZipArchive(PackageInterface $package, string $file, * * @param string $file File to extract * @param string $path Path where to extract file - * @return PromiseInterface */ protected function extract(PackageInterface $package, string $file, string $path): PromiseInterface { @@ -231,10 +228,6 @@ protected function extract(PackageInterface $package, string $file, string $path /** * Give a meaningful error message to the user. - * - * @param int $retval - * @param string $file - * @return string */ protected function getErrorMessage(int $retval, string $file): string { diff --git a/src/Composer/EventDispatcher/Event.php b/src/Composer/EventDispatcher/Event.php index 06bd006554da..4230df676095 100644 --- a/src/Composer/EventDispatcher/Event.php +++ b/src/Composer/EventDispatcher/Event.php @@ -46,7 +46,7 @@ class Event * @param string[] $args Arguments passed by the user * @param mixed[] $flags Optional flags to pass data not as argument */ - public function __construct(string $name, array $args = array(), array $flags = array()) + public function __construct(string $name, array $args = [], array $flags = []) { $this->name = $name; $this->args = $args; @@ -95,8 +95,6 @@ public function isPropagationStopped(): bool /** * Prevents the event from being passed to further listeners - * - * @return void */ public function stopPropagation(): void { diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index 323922c6b6df..c6547e0d7c06 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -54,7 +54,7 @@ class EventDispatcher /** @var ProcessExecutor */ protected $process; /** @var array>> */ - protected $listeners = array(); + protected $listeners = []; /** @var bool */ protected $runScripts = true; /** @var list */ @@ -67,18 +67,17 @@ class EventDispatcher * @param IOInterface $io The IOInterface instance * @param ProcessExecutor $process */ - public function __construct(PartialComposer $composer, IOInterface $io, ProcessExecutor $process = null) + public function __construct(PartialComposer $composer, IOInterface $io, ?ProcessExecutor $process = null) { $this->composer = $composer; $this->io = $io; $this->process = $process ?? new ProcessExecutor($io); - $this->eventStack = array(); + $this->eventStack = []; } /** * Set whether script handlers are active or not * - * @param bool $runScripts * @return $this */ public function setRunScripts(bool $runScripts = true): self @@ -96,7 +95,7 @@ public function setRunScripts(bool $runScripts = true): self * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ - public function dispatch(?string $eventName, Event $event = null): int + public function dispatch(?string $eventName, ?Event $event = null): int { if (null === $event) { if (null === $eventName) { @@ -112,13 +111,12 @@ public function dispatch(?string $eventName, Event $event = null): int * Dispatch a script event. * * @param string $eventName The constant in ScriptEvents - * @param bool $devMode * @param array $additionalArgs Arguments passed by the user * @param array $flags Optional flags to pass data not as argument * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ - public function dispatchScript(string $eventName, bool $devMode = false, array $additionalArgs = array(), array $flags = array()): int + public function dispatchScript(string $eventName, bool $devMode = false, array $additionalArgs = [], array $flags = []): int { assert($this->composer instanceof Composer, new \LogicException('This should only be reached with a fully loaded Composer')); @@ -199,7 +197,7 @@ protected function doDispatch(Event $event) if (is_array($callable) && (is_string($callable[0]) || is_object($callable[0])) && is_string($callable[1])) { $this->io->writeError(sprintf('> %s: %s', $event->getName(), (is_object($callable[0]) ? get_class($callable[0]) : $callable[0]).'->'.$callable[1]), true, IOInterface::VERBOSE); } - $return = false === call_user_func($callable, $event) ? 1 : 0; + $return = false === $callable($event) ? 1 : 0; } elseif ($this->isComposerScript($callable)) { $this->io->writeError(sprintf('> %s: %s', $event->getName(), $callable), true, IOInterface::VERBOSE); @@ -252,7 +250,7 @@ protected function doDispatch(Event $event) throw $e; } } else { - $args = implode(' ', array_map(array('Composer\Util\ProcessExecutor', 'escape'), $event->getArguments())); + $args = implode(' ', array_map(['Composer\Util\ProcessExecutor', 'escape'], $event->getArguments())); // @putenv does not receive arguments if (strpos($callable, '@putenv ') === 0) { @@ -283,7 +281,7 @@ protected function doDispatch(Event $event) if (false === strpos($exec, '=')) { Platform::clearEnv(substr($exec, 8)); } else { - list($var, $value) = explode('=', substr($exec, 8), 2); + [$var, $value] = explode('=', substr($exec, 8), 2); Platform::putEnv($var, $value); } @@ -347,11 +345,6 @@ protected function doDispatch(Event $event) return $returnMax; } - /** - * @param string $exec - * - * @return int - */ protected function executeTty(string $exec): int { if ($this->io->isInteractive()) { @@ -361,9 +354,6 @@ protected function executeTty(string $exec): int return $this->process->execute($exec); } - /** - * @return string - */ protected function getPhpExecCommand(): string { $finder = new PhpExecutableFinder(); @@ -381,8 +371,6 @@ protected function getPhpExecCommand(): string } /** - * @param string $className - * @param string $methodName * @param Event $event Event invoking the PHP callable * * @return mixed @@ -404,8 +392,6 @@ protected function executeEventPhpScript(string $className, string $methodName, * @param string $eventName The event name - typically a constant * @param callable|string $listener A callable expecting an event argument, or a command string to be executed (same as a composer.json "scripts" entry) * @param int $priority A higher value represents a higher priority - * - * @return void */ public function addListener(string $eventName, $listener, int $priority = 0): void { @@ -414,8 +400,6 @@ public function addListener(string $eventName, $listener, int $priority = 0): vo /** * @param callable|object $listener A callable or an object instance for which all listeners should be removed - * - * @return void */ public function removeListener($listener): void { @@ -434,21 +418,17 @@ public function removeListener($listener): void * Adds object methods as listeners for the events in getSubscribedEvents * * @see EventSubscriberInterface - * - * @param EventSubscriberInterface $subscriber - * - * @return void */ public function addSubscriber(EventSubscriberInterface $subscriber): void { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { if (is_string($params)) { - $this->addListener($eventName, array($subscriber, $params)); + $this->addListener($eventName, [$subscriber, $params]); } elseif (is_string($params[0])) { - $this->addListener($eventName, array($subscriber, $params[0]), $params[1] ?? 0); + $this->addListener($eventName, [$subscriber, $params[0]], $params[1] ?? 0); } else { foreach ($params as $listener) { - $this->addListener($eventName, array($subscriber, $listener[0]), $listener[1] ?? 0); + $this->addListener($eventName, [$subscriber, $listener[0]], $listener[1] ?? 0); } } } @@ -457,29 +437,25 @@ public function addSubscriber(EventSubscriberInterface $subscriber): void /** * Retrieves all listeners for a given event * - * @param Event $event * @return array All listeners: callables and scripts */ protected function getListeners(Event $event): array { - $scriptListeners = $this->runScripts ? $this->getScriptListeners($event) : array(); + $scriptListeners = $this->runScripts ? $this->getScriptListeners($event) : []; if (!isset($this->listeners[$event->getName()][0])) { - $this->listeners[$event->getName()][0] = array(); + $this->listeners[$event->getName()][0] = []; } krsort($this->listeners[$event->getName()]); $listeners = $this->listeners; $listeners[$event->getName()][0] = array_merge($listeners[$event->getName()][0], $scriptListeners); - return call_user_func_array('array_merge', $listeners[$event->getName()]); + return array_merge(...$listeners[$event->getName()]); } /** * Checks if an event has listeners registered - * - * @param Event $event - * @return bool */ public function hasEventListeners(Event $event): bool { @@ -500,7 +476,7 @@ protected function getScriptListeners(Event $event): array $scripts = $package->getScripts(); if (empty($scripts[$event->getName()])) { - return array(); + return []; } assert($this->composer instanceof Composer, new \LogicException('This should only be reached with a fully loaded Composer')); @@ -525,9 +501,6 @@ protected function getScriptListeners(Event $event): array /** * Checks if string given references a class path and method - * - * @param string $callable - * @return bool */ protected function isPhpScript(string $callable): bool { @@ -536,9 +509,6 @@ protected function isPhpScript(string $callable): bool /** * Checks if string given references a composer run-script - * - * @param string $callable - * @return bool */ protected function isComposerScript(string $callable): bool { @@ -548,9 +518,7 @@ protected function isComposerScript(string $callable): bool /** * Push an event to the stack of active event * - * @param Event $event * @throws \RuntimeException - * @return int */ protected function pushEvent(Event $event): int { @@ -564,17 +532,12 @@ protected function pushEvent(Event $event): int /** * Pops the active event from the stack - * - * @return string|null */ protected function popEvent(): ?string { return array_pop($this->eventStack); } - /** - * @return void - */ private function ensureBinDirIsInPath(): void { $pathEnv = 'PATH'; diff --git a/src/Composer/Factory.php b/src/Composer/Factory.php index 1a1f5e75a284..453f1e9e2c2b 100644 --- a/src/Composer/Factory.php +++ b/src/Composer/Factory.php @@ -29,7 +29,6 @@ use Composer\Plugin\PluginEvents; use Composer\EventDispatcher\Event; use Phar; -use Seld\JsonLint\DuplicateKeyException; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Output\ConsoleOutput; @@ -39,7 +38,6 @@ use Composer\Downloader\TransportException; use Composer\Json\JsonValidationException; use Composer\Repository\InstalledRepositoryInterface; -use Seld\JsonLint\JsonParser; use UnexpectedValueException; use ZipArchive; @@ -72,7 +70,7 @@ protected static function getHomeDir(): string } $userDir = self::getUserDir(); - $dirs = array(); + $dirs = []; if (self::useXdg()) { // XDG Base Directory Specifications @@ -163,7 +161,7 @@ protected static function getDataDir(string $home): string return $home; } - public static function createConfig(IOInterface $io = null, ?string $cwd = null): Config + public static function createConfig(?IOInterface $io = null, ?string $cwd = null): Config { $cwd = $cwd ?? Platform::getCwd(true); @@ -171,13 +169,13 @@ public static function createConfig(IOInterface $io = null, ?string $cwd = null) // determine and add main dirs to the config $home = self::getHomeDir(); - $config->merge(array( - 'config' => array( + $config->merge([ + 'config' => [ 'home' => $home, 'cache-dir' => self::getCacheDir($home), 'data-dir' => self::getDataDir($home), - ) - ), Config::SOURCE_DEFAULT); + ], + ], Config::SOURCE_DEFAULT); // load global config $file = new JsonFile($config->get('home').'/config.json'); @@ -195,7 +193,7 @@ public static function createConfig(IOInterface $io = null, ?string $cwd = null) // Protect directory against web access. Since HOME could be // the www-data's user home and be web-accessible it is a // potential security risk - $dirs = array($config->get('home'), $config->get('cache-dir'), $config->get('data-dir')); + $dirs = [$config->get('home'), $config->get('cache-dir'), $config->get('data-dir')]; foreach ($dirs as $dir) { if (!file_exists($dir . '/.htaccess')) { if (!is_dir($dir)) { @@ -213,7 +211,7 @@ public static function createConfig(IOInterface $io = null, ?string $cwd = null) $io->writeError('Loading config file ' . $file->getPath(), true, IOInterface::DEBUG); } self::validateJsonSchema($io, $file, JsonFile::AUTH_SCHEMA); - $config->merge(array('config' => $file->read()), $file->getPath()); + $config->merge(['config' => $file->read()], $file->getPath()); } $config->setAuthConfigSource(new JsonConfigSource($file, true)); @@ -231,7 +229,7 @@ public static function createConfig(IOInterface $io = null, ?string $cwd = null) self::validateJsonSchema($io, $authData, JsonFile::AUTH_SCHEMA, 'COMPOSER_AUTH'); $authData = json_decode($composerAuthEnv, true); if (null !== $authData) { - $config->merge(array('config' => $authData), 'COMPOSER_AUTH'); + $config->merge(['config' => $authData], 'COMPOSER_AUTH'); } } } @@ -256,10 +254,10 @@ public static function getLockFile(string $composerFile): string */ public static function createAdditionalStyles(): array { - return array( + return [ 'highlight' => new OutputFormatterStyle('red'), 'warning' => new OutputFormatterStyle('black', 'yellow'), - ); + ]; } public static function createOutput(): ConsoleOutput @@ -278,7 +276,6 @@ public static function createOutput(): ConsoleOutput * read from the default filename * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts Whether scripts should not be run - * @param string|null $cwd * @param bool $fullLoad Whether to initialize everything or only main project stuff (used when loading the global composer) * @throws \InvalidArgumentException * @throws \UnexpectedValueException @@ -340,7 +337,7 @@ public function createComposer(IOInterface $io, $localConfig = null, $disablePlu if ($localAuthFile->exists()) { $io->writeError('Loading config file ' . $localAuthFile->getPath(), true, IOInterface::DEBUG); self::validateJsonSchema($io, $localAuthFile, JsonFile::AUTH_SCHEMA); - $config->merge(array('config' => $localAuthFile->read()), $localAuthFile->getPath()); + $config->merge(['config' => $localAuthFile->read()], $localAuthFile->getPath()); $config->setAuthConfigSource(new JsonConfigSource($localAuthFile, true)); } } @@ -467,11 +464,8 @@ public static function createGlobal(IOInterface $io, bool $disablePlugins = fals /** * @param Repository\RepositoryManager $rm - * @param string $vendorDir - * - * @return void */ - protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, string $vendorDir, RootPackageInterface $rootPackage, ProcessExecutor $process = null): void + protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, string $vendorDir, RootPackageInterface $rootPackage, ?ProcessExecutor $process = null): void { $fs = null; if ($process) { @@ -503,11 +497,9 @@ protected function createGlobalComposer(IOInterface $io, Config $config, $disabl /** * @param IO\IOInterface $io - * @param Config $config * @param EventDispatcher $eventDispatcher - * @return Downloader\DownloadManager */ - public function createDownloadManager(IOInterface $io, Config $config, HttpDownloader $httpDownloader, ProcessExecutor $process, EventDispatcher $eventDispatcher = null): Downloader\DownloadManager + public function createDownloadManager(IOInterface $io, Config $config, HttpDownloader $httpDownloader, ProcessExecutor $process, ?EventDispatcher $eventDispatcher = null): Downloader\DownloadManager { $cache = null; if ($config->get('cache-files-ttl') > 0) { @@ -572,25 +564,18 @@ public function createArchiveManager(Config $config, Downloader\DownloadManager /** * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins - * @return Plugin\PluginManager */ - protected function createPluginManager(IOInterface $io, Composer $composer, PartialComposer $globalComposer = null, $disablePlugins = false): Plugin\PluginManager + protected function createPluginManager(IOInterface $io, Composer $composer, ?PartialComposer $globalComposer = null, $disablePlugins = false): Plugin\PluginManager { return new Plugin\PluginManager($io, $composer, $globalComposer, $disablePlugins); } - /** - * @return Installer\InstallationManager - */ - public function createInstallationManager(Loop $loop, IOInterface $io, EventDispatcher $eventDispatcher = null): Installer\InstallationManager + public function createInstallationManager(Loop $loop, IOInterface $io, ?EventDispatcher $eventDispatcher = null): Installer\InstallationManager { return new Installer\InstallationManager($loop, $io, $eventDispatcher); } - /** - * @return void - */ - protected function createDefaultInstallers(Installer\InstallationManager $im, PartialComposer $composer, IOInterface $io, ProcessExecutor $process = null): void + protected function createDefaultInstallers(Installer\InstallationManager $im, PartialComposer $composer, IOInterface $io, ?ProcessExecutor $process = null): void { $fs = new Filesystem($process); $binaryInstaller = new Installer\BinaryInstaller($io, rtrim($composer->getConfig()->get('bin-dir'), '/'), $composer->getConfig()->get('bin-compat'), $fs, rtrim($composer->getConfig()->get('vendor-dir'), '/')); @@ -624,7 +609,6 @@ protected function loadRootPackage(RepositoryManager $rm, Config $config, Versio * the default filename * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins * @param bool $disableScripts Whether scripts should not be run - * @return Composer */ public static function create(IOInterface $io, $config = null, $disablePlugins = false, bool $disableScripts = false): Composer { @@ -647,9 +631,8 @@ public static function create(IOInterface $io, $config = null, $disablePlugins = * @param IOInterface $io IO instance * @param Config $config Config instance * @param mixed[] $options Array of options passed directly to HttpDownloader constructor - * @return HttpDownloader */ - public static function createHttpDownloader(IOInterface $io, Config $config, array $options = array()): HttpDownloader + public static function createHttpDownloader(IOInterface $io, Config $config, array $options = []): HttpDownloader { static $warned = false; $disableTls = false; @@ -667,7 +650,7 @@ public static function createHttpDownloader(IOInterface $io, Config $config, arr throw new Exception\NoSslException('The openssl extension is required for SSL/TLS protection but is not available. ' . 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); } - $httpDownloaderOptions = array(); + $httpDownloaderOptions = []; if ($disableTls === false) { if ('' !== $config->get('cafile')) { $httpDownloaderOptions['ssl']['cafile'] = $config->get('cafile'); diff --git a/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.php b/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.php index 6076c0b04eff..491ad01b9a1c 100644 --- a/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.php +++ b/src/Composer/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilter.php @@ -16,10 +16,6 @@ final class IgnoreAllPlatformRequirementFilter implements PlatformRequirementFilterInterface { - /** - * @param string $req - * @return bool - */ public function isIgnored(string $req): bool { return PlatformRepository::isPlatformPackage($req); diff --git a/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php b/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php index 7e2e7e926f6d..700795832a98 100644 --- a/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php +++ b/src/Composer/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilter.php @@ -39,7 +39,7 @@ final class IgnoreListPlatformRequirementFilter implements PlatformRequirementFi */ public function __construct(array $reqList) { - $ignoreAll = $ignoreUpperBound = array(); + $ignoreAll = $ignoreUpperBound = []; foreach ($reqList as $req) { if (substr($req, -1) === '+') { $ignoreUpperBound[] = substr($req, 0, -1); @@ -51,10 +51,6 @@ public function __construct(array $reqList) $this->ignoreUpperBoundRegex = BasePackage::packageNamesToRegexp($ignoreUpperBound); } - /** - * @param string $req - * @return bool - */ public function isIgnored(string $req): bool { if (!PlatformRepository::isPlatformPackage($req)) { @@ -64,10 +60,6 @@ public function isIgnored(string $req): bool return Preg::isMatch($this->ignoreRegex, $req); } - /** - * @param string $req - * @return ConstraintInterface - */ public function filterConstraint(string $req, ConstraintInterface $constraint): ConstraintInterface { if (!PlatformRepository::isPlatformPackage($req)) { @@ -85,7 +77,7 @@ public function filterConstraint(string $req, ConstraintInterface $constraint): $intervals = Intervals::get($constraint); $last = end($intervals['numeric']); if ($last !== false && (string) $last->getEnd() !== (string) Interval::untilPositiveInfinity()) { - $constraint = new MultiConstraint(array($constraint, new Constraint('>=', $last->getEnd()->getVersion())), false); + $constraint = new MultiConstraint([$constraint, new Constraint('>=', $last->getEnd()->getVersion())], false); } return $constraint; diff --git a/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.php b/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.php index 0e2651214ffa..26570182464d 100644 --- a/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.php +++ b/src/Composer/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilter.php @@ -15,7 +15,6 @@ final class IgnoreNothingPlatformRequirementFilter implements PlatformRequirementFilterInterface { /** - * @param string $req * @return false */ public function isIgnored(string $req): bool diff --git a/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.php b/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.php index b735d13aed46..670156231222 100644 --- a/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.php +++ b/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactory.php @@ -16,8 +16,6 @@ final class PlatformRequirementFilterFactory { /** * @param mixed $boolOrList - * - * @return PlatformRequirementFilterInterface */ public static function fromBoolOrList($boolOrList): PlatformRequirementFilterInterface { @@ -37,17 +35,11 @@ public static function fromBoolOrList($boolOrList): PlatformRequirementFilterInt ); } - /** - * @return PlatformRequirementFilterInterface - */ public static function ignoreAll(): PlatformRequirementFilterInterface { return new IgnoreAllPlatformRequirementFilter(); } - /** - * @return PlatformRequirementFilterInterface - */ public static function ignoreNothing(): PlatformRequirementFilterInterface { return new IgnoreNothingPlatformRequirementFilter(); diff --git a/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.php b/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.php index 9a80837a2fb5..af1f651c86b2 100644 --- a/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.php +++ b/src/Composer/Filter/PlatformRequirementFilter/PlatformRequirementFilterInterface.php @@ -14,9 +14,5 @@ interface PlatformRequirementFilterInterface { - /** - * @param string $req - * @return bool - */ public function isIgnored(string $req): bool; } diff --git a/src/Composer/IO/BaseIO.php b/src/Composer/IO/BaseIO.php index 60eec1882b00..43d6f66f959f 100644 --- a/src/Composer/IO/BaseIO.php +++ b/src/Composer/IO/BaseIO.php @@ -20,7 +20,7 @@ abstract class BaseIO implements IOInterface { /** @var array */ - protected $authentications = array(); + protected $authentications = []; /** * @inheritDoc @@ -35,7 +35,7 @@ public function getAuthentications() */ public function resetAuthentications() { - $this->authentications = array(); + $this->authentications = []; } /** @@ -55,7 +55,7 @@ public function getAuthentication($repositoryName) return $this->authentications[$repositoryName]; } - return array('username' => null, 'password' => null); + return ['username' => null, 'password' => null]; } /** @@ -63,7 +63,7 @@ public function getAuthentication($repositoryName) */ public function setAuthentication($repositoryName, $username, $password = null) { - $this->authentications[$repositoryName] = array('username' => $username, 'password' => $password); + $this->authentications[$repositoryName] = ['username' => $username, 'password' => $password]; } /** @@ -91,7 +91,7 @@ public function writeErrorRaw($messages, bool $newline = true, int $verbosity = * * @return void */ - protected function checkAndSetAuthentication(string $repositoryName, string $username, string $password = null) + protected function checkAndSetAuthentication(string $repositoryName, string $username, ?string $password = null) { if ($this->hasAuthentication($repositoryName)) { $auth = $this->getAuthentication($repositoryName); @@ -160,51 +160,51 @@ public function loadConfiguration(Config $config) ProcessExecutor::setTimeout($config->get('process-timeout')); } - public function emergency($message, array $context = array()): void + public function emergency($message, array $context = []): void { $this->log(LogLevel::EMERGENCY, $message, $context); } - public function alert($message, array $context = array()): void + public function alert($message, array $context = []): void { $this->log(LogLevel::ALERT, $message, $context); } - public function critical($message, array $context = array()): void + public function critical($message, array $context = []): void { $this->log(LogLevel::CRITICAL, $message, $context); } - public function error($message, array $context = array()): void + public function error($message, array $context = []): void { $this->log(LogLevel::ERROR, $message, $context); } - public function warning($message, array $context = array()): void + public function warning($message, array $context = []): void { $this->log(LogLevel::WARNING, $message, $context); } - public function notice($message, array $context = array()): void + public function notice($message, array $context = []): void { $this->log(LogLevel::NOTICE, $message, $context); } - public function info($message, array $context = array()): void + public function info($message, array $context = []): void { $this->log(LogLevel::INFO, $message, $context); } - public function debug($message, array $context = array()): void + public function debug($message, array $context = []): void { $this->log(LogLevel::DEBUG, $message, $context); } - public function log($level, $message, array $context = array()): void + public function log($level, $message, array $context = []): void { $message = (string) $message; - if (in_array($level, array(LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR))) { + if (in_array($level, [LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR])) { $this->writeError(''.$message.''); } elseif ($level === LogLevel::WARNING) { $this->writeError(''.$message.''); diff --git a/src/Composer/IO/BufferIO.php b/src/Composer/IO/BufferIO.php index c25cc64dbd68..f6f208d96435 100644 --- a/src/Composer/IO/BufferIO.php +++ b/src/Composer/IO/BufferIO.php @@ -30,21 +30,16 @@ class BufferIO extends ConsoleIO /** @var StreamOutput */ protected $output; - /** - * @param string $input - * @param int $verbosity - * @param OutputFormatterInterface|null $formatter - */ - public function __construct(string $input = '', int $verbosity = StreamOutput::VERBOSITY_NORMAL, OutputFormatterInterface $formatter = null) + public function __construct(string $input = '', int $verbosity = StreamOutput::VERBOSITY_NORMAL, ?OutputFormatterInterface $formatter = null) { $input = new StringInput($input); $input->setInteractive(false); $output = new StreamOutput(fopen('php://memory', 'rw'), $verbosity, $formatter ? $formatter->isDecorated() : false, $formatter); - parent::__construct($input, $output, new HelperSet(array( + parent::__construct($input, $output, new HelperSet([ new QuestionHelper(), - ))); + ])); } /** @@ -74,8 +69,6 @@ public function getOutput(): string * @param string[] $inputs * * @see createStream - * - * @return void */ public function setUserInputs(array $inputs): void { diff --git a/src/Composer/IO/ConsoleIO.php b/src/Composer/IO/ConsoleIO.php index 717c477568f5..46ba7a4a1fe2 100644 --- a/src/Composer/IO/ConsoleIO.php +++ b/src/Composer/IO/ConsoleIO.php @@ -58,18 +58,16 @@ public function __construct(InputInterface $input, OutputInterface $output, Help $this->input = $input; $this->output = $output; $this->helperSet = $helperSet; - $this->verbosityMap = array( + $this->verbosityMap = [ self::QUIET => OutputInterface::VERBOSITY_QUIET, self::NORMAL => OutputInterface::VERBOSITY_NORMAL, self::VERBOSE => OutputInterface::VERBOSITY_VERBOSE, self::VERY_VERBOSE => OutputInterface::VERBOSITY_VERY_VERBOSE, self::DEBUG => OutputInterface::VERBOSITY_DEBUG, - ); + ]; } /** - * @param float $startTime - * * @return void */ public function enableDebugging(float $startTime) @@ -151,12 +149,6 @@ public function writeErrorRaw($messages, bool $newline = true, int $verbosity = /** * @param string[]|string $messages - * @param bool $newline - * @param bool $stderr - * @param int $verbosity - * @param bool $raw - * - * @return void */ private function doWrite($messages, bool $newline, bool $stderr, int $verbosity, bool $raw = false): void { @@ -206,12 +198,6 @@ public function overwriteError($messages, bool $newline = true, ?int $size = nul /** * @param string[]|string $messages - * @param bool $newline - * @param int|null $size - * @param bool $stderr - * @param int $verbosity - * - * @return void */ private function doOverwrite($messages, bool $newline, ?int $size, bool $stderr, int $verbosity): void { @@ -252,7 +238,6 @@ private function doOverwrite($messages, bool $newline, ?int $size, bool $stderr, } /** - * @param int $max * @return ProgressBar */ public function getProgressBar(int $max = 0) @@ -329,7 +314,7 @@ public function select($question, $choices, $default, $attempts = false, $errorM return (string) array_search($result, $choices, true); } - $results = array(); + $results = []; foreach ($choices as $index => $choice) { if (in_array($choice, $result, true)) { $results[] = (string) $index; @@ -339,17 +324,11 @@ public function select($question, $choices, $default, $attempts = false, $errorM return $results; } - /** - * @return Table - */ public function getTable(): Table { return new Table($this->output); } - /** - * @return OutputInterface - */ private function getErrorOutput(): OutputInterface { if ($this->output instanceof ConsoleOutputInterface) { diff --git a/src/Composer/IO/IOInterface.php b/src/Composer/IO/IOInterface.php index a1048be8e319..fb9906c088f5 100644 --- a/src/Composer/IO/IOInterface.php +++ b/src/Composer/IO/IOInterface.php @@ -234,7 +234,6 @@ public function setAuthentication(string $repositoryName, string $username, ?str /** * Loads authentications from a config instance * - * @param Config $config * * @return void */ diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index 59e4c502ca37..09beafaea408 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -202,15 +202,7 @@ class Installer /** * Constructor * - * @param IOInterface $io - * @param Config $config * @param RootPackageInterface&BasePackage $package - * @param DownloadManager $downloadManager - * @param RepositoryManager $repositoryManager - * @param Locker $locker - * @param InstallationManager $installationManager - * @param EventDispatcher $eventDispatcher - * @param AutoloadGenerator $autoloadGenerator */ public function __construct(IOInterface $io, Config $config, RootPackageInterface $package, DownloadManager $downloadManager, RepositoryManager $repositoryManager, Locker $locker, InstallationManager $installationManager, EventDispatcher $eventDispatcher, AutoloadGenerator $autoloadGenerator) { @@ -305,11 +297,11 @@ public function run(): int } if ($this->update) { - $installedRepo = new InstalledRepository(array( + $installedRepo = new InstalledRepository([ $this->locker->getLockedRepository($this->devMode), $this->createPlatformRepo(false), new RootPackageRepository(clone $this->package), - )); + ]); if ($isFreshInstall) { $this->suggestedPackagesReporter->addSuggestionsFromPackage($this->package); } @@ -365,7 +357,7 @@ public function run(): int } } if ($fundingCount > 0) { - $this->io->writeError(array( + $this->io->writeError([ sprintf( "%d package%s you are using %s looking for funding.", $fundingCount, @@ -373,7 +365,7 @@ public function run(): int 1 === $fundingCount ? 'is' : 'are' ), 'Use the `composer fund` command to find out more!', - )); + ]); } if ($this->runScripts) { @@ -418,9 +410,6 @@ public function run(): int } /** - * @param bool $doInstall - * - * @return int * @phpstan-return self::ERROR_* */ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doInstall): int @@ -519,9 +508,9 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doIns $platformReqs = $this->extractPlatformRequirements($this->package->getRequires()); $platformDevReqs = $this->extractPlatformRequirements($this->package->getDevRequires()); - $installsUpdates = $uninstalls = array(); + $installsUpdates = $uninstalls = []; if ($lockTransaction->getOperations()) { - $installNames = $updateNames = $uninstallNames = array(); + $installNames = $updateNames = $uninstallNames = []; foreach ($lockTransaction->getOperations() as $operation) { if ($operation instanceof InstallOperation) { $installsUpdates[] = $operation; @@ -605,7 +594,7 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doIns $this->package->getStabilityFlags(), $this->preferStable || $this->package->getPreferStable(), $this->preferLowest, - $this->config->get('platform') ?: array(), + $this->config->get('platform') ?: [], $this->writeLock && $this->executeOperations ); if ($updatedLock && $this->writeLock && $this->executeOperations) { @@ -636,18 +625,17 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doIns * * @param array> $aliases * - * @return int * * @phpstan-param list $aliases * @phpstan-return self::ERROR_* */ - protected function extractDevPackages(LockTransaction $lockTransaction, PlatformRepository $platformRepo, array $aliases, PolicyInterface $policy, LockArrayRepository $lockedRepository = null): int + protected function extractDevPackages(LockTransaction $lockTransaction, PlatformRepository $platformRepo, array $aliases, PolicyInterface $policy, ?LockArrayRepository $lockedRepository = null): int { if (!$this->package->getDevRequires()) { return 0; } - $resultRepo = new ArrayRepository(array()); + $resultRepo = new ArrayRepository([]); $loader = new ArrayLoader(null, true); $dumper = new ArrayDumper(); foreach ($lockTransaction->getNewLockPackages(false) as $pkg) { @@ -687,7 +675,6 @@ protected function extractDevPackages(LockTransaction $lockTransaction, Platform } /** - * @param InstalledRepositoryInterface $localRepo * @param bool $alreadySolved Whether the function is called as part of an update command or independently * @return int exit code * @phpstan-return self::ERROR_* @@ -709,7 +696,7 @@ protected function doInstall(InstalledRepositoryInterface $localRepo, bool $alre // creating repository set $policy = $this->createPolicy(false); // use aliases from lock file only, so empty root aliases here - $repositorySet = $this->createRepositorySet(false, $platformRepo, array(), $lockedRepository); + $repositorySet = $this->createRepositorySet(false, $platformRepo, [], $lockedRepository); $repositorySet->addRepository($lockedRepository); // creating requirements request @@ -764,7 +751,7 @@ protected function doInstall(InstalledRepositoryInterface $localRepo, bool $alre } if ($localRepoTransaction->getOperations()) { - $installs = $updates = $uninstalls = array(); + $installs = $updates = $uninstalls = []; foreach ($localRepoTransaction->getOperations() as $operation) { if ($operation instanceof InstallOperation) { $installs[] = $operation->getPackage()->getPrettyName().':'.$operation->getPackage()->getFullPrettyVersion(); @@ -810,32 +797,24 @@ protected function doInstall(InstalledRepositoryInterface $localRepo, bool $alre return 0; } - /** - * @param bool $forUpdate - * - * @return PlatformRepository - */ protected function createPlatformRepo(bool $forUpdate): PlatformRepository { if ($forUpdate) { - $platformOverrides = $this->config->get('platform') ?: array(); + $platformOverrides = $this->config->get('platform') ?: []; } else { $platformOverrides = $this->locker->getPlatformOverrides(); } - return new PlatformRepository(array(), $platformOverrides); + return new PlatformRepository([], $platformOverrides); } /** - * @param bool $forUpdate * @param array> $rootAliases - * @param RepositoryInterface|null $lockedRepository * - * @return RepositorySet * * @phpstan-param list $rootAliases */ - private function createRepositorySet(bool $forUpdate, PlatformRepository $platformRepo, array $rootAliases = array(), ?RepositoryInterface $lockedRepository = null): RepositorySet + private function createRepositorySet(bool $forUpdate, PlatformRepository $platformRepo, array $rootAliases = [], ?RepositoryInterface $lockedRepository = null): RepositorySet { if ($forUpdate) { $minimumStability = $this->package->getMinimumStability(); @@ -846,7 +825,7 @@ private function createRepositorySet(bool $forUpdate, PlatformRepository $platfo $minimumStability = $this->locker->getMinimumStability(); $stabilityFlags = $this->locker->getStabilityFlags(); - $requires = array(); + $requires = []; foreach ($lockedRepository->getPackages() as $package) { $constraint = new Constraint('=', $package->getVersion()); $constraint->setPrettyString($package->getPrettyVersion()); @@ -854,7 +833,7 @@ private function createRepositorySet(bool $forUpdate, PlatformRepository $platfo } } - $rootRequires = array(); + $rootRequires = []; foreach ($requires as $req => $constraint) { if ($constraint instanceof Link) { $constraint = $constraint->getConstraint(); @@ -869,8 +848,8 @@ private function createRepositorySet(bool $forUpdate, PlatformRepository $platfo } $this->fixedRootPackage = clone $this->package; - $this->fixedRootPackage->setRequires(array()); - $this->fixedRootPackage->setDevRequires(array()); + $this->fixedRootPackage->setRequires([]); + $this->fixedRootPackage->setDevRequires([]); $stabilityFlags[$this->package->getName()] = BasePackage::$stabilities[VersionParser::parseStability($this->package->getVersion())]; @@ -884,7 +863,7 @@ private function createRepositorySet(bool $forUpdate, PlatformRepository $platfo if ($additionalFixedRepositories instanceof CompositeRepository) { $additionalFixedRepositories = $additionalFixedRepositories->getRepositories(); } else { - $additionalFixedRepositories = array($additionalFixedRepositories); + $additionalFixedRepositories = [$additionalFixedRepositories]; } foreach ($additionalFixedRepositories as $additionalFixedRepository) { if ($additionalFixedRepository instanceof InstalledRepository || $additionalFixedRepository instanceof InstalledRepositoryInterface) { @@ -899,11 +878,6 @@ private function createRepositorySet(bool $forUpdate, PlatformRepository $platfo return $repositorySet; } - /** - * @param bool $forUpdate - * - * @return DefaultPolicy - */ private function createPolicy(bool $forUpdate): DefaultPolicy { $preferStable = null; @@ -926,9 +900,8 @@ private function createPolicy(bool $forUpdate): DefaultPolicy /** * @param RootPackageInterface&BasePackage $rootPackage - * @return Request */ - private function createRequest(RootPackageInterface $rootPackage, PlatformRepository $platformRepo, LockArrayRepository $lockedRepository = null): Request + private function createRequest(RootPackageInterface $rootPackage, PlatformRepository $platformRepo, ?LockArrayRepository $lockedRepository = null): Request { $request = new Request($lockedRepository); @@ -959,17 +932,11 @@ private function createRequest(RootPackageInterface $rootPackage, PlatformReposi return $request; } - /** - * @param LockArrayRepository|null $lockedRepository - * @param bool $includeDevRequires - * - * @return void - */ - private function requirePackagesForUpdate(Request $request, LockArrayRepository $lockedRepository = null, bool $includeDevRequires = true): void + private function requirePackagesForUpdate(Request $request, ?LockArrayRepository $lockedRepository = null, bool $includeDevRequires = true): void { // if we're updating mirrors we want to keep exactly the same versions installed which are in the lock file, but we want current remote metadata if ($this->updateMirrors) { - $excludedPackages = array(); + $excludedPackages = []; if (!$includeDevRequires) { $excludedPackages = array_flip($this->locker->getDevPackageNames()); } @@ -993,8 +960,6 @@ private function requirePackagesForUpdate(Request $request, LockArrayRepository } /** - * @param bool $forUpdate - * * @return array> * * @phpstan-return list @@ -1017,7 +982,7 @@ private function getRootAliases(bool $forUpdate): array */ private function extractPlatformRequirements(array $links): array { - $platformReqs = array(); + $platformReqs = []; foreach ($links as $link) { if (PlatformRepository::isPlatformPackage($link->getTarget())) { $platformReqs[$link->getTarget()] = $link->getPrettyConstraint(); @@ -1031,12 +996,10 @@ private function extractPlatformRequirements(array $links): array * Replace local repositories with InstalledArrayRepository instances * * This is to prevent any accidental modification of the existing repos on disk - * - * @return void */ private function mockLocalRepositories(RepositoryManager $rm): void { - $packages = array(); + $packages = []; foreach ($rm->getLocalRepository()->getPackages() as $package) { $packages[(string) $package] = clone $package; } @@ -1052,9 +1015,6 @@ private function mockLocalRepositories(RepositoryManager $rm): void ); } - /** - * @return PoolOptimizer|null - */ private function createPoolOptimizer(PolicyInterface $policy): ?PoolOptimizer { // Not the best architectural decision here, would need to be able @@ -1072,8 +1032,6 @@ private function createPoolOptimizer(PolicyInterface $policy): ?PoolOptimizer /** * Create Installer * - * @param IOInterface $io - * @param Composer $composer * @return Installer */ public static function create(IOInterface $io, Composer $composer): self @@ -1092,7 +1050,6 @@ public static function create(IOInterface $io, Composer $composer): self } /** - * @param RepositoryInterface $additionalFixedRepository * @return $this */ public function setAdditionalFixedRepository(RepositoryInterface $additionalFixedRepository): self @@ -1116,7 +1073,6 @@ public function setTemporaryConstraints(array $constraints): self /** * Whether to run in drymode or not * - * @param bool $dryRun * @return Installer */ public function setDryRun(bool $dryRun = true): self @@ -1128,8 +1084,6 @@ public function setDryRun(bool $dryRun = true): self /** * Checks, if this is a dry run (simulation mode). - * - * @return bool */ public function isDryRun(): bool { @@ -1139,7 +1093,6 @@ public function isDryRun(): bool /** * prefer source installation * - * @param bool $preferSource * @return Installer */ public function setPreferSource(bool $preferSource = true): self @@ -1152,7 +1105,6 @@ public function setPreferSource(bool $preferSource = true): self /** * prefer dist installation * - * @param bool $preferDist * @return Installer */ public function setPreferDist(bool $preferDist = true): self @@ -1165,7 +1117,6 @@ public function setPreferDist(bool $preferDist = true): self /** * Whether or not generated autoloader are optimized * - * @param bool $optimizeAutoloader * @return Installer */ public function setOptimizeAutoloader(bool $optimizeAutoloader): self @@ -1184,7 +1135,6 @@ public function setOptimizeAutoloader(bool $optimizeAutoloader): self * Whether or not generated autoloader considers the class map * authoritative. * - * @param bool $classMapAuthoritative * @return Installer */ public function setClassMapAuthoritative(bool $classMapAuthoritative): self @@ -1201,8 +1151,6 @@ public function setClassMapAuthoritative(bool $classMapAuthoritative): self /** * Whether or not generated autoloader considers APCu caching. * - * @param bool $apcuAutoloader - * @param string|null $apcuAutoloaderPrefix * @return Installer */ public function setApcuAutoloader(bool $apcuAutoloader, ?string $apcuAutoloaderPrefix = null): self @@ -1216,7 +1164,6 @@ public function setApcuAutoloader(bool $apcuAutoloader, ?string $apcuAutoloaderP /** * update packages * - * @param bool $update * @return Installer */ public function setUpdate(bool $update): self @@ -1229,7 +1176,6 @@ public function setUpdate(bool $update): self /** * Allows disabling the install step after an update * - * @param bool $install * @return Installer */ public function setInstall(bool $install): self @@ -1242,7 +1188,6 @@ public function setInstall(bool $install): self /** * enables dev packages * - * @param bool $devMode * @return Installer */ public function setDevMode(bool $devMode = true): self @@ -1257,7 +1202,6 @@ public function setDevMode(bool $devMode = true): self * * This is disabled implicitly when enabling dryRun * - * @param bool $dumpAutoloader * @return Installer */ public function setDumpAutoloader(bool $dumpAutoloader = true): self @@ -1272,7 +1216,6 @@ public function setDumpAutoloader(bool $dumpAutoloader = true): self * * This is disabled implicitly when enabling dryRun * - * @param bool $runScripts * @return Installer * @deprecated Use setRunScripts(false) on the EventDispatcher instance being injected instead */ @@ -1286,7 +1229,6 @@ public function setRunScripts(bool $runScripts = true): self /** * set the config instance * - * @param Config $config * @return Installer */ public function setConfig(Config $config): self @@ -1299,7 +1241,6 @@ public function setConfig(Config $config): self /** * run in verbose mode * - * @param bool $verbose * @return Installer */ public function setVerbose(bool $verbose = true): self @@ -1311,8 +1252,6 @@ public function setVerbose(bool $verbose = true): self /** * Checks, if running in verbose mode. - * - * @return bool */ public function isVerbose(): bool { @@ -1340,7 +1279,6 @@ public function setIgnorePlatformRequirements($ignorePlatformReqs): self } /** - * @param PlatformRequirementFilterInterface $platformRequirementFilter * @return Installer */ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface $platformRequirementFilter): self @@ -1353,7 +1291,6 @@ public function setPlatformRequirementFilter(PlatformRequirementFilterInterface /** * Update the lock file to the exact same versions and references but use current remote metadata like URLs and mirror info * - * @param bool $updateMirrors * @return Installer */ public function setUpdateMirrors(bool $updateMirrors): self @@ -1389,7 +1326,7 @@ public function setUpdateAllowList(array $packages): self */ public function setUpdateAllowTransitiveDependencies(int $updateAllowTransitiveDependencies): self { - if (!in_array($updateAllowTransitiveDependencies, array(Request::UPDATE_ONLY_LISTED, Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE, Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS), true)) { + if (!in_array($updateAllowTransitiveDependencies, [Request::UPDATE_ONLY_LISTED, Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS_NO_ROOT_REQUIRE, Request::UPDATE_LISTED_WITH_TRANSITIVE_DEPS], true)) { throw new \RuntimeException("Invalid value for updateAllowTransitiveDependencies supplied"); } @@ -1401,7 +1338,6 @@ public function setUpdateAllowTransitiveDependencies(int $updateAllowTransitiveD /** * Should packages be preferred in a stable version when updating? * - * @param bool $preferStable * @return Installer */ public function setPreferStable(bool $preferStable = true): self @@ -1414,7 +1350,6 @@ public function setPreferStable(bool $preferStable = true): self /** * Should packages be preferred in a lowest version when updating? * - * @param bool $preferLowest * @return Installer */ public function setPreferLowest(bool $preferLowest = true): self @@ -1429,7 +1364,6 @@ public function setPreferLowest(bool $preferLowest = true): self * * This is disabled implicitly when enabling dryRun * - * @param bool $writeLock * @return Installer */ public function setWriteLock(bool $writeLock = true): self @@ -1444,7 +1378,6 @@ public function setWriteLock(bool $writeLock = true): self * * This is disabled implicitly when enabling dryRun * - * @param bool $executeOperations * @return Installer */ public function setExecuteOperations(bool $executeOperations = true): self @@ -1457,7 +1390,6 @@ public function setExecuteOperations(bool $executeOperations = true): self /** * Should an audit be run after installation is complete? * - * @param boolean $audit * @return Installer */ public function setAudit(bool $audit): self @@ -1497,7 +1429,6 @@ public function disablePlugins(): self } /** - * @param SuggestedPackagesReporter $suggestedPackagesReporter * @return Installer */ public function setSuggestedPackagesReporter(SuggestedPackagesReporter $suggestedPackagesReporter): self diff --git a/src/Composer/Installer/BinaryInstaller.php b/src/Composer/Installer/BinaryInstaller.php index 203b624944c5..042986cbb381 100644 --- a/src/Composer/Installer/BinaryInstaller.php +++ b/src/Composer/Installer/BinaryInstaller.php @@ -41,13 +41,9 @@ class BinaryInstaller private $vendorDir; /** - * @param IOInterface $io - * @param string $binDir - * @param string $binCompat * @param Filesystem $filesystem - * @param string|null $vendorDir */ - public function __construct(IOInterface $io, string $binDir, string $binCompat, Filesystem $filesystem = null, ?string $vendorDir = null) + public function __construct(IOInterface $io, string $binDir, string $binCompat, ?Filesystem $filesystem = null, ?string $vendorDir = null) { $this->binDir = $binDir; $this->binCompat = $binCompat; @@ -56,12 +52,6 @@ public function __construct(IOInterface $io, string $binDir, string $binCompat, $this->vendorDir = $vendorDir; } - /** - * @param string $installPath - * @param bool $warnOnOverwrite - * - * @return void - */ public function installBinaries(PackageInterface $package, string $installPath, bool $warnOnOverwrite = true): void { $binaries = $this->getBinaries($package); @@ -117,9 +107,6 @@ public function installBinaries(PackageInterface $package, string $installPath, } } - /** - * @return void - */ public function removeBinaries(PackageInterface $package): void { $this->initializeBinDir(); @@ -144,11 +131,6 @@ public function removeBinaries(PackageInterface $package): void } } - /** - * @param string $bin - * - * @return string - */ public static function determineBinaryCaller(string $bin): string { if ('.bat' === substr($bin, -4) || '.exe' === substr($bin, -4)) { @@ -173,13 +155,6 @@ protected function getBinaries(PackageInterface $package): array return $package->getBinaries(); } - /** - * @param string $binPath - * @param string $link - * @param string $bin - * - * @return void - */ protected function installFullBinaries(string $binPath, string $link, string $bin, PackageInterface $package): void { // add unixy support for cygwin and similar environments @@ -196,33 +171,18 @@ protected function installFullBinaries(string $binPath, string $link, string $bi } } - /** - * @param string $binPath - * @param string $link - * - * @return void - */ protected function installUnixyProxyBinaries(string $binPath, string $link): void { file_put_contents($link, $this->generateUnixyProxyCode($binPath, $link)); Silencer::call('chmod', $link, 0777 & ~umask()); } - /** - * @return void - */ protected function initializeBinDir(): void { $this->filesystem->ensureDirectoryExists($this->binDir); $this->binDir = realpath($this->binDir); } - /** - * @param string $bin - * @param string $link - * - * @return string - */ protected function generateWindowsProxyCode(string $bin, string $link): string { $binPath = $this->filesystem->findShortestPath($link, $bin); @@ -246,12 +206,6 @@ protected function generateWindowsProxyCode(string $bin, string $link): string "{$caller} \"%BIN_TARGET%\" %*\r\n"; } - /** - * @param string $bin - * @param string $link - * - * @return string - */ protected function generateUnixyProxyCode(string $bin, string $link): string { $binPath = $this->filesystem->findShortestPath($link, $bin); diff --git a/src/Composer/Installer/InstallationManager.php b/src/Composer/Installer/InstallationManager.php index dce5329f47ae..ecec136a4c98 100644 --- a/src/Composer/Installer/InstallationManager.php +++ b/src/Composer/Installer/InstallationManager.php @@ -40,11 +40,11 @@ class InstallationManager { /** @var array */ - private $installers = array(); + private $installers = []; /** @var array */ - private $cache = array(); + private $cache = []; /** @var array> */ - private $notifiablePackages = array(); + private $notifiablePackages = []; /** @var Loop */ private $loop; /** @var IOInterface */ @@ -54,47 +54,40 @@ class InstallationManager /** @var bool */ private $outputProgress; - public function __construct(Loop $loop, IOInterface $io, EventDispatcher $eventDispatcher = null) + public function __construct(Loop $loop, IOInterface $io, ?EventDispatcher $eventDispatcher = null) { $this->loop = $loop; $this->io = $io; $this->eventDispatcher = $eventDispatcher; } - /** - * @return void - */ public function reset(): void { - $this->notifiablePackages = array(); - FileDownloader::$downloadMetadata = array(); + $this->notifiablePackages = []; + FileDownloader::$downloadMetadata = []; } /** * Adds installer * * @param InstallerInterface $installer installer instance - * - * @return void */ public function addInstaller(InstallerInterface $installer): void { array_unshift($this->installers, $installer); - $this->cache = array(); + $this->cache = []; } /** * Removes installer * * @param InstallerInterface $installer installer instance - * - * @return void */ public function removeInstaller(InstallerInterface $installer): void { if (false !== ($key = array_search($installer, $this->installers, true))) { array_splice($this->installers, $key, 1); - $this->cache = array(); + $this->cache = []; } } @@ -104,8 +97,6 @@ public function removeInstaller(InstallerInterface $installer): void * We prevent any plugins from being instantiated by simply * deactivating the installer for them. This ensure that no third-party * code is ever executed. - * - * @return void */ public function disablePlugins(): void { @@ -124,7 +115,6 @@ public function disablePlugins(): void * @param string $type package type * * @throws \InvalidArgumentException if installer for provided type is not registered - * @return InstallerInterface */ public function getInstaller(string $type): InstallerInterface { @@ -148,8 +138,6 @@ public function getInstaller(string $type): InstallerInterface * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance - * - * @return bool */ public function isPackageInstalled(InstalledRepositoryInterface $repo, PackageInterface $package): bool { @@ -165,8 +153,6 @@ public function isPackageInstalled(InstalledRepositoryInterface $repo, PackageIn * If the installer associated to this package doesn't handle that function, it'll do nothing. * * @param PackageInterface $package Package instance - * - * @return void */ public function ensureBinariesPresence(PackageInterface $package): void { @@ -190,18 +176,16 @@ public function ensureBinariesPresence(PackageInterface $package): void * @param OperationInterface[] $operations operations to execute * @param bool $devMode whether the install is being run in dev mode * @param bool $runScripts whether to dispatch script events - * - * @return void */ public function execute(InstalledRepositoryInterface $repo, array $operations, bool $devMode = true, bool $runScripts = true): void { /** @var PromiseInterface[] */ - $cleanupPromises = array(); + $cleanupPromises = []; $loop = $this->loop; $io = $this->io; $runCleanup = static function () use (&$cleanupPromises, $loop): void { - $promises = array(); + $promises = []; $loop->abortJobs(); @@ -232,8 +216,8 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b try { // execute operations in batches to make sure download-modifying-plugins are installed // before the other packages get downloaded - $batches = array(); - $batch = array(); + $batches = []; + $batch = []; foreach ($operations as $index => $operation) { if ($operation instanceof UpdateOperation || $operation instanceof InstallOperation) { $package = $operation instanceof UpdateOperation ? $operation->getTargetPackage() : $operation->getPackage(); @@ -241,8 +225,8 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b if ($batch) { $batches[] = $batch; } - $batches[] = array($index => $operation); - $batch = array(); + $batches[] = [$index => $operation]; + $batch = []; continue; } @@ -274,21 +258,17 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b /** * @param OperationInterface[] $operations List of operations to execute in this batch * @param PromiseInterface[] $cleanupPromises - * @param bool $devMode - * @param bool $runScripts * @param OperationInterface[] $allOperations Complete list of operations to be executed in the install job, used for event listeners - * - * @return void */ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, array $operations, array &$cleanupPromises, bool $devMode, bool $runScripts, array $allOperations): void { - $promises = array(); + $promises = []; foreach ($operations as $index => $operation) { $opType = $operation->getOperationType(); // ignoring alias ops as they don't need to execute anything at this stage - if (!in_array($opType, array('update', 'install', 'uninstall'))) { + if (!in_array($opType, ['update', 'install', 'uninstall'])) { continue; } @@ -328,8 +308,8 @@ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, arr // execute operations in batches to make sure every plugin is installed in the // right order and activated before the packages depending on it are installed - $batches = array(); - $batch = array(); + $batches = []; + $batch = []; foreach ($operations as $index => $operation) { if ($operation instanceof InstallOperation || $operation instanceof UpdateOperation) { $package = $operation instanceof UpdateOperation ? $operation->getTargetPackage() : $operation->getPackage(); @@ -337,8 +317,8 @@ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, arr if ($batch) { $batches[] = $batch; } - $batches[] = array($index => $operation); - $batch = array(); + $batches[] = [$index => $operation]; + $batch = []; continue; } @@ -358,27 +338,23 @@ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, arr /** * @param OperationInterface[] $operations List of operations to execute in this batch * @param PromiseInterface[] $cleanupPromises - * @param bool $devMode - * @param bool $runScripts * @param OperationInterface[] $allOperations Complete list of operations to be executed in the install job, used for event listeners - * - * @return void */ private function executeBatch(InstalledRepositoryInterface $repo, array $operations, array $cleanupPromises, bool $devMode, bool $runScripts, array $allOperations): void { - $promises = array(); - $postExecCallbacks = array(); + $promises = []; + $postExecCallbacks = []; foreach ($operations as $index => $operation) { $opType = $operation->getOperationType(); // ignoring alias ops as they don't need to execute anything - if (!in_array($opType, array('update', 'install', 'uninstall'))) { + if (!in_array($opType, ['update', 'install', 'uninstall'])) { // output alias ops in debug verbosity as they have no output otherwise if ($this->io->isDebug()) { $this->io->writeError(' - ' . $operation->show(false)); } - $this->$opType($repo, $operation); + $this->{$opType}($repo, $operation); continue; } @@ -413,7 +389,7 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati } $promise = $promise->then(function () use ($opType, $repo, $operation) { - return $this->$opType($repo, $operation); + return $this->{$opType}($repo, $operation); })->then($cleanupPromises[$index]) ->then(function () use ($devMode, $repo): void { $repo->write($devMode, $this); @@ -452,8 +428,6 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati /** * @param PromiseInterface[] $promises - * - * @return void */ private function waitOnPromises(array $promises): void { @@ -482,8 +456,6 @@ private function waitOnPromises(array $promises): void * * @param InstalledRepositoryInterface $repo repository in which to check * @param InstallOperation $operation operation instance - * - * @return PromiseInterface|null */ public function install(InstalledRepositoryInterface $repo, InstallOperation $operation): ?PromiseInterface { @@ -500,8 +472,6 @@ public function install(InstalledRepositoryInterface $repo, InstallOperation $op * * @param InstalledRepositoryInterface $repo repository in which to check * @param UpdateOperation $operation operation instance - * - * @return PromiseInterface|null */ public function update(InstalledRepositoryInterface $repo, UpdateOperation $operation): ?PromiseInterface { @@ -540,8 +510,6 @@ public function update(InstalledRepositoryInterface $repo, UpdateOperation $oper * * @param InstalledRepositoryInterface $repo repository in which to check * @param UninstallOperation $operation operation instance - * - * @return PromiseInterface|null */ public function uninstall(InstalledRepositoryInterface $repo, UninstallOperation $operation): ?PromiseInterface { @@ -556,8 +524,6 @@ public function uninstall(InstalledRepositoryInterface $repo, UninstallOperation * * @param InstalledRepositoryInterface $repo repository in which to check * @param MarkAliasInstalledOperation $operation operation instance - * - * @return void */ public function markAliasInstalled(InstalledRepositoryInterface $repo, MarkAliasInstalledOperation $operation): void { @@ -573,8 +539,6 @@ public function markAliasInstalled(InstalledRepositoryInterface $repo, MarkAlias * * @param InstalledRepositoryInterface $repo repository in which to check * @param MarkAliasUninstalledOperation $operation operation instance - * - * @return void */ public function markAliasUninstalled(InstalledRepositoryInterface $repo, MarkAliasUninstalledOperation $operation): void { @@ -586,7 +550,6 @@ public function markAliasUninstalled(InstalledRepositoryInterface $repo, MarkAli /** * Returns the installation path of a package * - * @param PackageInterface $package * @return string path */ public function getInstallPath(PackageInterface $package): string @@ -596,22 +559,14 @@ public function getInstallPath(PackageInterface $package): string return $installer->getInstallPath($package); } - /** - * @param bool $outputProgress - * - * @return void - */ public function setOutputProgress(bool $outputProgress): void { $this->outputProgress = $outputProgress; } - /** - * @return void - */ public function notifyInstalls(IOInterface $io): void { - $promises = array(); + $promises = []; try { foreach ($this->notifiablePackages as $repoUrl => $packages) { @@ -620,19 +575,19 @@ public function notifyInstalls(IOInterface $io): void foreach ($packages as $package) { $url = str_replace('%package%', $package->getPrettyName(), $repoUrl); - $params = array( + $params = [ 'version' => $package->getPrettyVersion(), 'version_normalized' => $package->getVersion(), - ); - $opts = array( + ]; + $opts = [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', - 'header' => array('Content-type: application/x-www-form-urlencoded'), + 'header' => ['Content-type: application/x-www-form-urlencoded'], 'content' => http_build_query($params, '', '&'), 'timeout' => 3, - ), - ); + ], + ]; $promises[] = $this->loop->getHttpDownloader()->add($url, $opts); } @@ -640,12 +595,12 @@ public function notifyInstalls(IOInterface $io): void continue; } - $postData = array('downloads' => array()); + $postData = ['downloads' => []]; foreach ($packages as $package) { - $packageNotification = array( + $packageNotification = [ 'name' => $package->getPrettyName(), 'version' => $package->getVersion(), - ); + ]; if (strpos($repoUrl, 'packagist.org/') !== false) { if (isset(FileDownloader::$downloadMetadata[$package->getName()])) { $packageNotification['downloaded'] = FileDownloader::$downloadMetadata[$package->getName()]; @@ -656,15 +611,15 @@ public function notifyInstalls(IOInterface $io): void $postData['downloads'][] = $packageNotification; } - $opts = array( + $opts = [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', - 'header' => array('Content-Type: application/json'), + 'header' => ['Content-Type: application/json'], 'content' => json_encode($postData), 'timeout' => 6, - ), - ); + ], + ]; $promises[] = $this->loop->getHttpDownloader()->add($repoUrl, $opts); } @@ -676,9 +631,6 @@ public function notifyInstalls(IOInterface $io): void $this->reset(); } - /** - * @return void - */ private function markForNotification(PackageInterface $package): void { if ($package->getNotificationUrl()) { diff --git a/src/Composer/Installer/InstallerEvent.php b/src/Composer/Installer/InstallerEvent.php index a87ce66a0ee4..8cb699e33d9f 100644 --- a/src/Composer/Installer/InstallerEvent.php +++ b/src/Composer/Installer/InstallerEvent.php @@ -46,13 +46,6 @@ class InstallerEvent extends Event /** * Constructor. - * - * @param string $eventName - * @param Composer $composer - * @param IOInterface $io - * @param bool $devMode - * @param bool $executeOperations - * @param Transaction $transaction */ public function __construct(string $eventName, Composer $composer, IOInterface $io, bool $devMode, bool $executeOperations, Transaction $transaction) { @@ -65,41 +58,26 @@ public function __construct(string $eventName, Composer $composer, IOInterface $ $this->transaction = $transaction; } - /** - * @return Composer - */ public function getComposer(): Composer { return $this->composer; } - /** - * @return IOInterface - */ public function getIO(): IOInterface { return $this->io; } - /** - * @return bool - */ public function isDevMode(): bool { return $this->devMode; } - /** - * @return bool - */ public function isExecutingOperations(): bool { return $this->executeOperations; } - /** - * @return Transaction|null - */ public function getTransaction(): ?Transaction { return $this->transaction; diff --git a/src/Composer/Installer/InstallerInterface.php b/src/Composer/Installer/InstallerInterface.php index a236e07ced6d..bfa73e18d6a2 100644 --- a/src/Composer/Installer/InstallerInterface.php +++ b/src/Composer/Installer/InstallerInterface.php @@ -28,7 +28,6 @@ interface InstallerInterface /** * Decides if the installer supports the given type * - * @param string $packageType * @return bool */ public function supports(string $packageType); @@ -50,7 +49,7 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null */ - public function download(PackageInterface $package, PackageInterface $prevPackage = null); + public function download(PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Do anything that needs to be done between all downloads have been completed and the actual operation is executed @@ -65,7 +64,7 @@ public function download(PackageInterface $package, PackageInterface $prevPackag * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null */ - public function prepare(string $type, PackageInterface $package, PackageInterface $prevPackage = null); + public function prepare(string $type, PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Installs specific package. @@ -108,12 +107,11 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null */ - public function cleanup(string $type, PackageInterface $package, PackageInterface $prevPackage = null); + public function cleanup(string $type, PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Returns the absolute installation path of a package. * - * @param PackageInterface $package * @return string absolute path to install to, which MUST not end with a slash */ public function getInstallPath(PackageInterface $package); diff --git a/src/Composer/Installer/LibraryInstaller.php b/src/Composer/Installer/LibraryInstaller.php index 9aebddbd3da7..8fa39bf1e2af 100644 --- a/src/Composer/Installer/LibraryInstaller.php +++ b/src/Composer/Installer/LibraryInstaller.php @@ -50,13 +50,10 @@ class LibraryInstaller implements InstallerInterface, BinaryPresenceInterface /** * Initializes library installer. * - * @param IOInterface $io - * @param PartialComposer $composer - * @param string|null $type * @param Filesystem $filesystem * @param BinaryInstaller $binaryInstaller */ - public function __construct(IOInterface $io, PartialComposer $composer, ?string $type = 'library', Filesystem $filesystem = null, BinaryInstaller $binaryInstaller = null) + public function __construct(IOInterface $io, PartialComposer $composer, ?string $type = 'library', ?Filesystem $filesystem = null, ?BinaryInstaller $binaryInstaller = null) { $this->composer = $composer; $this->downloadManager = $composer instanceof Composer ? $composer->getDownloadManager() : null; @@ -109,7 +106,7 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface /** * @inheritDoc */ - public function download(PackageInterface $package, PackageInterface $prevPackage = null) + public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); @@ -120,7 +117,7 @@ public function download(PackageInterface $package, PackageInterface $prevPackag /** * @inheritDoc */ - public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); @@ -131,7 +128,7 @@ public function prepare($type, PackageInterface $package, PackageInterface $prev /** * @inheritDoc */ - public function cleanup($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); @@ -257,7 +254,6 @@ public function ensureBinariesPresence(PackageInterface $package) * It is used for BC as getInstallPath tends to be overridden by * installer plugins but not getPackageBasePath * - * @param PackageInterface $package * @return string */ protected function getPackageBasePath(PackageInterface $package) diff --git a/src/Composer/Installer/MetapackageInstaller.php b/src/Composer/Installer/MetapackageInstaller.php index ec437a89a9f1..952993e58c55 100644 --- a/src/Composer/Installer/MetapackageInstaller.php +++ b/src/Composer/Installer/MetapackageInstaller.php @@ -53,7 +53,7 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface /** * @inheritDoc */ - public function download(PackageInterface $package, PackageInterface $prevPackage = null) + public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { // noop return \React\Promise\resolve(null); @@ -62,7 +62,7 @@ public function download(PackageInterface $package, PackageInterface $prevPackag /** * @inheritDoc */ - public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { // noop return \React\Promise\resolve(null); @@ -71,7 +71,7 @@ public function prepare($type, PackageInterface $package, PackageInterface $prev /** * @inheritDoc */ - public function cleanup($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { // noop return \React\Promise\resolve(null); diff --git a/src/Composer/Installer/NoopInstaller.php b/src/Composer/Installer/NoopInstaller.php index 2af9949857a0..22cf9f80ef99 100644 --- a/src/Composer/Installer/NoopInstaller.php +++ b/src/Composer/Installer/NoopInstaller.php @@ -43,7 +43,7 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface /** * @inheritDoc */ - public function download(PackageInterface $package, PackageInterface $prevPackage = null) + public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { return \React\Promise\resolve(null); } @@ -51,7 +51,7 @@ public function download(PackageInterface $package, PackageInterface $prevPackag /** * @inheritDoc */ - public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { return \React\Promise\resolve(null); } @@ -59,7 +59,7 @@ public function prepare($type, PackageInterface $package, PackageInterface $prev /** * @inheritDoc */ - public function cleanup($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { return \React\Promise\resolve(null); } diff --git a/src/Composer/Installer/PackageEvent.php b/src/Composer/Installer/PackageEvent.php index e16ca694ca21..1630f437e93f 100644 --- a/src/Composer/Installer/PackageEvent.php +++ b/src/Composer/Installer/PackageEvent.php @@ -58,13 +58,7 @@ class PackageEvent extends Event /** * Constructor. * - * @param string $eventName - * @param Composer $composer - * @param IOInterface $io - * @param bool $devMode - * @param RepositoryInterface $localRepo * @param OperationInterface[] $operations - * @param OperationInterface $operation */ public function __construct(string $eventName, Composer $composer, IOInterface $io, bool $devMode, RepositoryInterface $localRepo, array $operations, OperationInterface $operation) { @@ -78,33 +72,21 @@ public function __construct(string $eventName, Composer $composer, IOInterface $ $this->operation = $operation; } - /** - * @return Composer - */ public function getComposer(): Composer { return $this->composer; } - /** - * @return IOInterface - */ public function getIO(): IOInterface { return $this->io; } - /** - * @return bool - */ public function isDevMode(): bool { return $this->devMode; } - /** - * @return RepositoryInterface - */ public function getLocalRepo(): RepositoryInterface { return $this->localRepo; @@ -120,8 +102,6 @@ public function getOperations(): array /** * Returns the package instance. - * - * @return OperationInterface */ public function getOperation(): OperationInterface { diff --git a/src/Composer/Installer/PluginInstaller.php b/src/Composer/Installer/PluginInstaller.php index 0b34418dbf03..68326462eefe 100644 --- a/src/Composer/Installer/PluginInstaller.php +++ b/src/Composer/Installer/PluginInstaller.php @@ -30,7 +30,7 @@ */ class PluginInstaller extends LibraryInstaller { - public function __construct(IOInterface $io, PartialComposer $composer, Filesystem $fs = null, BinaryInstaller $binaryInstaller = null) + public function __construct(IOInterface $io, PartialComposer $composer, ?Filesystem $fs = null, ?BinaryInstaller $binaryInstaller = null) { parent::__construct($io, $composer, 'composer-plugin', $fs, $binaryInstaller); } @@ -46,7 +46,7 @@ public function supports(string $packageType) /** * @inheritDoc */ - public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null) + public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null) { // fail install process early if it is going to fail due to a plugin not being allowed if (($type === 'install' || $type === 'update') && !$this->getPluginManager()->arePluginsDisabled('local')) { @@ -59,7 +59,7 @@ public function prepare($type, PackageInterface $package, PackageInterface $prev /** * @inheritDoc */ - public function download(PackageInterface $package, PackageInterface $prevPackage = null) + public function download(PackageInterface $package, ?PackageInterface $prevPackage = null) { $extra = $package->getExtra(); if (empty($extra['class'])) { diff --git a/src/Composer/Installer/ProjectInstaller.php b/src/Composer/Installer/ProjectInstaller.php index d981680abd43..3ee3aceafcde 100644 --- a/src/Composer/Installer/ProjectInstaller.php +++ b/src/Composer/Installer/ProjectInstaller.php @@ -33,9 +33,6 @@ class ProjectInstaller implements InstallerInterface /** @var Filesystem */ private $filesystem; - /** - * @param string $installPath - */ public function __construct(string $installPath, DownloadManager $dm, Filesystem $fs) { $this->installPath = rtrim(strtr($installPath, '\\', '/'), '/').'/'; @@ -45,9 +42,6 @@ public function __construct(string $installPath, DownloadManager $dm, Filesystem /** * Decides if the installer supports the given type - * - * @param string $packageType - * @return bool */ public function supports(string $packageType): bool { @@ -65,7 +59,7 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface /** * @inheritDoc */ - public function download(PackageInterface $package, PackageInterface $prevPackage = null): ?PromiseInterface + public function download(PackageInterface $package, ?PackageInterface $prevPackage = null): ?PromiseInterface { $installPath = $this->installPath; if (file_exists($installPath) && !$this->filesystem->isDirEmpty($installPath)) { @@ -81,7 +75,7 @@ public function download(PackageInterface $package, PackageInterface $prevPackag /** * @inheritDoc */ - public function prepare($type, PackageInterface $package, PackageInterface $prevPackage = null): ?PromiseInterface + public function prepare($type, PackageInterface $package, ?PackageInterface $prevPackage = null): ?PromiseInterface { return $this->downloadManager->prepare($type, $package, $this->installPath, $prevPackage); } @@ -89,7 +83,7 @@ public function prepare($type, PackageInterface $package, PackageInterface $prev /** * @inheritDoc */ - public function cleanup($type, PackageInterface $package, PackageInterface $prevPackage = null): ?PromiseInterface + public function cleanup($type, PackageInterface $package, ?PackageInterface $prevPackage = null): ?PromiseInterface { return $this->downloadManager->cleanup($type, $package, $this->installPath, $prevPackage); } @@ -121,7 +115,6 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ /** * Returns the installation path of a package * - * @param PackageInterface $package * @return string path */ public function getInstallPath(PackageInterface $package): string diff --git a/src/Composer/Installer/SuggestedPackagesReporter.php b/src/Composer/Installer/SuggestedPackagesReporter.php index 18faf55d2542..caaf81376d28 100644 --- a/src/Composer/Installer/SuggestedPackagesReporter.php +++ b/src/Composer/Installer/SuggestedPackagesReporter.php @@ -32,7 +32,7 @@ class SuggestedPackagesReporter /** * @var array */ - protected $suggestedPackages = array(); + protected $suggestedPackages = []; /** * @var IOInterface @@ -61,24 +61,20 @@ public function getPackages(): array * @param string $source Source package which made the suggestion * @param string $target Target package to be suggested * @param string $reason Reason the target package to be suggested - * @return SuggestedPackagesReporter */ public function addPackage(string $source, string $target, string $reason): SuggestedPackagesReporter { - $this->suggestedPackages[] = array( + $this->suggestedPackages[] = [ 'source' => $source, 'target' => $target, 'reason' => $reason, - ); + ]; return $this; } /** * Add all suggestions from a package. - * - * @param PackageInterface $package - * @return SuggestedPackagesReporter */ public function addSuggestionsFromPackage(PackageInterface $package): SuggestedPackagesReporter { @@ -102,14 +98,13 @@ public function addSuggestionsFromPackage(PackageInterface $package): SuggestedP * @param int $mode One of the MODE_* constants from this class * @param InstalledRepository|null $installedRepo If passed in, suggested packages which are installed already will be skipped * @param PackageInterface|null $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package, or from the package itself, will be shown - * @return void */ - public function output(int $mode, InstalledRepository $installedRepo = null, PackageInterface $onlyDependentsOf = null): void + public function output(int $mode, ?InstalledRepository $installedRepo = null, ?PackageInterface $onlyDependentsOf = null): void { $suggestedPackages = $this->getFilteredSuggestions($installedRepo, $onlyDependentsOf); - $suggesters = array(); - $suggested = array(); + $suggesters = []; + $suggested = []; foreach ($suggestedPackages as $suggestion) { $suggesters[$suggestion['source']][$suggestion['target']] = $suggestion['reason']; $suggested[$suggestion['target']][$suggestion['source']] = $suggestion['reason']; @@ -168,9 +163,8 @@ public function output(int $mode, InstalledRepository $installedRepo = null, Pac * * @param InstalledRepository|null $installedRepo If passed in, suggested packages which are installed already will be skipped * @param PackageInterface|null $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package, or from the package itself, will be shown - * @return void */ - public function outputMinimalistic(InstalledRepository $installedRepo = null, PackageInterface $onlyDependentsOf = null): void + public function outputMinimalistic(?InstalledRepository $installedRepo = null, ?PackageInterface $onlyDependentsOf = null): void { $suggestedPackages = $this->getFilteredSuggestions($installedRepo, $onlyDependentsOf); if ($suggestedPackages) { @@ -183,10 +177,10 @@ public function outputMinimalistic(InstalledRepository $installedRepo = null, Pa * @param PackageInterface|null $onlyDependentsOf If passed in, only the suggestions from direct dependents of that package, or from the package itself, will be shown * @return mixed[] */ - private function getFilteredSuggestions(InstalledRepository $installedRepo = null, PackageInterface $onlyDependentsOf = null): array + private function getFilteredSuggestions(?InstalledRepository $installedRepo = null, ?PackageInterface $onlyDependentsOf = null): array { $suggestedPackages = $this->getPackages(); - $installedNames = array(); + $installedNames = []; if (null !== $installedRepo && !empty($suggestedPackages)) { foreach ($installedRepo->getPackages() as $package) { $installedNames = array_merge( @@ -196,7 +190,7 @@ private function getFilteredSuggestions(InstalledRepository $installedRepo = nul } } - $sourceFilter = array(); + $sourceFilter = []; if ($onlyDependentsOf) { $sourceFilter = array_map(static function ($link): string { return $link->getTarget(); @@ -204,7 +198,7 @@ private function getFilteredSuggestions(InstalledRepository $installedRepo = nul $sourceFilter[] = $onlyDependentsOf->getName(); } - $suggestions = array(); + $suggestions = []; foreach ($suggestedPackages as $suggestion) { if (in_array($suggestion['target'], $installedNames) || ($sourceFilter && !in_array($suggestion['source'], $sourceFilter))) { continue; @@ -216,10 +210,6 @@ private function getFilteredSuggestions(InstalledRepository $installedRepo = nul return $suggestions; } - /** - * @param string $string - * @return string - */ private function escapeOutput(string $string): string { return OutputFormatter::escape( @@ -227,10 +217,6 @@ private function escapeOutput(string $string): string ); } - /** - * @param string $string - * @return string - */ private function removeControlCharacters(string $string): string { return Preg::replace( diff --git a/src/Composer/Json/JsonFile.php b/src/Composer/Json/JsonFile.php index 805ca57ee8a4..e850f5ec8206 100644 --- a/src/Composer/Json/JsonFile.php +++ b/src/Composer/Json/JsonFile.php @@ -56,7 +56,7 @@ class JsonFile * @param ?IOInterface $io * @throws \InvalidArgumentException */ - public function __construct(string $path, HttpDownloader $httpDownloader = null, IOInterface $io = null) + public function __construct(string $path, ?HttpDownloader $httpDownloader = null, ?IOInterface $io = null) { $this->path = $path; @@ -67,9 +67,6 @@ public function __construct(string $path, HttpDownloader $httpDownloader = null, $this->io = $io; } - /** - * @return string - */ public function getPath(): string { return $this->path; @@ -77,8 +74,6 @@ public function getPath(): string /** * Checks whether json file exists. - * - * @return bool */ public function exists(): bool { @@ -170,8 +165,6 @@ public function write(array $hash, int $options = JSON_UNESCAPED_SLASHES | JSON_ /** * Modify file properties only if content modified * - * @param string $path - * @param string $content * @return int|false */ private function filePutContentsIfModified(string $path, string $content) @@ -231,23 +224,23 @@ public static function validateJsonSchema(string $source, $data, int $schema, ?s $schemaFile = 'file://' . $schemaFile; } - $schemaData = (object) array('$ref' => $schemaFile); + $schemaData = (object) ['$ref' => $schemaFile]; if ($schema === self::LAX_SCHEMA) { $schemaData->additionalProperties = true; - $schemaData->required = array(); + $schemaData->required = []; } elseif ($schema === self::STRICT_SCHEMA && $isComposerSchemaFile) { $schemaData->additionalProperties = false; - $schemaData->required = array('name', 'description'); + $schemaData->required = ['name', 'description']; } elseif ($schema === self::AUTH_SCHEMA && $isComposerSchemaFile) { - $schemaData = (object) array('$ref' => $schemaFile.'#/properties/config', '$schema'=> "https://json-schema.org/draft-04/schema#"); + $schemaData = (object) ['$ref' => $schemaFile.'#/properties/config', '$schema' => "https://json-schema.org/draft-04/schema#"]; } $validator = new Validator(); $validator->check($data, $schemaData); if (!$validator->isValid()) { - $errors = array(); + $errors = []; foreach ((array) $validator->getErrors() as $error) { $errors[] = ($error['property'] ? $error['property'].' : ' : '').$error['message']; } @@ -279,7 +272,6 @@ public static function encode($data, int $options = 448) * * @param int $code return code of json_last_error function * @throws \RuntimeException - * @return void */ private static function throwEncodeError(int $code): void { @@ -312,7 +304,7 @@ private static function throwEncodeError(int $code): void * @throws ParsingException * @return mixed */ - public static function parseJson(?string $json, string $file = null) + public static function parseJson(?string $json, ?string $file = null) { if (null === $json) { return null; @@ -328,13 +320,12 @@ public static function parseJson(?string $json, string $file = null) /** * Validates the syntax of a JSON string * - * @param string $json * @param string $file * @throws \UnexpectedValueException * @throws ParsingException * @return bool true on success */ - protected static function validateSyntax(string $json, string $file = null): bool + protected static function validateSyntax(string $json, ?string $file = null): bool { $parser = new JsonParser(); $result = $parser->lint($json); diff --git a/src/Composer/Json/JsonFormatter.php b/src/Composer/Json/JsonFormatter.php index de1afad0decd..773ac886e28c 100644 --- a/src/Composer/Json/JsonFormatter.php +++ b/src/Composer/Json/JsonFormatter.php @@ -33,10 +33,8 @@ class JsonFormatter * Originally licensed under MIT by Dave Perrett * * - * @param string $json * @param bool $unescapeUnicode Un escape unicode * @param bool $unescapeSlashes Un escape slashes - * @return string */ public static function format(string $json, bool $unescapeUnicode, bool $unescapeSlashes): string { diff --git a/src/Composer/Json/JsonManipulator.php b/src/Composer/Json/JsonManipulator.php index f046532df18e..e62fa69724ea 100644 --- a/src/Composer/Json/JsonManipulator.php +++ b/src/Composer/Json/JsonManipulator.php @@ -38,9 +38,6 @@ class JsonManipulator /** @var string */ private $indent; - /** - * @param string $contents - */ public function __construct(string $contents) { $contents = trim($contents); @@ -55,28 +52,18 @@ public function __construct(string $contents) $this->detectIndenting(); } - /** - * @return string - */ public function getContents(): string { return $this->contents . $this->newline; } - /** - * @param string $type - * @param string $package - * @param string $constraint - * @param bool $sortPackages - * @return bool - */ public function addLink(string $type, string $package, string $constraint, bool $sortPackages = false): bool { $decoded = JsonFile::parseJson($this->contents); // no link of that type yet if (!isset($decoded[$type])) { - return $this->addMainKey($type, array($package => $constraint)); + return $this->addMainKey($type, [$package => $constraint]); } $regex = '{'.self::$DEFINES.'^(?P\s*\{\s*(?:(?&string)\s*:\s*(?&json)\s*,\s*)*?)'. @@ -131,27 +118,26 @@ public function addLink(string $type, string $package, string $constraint, bool * @link https://getcomposer.org/doc/02-libraries.md#platform-packages * * @param array $packages - * @return void */ - private function sortPackages(array &$packages = array()): void + private function sortPackages(array &$packages = []): void { $prefix = static function ($requirement): string { if (PlatformRepository::isPlatformPackage($requirement)) { return Preg::replace( - array( + [ '/^php/', '/^hhvm/', '/^ext/', '/^lib/', '/^\D/', - ), - array( + ], + [ '0-$0', '1-$0', '2-$0', '3-$0', '4-$0', - ), + ], $requirement ); } @@ -165,48 +151,33 @@ private function sortPackages(array &$packages = array()): void } /** - * @param string $name * @param array|false $config - * @param bool $append - * @return bool */ public function addRepository(string $name, $config, bool $append = true): bool { return $this->addSubNode('repositories', $name, $config, $append); } - /** - * @param string $name - * @return bool - */ public function removeRepository(string $name): bool { return $this->removeSubNode('repositories', $name); } /** - * @param string $name * @param mixed $value - * @return bool */ public function addConfigSetting(string $name, $value): bool { return $this->addSubNode('config', $name, $value); } - /** - * @param string $name - * @return bool - */ public function removeConfigSetting(string $name): bool { return $this->removeSubNode('config', $name); } /** - * @param string $name * @param mixed $value - * @return bool */ public function addProperty(string $name, $value): bool { @@ -225,10 +196,6 @@ public function addProperty(string $name, $value): bool return $this->addMainKey($name, $value); } - /** - * @param string $name - * @return bool - */ public function removeProperty(string $name): bool { if (strpos($name, 'suggest.') === 0) { @@ -247,27 +214,23 @@ public function removeProperty(string $name): bool } /** - * @param string $mainNode - * @param string $name * @param mixed $value - * @param bool $append - * @return bool */ public function addSubNode(string $mainNode, string $name, $value, bool $append = true): bool { $decoded = JsonFile::parseJson($this->contents); $subName = null; - if (in_array($mainNode, array('config', 'extra', 'scripts')) && false !== strpos($name, '.')) { - list($name, $subName) = explode('.', $name, 2); + if (in_array($mainNode, ['config', 'extra', 'scripts']) && false !== strpos($name, '.')) { + [$name, $subName] = explode('.', $name, 2); } // no main node yet if (!isset($decoded[$mainNode])) { if ($subName !== null) { - $this->addMainKey($mainNode, array($name => array($subName => $value))); + $this->addMainKey($mainNode, [$name => [$subName => $value]]); } else { - $this->addMainKey($mainNode, array($name => $value)); + $this->addMainKey($mainNode, [$name => $value]); } return true; @@ -301,7 +264,7 @@ public function addSubNode(string $mainNode, string $name, $value, bool $append if ($subName !== null) { $curVal = json_decode($matches['content'], true); if (!is_array($curVal)) { - $curVal = array(); + $curVal = []; } $curVal[$subName] = $value; $value = $curVal; @@ -319,7 +282,7 @@ public function addSubNode(string $mainNode, string $name, $value, bool $append if (!empty($match['content'])) { if ($subName !== null) { - $value = array($subName => $value); + $value = [$subName => $value]; } // child missing but non empty children @@ -343,7 +306,7 @@ public function addSubNode(string $mainNode, string $name, $value, bool $append } } else { if ($subName !== null) { - $value = array($subName => $value); + $value = [$subName => $value]; } // children present but empty @@ -358,11 +321,6 @@ public function addSubNode(string $mainNode, string $name, $value, bool $append return true; } - /** - * @param string $mainNode - * @param string $name - * @return bool - */ public function removeSubNode(string $mainNode, string $name): bool { $decoded = JsonFile::parseJson($this->contents); @@ -394,8 +352,8 @@ public function removeSubNode(string $mainNode, string $name): bool } $subName = null; - if (in_array($mainNode, array('config', 'extra', 'scripts')) && false !== strpos($name, '.')) { - list($name, $subName) = explode('.', $name, 2); + if (in_array($mainNode, ['config', 'extra', 'scripts']) && false !== strpos($name, '.')) { + [$name, $subName] = explode('.', $name, 2); } // no node to remove @@ -465,9 +423,7 @@ public function removeSubNode(string $mainNode, string $name): bool } /** - * @param string $key * @param mixed $content - * @return bool */ public function addMainKey(string $key, $content): bool { @@ -509,10 +465,6 @@ public function addMainKey(string $key, $content): bool return true; } - /** - * @param string $key - * @return bool - */ public function removeMainKey(string $key): bool { $decoded = JsonFile::parseJson($this->contents); @@ -546,10 +498,6 @@ public function removeMainKey(string $key): bool return false; } - /** - * @param string $key - * @return bool - */ public function removeMainKeyIfEmpty(string $key): bool { $decoded = JsonFile::parseJson($this->contents); @@ -567,8 +515,6 @@ public function removeMainKeyIfEmpty(string $key): bool /** * @param mixed $data - * @param int $depth - * @return string */ public function format($data, int $depth = 0): string { @@ -584,7 +530,7 @@ public function format($data, int $depth = 0): string } $out = '{' . $this->newline; - $elems = array(); + $elems = []; foreach ($data as $key => $val) { $elems[] = str_repeat($this->indent, $depth + 2) . JsonFile::encode($key). ': '.$this->format($val, $depth + 1); } @@ -595,9 +541,6 @@ public function format($data, int $depth = 0): string return JsonFile::encode($data); } - /** - * @return void - */ protected function detectIndenting(): void { if (Preg::isMatch('{^([ \t]+)"}m', $this->contents, $match)) { diff --git a/src/Composer/Json/JsonValidationException.php b/src/Composer/Json/JsonValidationException.php index 783d471d176c..28c22fcf905f 100644 --- a/src/Composer/Json/JsonValidationException.php +++ b/src/Composer/Json/JsonValidationException.php @@ -25,10 +25,9 @@ class JsonValidationException extends Exception protected $errors; /** - * @param string $message * @param string[] $errors */ - public function __construct(string $message, array $errors = array(), Exception $previous = null) + public function __construct(string $message, array $errors = [], ?Exception $previous = null) { $this->errors = $errors; parent::__construct((string) $message, 0, $previous); diff --git a/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/src/Composer/PHPStan/ConfigReturnTypeExtension.php index 6a9139387210..a1e6359bb1da 100644 --- a/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -1,5 +1,15 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\PHPStan; use Composer\Config; @@ -17,7 +27,6 @@ use PHPStan\Type\IntegerRangeType; use PHPStan\Type\IntegerType; use PHPStan\Type\MixedType; -use PHPStan\Type\ObjectType; use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; diff --git a/src/Composer/Package/AliasPackage.php b/src/Composer/Package/AliasPackage.php index 2a7663d2a850..75d3158cc573 100644 --- a/src/Composer/Package/AliasPackage.php +++ b/src/Composer/Package/AliasPackage.php @@ -68,7 +68,7 @@ public function __construct(BasePackage $aliasOf, string $version, string $prett foreach (Link::$TYPES as $type) { $links = $aliasOf->{'get' . ucfirst($type)}(); - $this->$type = $this->replaceSelfVersionDependencies($links, $type); + $this->{$type} = $this->replaceSelfVersionDependencies($links, $type); } } @@ -167,7 +167,6 @@ public function setRootPackageAlias(bool $value): void /** * @see setRootPackageAlias - * @return bool */ public function isRootPackageAlias(): bool { @@ -188,8 +187,8 @@ protected function replaceSelfVersionDependencies(array $links, $linkType): arra $prettyVersion = $this->aliasOf->getPrettyVersion(); } - if (\in_array($linkType, array(Link::TYPE_CONFLICT, Link::TYPE_PROVIDE, Link::TYPE_REPLACE), true)) { - $newLinks = array(); + if (\in_array($linkType, [Link::TYPE_CONFLICT, Link::TYPE_PROVIDE, Link::TYPE_REPLACE], true)) { + $newLinks = []; foreach ($links as $link) { // link is self.version, but must be replacing also the replaced version if ('self.version' === $link->getPrettyConstraint()) { @@ -213,9 +212,6 @@ protected function replaceSelfVersionDependencies(array $links, $linkType): arra return $links; } - /** - * @return bool - */ public function hasSelfVersionRequires(): bool { return $this->hasSelfVersionRequires; diff --git a/src/Composer/Package/Archiver/ArchivableFilesFilter.php b/src/Composer/Package/Archiver/ArchivableFilesFilter.php index b454dca4de45..fdf81748beda 100644 --- a/src/Composer/Package/Archiver/ArchivableFilesFilter.php +++ b/src/Composer/Package/Archiver/ArchivableFilesFilter.php @@ -18,7 +18,7 @@ class ArchivableFilesFilter extends FilterIterator { /** @var string[] */ - private $dirs = array(); + private $dirs = []; /** * @return bool true if the current element is acceptable, otherwise false. @@ -35,11 +35,6 @@ public function accept(): bool return true; } - /** - * @param string $sources - * - * @return void - */ public function addEmptyDir(PharData $phar, string $sources): void { foreach ($this->dirs as $filepath) { diff --git a/src/Composer/Package/Archiver/ArchivableFilesFinder.php b/src/Composer/Package/Archiver/ArchivableFilesFinder.php index b37e50f55025..71f763d438b9 100644 --- a/src/Composer/Package/Archiver/ArchivableFilesFinder.php +++ b/src/Composer/Package/Archiver/ArchivableFilesFinder.php @@ -47,12 +47,12 @@ public function __construct(string $sources, array $excludes, bool $ignoreFilter $sources = $fs->normalizePath(realpath($sources)); if ($ignoreFilters) { - $filters = array(); + $filters = []; } else { - $filters = array( + $filters = [ new GitExcludeFilter($sources), new ComposerExcludeFilter($sources, $excludes), - ); + ]; } $this->finder = new Finder(); diff --git a/src/Composer/Package/Archiver/ArchiveManager.php b/src/Composer/Package/Archiver/ArchiveManager.php index 973fb9eadfa3..b127a0d16f5c 100644 --- a/src/Composer/Package/Archiver/ArchiveManager.php +++ b/src/Composer/Package/Archiver/ArchiveManager.php @@ -35,7 +35,7 @@ class ArchiveManager /** * @var ArchiverInterface[] */ - protected $archivers = array(); + protected $archivers = []; /** * @var bool @@ -51,11 +51,6 @@ public function __construct(DownloadManager $downloadManager, Loop $loop) $this->loop = $loop; } - /** - * @param ArchiverInterface $archiver - * - * @return void - */ public function addArchiver(ArchiverInterface $archiver): void { $this->archivers[] = $archiver; @@ -89,7 +84,7 @@ public function getPackageFilename(CompletePackageInterface $package): string } else { $baseName = Preg::replace('#[^a-z0-9-_]#i', '-', $package->getName()); } - $nameParts = array($baseName); + $nameParts = [$baseName]; if (null !== $package->getDistReference() && Preg::isMatch('{^[a-f0-9]{40}$}', $package->getDistReference())) { array_push($nameParts, $package->getDistReference(), $package->getDistType()); diff --git a/src/Composer/Package/Archiver/ArchiverInterface.php b/src/Composer/Package/Archiver/ArchiverInterface.php index 8b3ef316b316..7ebc792d1f37 100644 --- a/src/Composer/Package/Archiver/ArchiverInterface.php +++ b/src/Composer/Package/Archiver/ArchiverInterface.php @@ -30,7 +30,7 @@ interface ArchiverInterface * * @return string The path to the written archive file */ - public function archive(string $sources, string $target, string $format, array $excludes = array(), bool $ignoreFilters = false): string; + public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = false): string; /** * Format supported by the archiver. diff --git a/src/Composer/Package/Archiver/BaseExcludeFilter.php b/src/Composer/Package/Archiver/BaseExcludeFilter.php index a7e587fc3924..e2af2b2d3eb0 100644 --- a/src/Composer/Package/Archiver/BaseExcludeFilter.php +++ b/src/Composer/Package/Archiver/BaseExcludeFilter.php @@ -36,7 +36,7 @@ abstract class BaseExcludeFilter public function __construct(string $sourcePath) { $this->sourcePath = $sourcePath; - $this->excludePatterns = array(); + $this->excludePatterns = []; } /** @@ -52,7 +52,7 @@ public function __construct(string $sourcePath) public function filter(string $relativePath, bool $exclude): bool { foreach ($this->excludePatterns as $patternData) { - list($pattern, $negate, $stripLeadingSlash) = $patternData; + [$pattern, $negate, $stripLeadingSlash] = $patternData; if ($stripLeadingSlash) { $path = substr($relativePath, 1); @@ -91,7 +91,7 @@ static function ($line) use ($lineParser) { return null; } - return call_user_func($lineParser, $line); + return $lineParser($line); }, $lines ), @@ -110,7 +110,7 @@ static function ($pattern): bool { */ protected function generatePatterns(array $rules): array { - $patterns = array(); + $patterns = []; foreach ($rules as $rule) { $patterns[] = $this->generatePattern($rule); } @@ -147,6 +147,6 @@ protected function generatePattern(string $rule): array // remove delimiters as well as caret (^) and dollar sign ($) from the regex $rule = substr(Finder\Glob::toRegex($rule), 2, -2); - return array('{'.$pattern.$rule.'(?=$|/)}', $negate, false); + return ['{'.$pattern.$rule.'(?=$|/)}', $negate, false]; } } diff --git a/src/Composer/Package/Archiver/GitExcludeFilter.php b/src/Composer/Package/Archiver/GitExcludeFilter.php index 12b4c5a657d7..917f9fced955 100644 --- a/src/Composer/Package/Archiver/GitExcludeFilter.php +++ b/src/Composer/Package/Archiver/GitExcludeFilter.php @@ -25,8 +25,6 @@ class GitExcludeFilter extends BaseExcludeFilter { /** * Parses .gitattributes if it exists - * - * @param string $sourcePath */ public function __construct(string $sourcePath) { @@ -37,7 +35,7 @@ public function __construct(string $sourcePath) $this->excludePatterns, $this->parseLines( file($sourcePath.'/.gitattributes'), - array($this, 'parseGitAttributesLine') + [$this, 'parseGitAttributesLine'] ) ); } diff --git a/src/Composer/Package/Archiver/PharArchiver.php b/src/Composer/Package/Archiver/PharArchiver.php index a0131bb54423..c3d025f8d8af 100644 --- a/src/Composer/Package/Archiver/PharArchiver.php +++ b/src/Composer/Package/Archiver/PharArchiver.php @@ -20,23 +20,23 @@ class PharArchiver implements ArchiverInterface { /** @var array */ - protected static $formats = array( + protected static $formats = [ 'zip' => \Phar::ZIP, 'tar' => \Phar::TAR, 'tar.gz' => \Phar::TAR, 'tar.bz2' => \Phar::TAR, - ); + ]; /** @var array */ - protected static $compressFormats = array( + protected static $compressFormats = [ 'tar.gz' => \Phar::GZ, 'tar.bz2' => \Phar::BZ2, - ); + ]; /** * @inheritDoc */ - public function archive(string $sources, string $target, string $format, array $excludes = array(), bool $ignoreFilters = false): string + public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = false): string { $sources = realpath($sources); diff --git a/src/Composer/Package/Archiver/ZipArchiver.php b/src/Composer/Package/Archiver/ZipArchiver.php index fce4f14bcd89..71f512e5c3f6 100644 --- a/src/Composer/Package/Archiver/ZipArchiver.php +++ b/src/Composer/Package/Archiver/ZipArchiver.php @@ -21,14 +21,14 @@ class ZipArchiver implements ArchiverInterface { /** @var array */ - protected static $formats = array( + protected static $formats = [ 'zip' => true, - ); + ]; /** * @inheritDoc */ - public function archive(string $sources, string $target, string $format, array $excludes = array(), bool $ignoreFilters = false): string + public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = false): string { $fs = new Filesystem(); $sources = $fs->normalizePath($sources); @@ -83,9 +83,6 @@ public function supports(string $format, ?string $sourceType): bool return isset(static::$formats[$format]) && $this->compressionAvailable(); } - /** - * @return bool - */ private function compressionAvailable(): bool { return class_exists('ZipArchive'); diff --git a/src/Composer/Package/BasePackage.php b/src/Composer/Package/BasePackage.php index 509a33e1ae1f..d6d37d360d91 100644 --- a/src/Composer/Package/BasePackage.php +++ b/src/Composer/Package/BasePackage.php @@ -26,13 +26,13 @@ abstract class BasePackage implements PackageInterface * @phpstan-var array * @internal */ - public static $supportedLinkTypes = array( - 'require' => array('description' => 'requires', 'method' => Link::TYPE_REQUIRE), - 'conflict' => array('description' => 'conflicts', 'method' => Link::TYPE_CONFLICT), - 'provide' => array('description' => 'provides', 'method' => Link::TYPE_PROVIDE), - 'replace' => array('description' => 'replaces', 'method' => Link::TYPE_REPLACE), - 'require-dev' => array('description' => 'requires (for development)', 'method' => Link::TYPE_DEV_REQUIRE), - ); + public static $supportedLinkTypes = [ + 'require' => ['description' => 'requires', 'method' => Link::TYPE_REQUIRE], + 'conflict' => ['description' => 'conflicts', 'method' => Link::TYPE_CONFLICT], + 'provide' => ['description' => 'provides', 'method' => Link::TYPE_PROVIDE], + 'replace' => ['description' => 'replaces', 'method' => Link::TYPE_REPLACE], + 'require-dev' => ['description' => 'requires (for development)', 'method' => Link::TYPE_DEV_REQUIRE], + ]; public const STABILITY_STABLE = 0; public const STABILITY_RC = 5; @@ -41,13 +41,13 @@ abstract class BasePackage implements PackageInterface public const STABILITY_DEV = 20; /** @var array */ - public static $stabilities = array( + public static $stabilities = [ 'stable' => self::STABILITY_STABLE, 'RC' => self::STABILITY_RC, 'beta' => self::STABILITY_BETA, 'alpha' => self::STABILITY_ALPHA, 'dev' => self::STABILITY_DEV, - ); + ]; /** * READ-ONLY: The package id, public for fast access in dependency solver @@ -95,9 +95,9 @@ public function getPrettyName(): string */ public function getNames($provides = true): array { - $names = array( + $names = [ $this->getName() => true, - ); + ]; if ($provides) { foreach ($this->getProvides() as $link) { @@ -154,8 +154,6 @@ public function getRepository(): ?RepositoryInterface /** * checks if this package is a platform package - * - * @return bool */ public function isPlatform(): bool { @@ -164,17 +162,12 @@ public function isPlatform(): bool /** * Returns package unique name, constructed from name, version and release type. - * - * @return string */ public function getUniqueName(): string { return $this->getName().'-'.$this->getVersion(); } - /** - * @return bool - */ public function equals(PackageInterface $package): bool { $self = $this; @@ -190,8 +183,6 @@ public function equals(PackageInterface $package): bool /** * Converts the package into a readable and unique string - * - * @return string */ public function __toString(): string { @@ -209,7 +200,7 @@ public function getPrettyString(): string public function getFullPrettyVersion(bool $truncate = true, int $displayMode = PackageInterface::DISPLAY_SOURCE_REF_IF_DEV): string { if ($displayMode === PackageInterface::DISPLAY_SOURCE_REF_IF_DEV && - (!$this->isDev() || !\in_array($this->getSourceType(), array('hg', 'git'))) + (!$this->isDev() || !\in_array($this->getSourceType(), ['hg', 'git'])) ) { return $this->getPrettyVersion(); } @@ -239,8 +230,6 @@ public function getFullPrettyVersion(bool $truncate = true, int $displayMode = P } /** - * @return int - * * @phpstan-return self::STABILITY_* */ public function getStabilityPriority(): int @@ -257,7 +246,6 @@ public function __clone() /** * Build a regexp from a package name, expanding * globs as required * - * @param string $allowPattern * @param non-empty-string $wrap Wrap the cleaned string by the given string * @return non-empty-string */ diff --git a/src/Composer/Package/Comparer/Comparer.php b/src/Composer/Package/Comparer/Comparer.php index a52e1c1af17a..1fd79b8bbd6d 100644 --- a/src/Composer/Package/Comparer/Comparer.php +++ b/src/Composer/Package/Comparer/Comparer.php @@ -28,29 +28,17 @@ class Comparer /** @var array{changed?: string[], removed?: string[], added?: string[]} */ private $changed; - /** - * @param string $source - * - * @return void - */ public function setSource(string $source): void { $this->source = $source; } - /** - * @param string $update - * - * @return void - */ public function setUpdate(string $update): void { $this->update = $update; } /** - * @param bool $explicated - * * @return array{changed?: string[], removed?: string[], added?: string[]}|false false if no change */ public function getChanged(bool $explicated = false) @@ -71,8 +59,6 @@ public function getChanged(bool $explicated = false) } /** - * @param bool $explicated - * * @return string empty string if no changes */ public function getChangedAsString(bool $toString = false, bool $explicated = false): string @@ -82,7 +68,7 @@ public function getChangedAsString(bool $toString = false, bool $explicated = fa return ''; } - $strings = array(); + $strings = []; foreach ($changed as $sectionKey => $itemSection) { foreach ($itemSection as $itemKey => $item) { $strings[] = $item."\r\n"; @@ -92,14 +78,11 @@ public function getChangedAsString(bool $toString = false, bool $explicated = fa return trim(implode("\r\n", $strings)); } - /** - * @return void - */ public function doCompare(): void { - $source = array(); - $destination = array(); - $this->changed = array(); + $source = []; + $destination = []; + $this->changed = []; $currentDirectory = Platform::getCwd(); chdir($this->source); $source = $this->doTree('.', $source); @@ -134,7 +117,6 @@ public function doCompare(): void } /** - * @param string $dir * @param mixed[] $array * * @return array>|false diff --git a/src/Composer/Package/CompletePackage.php b/src/Composer/Package/CompletePackage.php index fc706cfe9380..66a5a127cb95 100644 --- a/src/Composer/Package/CompletePackage.php +++ b/src/Composer/Package/CompletePackage.php @@ -20,29 +20,29 @@ class CompletePackage extends Package implements CompletePackageInterface { /** @var mixed[] */ - protected $repositories = array(); + protected $repositories = []; /** @var string[] */ - protected $license = array(); + protected $license = []; /** @var string[] */ - protected $keywords = array(); + protected $keywords = []; /** @var array */ - protected $authors = array(); + protected $authors = []; /** @var ?string */ protected $description = null; /** @var ?string */ protected $homepage = null; /** @var array Map of script name to array of handlers */ - protected $scripts = array(); + protected $scripts = []; /** @var array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string} */ - protected $support = array(); + protected $support = []; /** @var array */ - protected $funding = array(); + protected $funding = []; /** @var bool|string */ protected $abandoned = false; /** @var ?string */ protected $archiveName = null; /** @var string[] */ - protected $archiveExcludes = array(); + protected $archiveExcludes = []; /** * @inheritDoc diff --git a/src/Composer/Package/CompletePackageInterface.php b/src/Composer/Package/CompletePackageInterface.php index c6198dfe6efb..b24a0f9fc283 100644 --- a/src/Composer/Package/CompletePackageInterface.php +++ b/src/Composer/Package/CompletePackageInterface.php @@ -30,7 +30,6 @@ public function getScripts(): array; /** * @param array $scripts - * @return void */ public function setScripts(array $scripts): void; @@ -45,7 +44,6 @@ public function getRepositories(): array; * Set the repositories * * @param mixed[] $repositories - * @return void */ public function setRepositories(array $repositories): void; @@ -60,7 +58,6 @@ public function getLicense(): array; * Set the license * * @param string[] $license - * @return void */ public function setLicense(array $license): void; @@ -75,7 +72,6 @@ public function getKeywords(): array; * Set the keywords * * @param string[] $keywords - * @return void */ public function setKeywords(array $keywords): void; @@ -88,9 +84,6 @@ public function getDescription(): ?string; /** * Set the description - * - * @param string $description - * @return void */ public function setDescription(string $description): void; @@ -103,9 +96,6 @@ public function getHomepage(): ?string; /** * Set the homepage - * - * @param string $homepage - * @return void */ public function setHomepage(string $homepage): void; @@ -122,7 +112,6 @@ public function getAuthors(): array; * Set the authors * * @param array $authors - * @return void */ public function setAuthors(array $authors): void; @@ -137,7 +126,6 @@ public function getSupport(): array; * Set the support information * * @param array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string} $support - * @return void */ public function setSupport(array $support): void; @@ -154,27 +142,21 @@ public function getFunding(): array; * Set the funding * * @param array $funding - * @return void */ public function setFunding(array $funding): void; /** * Returns if the package is abandoned or not - * - * @return bool */ public function isAbandoned(): bool; /** * If the package is abandoned and has a suggested replacement, this method returns it - * - * @return string|null */ public function getReplacementPackage(): ?string; /** * @param bool|string $abandoned - * @return void */ public function setAbandoned($abandoned): void; @@ -187,9 +169,6 @@ public function getArchiveName(): ?string; /** * Sets default base filename for archive - * - * @param string $name - * @return void */ public function setArchiveName(string $name): void; @@ -204,7 +183,6 @@ public function getArchiveExcludes(): array; * Sets a list of patterns to be excluded from archives * * @param string[] $excludes - * @return void */ public function setArchiveExcludes(array $excludes): void; } diff --git a/src/Composer/Package/Dumper/ArrayDumper.php b/src/Composer/Package/Dumper/ArrayDumper.php index d150504e66e6..f713fbe333aa 100644 --- a/src/Composer/Package/Dumper/ArrayDumper.php +++ b/src/Composer/Package/Dumper/ArrayDumper.php @@ -28,7 +28,7 @@ class ArrayDumper */ public function dump(PackageInterface $package): array { - $keys = array( + $keys = [ 'binaries' => 'bin', 'type', 'extra', @@ -37,9 +37,9 @@ public function dump(PackageInterface $package): array 'devAutoload' => 'autoload-dev', 'notificationUrl' => 'notification-url', 'includePaths' => 'include-path', - ); + ]; - $data = array(); + $data = []; $data['name'] = $package->getPrettyName(); $data['version'] = $package->getPrettyVersion(); $data['version_normalized'] = $package->getVersion(); @@ -105,7 +105,7 @@ public function dump(PackageInterface $package): array $data['archive']['exclude'] = $package->getArchiveExcludes(); } - $keys = array( + $keys = [ 'scripts', 'license', 'authors', @@ -115,7 +115,7 @@ public function dump(PackageInterface $package): array 'repositories', 'support', 'funding', - ); + ]; $data = $this->dumpValues($package, $keys, $data); @@ -156,7 +156,7 @@ private function dumpValues(PackageInterface $package, array $keys, array $data) } $getter = 'get'.ucfirst($method); - $value = $package->$getter(); + $value = $package->{$getter}(); if (null !== $value && !(\is_array($value) && 0 === \count($value))) { $data[$key] = $value; diff --git a/src/Composer/Package/Link.php b/src/Composer/Package/Link.php index 59bfb993fdf1..7b19f83a7977 100644 --- a/src/Composer/Package/Link.php +++ b/src/Composer/Package/Link.php @@ -42,13 +42,13 @@ class Link * @var string[] * @phpstan-var array */ - public static $TYPES = array( + public static $TYPES = [ self::TYPE_REQUIRE, self::TYPE_DEV_REQUIRE, self::TYPE_PROVIDE, self::TYPE_CONFLICT, self::TYPE_REPLACE, - ); + ]; /** * @var string @@ -79,11 +79,8 @@ class Link /** * Creates a new package link. * - * @param string $source - * @param string $target * @param ConstraintInterface $constraint Constraint applying to the target of this link * @param self::TYPE_* $description Used to create a descriptive string representation - * @param string|null $prettyConstraint */ public function __construct( string $source, @@ -99,33 +96,21 @@ public function __construct( $this->prettyConstraint = $prettyConstraint; } - /** - * @return string - */ public function getDescription(): string { return $this->description; } - /** - * @return string - */ public function getSource(): string { return $this->source; } - /** - * @return string - */ public function getTarget(): string { return $this->target; } - /** - * @return ConstraintInterface - */ public function getConstraint(): ConstraintInterface { return $this->constraint; @@ -133,7 +118,6 @@ public function getConstraint(): ConstraintInterface /** * @throws \UnexpectedValueException If no pretty constraint was provided - * @return string */ public function getPrettyConstraint(): string { @@ -144,18 +128,11 @@ public function getPrettyConstraint(): string return $this->prettyConstraint; } - /** - * @return string - */ public function __toString(): string { return $this->source.' '.$this->description.' '.$this->target.' ('.$this->constraint.')'; } - /** - * @param PackageInterface $sourcePackage - * @return string - */ public function getPrettyString(PackageInterface $sourcePackage): string { return $sourcePackage->getPrettyString().' '.$this->description.' '.$this->target.' '.$this->constraint->getPrettyString(); diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 618c397eea3c..ef7ae0fb6771 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -34,10 +34,7 @@ class ArrayLoader implements LoaderInterface /** @var bool */ protected $loadOptions; - /** - * @param bool $loadOptions - */ - public function __construct(VersionParser $parser = null, bool $loadOptions = false) + public function __construct(?VersionParser $parser = null, bool $loadOptions = false) { if (!$parser) { $parser = new VersionParser; @@ -83,8 +80,8 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa */ public function loadPackages(array $versions): array { - $packages = array(); - $linkCache = array(); + $packages = []; + $linkCache = []; foreach ($versions as $version) { $package = $this->createObject($version, 'Composer\Package\CompletePackage'); @@ -159,7 +156,7 @@ private function configureObject(PackageInterface $package, array $config): Base if (isset($config['bin'])) { if (!\is_array($config['bin'])) { - $config['bin'] = array($config['bin']); + $config['bin'] = [$config['bin']]; } foreach ($config['bin'] as $key => $bin) { $config['bin'][$key] = ltrim($bin, '/'); @@ -256,7 +253,7 @@ private function configureObject(PackageInterface $package, array $config): Base foreach ($config['scripts'] as $event => $listeners) { $config['scripts'][$event] = (array) $listeners; } - foreach (array('composer', 'php', 'putenv') as $reserved) { + foreach (['composer', 'php', 'putenv'] as $reserved) { if (isset($config['scripts'][$reserved])) { trigger_error('The `'.$reserved.'` script name is reserved for internal use, please avoid defining it', E_USER_DEPRECATED); } @@ -277,7 +274,7 @@ private function configureObject(PackageInterface $package, array $config): Base } if (!empty($config['license'])) { - $package->setLicense(\is_array($config['license']) ? $config['license'] : array($config['license'])); + $package->setLicense(\is_array($config['license']) ? $config['license'] : [$config['license']]); } if (!empty($config['authors']) && \is_array($config['authors'])) { @@ -316,10 +313,7 @@ private function configureObject(PackageInterface $package, array $config): Base /** * @param array>>> $linkCache - * @param PackageInterface $package * @param mixed[] $config - * - * @return void */ private function configureCachedLinks(array &$linkCache, PackageInterface $package, array $config): void { @@ -330,7 +324,7 @@ private function configureCachedLinks(array &$linkCache, PackageInterface $packa if (isset($config[$type])) { $method = 'set'.ucfirst($opts['method']); - $links = array(); + $links = []; foreach ($config[$type] as $prettyTarget => $constraint) { $target = strtolower($prettyTarget); @@ -343,10 +337,10 @@ private function configureCachedLinks(array &$linkCache, PackageInterface $packa $links[$target] = $this->createLink($name, $prettyVersion, $opts['method'], $target, $constraint); } else { if (!isset($linkCache[$name][$type][$target][$constraint])) { - $linkCache[$name][$type][$target][$constraint] = array($target, $this->createLink($name, $prettyVersion, $opts['method'], $target, $constraint)); + $linkCache[$name][$type][$target][$constraint] = [$target, $this->createLink($name, $prettyVersion, $opts['method'], $target, $constraint)]; } - list($target, $link) = $linkCache[$name][$type][$target][$constraint]; + [$target, $link] = $linkCache[$name][$type][$target][$constraint]; $links[$target] = $link; } } @@ -368,7 +362,7 @@ private function configureCachedLinks(array &$linkCache, PackageInterface $packa */ public function parseLinks(string $source, string $sourceVersion, string $description, array $links): array { - $res = array(); + $res = []; foreach ($links as $target => $constraint) { $target = strtolower((string) $target); $res[$target] = $this->createLink($source, $sourceVersion, $description, $target, $constraint); @@ -383,7 +377,6 @@ public function parseLinks(string $source, string $sourceVersion, string $descri * @param Link::TYPE_* $description link description (e.g. requires, replaces, ..) * @param string $target target package name * @param string $prettyConstraint constraint string - * @return Link */ private function createLink(string $source, string $sourceVersion, string $description, string $target, string $prettyConstraint): Link { diff --git a/src/Composer/Package/Loader/RootPackageLoader.php b/src/Composer/Package/Loader/RootPackageLoader.php index 211a23c87536..588a7278712f 100644 --- a/src/Composer/Package/Loader/RootPackageLoader.php +++ b/src/Composer/Package/Loader/RootPackageLoader.php @@ -49,7 +49,7 @@ class RootPackageLoader extends ArrayLoader */ private $versionGuesser; - public function __construct(RepositoryManager $manager, Config $config, VersionParser $parser = null, VersionGuesser $versionGuesser = null, IOInterface $io = null) + public function __construct(RepositoryManager $manager, Config $config, ?VersionParser $parser = null, ?VersionGuesser $versionGuesser = null, ?IOInterface $io = null) { parent::__construct($parser); @@ -61,7 +61,6 @@ public function __construct(RepositoryManager $manager, Config $config, VersionP /** * @inheritDoc * - * @param string|null $cwd * * @return RootPackage|RootAliasPackage * @@ -100,16 +99,16 @@ public function load(array $config, string $class = 'Composer\Package\RootPackag } if ($commit) { - $config['source'] = array( + $config['source'] = [ 'type' => '', 'url' => '', 'reference' => $commit, - ); - $config['dist'] = array( + ]; + $config['dist'] = [ 'type' => '', 'url' => '', 'reference' => $commit, - ); + ]; } } @@ -133,15 +132,15 @@ public function load(array $config, string $class = 'Composer\Package\RootPackag $realPackage->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability'])); } - $aliases = array(); - $stabilityFlags = array(); - $references = array(); - foreach (array('require', 'require-dev') as $linkType) { + $aliases = []; + $stabilityFlags = []; + $references = []; + foreach (['require', 'require-dev'] as $linkType) { if (isset($config[$linkType])) { $linkInfo = BasePackage::$supportedLinkTypes[$linkType]; $method = 'get'.ucfirst($linkInfo['method']); - $links = array(); - foreach ($realPackage->$method() as $link) { + $links = []; + foreach ($realPackage->{$method}() as $link) { $links[$link->getTarget()] = $link->getConstraint()->getPrettyString(); } $aliases = $this->extractAliases($links, $aliases); @@ -196,12 +195,12 @@ private function extractAliases(array $requires, array $aliases): array { foreach ($requires as $reqName => $reqVersion) { if (Preg::isMatch('{^([^,\s#]+)(?:#[^ ]+)? +as +([^,\s]+)$}', $reqVersion, $match)) { - $aliases[] = array( + $aliases[] = [ 'package' => strtolower($reqName), 'version' => $this->versionParser->normalize($match[1], $reqVersion), 'alias' => $match[2], 'alias_normalized' => $this->versionParser->normalize($match[2], $reqVersion), - ); + ]; } elseif (strpos($reqVersion, ' as ') !== false) { throw new \UnexpectedValueException('Invalid alias definition in "'.$reqName.'": "'.$reqVersion.'". Aliases should be in the form "exact-version as other-exact-version".'); } @@ -214,7 +213,6 @@ private function extractAliases(array $requires, array $aliases): array * @internal * * @param array $requires - * @param string $minimumStability * @param array $stabilityFlags * * @return array @@ -228,7 +226,7 @@ public static function extractStabilityFlags(array $requires, string $minimumSta /** @var int $minimumStability */ $minimumStability = $stabilities[$minimumStability]; foreach ($requires as $reqName => $reqVersion) { - $constraints = array(); + $constraints = []; // extract all sub-constraints in case it is an OR/AND multi-constraint $orSplit = Preg::split('{\s*\|\|?\s*}', trim($reqVersion)); diff --git a/src/Composer/Package/Loader/ValidatingArrayLoader.php b/src/Composer/Package/Loader/ValidatingArrayLoader.php index 7e4318b85683..020cd5b1b901 100644 --- a/src/Composer/Package/Loader/ValidatingArrayLoader.php +++ b/src/Composer/Package/Loader/ValidatingArrayLoader.php @@ -43,9 +43,8 @@ class ValidatingArrayLoader implements LoaderInterface /** * @param true $strictName - * @param int $flags */ - public function __construct(LoaderInterface $loader, bool $strictName = true, VersionParser $parser = null, int $flags = 0) + public function __construct(LoaderInterface $loader, bool $strictName = true, ?VersionParser $parser = null, int $flags = 0) { $this->loader = $loader; $this->versionParser = $parser ?: new VersionParser(); @@ -61,8 +60,8 @@ public function __construct(LoaderInterface $loader, bool $strictName = true, Ve */ public function load(array $config, string $class = 'Composer\Package\CompletePackage'): BasePackage { - $this->errors = array(); - $this->warnings = array(); + $this->errors = []; + $this->warnings = []; $this->config = $config; $this->validateString('name', true); @@ -168,7 +167,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa unset($this->config['authors'][$key]); continue; } - foreach (array('homepage', 'email', 'name', 'role') as $authorData) { + foreach (['homepage', 'email', 'name', 'role'] as $authorData) { if (isset($author[$authorData]) && !is_string($author[$authorData])) { $this->errors[] = 'authors.'.$key.'.'.$authorData.' : invalid value, must be a string'; unset($this->config['authors'][$key][$authorData]); @@ -192,7 +191,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa } if ($this->validateArray('support') && !empty($this->config['support'])) { - foreach (array('issues', 'forum', 'wiki', 'source', 'email', 'irc', 'docs', 'rss', 'chat') as $key) { + foreach (['issues', 'forum', 'wiki', 'source', 'email', 'irc', 'docs', 'rss', 'chat'] as $key) { if (isset($this->config['support'][$key]) && !is_string($this->config['support'][$key])) { $this->errors[] = 'support.'.$key.' : invalid value, must be a string'; unset($this->config['support'][$key]); @@ -204,12 +203,12 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa unset($this->config['support']['email']); } - if (isset($this->config['support']['irc']) && !$this->filterUrl($this->config['support']['irc'], array('irc', 'ircs'))) { + if (isset($this->config['support']['irc']) && !$this->filterUrl($this->config['support']['irc'], ['irc', 'ircs'])) { $this->warnings[] = 'support.irc : invalid value ('.$this->config['support']['irc'].'), must be a irc:/// or ircs:// URL'; unset($this->config['support']['irc']); } - foreach (array('issues', 'forum', 'wiki', 'source', 'docs', 'chat') as $key) { + foreach (['issues', 'forum', 'wiki', 'source', 'docs', 'chat'] as $key) { if (isset($this->config['support'][$key]) && !$this->filterUrl($this->config['support'][$key])) { $this->warnings[] = 'support.'.$key.' : invalid value ('.$this->config['support'][$key].'), must be an http/https URL'; unset($this->config['support'][$key]); @@ -227,7 +226,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa unset($this->config['funding'][$key]); continue; } - foreach (array('type', 'url') as $fundingData) { + foreach (['type', 'url'] as $fundingData) { if (isset($fundingOption[$fundingData]) && !is_string($fundingOption[$fundingData])) { $this->errors[] = 'funding.'.$key.'.'.$fundingData.' : invalid value, must be a string'; unset($this->config['funding'][$key][$fundingData]); @@ -319,7 +318,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa } if ($this->validateArray('autoload') && !empty($this->config['autoload'])) { - $types = array('psr-0', 'psr-4', 'classmap', 'files', 'exclude-from-classmap'); + $types = ['psr-0', 'psr-4', 'classmap', 'files', 'exclude-from-classmap']; foreach ($this->config['autoload'] as $type => $typeConfig) { if (!in_array($type, $types)) { $this->errors[] = 'autoload : invalid value ('.$type.'), must be one of '.implode(', ', $types); @@ -342,7 +341,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa unset($this->config['autoload']['psr-4']); } - foreach (array('source', 'dist') as $srcType) { + foreach (['source', 'dist'] as $srcType) { if ($this->validateArray($srcType) && !empty($this->config[$srcType])) { if (!isset($this->config[$srcType]['type'])) { $this->errors[] = $srcType . '.type : must be present'; @@ -424,7 +423,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa } $package = $this->loader->load($this->config, $class); - $this->config = array(); + $this->config = []; return $package; } @@ -445,12 +444,6 @@ public function getErrors(): array return $this->errors; } - /** - * @param string $name - * @param bool $isLink - * - * @return string|null - */ public static function hasPackageNamingError(string $name, bool $isLink = false): ?string { if (PlatformRepository::isPlatformPackage($name)) { @@ -461,7 +454,7 @@ public static function hasPackageNamingError(string $name, bool $isLink = false) return $name.' is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match "^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$".'; } - $reservedNames = array('nul', 'con', 'prn', 'aux', 'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7', 'com8', 'com9', 'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9'); + $reservedNames = ['nul', 'con', 'prn', 'aux', 'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7', 'com8', 'com9', 'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9']; $bits = explode('/', strtolower($name)); if (in_array($bits[0], $reservedNames, true) || in_array($bits[1], $reservedNames, true)) { return $name.' is reserved, package and vendor names can not match any of: '.implode(', ', $reservedNames).'.'; @@ -486,12 +479,6 @@ public static function hasPackageNamingError(string $name, bool $isLink = false) } /** - * @param string $property - * @param string $regex - * @param bool $mandatory - * - * @return bool - * * @phpstan-param non-empty-string $property * @phpstan-param non-empty-string $regex */ @@ -517,11 +504,6 @@ private function validateRegex(string $property, string $regex, bool $mandatory } /** - * @param string $property - * @param bool $mandatory - * - * @return bool - * * @phpstan-param non-empty-string $property */ private function validateString(string $property, bool $mandatory = false): bool @@ -546,11 +528,6 @@ private function validateString(string $property, bool $mandatory = false): bool } /** - * @param string $property - * @param bool $mandatory - * - * @return bool - * * @phpstan-param non-empty-string $property */ private function validateArray(string $property, bool $mandatory = false): bool @@ -575,12 +552,6 @@ private function validateArray(string $property, bool $mandatory = false): bool } /** - * @param string $property - * @param string|null $regex - * @param bool $mandatory - * - * @return bool - * * @phpstan-param non-empty-string $property * @phpstan-param non-empty-string|null $regex */ @@ -611,11 +582,6 @@ private function validateFlatArray(string $property, ?string $regex = null, bool } /** - * @param string $property - * @param bool $mandatory - * - * @return bool - * * @phpstan-param non-empty-string $property */ private function validateUrl(string $property, bool $mandatory = false): bool @@ -637,10 +603,8 @@ private function validateUrl(string $property, bool $mandatory = false): bool /** * @param mixed $value * @param string[] $schemes - * - * @return bool */ - private function filterUrl($value, array $schemes = array('http', 'https')): bool + private function filterUrl($value, array $schemes = ['http', 'https']): bool { if ($value === '') { return true; diff --git a/src/Composer/Package/Locker.php b/src/Composer/Package/Locker.php index b303a0e4512b..e5c97cce0484 100644 --- a/src/Composer/Package/Locker.php +++ b/src/Composer/Package/Locker.php @@ -55,12 +55,11 @@ class Locker /** * Initializes packages locker. * - * @param IOInterface $io * @param JsonFile $lockFile lockfile loader * @param InstallationManager $installationManager installation manager instance * @param string $composerFileContents The contents of the composer file */ - public function __construct(IOInterface $io, JsonFile $lockFile, InstallationManager $installationManager, string $composerFileContents, ProcessExecutor $process = null) + public function __construct(IOInterface $io, JsonFile $lockFile, InstallationManager $installationManager, string $composerFileContents, ?ProcessExecutor $process = null) { $this->lockFile = $lockFile; $this->installationManager = $installationManager; @@ -75,14 +74,12 @@ public function __construct(IOInterface $io, JsonFile $lockFile, InstallationMan * Returns the md5 hash of the sorted content of the composer file. * * @param string $composerFileContents The contents of the composer file. - * - * @return string */ public static function getContentHash(string $composerFileContents): string { $content = JsonFile::parseJson($composerFileContents, 'composer.json'); - $relevantKeys = array( + $relevantKeys = [ 'name', 'version', 'require', @@ -94,9 +91,9 @@ public static function getContentHash(string $composerFileContents): string 'prefer-stable', 'repositories', 'extra', - ); + ]; - $relevantContent = array(); + $relevantContent = []; foreach (array_intersect($relevantKeys, array_keys($content)) as $key) { $relevantContent[$key] = $content[$key]; @@ -112,8 +109,6 @@ public static function getContentHash(string $composerFileContents): string /** * Checks whether locker has been locked (lockfile found). - * - * @return bool */ public function isLocked(): bool { @@ -128,8 +123,6 @@ public function isLocked(): bool /** * Checks whether the lock file is still up to date with the current hash - * - * @return bool */ public function isFresh(): bool { @@ -154,7 +147,6 @@ public function isFresh(): bool * * @param bool $withDevReqs true to retrieve the locked dev packages * @throws \RuntimeException - * @return \Composer\Repository\LockArrayRepository */ public function getLockedRepository(bool $withDevReqs = false): LockArrayRepository { @@ -175,7 +167,7 @@ public function getLockedRepository(bool $withDevReqs = false): LockArrayReposit } if (isset($lockedPackages[0]['name'])) { - $packageByName = array(); + $packageByName = []; foreach ($lockedPackages as $info) { $package = $this->loader->load($info); $packages->addPackage($package); @@ -207,7 +199,7 @@ public function getLockedRepository(bool $withDevReqs = false): LockArrayReposit */ public function getDevPackageNames(): array { - $names = array(); + $names = []; $lockData = $this->getLockData(); if (isset($lockData['packages-dev'])) { foreach ($lockData['packages-dev'] as $package) { @@ -227,14 +219,14 @@ public function getDevPackageNames(): array public function getPlatformRequirements(bool $withDevReqs = false): array { $lockData = $this->getLockData(); - $requirements = array(); + $requirements = []; if (!empty($lockData['platform'])) { $requirements = $this->loader->parseLinks( '__root__', '1.0.0', Link::TYPE_REQUIRE, - $lockData['platform'] ?? array() + $lockData['platform'] ?? [] ); } @@ -243,7 +235,7 @@ public function getPlatformRequirements(bool $withDevReqs = false): array '__root__', '1.0.0', Link::TYPE_REQUIRE, - $lockData['platform-dev'] ?? array() + $lockData['platform-dev'] ?? [] ); $requirements = array_merge($requirements, $devRequirements); @@ -252,9 +244,6 @@ public function getPlatformRequirements(bool $withDevReqs = false): array return $requirements; } - /** - * @return string - */ public function getMinimumStability(): string { $lockData = $this->getLockData(); @@ -269,12 +258,9 @@ public function getStabilityFlags(): array { $lockData = $this->getLockData(); - return $lockData['stability-flags'] ?? array(); + return $lockData['stability-flags'] ?? []; } - /** - * @return bool|null - */ public function getPreferStable(): ?bool { $lockData = $this->getLockData(); @@ -284,9 +270,6 @@ public function getPreferStable(): ?bool return $lockData['prefer-stable'] ?? null; } - /** - * @return bool|null - */ public function getPreferLowest(): ?bool { $lockData = $this->getLockData(); @@ -303,7 +286,7 @@ public function getPlatformOverrides(): array { $lockData = $this->getLockData(); - return $lockData['platform-overrides'] ?? array(); + return $lockData['platform-overrides'] ?? []; } /** @@ -315,7 +298,7 @@ public function getAliases(): array { $lockData = $this->getLockData(); - return $lockData['aliases'] ?? array(); + return $lockData['aliases'] ?? []; } /** @@ -325,7 +308,7 @@ public function getPluginApi() { $lockData = $this->getLockData(); - return isset($lockData['plugin-api-version']) ? $lockData['plugin-api-version'] : '1.1.0'; + return $lockData['plugin-api-version'] ?? '1.1.0'; } /** @@ -352,14 +335,10 @@ public function getLockData(): array * @param array $platformReqs array of package name => constraint for required platform packages * @param array $platformDevReqs array of package name => constraint for dev-required platform packages * @param string[][] $aliases array of aliases - * @param string $minimumStability * @param array $stabilityFlags - * @param bool $preferStable - * @param bool $preferLowest * @param array $platformOverrides * @param bool $write Whether to actually write data to disk, useful in tests and for --dry-run * - * @return bool * * @phpstan-param list $aliases */ @@ -368,17 +347,17 @@ public function setLockData(array $packages, ?array $devPackages, array $platfor // keep old default branch names normalized to DEFAULT_BRANCH_ALIAS for BC as that is how Composer 1 outputs the lock file // when loading the lock file the version is anyway ignored in Composer 2, so it has no adverse effect $aliases = array_map(static function ($alias): array { - if (in_array($alias['version'], array('dev-master', 'dev-trunk', 'dev-default'), true)) { + if (in_array($alias['version'], ['dev-master', 'dev-trunk', 'dev-default'], true)) { $alias['version'] = VersionParser::DEFAULT_BRANCH_ALIAS; } return $alias; }, $aliases); - $lock = array( - '_readme' => array('This file locks the dependencies of your project to a known state', + $lock = [ + '_readme' => ['This file locks the dependencies of your project to a known state', 'Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies', - 'This file is @gener'.'ated automatically', ), + 'This file is @gener'.'ated automatically', ], 'content-hash' => $this->contentHash, 'packages' => null, 'packages-dev' => null, @@ -387,7 +366,7 @@ public function setLockData(array $packages, ?array $devPackages, array $platfor 'stability-flags' => $stabilityFlags, 'prefer-stable' => $preferStable, 'prefer-lowest' => $preferLowest, - ); + ]; $lock['packages'] = $this->lockPackages($packages); if (null !== $devPackages) { @@ -431,7 +410,7 @@ public function setLockData(array $packages, ?array $devPackages, array $platfor */ private function lockPackages(array $packages): array { - $locked = array(); + $locked = []; foreach ($packages as $package) { if ($package instanceof AliasPackage) { @@ -497,7 +476,7 @@ private function getPackageTime(PackageInterface $package): ?string $sourceType = $package->getSourceType(); $datetime = null; - if ($path && in_array($sourceType, array('git', 'hg'))) { + if ($path && in_array($sourceType, ['git', 'hg'])) { $sourceRef = $package->getSourceReference() ?: $package->getDistReference(); switch ($sourceType) { case 'git': diff --git a/src/Composer/Package/Package.php b/src/Composer/Package/Package.php index e004ca677a8f..dd6bf49869eb 100644 --- a/src/Composer/Package/Package.php +++ b/src/Composer/Package/Package.php @@ -57,9 +57,9 @@ class Package extends BasePackage /** @var ?\DateTimeInterface */ protected $releaseDate; /** @var mixed[] */ - protected $extra = array(); + protected $extra = []; /** @var string[] */ - protected $binaries = array(); + protected $binaries = []; /** @var bool */ protected $dev; /** @@ -71,33 +71,33 @@ class Package extends BasePackage protected $notificationUrl; /** @var array */ - protected $requires = array(); + protected $requires = []; /** @var array */ - protected $conflicts = array(); + protected $conflicts = []; /** @var array */ - protected $provides = array(); + protected $provides = []; /** @var array */ - protected $replaces = array(); + protected $replaces = []; /** @var array */ - protected $devRequires = array(); + protected $devRequires = []; /** @var array */ - protected $suggests = array(); + protected $suggests = []; /** * @var array * @phpstan-var AutoloadRules */ - protected $autoload = array(); + protected $autoload = []; /** * @var array * @phpstan-var DevAutoloadRules */ - protected $devAutoload = array(); + protected $devAutoload = []; /** @var string[] */ - protected $includePaths = array(); + protected $includePaths = []; /** @var bool */ protected $isDefaultBranch = false; /** @var mixed[] */ - protected $transportOptions = array(); + protected $transportOptions = []; /** * Creates a new in memory package. @@ -125,11 +125,6 @@ public function isDev(): bool return $this->dev; } - /** - * @param string $type - * - * @return void - */ public function setType(string $type): void { $this->type = $type; @@ -151,9 +146,6 @@ public function getStability(): string return $this->stability; } - /** - * @return void - */ public function setTargetDir(?string $targetDir): void { $this->targetDir = $targetDir; @@ -173,8 +165,6 @@ public function getTargetDir(): ?string /** * @param mixed[] $extra - * - * @return void */ public function setExtra(array $extra): void { @@ -191,8 +181,6 @@ public function getExtra(): array /** * @param string[] $binaries - * - * @return void */ public function setBinaries(array $binaries): void { @@ -209,8 +197,6 @@ public function getBinaries(): array /** * @inheritDoc - * - * @return void */ public function setInstallationSource(?string $type): void { @@ -225,9 +211,6 @@ public function getInstallationSource(): ?string return $this->installationSource; } - /** - * @return void - */ public function setSourceType(?string $type): void { $this->sourceType = $type; @@ -241,9 +224,6 @@ public function getSourceType(): ?string return $this->sourceType; } - /** - * @return void - */ public function setSourceUrl(?string $url): void { $this->sourceUrl = $url; @@ -257,9 +237,6 @@ public function getSourceUrl(): ?string return $this->sourceUrl; } - /** - * @return void - */ public function setSourceReference(?string $reference): void { $this->sourceReference = $reference; @@ -273,9 +250,6 @@ public function getSourceReference(): ?string return $this->sourceReference; } - /** - * @return void - */ public function setSourceMirrors(?array $mirrors): void { $this->sourceMirrors = $mirrors; @@ -299,8 +273,6 @@ public function getSourceUrls(): array /** * @param string $type - * - * @return void */ public function setDistType(?string $type): void { @@ -317,8 +289,6 @@ public function getDistType(): ?string /** * @param string $url - * - * @return void */ public function setDistUrl(?string $url): void { @@ -335,8 +305,6 @@ public function getDistUrl(): ?string /** * @param string $reference - * - * @return void */ public function setDistReference(?string $reference): void { @@ -353,8 +321,6 @@ public function getDistReference(): ?string /** * @param string $sha1checksum - * - * @return void */ public function setDistSha1Checksum(?string $sha1checksum): void { @@ -369,9 +335,6 @@ public function getDistSha1Checksum(): ?string return $this->distSha1Checksum; } - /** - * @return void - */ public function setDistMirrors(?array $mirrors): void { $this->distMirrors = $mirrors; @@ -425,9 +388,6 @@ public function getPrettyVersion(): string return $this->prettyVersion; } - /** - * @return void - */ public function setReleaseDate(?\DateTimeInterface $releaseDate): void { $this->releaseDate = $releaseDate; @@ -445,8 +405,6 @@ public function getReleaseDate(): ?\DateTimeInterface * Set the required packages * * @param array $requires A set of package links - * - * @return void */ public function setRequires(array $requires): void { @@ -469,8 +427,6 @@ public function getRequires(): array * Set the conflicting packages * * @param array $conflicts A set of package links - * - * @return void */ public function setConflicts(array $conflicts): void { @@ -494,8 +450,6 @@ public function getConflicts(): array * Set the provided virtual packages * * @param array $provides A set of package links - * - * @return void */ public function setProvides(array $provides): void { @@ -519,8 +473,6 @@ public function getProvides(): array * Set the packages this one replaces * * @param array $replaces A set of package links - * - * @return void */ public function setReplaces(array $replaces): void { @@ -544,8 +496,6 @@ public function getReplaces(): array * Set the recommended packages * * @param array $devRequires A set of package links - * - * @return void */ public function setDevRequires(array $devRequires): void { @@ -568,8 +518,6 @@ public function getDevRequires(): array * Set the suggested packages * * @param array $suggests A set of package names/comments - * - * @return void */ public function setSuggests(array $suggests): void { @@ -589,7 +537,6 @@ public function getSuggests(): array * * @param array $autoload Mapping of autoloading rules * - * @return void * * @phpstan-param AutoloadRules $autoload */ @@ -611,7 +558,6 @@ public function getAutoload(): array * * @param array $devAutoload Mapping of dev autoloading rules * - * @return void * * @phpstan-param DevAutoloadRules $devAutoload */ @@ -632,8 +578,6 @@ public function getDevAutoload(): array * Sets the list of paths added to PHP's include path. * * @param string[] $includePaths List of directories. - * - * @return void */ public function setIncludePaths(array $includePaths): void { @@ -650,10 +594,6 @@ public function getIncludePaths(): array /** * Sets the notification URL - * - * @param string $notificationUrl - * - * @return void */ public function setNotificationUrl(string $notificationUrl): void { @@ -668,11 +608,6 @@ public function getNotificationUrl(): ?string return $this->notificationUrl; } - /** - * @param bool $defaultBranch - * - * @return void - */ public function setIsDefaultBranch(bool $defaultBranch): void { $this->isDefaultBranch = $defaultBranch; @@ -712,8 +647,6 @@ public function setSourceDistReferences(string $reference): void * * @param string $version The package's normalized version * @param string $prettyVersion The package's non-normalized version - * - * @return void */ public function replaceVersion(string $version, string $prettyVersion): void { @@ -725,11 +658,7 @@ public function replaceVersion(string $version, string $prettyVersion): void } /** - * @param string|null $url * @param mixed[]|null $mirrors - * @param string|null $ref - * @param string|null $type - * @param string $urlType * * @return string[] * @@ -738,14 +667,14 @@ public function replaceVersion(string $version, string $prettyVersion): void protected function getUrls(?string $url, ?array $mirrors, ?string $ref, ?string $type, string $urlType): array { if (!$url) { - return array(); + return []; } if ($urlType === 'dist' && false !== strpos($url, '%')) { $url = ComposerMirror::processUrl($url, $this->name, $this->version, $ref, $type, $this->prettyVersion); } - $urls = array($url); + $urls = [$url]; if ($mirrors) { foreach ($mirrors as $mirror) { if ($urlType === 'dist') { @@ -769,13 +698,12 @@ protected function getUrls(?string $url, ?array $mirrors, ?string $ref, ?string /** * @param array $links - * @param string $source * @return array */ private function convertLinksToMap(array $links, string $source): array { trigger_error('Package::'.$source.' must be called with a map of lowercased package name => Link object, got a indexed array, this is deprecated and you should fix your usage.'); - $newLinks = array(); + $newLinks = []; foreach ($links as $link) { $newLinks[$link->getTarget()] = $link; } diff --git a/src/Composer/Package/PackageInterface.php b/src/Composer/Package/PackageInterface.php index e31abef2925e..c6196dafeac0 100644 --- a/src/Composer/Package/PackageInterface.php +++ b/src/Composer/Package/PackageInterface.php @@ -58,10 +58,6 @@ public function getNames(bool $provides = true): array; /** * Allows the solver to set an id for this package to refer to it. - * - * @param int $id - * - * @return void */ public function setId(int $id): void; @@ -74,8 +70,6 @@ public function getId(): int; /** * Returns whether the package is a development virtual package or a concrete one - * - * @return bool */ public function isDev(): bool; @@ -105,8 +99,6 @@ public function getExtra(): array; * * @param ?string $type source/dist * @phpstan-param 'source'|'dist'|null $type - * - * @return void */ public function setInstallationSource(?string $type): void; @@ -155,7 +147,6 @@ public function getSourceMirrors(): ?array; /** * @param null|array $mirrors - * @return void */ public function setSourceMirrors(?array $mirrors): void; @@ -203,7 +194,6 @@ public function getDistMirrors(): ?array; /** * @param null|array $mirrors - * @return void */ public function setDistMirrors(?array $mirrors): void; @@ -244,7 +234,6 @@ public function getReleaseDate(): ?\DateTimeInterface; /** * Returns the stability of this package: one of (dev, alpha, beta, RC, stable) * - * @return string * * @phpstan-return 'stable'|'RC'|'beta'|'alpha'|'dev' */ @@ -335,10 +324,6 @@ public function getIncludePaths(): array; /** * Stores a reference to the repository that owns the package - * - * @param RepositoryInterface $repository - * - * @return void */ public function setRepository(RepositoryInterface $repository): void; @@ -358,8 +343,6 @@ public function getBinaries(): array; /** * Returns package unique name, constructed from name and version. - * - * @return string */ public function getUniqueName(): string; @@ -372,21 +355,14 @@ public function getNotificationUrl(): ?string; /** * Converts the package into a readable and unique string - * - * @return string */ public function __toString(): string; /** * Converts the package into a pretty readable string - * - * @return string */ public function getPrettyString(): string; - /** - * @return bool - */ public function isDefaultBranch(): bool; /** @@ -400,35 +376,19 @@ public function getTransportOptions(): array; * Configures the list of options to download package dist files * * @param mixed[] $options - * - * @return void */ public function setTransportOptions(array $options): void; - /** - * @return void - */ public function setSourceReference(?string $reference): void; - /** - * @return void - */ public function setDistUrl(?string $url): void; - /** - * @return void - */ public function setDistType(?string $type): void; - /** - * @return void - */ public function setDistReference(?string $reference): void; /** * Set dist and source references and update dist URL for ones that contain a reference - * - * @return void */ public function setSourceDistReferences(string $reference): void; } diff --git a/src/Composer/Package/RootAliasPackage.php b/src/Composer/Package/RootAliasPackage.php index 07b1f38e0bbd..57768d574efe 100644 --- a/src/Composer/Package/RootAliasPackage.php +++ b/src/Composer/Package/RootAliasPackage.php @@ -162,7 +162,7 @@ public function setStabilityFlags(array $stabilityFlags): void /** * @inheritDoc */ - public function setMinimumStability($minimumStability): void + public function setMinimumStability(string $minimumStability): void { $this->aliasOf->setMinimumStability($minimumStability); } @@ -170,7 +170,7 @@ public function setMinimumStability($minimumStability): void /** * @inheritDoc */ - public function setPreferStable($preferStable): void + public function setPreferStable(bool $preferStable): void { $this->aliasOf->setPreferStable($preferStable); } diff --git a/src/Composer/Package/RootPackage.php b/src/Composer/Package/RootPackage.php index bf227eb4452d..7f2d656761d6 100644 --- a/src/Composer/Package/RootPackage.php +++ b/src/Composer/Package/RootPackage.php @@ -26,13 +26,13 @@ class RootPackage extends CompletePackage implements RootPackageInterface /** @var bool */ protected $preferStable = false; /** @var array Map of package name to stability constant */ - protected $stabilityFlags = array(); + protected $stabilityFlags = []; /** @var mixed[] */ - protected $config = array(); + protected $config = []; /** @var array Map of package name to reference/commit hash */ - protected $references = array(); + protected $references = []; /** @var array */ - protected $aliases = array(); + protected $aliases = []; /** * @inheritDoc diff --git a/src/Composer/Package/RootPackageInterface.php b/src/Composer/Package/RootPackageInterface.php index ef1ab7549d1b..579a95dc2df9 100644 --- a/src/Composer/Package/RootPackageInterface.php +++ b/src/Composer/Package/RootPackageInterface.php @@ -33,8 +33,6 @@ public function getAliases(): array; /** * Returns the minimum stability of the package - * - * @return string */ public function getMinimumStability(): string; @@ -58,8 +56,6 @@ public function getReferences(): array; /** * Returns true if the root package prefers picking stable packages over unstable ones - * - * @return bool */ public function getPreferStable(): bool; @@ -74,8 +70,6 @@ public function getConfig(): array; * Set the required packages * * @param Link[] $requires A set of package links - * - * @return void */ public function setRequires(array $requires): void; @@ -83,8 +77,6 @@ public function setRequires(array $requires): void; * Set the recommended packages * * @param Link[] $devRequires A set of package links - * - * @return void */ public function setDevRequires(array $devRequires): void; @@ -92,8 +84,6 @@ public function setDevRequires(array $devRequires): void; * Set the conflicting packages * * @param Link[] $conflicts A set of package links - * - * @return void */ public function setConflicts(array $conflicts): void; @@ -101,8 +91,6 @@ public function setConflicts(array $conflicts): void; * Set the provided virtual packages * * @param Link[] $provides A set of package links - * - * @return void */ public function setProvides(array $provides): void; @@ -110,8 +98,6 @@ public function setProvides(array $provides): void; * Set the packages this one replaces * * @param Link[] $replaces A set of package links - * - * @return void */ public function setReplaces(array $replaces): void; @@ -120,8 +106,6 @@ public function setReplaces(array $replaces): void; * * @param array $autoload Mapping of autoloading rules * @phpstan-param AutoloadRules $autoload - * - * @return void */ public function setAutoload(array $autoload): void; @@ -130,8 +114,6 @@ public function setAutoload(array $autoload): void; * * @param array $devAutoload Mapping of dev autoloading rules * @phpstan-param DevAutoloadRules $devAutoload - * - * @return void */ public function setDevAutoload(array $devAutoload): void; @@ -139,26 +121,16 @@ public function setDevAutoload(array $devAutoload): void; * Set the stabilityFlags * * @param array $stabilityFlags - * - * @return void */ public function setStabilityFlags(array $stabilityFlags): void; /** * Set the minimumStability - * - * @param string $minimumStability - * - * @return void */ public function setMinimumStability(string $minimumStability): void; /** * Set the preferStable - * - * @param bool $preferStable - * - * @return void */ public function setPreferStable(bool $preferStable): void; @@ -166,8 +138,6 @@ public function setPreferStable(bool $preferStable): void; * Set the config * * @param mixed[] $config - * - * @return void */ public function setConfig(array $config): void; @@ -175,8 +145,6 @@ public function setConfig(array $config): void; * Set the references * * @param array $references - * - * @return void */ public function setReferences(array $references): void; @@ -184,8 +152,6 @@ public function setReferences(array $references): void; * Set the aliases * * @param array $aliases - * - * @return void */ public function setAliases(array $aliases): void; @@ -193,15 +159,11 @@ public function setAliases(array $aliases): void; * Set the suggested packages * * @param array $suggests A set of package names/comments - * - * @return void */ public function setSuggests(array $suggests): void; /** * @param mixed[] $extra - * - * @return void */ public function setExtra(array $extra): void; } diff --git a/src/Composer/Package/Version/VersionBumper.php b/src/Composer/Package/Version/VersionBumper.php index c272d4da0fe0..76c92d4f5710 100644 --- a/src/Composer/Package/Version/VersionBumper.php +++ b/src/Composer/Package/Version/VersionBumper.php @@ -12,18 +12,10 @@ namespace Composer\Package\Version; -use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; -use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; -use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterInterface; -use Composer\Package\BasePackage; -use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; -use Composer\Composer; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; use Composer\Pcre\Preg; -use Composer\Repository\RepositorySet; -use Composer\Repository\PlatformRepository; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Intervals; diff --git a/src/Composer/Package/Version/VersionGuesser.php b/src/Composer/Package/Version/VersionGuesser.php index 6532f14a5f9b..1ccc32b29904 100644 --- a/src/Composer/Package/Version/VersionGuesser.php +++ b/src/Composer/Package/Version/VersionGuesser.php @@ -50,11 +50,6 @@ class VersionGuesser */ private $versionParser; - /** - * @param Config $config - * @param ProcessExecutor $process - * @param SemverVersionParser $versionParser - */ public function __construct(Config $config, ProcessExecutor $process, SemverVersionParser $versionParser) { $this->config = $config; @@ -66,7 +61,6 @@ public function __construct(Config $config, ProcessExecutor $process, SemverVers * @param array $packageConfig * @param string $path Path to guess into * - * @return array|null * @phpstan-return Version|null */ public function guessVersion(array $packageConfig, string $path): ?array @@ -105,11 +99,8 @@ public function guessVersion(array $packageConfig, string $path): ?array } /** - * @param array $versionData - * * @phpstan-param Version $versionData * - * @return array * @phpstan-return Version */ private function postprocess(array $versionData): array @@ -131,7 +122,6 @@ private function postprocess(array $versionData): array /** * @param array $packageConfig - * @param string $path * * @return array{version: string|null, commit: string|null, pretty_version: string|null, feature_version?: string|null, feature_pretty_version?: string|null} */ @@ -147,7 +137,7 @@ private function guessGitVersion(array $packageConfig, string $path): array // try to fetch current version from git branch if (0 === $this->process->execute(['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], $output, $path)) { - $branches = array(); + $branches = []; $isFeatureBranch = false; // find current branch and collect all branch names @@ -209,15 +199,13 @@ private function guessGitVersion(array $packageConfig, string $path): array } if ($featureVersion) { - return array('version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion, 'feature_version' => $featureVersion, 'feature_pretty_version' => $featurePrettyVersion); + return ['version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion, 'feature_version' => $featureVersion, 'feature_pretty_version' => $featurePrettyVersion]; } - return array('version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion); + return ['version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion]; } /** - * @param string $path - * * @return array{version: string, pretty_version: string}|null */ private function versionFromGitTags(string $path): ?array @@ -227,7 +215,7 @@ private function versionFromGitTags(string $path): ?array try { $version = $this->versionParser->normalize(trim($output)); - return array('version' => $version, 'pretty_version' => trim($output)); + return ['version' => $version, 'pretty_version' => trim($output)]; } catch (\Exception $e) { } } @@ -237,7 +225,6 @@ private function versionFromGitTags(string $path): ?array /** * @param array $packageConfig - * @param string $path * * @return array{version: string|null, commit: ''|null, pretty_version: string|null, feature_version?: string|null, feature_pretty_version?: string|null}|null */ @@ -250,16 +237,16 @@ private function guessHgVersion(array $packageConfig, string $path): ?array $isFeatureBranch = 0 === strpos($version, 'dev-'); if (VersionParser::DEFAULT_BRANCH_ALIAS === $version) { - return array('version' => $version, 'commit' => null, 'pretty_version' => 'dev-'.$branch); + return ['version' => $version, 'commit' => null, 'pretty_version' => 'dev-'.$branch]; } if (!$isFeatureBranch) { - return array('version' => $version, 'commit' => null, 'pretty_version' => $version); + return ['version' => $version, 'commit' => null, 'pretty_version' => $version]; } // re-use the HgDriver to fetch branches (this properly includes bookmarks) $io = new NullIO(); - $driver = new HgDriver(array('url' => $path), $io, $this->config, new HttpDownloader($io, $this->config), $this->process); + $driver = new HgDriver(['url' => $path], $io, $this->config, new HttpDownloader($io, $this->config), $this->process); $branches = array_map('strval', array_keys($driver->getBranches())); // try to find the best (nearest) version branch to assume this feature's version @@ -276,10 +263,7 @@ private function guessHgVersion(array $packageConfig, string $path): ?array /** * @param array $packageConfig - * @param string|null $version * @param string[] $branches - * @param string $scmCmdline - * @param string $path * * @phpstan-param non-empty-string $scmCmdline * @@ -299,7 +283,7 @@ private function guessFeatureVersion(array $packageConfig, ?string $version, arr // return directly, if branch is configured to be non-feature branch if (!$this->isFeatureBranch($packageConfig, $branch)) { - return array('version' => $version, 'pretty_version' => $prettyVersion); + return ['version' => $version, 'pretty_version' => $prettyVersion]; } // sort local branches first then remote ones @@ -327,7 +311,7 @@ private function guessFeatureVersion(array $packageConfig, ?string $version, arr continue; } - $cmdLine = str_replace(array('%candidate%', '%branch%'), array($candidate, $branch), $scmCmdline); + $cmdLine = str_replace(['%candidate%', '%branch%'], [$candidate, $branch], $scmCmdline); $promises[] = $this->process->executeAsync($cmdLine, $path)->then(function (Process $process) use (&$length, &$version, &$prettyVersion, $candidateVersion, &$promises): void { if (!$process->isSuccessful()) { return; @@ -355,14 +339,11 @@ private function guessFeatureVersion(array $packageConfig, ?string $version, arr } } - return array('version' => $version, 'pretty_version' => $prettyVersion); + return ['version' => $version, 'pretty_version' => $prettyVersion]; } /** * @param array $packageConfig - * @param string|null $branchName - * - * @return bool */ private function isFeatureBranch(array $packageConfig, ?string $branchName): bool { @@ -375,8 +356,6 @@ private function isFeatureBranch(array $packageConfig, ?string $branchName): boo } /** - * @param string $path - * * @return array{version: string|null, commit: '', pretty_version: string|null} */ private function guessFossilVersion(string $path): array @@ -400,12 +379,11 @@ private function guessFossilVersion(string $path): array } } - return array('version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion); + return ['version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion]; } /** * @param array $packageConfig - * @param string $path * * @return array{version: string, commit: '', pretty_version: string}|null */ @@ -427,7 +405,7 @@ private function guessSvnVersion(array $packageConfig, string $path): ?array $version = $this->versionParser->normalizeBranch($matches[3]); $prettyVersion = 'dev-' . $matches[3]; - return array('version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion); + return ['version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion]; } $prettyVersion = trim($matches[1]); @@ -437,7 +415,7 @@ private function guessSvnVersion(array $packageConfig, string $path): ?array $version = $this->versionParser->normalize($prettyVersion); } - return array('version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion); + return ['version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion]; } } diff --git a/src/Composer/Package/Version/VersionParser.php b/src/Composer/Package/Version/VersionParser.php index ca0a117731a9..b2859c134327 100644 --- a/src/Composer/Package/Version/VersionParser.php +++ b/src/Composer/Package/Version/VersionParser.php @@ -23,7 +23,7 @@ class VersionParser extends SemverVersionParser public const DEFAULT_BRANCH_ALIAS = '9999999-dev'; /** @var array Constraint parsing cache */ - private static $constraints = array(); + private static $constraints = []; /** * @inheritDoc @@ -50,7 +50,7 @@ public function parseConstraints($constraints): ConstraintInterface public function parseNameVersionPairs(array $pairs): array { $pairs = array_values($pairs); - $result = array(); + $result = []; for ($i = 0, $count = count($pairs); $i < $count; $i++) { $pair = Preg::replace('{^([^=: ]+)[=: ](.*)$}', '$1 $2', trim($pairs[$i])); @@ -60,32 +60,26 @@ public function parseNameVersionPairs(array $pairs): array } if (strpos($pair, ' ')) { - list($name, $version) = explode(' ', $pair, 2); - $result[] = array('name' => $name, 'version' => $version); + [$name, $version] = explode(' ', $pair, 2); + $result[] = ['name' => $name, 'version' => $version]; } else { - $result[] = array('name' => $pair); + $result[] = ['name' => $pair]; } } return $result; } - /** - * @param string $normalizedFrom - * @param string $normalizedTo - * - * @return bool - */ public static function isUpgrade(string $normalizedFrom, string $normalizedTo): bool { if ($normalizedFrom === $normalizedTo) { return true; } - if (in_array($normalizedFrom, array('dev-master', 'dev-trunk', 'dev-default'), true)) { + if (in_array($normalizedFrom, ['dev-master', 'dev-trunk', 'dev-default'], true)) { $normalizedFrom = VersionParser::DEFAULT_BRANCH_ALIAS; } - if (in_array($normalizedTo, array('dev-master', 'dev-trunk', 'dev-default'), true)) { + if (in_array($normalizedTo, ['dev-master', 'dev-trunk', 'dev-default'], true)) { $normalizedTo = VersionParser::DEFAULT_BRANCH_ALIAS; } @@ -93,7 +87,7 @@ public static function isUpgrade(string $normalizedFrom, string $normalizedTo): return true; } - $sorted = Semver::sort(array($normalizedTo, $normalizedFrom)); + $sorted = Semver::sort([$normalizedTo, $normalizedFrom]); return $sorted[0] === $normalizedFrom; } diff --git a/src/Composer/Package/Version/VersionSelector.php b/src/Composer/Package/Version/VersionSelector.php index 6832695c78c2..9cf4816f368e 100644 --- a/src/Composer/Package/Version/VersionSelector.php +++ b/src/Composer/Package/Version/VersionSelector.php @@ -40,7 +40,7 @@ class VersionSelector private $repositorySet; /** @var array */ - private $platformConstraints = array(); + private $platformConstraints = []; /** @var VersionParser */ private $parser; @@ -48,7 +48,7 @@ class VersionSelector /** * @param PlatformRepository $platformRepo If passed in, the versions found will be filtered against their requirements to eliminate any not matching the current platform packages */ - public function __construct(RepositorySet $repositorySet, PlatformRepository $platformRepo = null) + public function __construct(RepositorySet $repositorySet, ?PlatformRepository $platformRepo = null) { $this->repositorySet = $repositorySet; if ($platformRepo) { @@ -62,15 +62,12 @@ public function __construct(RepositorySet $repositorySet, PlatformRepository $pl * Given a package name and optional version, returns the latest PackageInterface * that matches. * - * @param string $packageName * @param string $targetPackageVersion - * @param string $preferredStability * @param PlatformRequirementFilterInterface|bool|string[] $platformRequirementFilter - * @param int $repoSetFlags * @param IOInterface|null $io If passed, warnings will be output there in case versions cannot be selected due to platform requirements * @return PackageInterface|false */ - public function findBestCandidate(string $packageName, string $targetPackageVersion = null, string $preferredStability = 'stable', $platformRequirementFilter = null, int $repoSetFlags = 0, ?IOInterface $io = null) + public function findBestCandidate(string $packageName, ?string $targetPackageVersion = null, string $preferredStability = 'stable', $platformRequirementFilter = null, int $repoSetFlags = 0, ?IOInterface $io = null) { if (!isset(BasePackage::$stabilities[$preferredStability])) { // If you get this, maybe you are still relying on the Composer 1.x signature where the 3rd arg was the php version @@ -88,7 +85,7 @@ public function findBestCandidate(string $packageName, string $targetPackageVers $candidates = $this->repositorySet->findPackages(strtolower($packageName), $constraint, $repoSetFlags); $minPriority = BasePackage::$stabilities[$preferredStability]; - usort($candidates, function (PackageInterface $a, PackageInterface $b) use ($minPriority) { + usort($candidates, static function (PackageInterface $a, PackageInterface $b) use ($minPriority) { $aPriority = $a->getStabilityPriority(); $bPriority = $b->getStabilityPriority(); @@ -185,9 +182,6 @@ public function findBestCandidate(string $packageName, string $targetPackageVers * * 2.0-beta.1 -> ^2.0@beta * * dev-master -> ^2.1@dev (dev version with alias) * * dev-master -> dev-master (dev versions are untouched) - * - * @param PackageInterface $package - * @return string */ public function findRecommendedRequireVersion(PackageInterface $package): string { @@ -221,13 +215,6 @@ public function findRecommendedRequireVersion(PackageInterface $package): string return $package->getPrettyVersion(); } - /** - * @param string $version - * @param string $prettyVersion - * @param string $stability - * - * @return string - */ private function transformVersion(string $version, string $prettyVersion, string $stability): string { // attempt to transform 2.1.1 to 2.1 @@ -256,9 +243,6 @@ private function transformVersion(string $version, string $prettyVersion, string return '^' . $version; } - /** - * @return VersionParser - */ private function getParser(): VersionParser { if ($this->parser === null) { diff --git a/src/Composer/PartialComposer.php b/src/Composer/PartialComposer.php index b5c859ae9074..c6f9c7523664 100644 --- a/src/Composer/PartialComposer.php +++ b/src/Composer/PartialComposer.php @@ -53,97 +53,61 @@ class PartialComposer */ private $eventDispatcher; - /** - * @return void - */ public function setPackage(RootPackageInterface $package): void { $this->package = $package; } - /** - * @return RootPackageInterface - */ public function getPackage(): RootPackageInterface { return $this->package; } - /** - * @return void - */ public function setConfig(Config $config): void { $this->config = $config; } - /** - * @return Config - */ public function getConfig(): Config { return $this->config; } - /** - * @return void - */ public function setLoop(Loop $loop): void { $this->loop = $loop; } - /** - * @return Loop - */ public function getLoop(): Loop { return $this->loop; } - /** - * @return void - */ public function setRepositoryManager(RepositoryManager $manager): void { $this->repositoryManager = $manager; } - /** - * @return RepositoryManager - */ public function getRepositoryManager(): RepositoryManager { return $this->repositoryManager; } - /** - * @return void - */ public function setInstallationManager(InstallationManager $manager): void { $this->installationManager = $manager; } - /** - * @return InstallationManager - */ public function getInstallationManager(): InstallationManager { return $this->installationManager; } - /** - * @return void - */ public function setEventDispatcher(EventDispatcher $eventDispatcher): void { $this->eventDispatcher = $eventDispatcher; } - /** - * @return EventDispatcher - */ public function getEventDispatcher(): EventDispatcher { return $this->eventDispatcher; diff --git a/src/Composer/Platform/HhvmDetector.php b/src/Composer/Platform/HhvmDetector.php index 29e9dac2fbba..46886c353418 100644 --- a/src/Composer/Platform/HhvmDetector.php +++ b/src/Composer/Platform/HhvmDetector.php @@ -25,23 +25,17 @@ class HhvmDetector /** @var ?ProcessExecutor */ private $processExecutor; - public function __construct(ExecutableFinder $executableFinder = null, ProcessExecutor $processExecutor = null) + public function __construct(?ExecutableFinder $executableFinder = null, ?ProcessExecutor $processExecutor = null) { $this->executableFinder = $executableFinder; $this->processExecutor = $processExecutor; } - /** - * @return void - */ public function reset(): void { self::$hhvmVersion = null; } - /** - * @return string|null - */ public function getVersion(): ?string { if (null !== self::$hhvmVersion) { diff --git a/src/Composer/Platform/Runtime.php b/src/Composer/Platform/Runtime.php index c59e9d060640..b05af085cb3a 100644 --- a/src/Composer/Platform/Runtime.php +++ b/src/Composer/Platform/Runtime.php @@ -15,10 +15,7 @@ class Runtime { /** - * @param string $constant * @param class-string $class - * - * @return bool */ public function hasConstant(string $constant, ?string $class = null): bool { @@ -26,7 +23,6 @@ public function hasConstant(string $constant, ?string $class = null): bool } /** - * @param string $constant * @param class-string $class * * @return mixed @@ -36,31 +32,23 @@ public function getConstant(string $constant, ?string $class = null) return constant(ltrim($class.'::'.$constant, ':')); } - /** - * @param string $fn - * - * @return bool - */ public function hasFunction(string $fn): bool { return function_exists($fn); } /** - * @param callable $callable * @param mixed[] $arguments * * @return mixed */ - public function invoke(callable $callable, array $arguments = array()) + public function invoke(callable $callable, array $arguments = []) { - return call_user_func_array($callable, $arguments); + return $callable(...$arguments); } /** * @param class-string $class - * - * @return bool */ public function hasClass(string $class): bool { @@ -71,10 +59,9 @@ public function hasClass(string $class): bool * @param class-string $class * @param mixed[] $arguments * - * @return object * @throws \ReflectionException */ - public function construct(string $class, array $arguments = array()): object + public function construct(string $class, array $arguments = []): object { if (empty($arguments)) { return new $class; @@ -91,11 +78,6 @@ public function getExtensions(): array return get_loaded_extensions(); } - /** - * @param string $extension - * - * @return string - */ public function getExtensionVersion(string $extension): string { $version = phpversion($extension); @@ -107,9 +89,6 @@ public function getExtensionVersion(string $extension): string } /** - * @param string $extension - * - * @return string * @throws \ReflectionException */ public function getExtensionInfo(string $extension): string diff --git a/src/Composer/Platform/Version.php b/src/Composer/Platform/Version.php index 053ca716bc27..1429ffc69cbb 100644 --- a/src/Composer/Platform/Version.php +++ b/src/Composer/Platform/Version.php @@ -20,9 +20,7 @@ class Version { /** - * @param string $opensslVersion * @param bool $isFips Set by the method - * @return string|null */ public static function parseOpenssl(string $opensslVersion, ?bool &$isFips): ?string { @@ -39,15 +37,11 @@ public static function parseOpenssl(string $opensslVersion, ?bool &$isFips): ?st } $isFips = strpos($matches['suffix'], 'fips') !== false; - $suffix = strtr('-'.ltrim($matches['suffix'], '-'), array('-fips' => '', '-pre' => '-alpha')); + $suffix = strtr('-'.ltrim($matches['suffix'], '-'), ['-fips' => '', '-pre' => '-alpha']); return rtrim($matches['version'].$patch.$suffix, '-'); } - /** - * @param string $libjpegVersion - * @return string|null - */ public static function parseLibjpeg(string $libjpegVersion): ?string { if (!Preg::isMatch('/^(?\d+)(?[a-z]*)$/', $libjpegVersion, $matches)) { @@ -57,10 +51,6 @@ public static function parseLibjpeg(string $libjpegVersion): ?string return $matches['major'].'.'.self::convertAlphaVersionToIntVersion($matches['minor']); } - /** - * @param string $zoneinfoVersion - * @return string|null - */ public static function parseZoneinfoVersion(string $zoneinfoVersion): ?string { if (!Preg::isMatch('/^(?\d{4})(?[a-z]*)$/', $zoneinfoVersion, $matches)) { @@ -72,39 +62,22 @@ public static function parseZoneinfoVersion(string $zoneinfoVersion): ?string /** * "" => 0, "a" => 1, "zg" => 33 - * - * @param string $alpha - * @return int */ private static function convertAlphaVersionToIntVersion(string $alpha): int { return strlen($alpha) * (-ord('a') + 1) + array_sum(array_map('ord', str_split($alpha))); } - /** - * @param int $versionId - * @return string - */ public static function convertLibxpmVersionId(int $versionId): string { return self::convertVersionId($versionId, 100); } - /** - * @param int $versionId - * @return string - */ public static function convertOpenldapVersionId(int $versionId): string { return self::convertVersionId($versionId, 100); } - /** - * @param int $versionId - * @param int $base - * - * @return string - */ private static function convertVersionId(int $versionId, int $base): string { return sprintf( diff --git a/src/Composer/Plugin/CommandEvent.php b/src/Composer/Plugin/CommandEvent.php index d861671c033f..ece2cf5e3ffe 100644 --- a/src/Composer/Plugin/CommandEvent.php +++ b/src/Composer/Plugin/CommandEvent.php @@ -43,12 +43,10 @@ class CommandEvent extends Event * * @param string $name The event name * @param string $commandName The command name - * @param InputInterface $input - * @param OutputInterface $output * @param mixed[] $args Arguments passed by the user * @param mixed[] $flags Optional flags to pass data not as argument */ - public function __construct(string $name, string $commandName, InputInterface $input, OutputInterface $output, array $args = array(), array $flags = array()) + public function __construct(string $name, string $commandName, InputInterface $input, OutputInterface $output, array $args = [], array $flags = []) { parent::__construct($name, $args, $flags); $this->commandName = $commandName; @@ -58,8 +56,6 @@ public function __construct(string $name, string $commandName, InputInterface $i /** * Returns the command input interface - * - * @return InputInterface */ public function getInput(): InputInterface { @@ -68,8 +64,6 @@ public function getInput(): InputInterface /** * Retrieves the command output interface - * - * @return OutputInterface */ public function getOutput(): OutputInterface { @@ -78,8 +72,6 @@ public function getOutput(): OutputInterface /** * Retrieves the name of the command being run - * - * @return string */ public function getCommandName(): string { diff --git a/src/Composer/Plugin/PluginBlockedException.php b/src/Composer/Plugin/PluginBlockedException.php index 04a8db0052a8..a23815eaa985 100644 --- a/src/Composer/Plugin/PluginBlockedException.php +++ b/src/Composer/Plugin/PluginBlockedException.php @@ -1,4 +1,4 @@ - */ - protected $plugins = array(); + protected $plugins = []; /** @var array */ - protected $registeredPlugins = array(); + protected $registeredPlugins = []; /** * @var array|null @@ -75,7 +75,7 @@ class PluginManager /** * @param bool|'local'|'global' $disablePlugins Whether plugins should not be loaded, can be set to local or global to only disable local/global plugins */ - public function __construct(IOInterface $io, Composer $composer, PartialComposer $globalComposer = null, $disablePlugins = false) + public function __construct(IOInterface $io, Composer $composer, ?PartialComposer $globalComposer = null, $disablePlugins = false) { $this->io = $io; $this->composer = $composer; @@ -93,8 +93,6 @@ public function setRunningInGlobalDir(bool $runningInGlobalDir): void /** * Loads all plugins from currently installed plugin packages - * - * @return void */ public function loadInstalledPlugins(): void { @@ -110,8 +108,6 @@ public function loadInstalledPlugins(): void /** * Deactivate all plugins from currently installed plugin packages - * - * @return void */ public function deactivateInstalledPlugins(): void { @@ -149,11 +145,9 @@ public function getGlobalComposer(): ?PartialComposer * If it's of type composer-installer it is registered as an installer * instead for BC * - * @param PackageInterface $package * @param bool $failOnMissingClasses By default this silently skips plugins that can not be found, but if set to true it fails with an exception * @param bool $isGlobalPlugin Set to true to denote plugins which are installed in the global Composer directory * - * @return void * * @throws \UnexpectedValueException */ @@ -210,7 +204,7 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.'); } - $classes = is_array($extra['class']) ? $extra['class'] : array($extra['class']); + $classes = is_array($extra['class']) ? $extra['class'] : [$extra['class']]; $localRepo = $this->composer->getRepositoryManager()->getLocalRepository(); $globalRepo = $this->globalComposer !== null ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; @@ -220,31 +214,31 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl // clear files autoload rules from the root package as the root dependencies are not // necessarily all present yet when booting this runtime autoloader $rootPackageAutoloads = $rootPackage->getAutoload(); - $rootPackageAutoloads['files'] = array(); + $rootPackageAutoloads['files'] = []; $rootPackage->setAutoload($rootPackageAutoloads); $rootPackageAutoloads = $rootPackage->getDevAutoload(); - $rootPackageAutoloads['files'] = array(); + $rootPackageAutoloads['files'] = []; $rootPackage->setDevAutoload($rootPackageAutoloads); unset($rootPackageAutoloads); $rootPackageRepo = new RootPackageRepository($rootPackage); - $installedRepo = new InstalledRepository(array($localRepo, $rootPackageRepo)); + $installedRepo = new InstalledRepository([$localRepo, $rootPackageRepo]); if ($globalRepo) { $installedRepo->addRepository($globalRepo); } - $autoloadPackages = array($package->getName() => $package); + $autoloadPackages = [$package->getName() => $package]; $autoloadPackages = $this->collectDependencies($installedRepo, $autoloadPackages, $package); $generator = $this->composer->getAutoloadGenerator(); - $autoloads = array(array($rootPackage, '')); + $autoloads = [[$rootPackage, '']]; foreach ($autoloadPackages as $autoloadPackage) { if ($autoloadPackage === $rootPackage) { continue; } $downloadPath = $this->getInstallPath($autoloadPackage, $globalRepo && $globalRepo->hasPackage($autoloadPackage)); - $autoloads[] = array($autoloadPackage, $downloadPath); + $autoloads[] = [$autoloadPackage, $downloadPath]; } $map = $generator->parseAutoloads($autoloads, $rootPackage); @@ -272,11 +266,11 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl $className = substr($class, $separatorPos + 1); } $code = Preg::replace('{^((?:final\s+)?(?:\s*))class\s+('.preg_quote($className).')}mi', '$1class $2_composer_tmp'.self::$classCounter, $code, 1); - $code = strtr($code, array( + $code = strtr($code, [ '__FILE__' => var_export($path, true), '__DIR__' => var_export(dirname($path), true), '__CLASS__' => var_export($class, true), - )); + ]); $code = Preg::replace('/^\s*<\?(php)?/i', '', $code, 1); eval($code); $class .= '_composer_tmp'.self::$classCounter; @@ -310,9 +304,7 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl * If it's of type composer-installer it is unregistered from the installers * instead for BC * - * @param PackageInterface $package * - * @return void * * @throws \UnexpectedValueException */ @@ -337,9 +329,7 @@ public function deactivatePackage(PackageInterface $package): void * If it's of type composer-installer it is unregistered from the installers * instead for BC * - * @param PackageInterface $package * - * @return void * * @throws \UnexpectedValueException */ @@ -361,8 +351,6 @@ public function uninstallPackage(PackageInterface $package): void /** * Returns the version of the internal composer-plugin-api package. - * - * @return string */ protected function getPluginApiVersion(): string { @@ -377,12 +365,9 @@ protected function getPluginApiVersion(): string * to do it. * * @param PluginInterface $plugin plugin instance - * @param bool $isGlobalPlugin * @param ?PackageInterface $sourcePackage Package from which the plugin comes from - * - * @return void */ - public function addPlugin(PluginInterface $plugin, bool $isGlobalPlugin = false, PackageInterface $sourcePackage = null): void + public function addPlugin(PluginInterface $plugin, bool $isGlobalPlugin = false, ?PackageInterface $sourcePackage = null): void { if ($this->arePluginsDisabled($isGlobalPlugin ? 'global' : 'local')) { return; @@ -396,7 +381,7 @@ public function addPlugin(PluginInterface $plugin, bool $isGlobalPlugin = false, return; } - $details = array(); + $details = []; if ($sourcePackage) { $details[] = 'from '.$sourcePackage->getName(); } @@ -420,8 +405,6 @@ public function addPlugin(PluginInterface $plugin, bool $isGlobalPlugin = false, * to do it. * * @param PluginInterface $plugin plugin instance - * - * @return void */ public function removePlugin(PluginInterface $plugin): void { @@ -445,8 +428,6 @@ public function removePlugin(PluginInterface $plugin): void * to do it. * * @param PluginInterface $plugin plugin instance - * - * @return void */ public function uninstallPlugin(PluginInterface $plugin): void { @@ -464,9 +445,7 @@ public function uninstallPlugin(PluginInterface $plugin): void * call this method as early as possible. * * @param RepositoryInterface $repo Repository to scan for plugins to install - * @param bool $isGlobalRepo * - * @return void * * @throws \RuntimeException */ @@ -474,7 +453,7 @@ private function loadRepository(RepositoryInterface $repo, bool $isGlobalRepo): { $packages = $repo->getPackages(); - $weights = array(); + $weights = []; foreach ($packages as $package) { if ($package->getType() === 'composer-plugin') { $extra = $package->getExtra(); @@ -504,9 +483,6 @@ private function loadRepository(RepositoryInterface $repo, bool $isGlobalRepo): * If a plugin requires another plugin, the required one will be deactivated last * * @param RepositoryInterface $repo Repository to scan for plugins to install - * @param bool $isGlobalRepo - * - * @return void */ private function deactivateRepository(RepositoryInterface $repo, bool $isGlobalRepo): void { @@ -552,7 +528,6 @@ private function collectDependencies(InstalledRepository $installedRepo, array $ /** * Retrieves the path a package is installed to. * - * @param PackageInterface $package * @param bool $global Whether this is a global package * * @return string Install path @@ -569,8 +544,6 @@ private function getInstallPath(PackageInterface $package, bool $global = false) } /** - * @param PluginInterface $plugin - * @param string $capability * @throws \RuntimeException On empty or non-string implementation class name value * @return null|string The fully qualified class of the implementation or null if Plugin is not of Capable type or does not provide it */ @@ -598,16 +571,14 @@ protected function getCapabilityImplementationClassName(PluginInterface $plugin, /** * @template CapabilityClass of Capability - * @param PluginInterface $plugin * @param class-string $capabilityClassName The fully qualified name of the API interface which the plugin may provide * an implementation of. * @param array $ctorArgs Arguments passed to Capability's constructor. * Keeping it an array will allow future values to be passed w\o changing the signature. - * @return null|Capability * @phpstan-param class-string $capabilityClassName * @phpstan-return null|CapabilityClass */ - public function getPluginCapability(PluginInterface $plugin, $capabilityClassName, array $ctorArgs = array()): ?Capability + public function getPluginCapability(PluginInterface $plugin, $capabilityClassName, array $ctorArgs = []): ?Capability { if ($capabilityClass = $this->getCapabilityImplementationClassName($plugin, $capabilityClassName)) { if (!class_exists($capabilityClass)) { @@ -638,9 +609,9 @@ public function getPluginCapability(PluginInterface $plugin, $capabilityClassNam * Keeping it an array will allow future values to be passed w\o changing the signature. * @return CapabilityClass[] */ - public function getPluginCapabilities($capabilityClassName, array $ctorArgs = array()): array + public function getPluginCapabilities($capabilityClassName, array $ctorArgs = []): array { - $capabilities = array(); + $capabilities = []; foreach ($this->getPlugins() as $plugin) { $capability = $this->getPluginCapability($plugin, $capabilityClassName, $ctorArgs); if (null !== $capability) { @@ -657,19 +628,19 @@ public function getPluginCapabilities($capabilityClassName, array $ctorArgs = ar */ private function parseAllowedPlugins($allowPluginsConfig, ?Locker $locker = null): ?array { - if (array() === $allowPluginsConfig && $locker !== null && $locker->isLocked() && version_compare($locker->getPluginApi(), '2.2.0', '<')) { + if ([] === $allowPluginsConfig && $locker !== null && $locker->isLocked() && version_compare($locker->getPluginApi(), '2.2.0', '<')) { return null; } if (true === $allowPluginsConfig) { - return array('{}' => true); + return ['{}' => true]; } if (false === $allowPluginsConfig) { - return array('{}' => false); + return ['{}' => false]; } - $rules = array(); + $rules = []; foreach ($allowPluginsConfig as $pattern => $allow) { $rules[BasePackage::packageNameToRegexp($pattern)] = $allow; } @@ -690,10 +661,6 @@ public function arePluginsDisabled($type) /** * @internal - * - * @param string $package - * @param bool $isGlobalPlugin - * @return bool */ public function isPluginAllowed(string $package, bool $isGlobalPlugin): bool { @@ -710,14 +677,14 @@ public function isPluginAllowed(string $package, bool $isGlobalPlugin): bool $this->io->writeError('For additional security you should declare the allow-plugins config with a list of packages names that are allowed to run code. See https://getcomposer.org/allow-plugins'); $this->io->writeError('This warning will become an exception once you run composer update!'); - $rules = array('{}' => true); + $rules = ['{}' => true]; // if no config is defined we allow all plugins for BC return true; } // keep going and prompt the user - $rules = array(); + $rules = []; } foreach ($rules as $pattern => $allow) { @@ -763,12 +730,12 @@ public function isPluginAllowed(string $package, bool $isGlobalPlugin): bool case '?': default: $attempts++; - $this->io->writeError(array( + $this->io->writeError([ 'y - add package to allow-plugins in composer.json and let it run immediately', 'n - add package (as disallowed) to allow-plugins in composer.json to suppress further prompts', 'd - discard this, do not change composer.json and do not allow the plugin to run', '? - print help', - )); + ]); break; } } diff --git a/src/Composer/Plugin/PostFileDownloadEvent.php b/src/Composer/Plugin/PostFileDownloadEvent.php index a19a9e38efd5..e789916460dc 100644 --- a/src/Composer/Plugin/PostFileDownloadEvent.php +++ b/src/Composer/Plugin/PostFileDownloadEvent.php @@ -78,8 +78,6 @@ public function __construct(string $name, ?string $fileName, ?string $checksum, * Retrieves the target file name location. * * If this download is of type metadata, null is returned. - * - * @return string|null */ public function getFileName(): ?string { @@ -88,8 +86,6 @@ public function getFileName(): ?string /** * Gets the checksum. - * - * @return string|null */ public function getChecksum(): ?string { @@ -98,8 +94,6 @@ public function getChecksum(): ?string /** * Gets the processed URL. - * - * @return string */ public function getUrl(): string { @@ -137,8 +131,6 @@ public function getPackage(): ?PackageInterface /** * Returns the type of this download (package, metadata). - * - * @return string */ public function getType(): string { diff --git a/src/Composer/Plugin/PreCommandRunEvent.php b/src/Composer/Plugin/PreCommandRunEvent.php index 4afd03a338f4..7bd7a46266cc 100644 --- a/src/Composer/Plugin/PreCommandRunEvent.php +++ b/src/Composer/Plugin/PreCommandRunEvent.php @@ -36,7 +36,6 @@ class PreCommandRunEvent extends Event * Constructor. * * @param string $name The event name - * @param InputInterface $input * @param string $command The command about to be executed */ public function __construct(string $name, InputInterface $input, string $command) @@ -48,8 +47,6 @@ public function __construct(string $name, InputInterface $input, string $command /** * Returns the console input - * - * @return InputInterface */ public function getInput(): InputInterface { @@ -58,8 +55,6 @@ public function getInput(): InputInterface /** * Returns the command about to be executed - * - * @return string */ public function getCommand(): string { diff --git a/src/Composer/Plugin/PreFileDownloadEvent.php b/src/Composer/Plugin/PreFileDownloadEvent.php index 53fd54f4a33f..bacf041ddfae 100644 --- a/src/Composer/Plugin/PreFileDownloadEvent.php +++ b/src/Composer/Plugin/PreFileDownloadEvent.php @@ -50,15 +50,12 @@ class PreFileDownloadEvent extends Event /** * @var mixed[] */ - private $transportOptions = array(); + private $transportOptions = []; /** * Constructor. * * @param string $name The event name - * @param HttpDownloader $httpDownloader - * @param string $processedUrl - * @param string $type * @param mixed $context */ public function __construct(string $name, HttpDownloader $httpDownloader, string $processedUrl, string $type, $context = null) @@ -70,9 +67,6 @@ public function __construct(string $name, HttpDownloader $httpDownloader, string $this->context = $context; } - /** - * @return HttpDownloader - */ public function getHttpDownloader(): HttpDownloader { return $this->httpDownloader; @@ -80,8 +74,6 @@ public function getHttpDownloader(): HttpDownloader /** * Retrieves the processed URL that will be downloaded. - * - * @return string */ public function getProcessedUrl(): string { @@ -92,8 +84,6 @@ public function getProcessedUrl(): string * Sets the processed URL that will be downloaded. * * @param string $processedUrl New processed URL - * - * @return void */ public function setProcessedUrl(string $processedUrl): void { @@ -102,8 +92,6 @@ public function setProcessedUrl(string $processedUrl): void /** * Retrieves a custom package cache key for this download. - * - * @return string|null */ public function getCustomCacheKey(): ?string { @@ -114,8 +102,6 @@ public function getCustomCacheKey(): ?string * Sets a custom package cache key for this download. * * @param string|null $customCacheKey New cache key - * - * @return void */ public function setCustomCacheKey(?string $customCacheKey): void { @@ -124,8 +110,6 @@ public function setCustomCacheKey(?string $customCacheKey): void /** * Returns the type of this download (package, metadata). - * - * @return string */ public function getType(): string { @@ -163,8 +147,6 @@ public function getTransportOptions(): array * Only available for events with type metadata, for packages set the transport options on the package itself. * * @param mixed[] $options - * - * @return void */ public function setTransportOptions(array $options): void { diff --git a/src/Composer/Plugin/PrePoolCreateEvent.php b/src/Composer/Plugin/PrePoolCreateEvent.php index dee00e4d503d..e7ea7a06cb7e 100644 --- a/src/Composer/Plugin/PrePoolCreateEvent.php +++ b/src/Composer/Plugin/PrePoolCreateEvent.php @@ -98,9 +98,6 @@ public function getRepositories(): array return $this->repositories; } - /** - * @return Request - */ public function getRequest(): Request { return $this->request; @@ -160,8 +157,6 @@ public function getUnacceptableFixedPackages(): array /** * @param BasePackage[] $packages - * - * @return void */ public function setPackages(array $packages): void { @@ -170,8 +165,6 @@ public function setPackages(array $packages): void /** * @param BasePackage[] $packages - * - * @return void */ public function setUnacceptableFixedPackages(array $packages): void { diff --git a/src/Composer/Question/StrictConfirmationQuestion.php b/src/Composer/Question/StrictConfirmationQuestion.php index 112e97733cea..c27753b32f27 100644 --- a/src/Composer/Question/StrictConfirmationQuestion.php +++ b/src/Composer/Question/StrictConfirmationQuestion.php @@ -50,8 +50,6 @@ public function __construct(string $question, bool $default = true, string $true /** * Returns the default answer normalizer. - * - * @return callable */ private function getDefaultNormalizer(): callable { @@ -81,8 +79,6 @@ private function getDefaultNormalizer(): callable /** * Returns the default answer validator. - * - * @return callable */ private function getDefaultValidator(): callable { diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php index b0a0e3b6cd4d..71a26ecc3521 100644 --- a/src/Composer/Repository/ArrayRepository.php +++ b/src/Composer/Repository/ArrayRepository.php @@ -42,7 +42,7 @@ class ArrayRepository implements RepositoryInterface /** * @param array $packages */ - public function __construct(array $packages = array()) + public function __construct(array $packages = []) { foreach ($packages as $package) { $this->addPackage($package); @@ -57,12 +57,12 @@ public function getRepoName() /** * @inheritDoc */ - public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = array()) + public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) { $packages = $this->getPackages(); - $result = array(); - $namesFound = array(); + $result = []; + $namesFound = []; foreach ($packages as $package) { if (array_key_exists($package->getName(), $packageNameMap)) { if ( @@ -91,7 +91,7 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities } } - return array('namesFound' => array_keys($namesFound), 'packages' => $result); + return ['namesFound' => array_keys($namesFound), 'packages' => $result]; } /** @@ -125,7 +125,7 @@ public function findPackages(string $name, $constraint = null) { // normalize name $name = strtolower($name); - $packages = array(); + $packages = []; if (null !== $constraint && !$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); @@ -155,11 +155,11 @@ public function search(string $query, int $mode = 0, ?string $type = null) $regex = '{(?:'.implode('|', Preg::split('{\s+}', $query)).')}i'; } - $matches = array(); + $matches = []; foreach ($this->getPackages() as $package) { $name = $package->getName(); if ($mode === self::SEARCH_VENDOR) { - list($name) = explode('/', $name); + [$name] = explode('/', $name); } if (isset($matches[$name])) { continue; @@ -172,15 +172,15 @@ public function search(string $query, int $mode = 0, ?string $type = null) || ($mode === self::SEARCH_FULLTEXT && $package instanceof CompletePackageInterface && Preg::isMatch($regex, implode(' ', (array) $package->getKeywords()) . ' ' . $package->getDescription())) ) { if ($mode === self::SEARCH_VENDOR) { - $matches[$name] = array( + $matches[$name] = [ 'name' => $name, 'description' => null, - ); + ]; } else { - $matches[$name] = array( + $matches[$name] = [ 'name' => $package->getPrettyName(), 'description' => $package instanceof CompletePackageInterface ? $package->getDescription() : null, - ); + ]; if ($package instanceof CompletePackageInterface && $package->isAbandoned()) { $matches[$name]['abandoned'] = $package->getReplacementPackage() ?: true; @@ -198,7 +198,7 @@ public function search(string $query, int $mode = 0, ?string $type = null) public function hasPackage(PackageInterface $package) { if ($this->packageMap === null) { - $this->packageMap = array(); + $this->packageMap = []; foreach ($this->getPackages() as $repoPackage) { $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage; } @@ -239,7 +239,7 @@ public function addPackage(PackageInterface $package) */ public function getProviders(string $packageName) { - $result = array(); + $result = []; foreach ($this->getPackages() as $candidate) { if (isset($result[$candidate->getName()])) { @@ -247,11 +247,11 @@ public function getProviders(string $packageName) } foreach ($candidate->getProvides() as $link) { if ($packageName === $link->getTarget()) { - $result[$candidate->getName()] = array( + $result[$candidate->getName()] = [ 'name' => $candidate->getName(), 'description' => $candidate instanceof CompletePackageInterface ? $candidate->getDescription() : null, 'type' => $candidate->getType(), - ); + ]; continue 2; } } @@ -261,9 +261,6 @@ public function getProviders(string $packageName) } /** - * @param string $alias - * @param string $prettyAlias - * * @return AliasPackage|CompleteAliasPackage */ protected function createAliasPackage(BasePackage $package, string $alias, string $prettyAlias) @@ -339,6 +336,6 @@ public function count(): int */ protected function initialize() { - $this->packages = array(); + $this->packages = []; } } diff --git a/src/Composer/Repository/ArtifactRepository.php b/src/Composer/Repository/ArtifactRepository.php index e796739d0849..0e7c4cecf369 100644 --- a/src/Composer/Repository/ArtifactRepository.php +++ b/src/Composer/Repository/ArtifactRepository.php @@ -68,11 +68,6 @@ protected function initialize() $this->scanDirectory($this->lookup); } - /** - * @param string $path - * - * @return void - */ private function scanDirectory(string $path): void { $io = $this->io; @@ -107,7 +102,7 @@ private function getComposerInformation(\SplFileInfo $file): ?BasePackage $json = null; $fileType = null; $fileExtension = pathinfo($file->getPathname(), PATHINFO_EXTENSION); - if (in_array($fileExtension, array('gz', 'tar', 'tgz'), true)) { + if (in_array($fileExtension, ['gz', 'tar', 'tgz'], true)) { $fileType = 'tar'; } elseif ($fileExtension === 'zip') { $fileType = 'zip'; @@ -130,11 +125,11 @@ private function getComposerInformation(\SplFileInfo $file): ?BasePackage } $package = JsonFile::parseJson($json, $file->getPathname().'#composer.json'); - $package['dist'] = array( + $package['dist'] = [ 'type' => $fileType, 'url' => strtr($file->getPathname(), '\\', '/'), 'shasum' => sha1_file($file->getRealPath()), - ); + ]; try { $package = $this->loader->load($package); diff --git a/src/Composer/Repository/CanonicalPackagesTrait.php b/src/Composer/Repository/CanonicalPackagesTrait.php index fc4e1ef86270..1784dadc16c8 100644 --- a/src/Composer/Repository/CanonicalPackagesTrait.php +++ b/src/Composer/Repository/CanonicalPackagesTrait.php @@ -32,14 +32,14 @@ public function getCanonicalPackages() $packages = $this->getPackages(); // get at most one package of each name, preferring non-aliased ones - $packagesByName = array(); + $packagesByName = []; foreach ($packages as $package) { if (!isset($packagesByName[$package->getName()]) || $packagesByName[$package->getName()] instanceof AliasPackage) { $packagesByName[$package->getName()] = $package; } } - $canonicalPackages = array(); + $canonicalPackages = []; // unfold aliased packages foreach ($packagesByName as $package) { diff --git a/src/Composer/Repository/ComposerRepository.php b/src/Composer/Repository/ComposerRepository.php index 01c28d45c381..057e923fd311 100644 --- a/src/Composer/Repository/ComposerRepository.php +++ b/src/Composer/Repository/ComposerRepository.php @@ -42,7 +42,6 @@ use Composer\MetadataMinifier\MetadataMinifier; use Composer\Util\Url; use React\Promise\PromiseInterface; -use function React\Promise\resolve; /** * @author Jordi Boggiano @@ -118,14 +117,14 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito * useful for v2 metadata repositories with lazy providers * @phpstan-var array */ - private $freshMetadataUrls = array(); + private $freshMetadataUrls = []; /** * @var array list of package names which returned a 404 and should not be re-fetched in case loadPackage is called several times * useful for v2 metadata repositories with lazy providers * @phpstan-var array */ - private $packagesNotFoundCache = array(); + private $packagesNotFoundCache = []; /** * @var VersionParser @@ -136,7 +135,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito * @param array $repoConfig * @phpstan-param array{url: string, options?: mixed[], type?: 'composer', allow_ssl_downgrade?: bool} $repoConfig */ - public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null) + public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $eventDispatcher = null) { parent::__construct(); if (!Preg::isMatch('{^[\w.]+\??://}', $repoConfig['url'])) { @@ -155,7 +154,7 @@ public function __construct(array $repoConfig, IOInterface $io, Config $config, } if (!isset($repoConfig['options'])) { - $repoConfig['options'] = array(); + $repoConfig['options'] = []; } if (isset($repoConfig['allow_ssl_downgrade']) && true === $repoConfig['allow_ssl_downgrade']) { $this->allowSslDowngrade = true; @@ -213,7 +212,7 @@ public function findPackage(string $name, $constraint) return null; } - $packages = $this->loadAsyncPackages(array($name => $constraint)); + $packages = $this->loadAsyncPackages([$name => $constraint]); if (count($packages['packages']) > 0) { return reset($packages['packages']); @@ -254,10 +253,10 @@ public function findPackages(string $name, $constraint = null) } if ($this->hasAvailablePackageList && !$this->lazyProvidersRepoContains($name)) { - return array(); + return []; } - $result = $this->loadAsyncPackages(array($name => $constraint)); + $result = $this->loadAsyncPackages([$name => $constraint]); return $result['packages']; } @@ -269,7 +268,7 @@ public function findPackages(string $name, $constraint = null) } } - return array(); + return []; } return parent::findPackages($name, $constraint); @@ -277,8 +276,6 @@ public function findPackages(string $name, $constraint = null) /** * @param array $packages - * @param ConstraintInterface|null $constraint - * @param bool $returnFirstMatch * * @return BasePackage|array|null */ @@ -292,7 +289,7 @@ private function filterPackages(array $packages, ?ConstraintInterface $constrain return $packages; } - $filteredPackages = array(); + $filteredPackages = []; foreach ($packages as $package) { $pkgConstraint = new Constraint('==', $package->getVersion()); @@ -319,7 +316,7 @@ public function getPackages() if ($this->lazyProvidersUrl) { if (is_array($this->availablePackages) && !$this->availablePackagePatterns) { - $packageMap = array(); + $packageMap = []; foreach ($this->availablePackages as $name) { $packageMap[$name] = new MatchAllConstraint(); } @@ -393,14 +390,14 @@ static function (array $results) use ($packageFilterRegex): array { return $filterResults(array_keys($this->partialPackagesByName)); } - return array(); + return []; } if ($hasProviders) { return $filterResults($this->getProviderNames()); } - $names = array(); + $names = []; foreach ($this->getPackages() as $package) { $names[] = $package->getPrettyName(); } @@ -423,7 +420,7 @@ private function getVendorNames(): array $names = $this->getPackageNames(); - $uniques = array(); + $uniques = []; foreach ($names as $name) { // @phpstan-ignore-next-line $uniques[substr($name, 0, strpos($name, '/'))] = true; @@ -439,7 +436,6 @@ private function getVendorNames(): array } /** - * @param string|null $packageFilter * @return list */ private function loadPackageList(?string $packageFilter = null): array @@ -472,7 +468,7 @@ private function loadPackageList(?string $packageFilter = null): array return $result['packageNames']; } - public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = array()) + public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) { // this call initializes loadRootServerFile which is needed for the rest below to work $hasProviders = $this->hasProviders(); @@ -481,12 +477,12 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities return parent::loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); } - $packages = array(); - $namesFound = array(); + $packages = []; + $namesFound = []; if ($hasProviders || $this->hasPartialPackages()) { foreach ($packageNameMap as $name => $constraint) { - $matches = array(); + $matches = []; // if a repo has no providers but only partial packages and the partial packages are missing // then we don't want to call whatProvides as it would try to load from the providers and fail @@ -537,7 +533,7 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities $namesFound = array_merge($namesFound, $result['namesFound']); } - return array('namesFound' => array_keys($namesFound), 'packages' => $packages); + return ['namesFound' => array_keys($namesFound), 'packages' => $packages]; } /** @@ -548,15 +544,15 @@ public function search(string $query, int $mode = 0, ?string $type = null) $this->loadRootServerFile(600); if ($this->searchUrl && $mode === self::SEARCH_FULLTEXT) { - $url = str_replace(array('%query%', '%type%'), array(urlencode($query), $type), $this->searchUrl); + $url = str_replace(['%query%', '%type%'], [urlencode($query), $type], $this->searchUrl); $search = $this->httpDownloader->get($url, $this->options)->decodeJson(); if (empty($search['results'])) { - return array(); + return []; } - $results = array(); + $results = []; foreach ($search['results'] as $result) { // do not show virtual packages in results as they are not directly useful from a composer perspective if (!empty($result['virtual'])) { @@ -570,12 +566,12 @@ public function search(string $query, int $mode = 0, ?string $type = null) } if ($mode === self::SEARCH_VENDOR) { - $results = array(); + $results = []; $regex = '{(?:'.implode('|', Preg::split('{\s+}', $query)).')}i'; $vendorNames = $this->getVendorNames(); foreach (Preg::grep($regex, $vendorNames) as $name) { - $results[] = array('name' => $name, 'description' => ''); + $results[] = ['name' => $name, 'description' => '']; } return $results; @@ -587,20 +583,20 @@ public function search(string $query, int $mode = 0, ?string $type = null) $url = $this->listUrl . '?vendor='.urlencode($match['vendor']).'&filter='.urlencode($match['query'].'*'); $result = $this->httpDownloader->get($url, $this->options)->decodeJson(); - $results = array(); + $results = []; foreach ($result['packageNames'] as $name) { - $results[] = array('name' => $name, 'description' => ''); + $results[] = ['name' => $name, 'description' => '']; } return $results; } - $results = array(); + $results = []; $regex = '{(?:'.implode('|', Preg::split('{\s+}', $query)).')}i'; $packageNames = $this->getPackageNames(); foreach (Preg::grep($regex, $packageNames) as $name) { - $results[] = array('name' => $name, 'description' => ''); + $results[] = ['name' => $name, 'description' => '']; } return $results; @@ -612,6 +608,7 @@ public function search(string $query, int $mode = 0, ?string $type = null) public function hasSecurityAdvisories(): bool { $this->loadRootServerFile(600); + return $this->securityAdvisoryConfig !== null && ($this->securityAdvisoryConfig['metadata'] || $this->securityAdvisoryConfig['api-url'] !== null); } @@ -637,15 +634,15 @@ public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPa * @return ($allowPartialAdvisories is false ? SecurityAdvisory|null : PartialSecurityAdvisory|SecurityAdvisory|null) */ $create = function (array $data, string $name) use ($parser, $allowPartialAdvisories, &$packageConstraintMap): ?PartialSecurityAdvisory { - $advisory = PartialSecurityAdvisory::create($name, $data, $parser); - if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { - throw new \RuntimeException('Advisory for '.$name.' could not be loaded as a full advisory from '.$this->getRepoName() . PHP_EOL . var_export($data, true)); - } - if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { - return null; - } - - return $advisory; + $advisory = PartialSecurityAdvisory::create($name, $data, $parser); + if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { + throw new \RuntimeException('Advisory for '.$name.' could not be loaded as a full advisory from '.$this->getRepoName() . PHP_EOL . var_export($data, true)); + } + if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { + return null; + } + + return $advisory; }; if ($this->securityAdvisoryConfig['metadata'] && ($allowPartialAdvisories || $apiUrl === null)) { @@ -659,8 +656,8 @@ public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPa } $promises[] = $this->startCachedAsyncDownload($name, $name) - ->then(function (array $spec) use (&$advisories, &$namesFound, &$packageConstraintMap, $name, $create): void { - list($response, ) = $spec; + ->then(static function (array $spec) use (&$advisories, &$namesFound, &$packageConstraintMap, $name, $create): void { + [$response, ] = $spec; if (!isset($response['security-advisories']) || !is_array($response['security-advisories'])) { return; @@ -669,7 +666,9 @@ public function getSecurityAdvisories(array $packageConstraintMap, bool $allowPa $namesFound[$name] = true; if (count($response['security-advisories']) > 0) { $advisories[$name] = array_filter(array_map( - function ($data) use ($name, $create) { return $create($data, $name); }, + static function ($data) use ($name, $create) { + return $create($data, $name); + }, $response['security-advisories'] )); } @@ -694,7 +693,9 @@ function ($data) use ($name, $create) { return $create($data, $name); }, foreach ($response->decodeJson()['advisories'] as $name => $list) { if (count($list) > 0) { $advisories[$name] = array_filter(array_map( - function ($data) use ($name, $create) { return $create($data, $name); }, + static function ($data) use ($name, $create) { + return $create($data, $name); + }, $list )); } @@ -708,7 +709,7 @@ function ($data) use ($name, $create) { return $create($data, $name); }, public function getProviders(string $packageName) { $this->loadRootServerFile(); - $result = array(); + $result = []; if ($this->providersApiUrl) { try { @@ -736,11 +737,11 @@ public function getProviders(string $packageName) if (isset($result[$candidate['name']]) || !isset($candidate['provide'][$packageName])) { continue; } - $result[$candidate['name']] = array( + $result[$candidate['name']] = [ 'name' => $candidate['name'], 'description' => $candidate['description'] ?? '', 'type' => $candidate['type'] ?? '', - ); + ]; } } } @@ -768,14 +769,14 @@ private function getProviderNames(): array if ($this->lazyProvidersUrl) { // Can not determine list of provided packages for lazy repositories - return array(); + return []; } if (null !== $this->providersUrl && null !== $this->providerListing) { return array_keys($this->providerListing); } - return array(); + return []; } protected function configurePackageTransportOptions(PackageInterface $package): void @@ -789,9 +790,6 @@ protected function configurePackageTransportOptions(PackageInterface $package): } } - /** - * @return bool - */ private function hasProviders(): bool { $this->loadRootServerFile(); @@ -809,13 +807,13 @@ private function hasProviders(): bool * * @return array */ - private function whatProvides(string $name, array $acceptableStabilities = null, array $stabilityFlags = null, array $alreadyLoaded = array()): array + private function whatProvides(string $name, ?array $acceptableStabilities = null, ?array $stabilityFlags = null, array $alreadyLoaded = []): array { $packagesSource = null; if (!$this->hasPartialPackages() || !isset($this->partialPackagesByName[$name])) { // skip platform packages, root package and composer-plugin-api if (PlatformRepository::isPlatformPackage($name) || '__root__' === $name) { - return array(); + return []; } if (null === $this->providerListing) { @@ -834,14 +832,14 @@ private function whatProvides(string $name, array $acceptableStabilities = null, } elseif ($this->providersUrl) { // package does not exist in this repo if (!isset($this->providerListing[$name])) { - return array(); + return []; } $hash = $this->providerListing[$name]['sha256']; - $url = str_replace(array('%package%', '%hash%'), array($name, $hash), $this->providersUrl); + $url = str_replace(['%package%', '%hash%'], [$name, $hash], $this->providersUrl); $cacheKey = 'provider-'.strtr($name, '/', '$').'.json'; } else { - return array(); + return []; } $packages = null; @@ -869,8 +867,8 @@ private function whatProvides(string $name, array $acceptableStabilities = null, $packagesSource = 'downloaded file ('.Url::sanitize($url).')'; } catch (TransportException $e) { // 404s are acceptable for lazy provider repos - if ($this->lazyProvidersUrl && in_array($e->getStatusCode(), array(404, 499), true)) { - $packages = array('packages' => array()); + if ($this->lazyProvidersUrl && in_array($e->getStatusCode(), [404, 499], true)) { + $packages = ['packages' => []]; $packagesSource = 'not-found file ('.Url::sanitize($url).')'; if ($e->getStatusCode() === 499) { $this->io->error('' . $e->getMessage() . ''); @@ -883,13 +881,13 @@ private function whatProvides(string $name, array $acceptableStabilities = null, $loadingPartialPackage = false; } else { - $packages = array('packages' => array('versions' => $this->partialPackagesByName[$name])); + $packages = ['packages' => ['versions' => $this->partialPackagesByName[$name]]]; $packagesSource = 'root file ('.Url::sanitize($this->getPackagesJsonUrl()).')'; $loadingPartialPackage = true; } - $result = array(); - $versionsToLoad = array(); + $result = []; + $versionsToLoad = []; foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { $normalizedName = strtolower($version['name']); @@ -961,8 +959,6 @@ protected function initialize() /** * Adds a new package to the repository - * - * @param PackageInterface $package */ public function addPackage(PackageInterface $package) { @@ -981,13 +977,13 @@ public function addPackage(PackageInterface $package) * * @return array{namesFound: array, packages: array} */ - private function loadAsyncPackages(array $packageNames, array $acceptableStabilities = null, array $stabilityFlags = null, array $alreadyLoaded = array()): array + private function loadAsyncPackages(array $packageNames, ?array $acceptableStabilities = null, ?array $stabilityFlags = null, array $alreadyLoaded = []): array { $this->loadRootServerFile(); - $packages = array(); - $namesFound = array(); - $promises = array(); + $packages = []; + $namesFound = []; + $promises = []; if (null === $this->lazyProvidersUrl) { throw new \LogicException('loadAsyncPackages only supports v2 protocol composer repos with a metadata-url'); @@ -995,7 +991,7 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili // load ~dev versions of the packages as well if needed foreach ($packageNames as $name => $constraint) { - if ($acceptableStabilities === null || $stabilityFlags === null || StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, array($name), 'dev')) { + if ($acceptableStabilities === null || $stabilityFlags === null || StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, [$name], 'dev')) { $packageNames[$name.'~dev'] = $constraint; } // if only dev stability is requested, we skip loading the non dev file @@ -1015,7 +1011,7 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili $promises[] = $this->startCachedAsyncDownload($name, $realName) ->then(function (array $spec) use (&$packages, &$namesFound, $realName, $constraint, $acceptableStabilities, $stabilityFlags, $alreadyLoaded): void { - list($response, $packagesSource) = $spec; + [$response, $packagesSource] = $spec; if (null === $response) { return; } @@ -1027,7 +1023,7 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili } $namesFound[$realName] = true; - $versionsToLoad = array(); + $versionsToLoad = []; foreach ($versions as $version) { if (!isset($version['version_normalized'])) { $version['version_normalized'] = $this->versionParser->normalize($version['version']); @@ -1061,10 +1057,10 @@ private function loadAsyncPackages(array $packageNames, array $acceptableStabili $this->loop->wait($promises); - return array('namesFound' => $namesFound, 'packages' => $packages); + return ['namesFound' => $namesFound, 'packages' => $packages]; } - private function startCachedAsyncDownload(string $fileName, string $packageName = null): PromiseInterface + private function startCachedAsyncDownload(string $fileName, ?string $packageName = null): PromiseInterface { if (null === $this->lazyProvidersUrl) { throw new \LogicException('startCachedAsyncDownload only supports v2 protocol composer repos with a metadata-url'); @@ -1083,7 +1079,7 @@ private function startCachedAsyncDownload(string $fileName, string $packageName } return $this->asyncFetchFile($url, $cacheKey, $lastModified) - ->then(function ($response) use ($url, $cacheKey, $contents, $packageName): array { + ->then(static function ($response) use ($url, $cacheKey, $contents, $packageName): array { $packagesSource = 'downloaded file ('.Url::sanitize($url).')'; if (true === $response) { @@ -1100,26 +1096,23 @@ private function startCachedAsyncDownload(string $fileName, string $packageName } /** - * @param ConstraintInterface|null $constraint * @param string $name package name (must be lowercased already) * @param array $versionData * @param array|null $acceptableStabilities * @phpstan-param array|null $acceptableStabilities * @param array|null $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array|null $stabilityFlags - * - * @return bool */ - private function isVersionAcceptable(?ConstraintInterface $constraint, string $name, array $versionData, array $acceptableStabilities = null, array $stabilityFlags = null): bool + private function isVersionAcceptable(?ConstraintInterface $constraint, string $name, array $versionData, ?array $acceptableStabilities = null, ?array $stabilityFlags = null): bool { - $versions = array($versionData['version_normalized']); + $versions = [$versionData['version_normalized']]; if ($alias = $this->loader->getBranchAlias($versionData)) { $versions[] = $alias; } foreach ($versions as $version) { - if (null !== $acceptableStabilities && null !== $stabilityFlags && !StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, array($name), VersionParser::parseStability($version))) { + if (null !== $acceptableStabilities && null !== $stabilityFlags && !StabilityFilter::isPackageAcceptable($acceptableStabilities, $stabilityFlags, [$name], VersionParser::parseStability($version))) { continue; } @@ -1133,9 +1126,6 @@ private function isVersionAcceptable(?ConstraintInterface $constraint, string $n return false; } - /** - * @return string - */ private function getPackagesJsonUrl(): string { $jsonUrlParts = parse_url(strtr($this->url, '\\', '/')); @@ -1148,7 +1138,6 @@ private function getPackagesJsonUrl(): string } /** - * @param int|null $rootMaxAge * @return array<'providers'|'provider-includes'|'packages'|'providers-url'|'notify-batch'|'search'|'mirrors'|'providers-lazy-url'|'metadata-url'|'available-packages'|'available-package-patterns', mixed>|true */ protected function loadRootServerFile(?int $rootMaxAge = null) @@ -1188,16 +1177,16 @@ protected function loadRootServerFile(?int $rootMaxAge = null) if (!empty($data['mirrors'])) { foreach ($data['mirrors'] as $mirror) { if (!empty($mirror['git-url'])) { - $this->sourceMirrors['git'][] = array('url' => $mirror['git-url'], 'preferred' => !empty($mirror['preferred'])); + $this->sourceMirrors['git'][] = ['url' => $mirror['git-url'], 'preferred' => !empty($mirror['preferred'])]; } if (!empty($mirror['hg-url'])) { - $this->sourceMirrors['hg'][] = array('url' => $mirror['hg-url'], 'preferred' => !empty($mirror['preferred'])); + $this->sourceMirrors['hg'][] = ['url' => $mirror['hg-url'], 'preferred' => !empty($mirror['preferred'])]; } if (!empty($mirror['dist-url'])) { - $this->distMirrors[] = array( + $this->distMirrors[] = [ 'url' => $this->canonicalizeUrl($mirror['dist-url']), 'preferred' => !empty($mirror['preferred']), - ); + ]; } } } @@ -1276,11 +1265,6 @@ protected function loadRootServerFile(?int $rootMaxAge = null) return $this->rootData = $data; } - /** - * @param string $url - * - * @return string - */ private function canonicalizeUrl(string $url): string { if ('/' === $url[0]) { @@ -1307,9 +1291,6 @@ private function loadDataFromServer(): array return $this->loadIncludes($data); } - /** - * @return bool - */ private function hasPartialPackages(): bool { if ($this->hasPartialPackages && null === $this->partialPackagesByName) { @@ -1321,14 +1302,12 @@ private function hasPartialPackages(): bool /** * @param array{providers?: mixed[], provider-includes?: mixed[]} $data - * - * @return void */ private function loadProviderListings($data): void { if (isset($data['providers'])) { if (!is_array($this->providerListing)) { - $this->providerListing = array(); + $this->providerListing = []; } $this->providerListing = array_merge($this->providerListing, $data['providers']); } @@ -1337,7 +1316,7 @@ private function loadProviderListings($data): void $includes = $data['provider-includes']; foreach ($includes as $include => $metadata) { $url = $this->baseUrl . '/' . str_replace('%hash%', $metadata['sha256'], $include); - $cacheKey = str_replace(array('%hash%','$'), '', $include); + $cacheKey = str_replace(['%hash%','$'], '', $include); if ($this->cache->sha256($cacheKey) === $metadata['sha256']) { $includedData = json_decode($this->cache->read($cacheKey), true); } else { @@ -1356,7 +1335,7 @@ private function loadProviderListings($data): void */ private function loadIncludes(array $data): array { - $packages = array(); + $packages = []; // legacy repo handling if (!isset($data['packages']) && !isset($data['includes'])) { @@ -1400,14 +1379,13 @@ private function loadIncludes(array $data): array /** * @param mixed[] $packages - * @param string|null $source * * @return list */ private function createPackages(array $packages, ?string $source = null): array { if (!$packages) { - return array(); + return []; } try { @@ -1434,11 +1412,6 @@ private function createPackages(array $packages, ?string $source = null): array } /** - * @param string $filename - * @param string|null $cacheKey - * @param string|null $sha256 - * @param bool $storeLastModifiedTime - * * @return array */ protected function fetchFile(string $filename, ?string $cacheKey = null, ?string $sha256 = null, bool $storeLastModifiedTime = false) @@ -1458,7 +1431,7 @@ protected function fetchFile(string $filename, ?string $cacheKey = null, ?string try { $options = $this->options; if ($this->eventDispatcher) { - $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', array('repository' => $this)); + $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', ['repository' => $this]); $preFileDownloadEvent->setTransportOptions($this->options); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $filename = $preFileDownloadEvent->getProcessedUrl(); @@ -1486,7 +1459,7 @@ protected function fetchFile(string $filename, ?string $cacheKey = null, ?string } if ($this->eventDispatcher) { - $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, $sha256, $filename, 'metadata', array('response' => $response, 'repository' => $this)); + $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, $sha256, $filename, 'metadata', ['response' => $response, 'repository' => $this]); $this->eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } @@ -1542,10 +1515,6 @@ protected function fetchFile(string $filename, ?string $cacheKey = null, ?string } /** - * @param string $filename - * @param string $cacheKey - * @param string $lastModifiedTime - * * @return array|true */ private function fetchFileIfLastModified(string $filename, string $cacheKey, string $lastModifiedTime) @@ -1553,7 +1522,7 @@ private function fetchFileIfLastModified(string $filename, string $cacheKey, str try { $options = $this->options; if ($this->eventDispatcher) { - $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', array('repository' => $this)); + $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', ['repository' => $this]); $preFileDownloadEvent->setTransportOptions($this->options); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $filename = $preFileDownloadEvent->getProcessedUrl(); @@ -1571,7 +1540,7 @@ private function fetchFileIfLastModified(string $filename, string $cacheKey, str } if ($this->eventDispatcher) { - $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, null, $filename, 'metadata', array('response' => $response, 'repository' => $this)); + $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, null, $filename, 'metadata', ['response' => $response, 'repository' => $this]); $this->eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } @@ -1607,15 +1576,10 @@ private function fetchFileIfLastModified(string $filename, string $cacheKey, str } } - /** - * @param string $filename - * @param string $cacheKey - * @param string|null $lastModifiedTime - */ private function asyncFetchFile(string $filename, string $cacheKey, ?string $lastModifiedTime = null): PromiseInterface { if (isset($this->packagesNotFoundCache[$filename])) { - return \React\Promise\resolve(array('packages' => array())); + return \React\Promise\resolve(['packages' => []]); } if (isset($this->freshMetadataUrls[$filename]) && $lastModifiedTime) { @@ -1626,7 +1590,7 @@ private function asyncFetchFile(string $filename, string $cacheKey, ?string $las $httpDownloader = $this->httpDownloader; $options = $this->options; if ($this->eventDispatcher) { - $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', array('repository' => $this)); + $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->httpDownloader, $filename, 'metadata', ['repository' => $this]); $preFileDownloadEvent->setTransportOptions($this->options); $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); $filename = $preFileDownloadEvent->getProcessedUrl(); @@ -1654,7 +1618,7 @@ private function asyncFetchFile(string $filename, string $cacheKey, ?string $las if ($response->getStatusCode() === 404) { $this->packagesNotFoundCache[$filename] = true; - return array('packages' => array()); + return ['packages' => []]; } $json = (string) $response->getBody(); @@ -1665,7 +1629,7 @@ private function asyncFetchFile(string $filename, string $cacheKey, ?string $las } if ($eventDispatcher) { - $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, null, $filename, 'metadata', array('response' => $response, 'repository' => $this)); + $postFileDownloadEvent = new PostFileDownloadEvent(PluginEvents::POST_FILE_DOWNLOAD, null, null, $filename, 'metadata', ['response' => $response, 'repository' => $this]); $eventDispatcher->dispatch($postFileDownloadEvent->getName(), $postFileDownloadEvent); } @@ -1700,12 +1664,12 @@ private function asyncFetchFile(string $filename, string $cacheKey, ?string $las // if the file is in the cache, we fake a 304 Not Modified to allow the process to continue if ($lastModifiedTime) { - return $accept(new Response(array('url' => $url), 304, array(), '')); + return $accept(new Response(['url' => $url], 304, [], '')); } // special error code returned when network is being artificially disabled if ($e instanceof TransportException && $e->getStatusCode() === 499) { - return $accept(new Response(array('url' => $url), 404, array(), '')); + return $accept(new Response(['url' => $url], 404, [], '')); } throw $e; @@ -1718,8 +1682,6 @@ private function asyncFetchFile(string $filename, string $cacheKey, ?string $las * This initializes the packages key of a partial packages.json that contain some packages inlined + a providers-lazy-url * * This should only be called once - * - * @return void */ private function initializePartialPackages(): void { @@ -1728,7 +1690,7 @@ private function initializePartialPackages(): void return; } - $this->partialPackagesByName = array(); + $this->partialPackagesByName = []; foreach ($rootData['packages'] as $package => $versions) { foreach ($versions as $version) { $versionPackageName = strtolower((string) ($version['name'] ?? '')); @@ -1747,7 +1709,6 @@ private function initializePartialPackages(): void /** * Checks if the package name is present in this lazy providers repo * - * @param string $name * @return bool true if the package name is present in availablePackages or matched by availablePackagePatterns */ protected function lazyProvidersRepoContains(string $name) diff --git a/src/Composer/Repository/CompositeRepository.php b/src/Composer/Repository/CompositeRepository.php index 3ae0aafbb908..08af5ea60b77 100644 --- a/src/Composer/Repository/CompositeRepository.php +++ b/src/Composer/Repository/CompositeRepository.php @@ -34,7 +34,7 @@ class CompositeRepository implements RepositoryInterface */ public function __construct(array $repositories) { - $this->repositories = array(); + $this->repositories = []; foreach ($repositories as $repo) { $this->addRepository($repo); } @@ -93,22 +93,22 @@ public function findPackage($name, $constraint): ?BasePackage */ public function findPackages($name, $constraint = null): array { - $packages = array(); + $packages = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $packages[] = $repository->findPackages($name, $constraint); } - return $packages ? call_user_func_array('array_merge', $packages) : array(); + return $packages ? array_merge(...$packages) : []; } /** * @inheritDoc */ - public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = array()): array + public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []): array { - $packages = array(); - $namesFound = array(); + $packages = []; + $namesFound = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $result = $repository->loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); @@ -116,10 +116,10 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities $namesFound[] = $result['namesFound']; } - return array( - 'packages' => $packages ? call_user_func_array('array_merge', $packages) : array(), - 'namesFound' => $namesFound ? array_unique(call_user_func_array('array_merge', $namesFound)) : array(), - ); + return [ + 'packages' => $packages ? array_merge(...$packages) : [], + 'namesFound' => $namesFound ? array_unique(array_merge(...$namesFound)) : [], + ]; } /** @@ -127,13 +127,13 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities */ public function search(string $query, int $mode = 0, ?string $type = null): array { - $matches = array(); + $matches = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $matches[] = $repository->search($query, $mode, $type); } - return $matches ? call_user_func_array('array_merge', $matches) : array(); + return $matches ? array_merge(...$matches) : []; } /** @@ -141,13 +141,13 @@ public function search(string $query, int $mode = 0, ?string $type = null): arra */ public function getPackages(): array { - $packages = array(); + $packages = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $packages[] = $repository->getPackages(); } - return $packages ? call_user_func_array('array_merge', $packages) : array(); + return $packages ? array_merge(...$packages) : []; } /** @@ -155,18 +155,15 @@ public function getPackages(): array */ public function getProviders($packageName): array { - $results = array(); + $results = []; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $results[] = $repository->getProviders($packageName); } - return $results ? call_user_func_array('array_merge', $results) : array(); + return $results ? array_merge(...$results) : []; } - /** - * @return void - */ public function removePackage(PackageInterface $package): void { foreach ($this->repositories as $repository) { @@ -192,9 +189,6 @@ public function count(): int /** * Add a repository. - * @param RepositoryInterface $repository - * - * @return void */ public function addRepository(RepositoryInterface $repository): void { diff --git a/src/Composer/Repository/FilesystemRepository.php b/src/Composer/Repository/FilesystemRepository.php index 8a87970bbc0a..901a5ef166ed 100644 --- a/src/Composer/Repository/FilesystemRepository.php +++ b/src/Composer/Repository/FilesystemRepository.php @@ -46,10 +46,9 @@ class FilesystemRepository extends WritableArrayRepository * Initializes filesystem repository. * * @param JsonFile $repositoryFile repository json file - * @param bool $dumpVersions * @param ?RootPackageInterface $rootPackage Must be provided if $dumpVersions is true */ - public function __construct(JsonFile $repositoryFile, bool $dumpVersions = false, RootPackageInterface $rootPackage = null, Filesystem $filesystem = null) + public function __construct(JsonFile $repositoryFile, bool $dumpVersions = false, ?RootPackageInterface $rootPackage = null, ?Filesystem $filesystem = null) { parent::__construct(); $this->file = $repositoryFile; @@ -120,7 +119,7 @@ public function reload() */ public function write(bool $devMode, InstallationManager $installationManager) { - $data = array('packages' => array(), 'dev' => $devMode, 'dev-package-names' => array()); + $data = ['packages' => [], 'dev' => $devMode, 'dev-package-names' => []]; $dumper = new ArrayDumper(); // make sure the directory is created so we can realpath it @@ -130,7 +129,7 @@ public function write(bool $devMode, InstallationManager $installationManager) $this->filesystem->ensureDirectoryExists($repoDir); $repoDir = $this->filesystem->normalizePath(realpath($repoDir)); - $installPaths = array(); + $installPaths = []; foreach ($this->getCanonicalPackages() as $package) { $pkgArray = $dumper->dump($package); @@ -172,11 +171,8 @@ public function write(bool $devMode, InstallationManager $installationManager) /** * @param array $array - * @param int $level - * - * @return string */ - private function dumpToPhpCode(array $array = array(), int $level = 0): string + private function dumpToPhpCode(array $array = [], int $level = 0): string { $lines = "array(\n"; $level++; @@ -325,7 +321,7 @@ private function dumpInstalledPackage(PackageInterface $package, array $installP 'reference' => $reference, 'type' => $package->getType(), 'install_path' => $installPath, - 'aliases' => array(), + 'aliases' => [], 'dev_requirement' => isset($devPackages[$package->getName()]), ]; diff --git a/src/Composer/Repository/FilterRepository.php b/src/Composer/Repository/FilterRepository.php index 54d63075c845..7419cd1a8cd3 100644 --- a/src/Composer/Repository/FilterRepository.php +++ b/src/Composer/Repository/FilterRepository.php @@ -69,8 +69,6 @@ public function getRepoName(): string /** * Returns the wrapped repositories - * - * @return RepositoryInterface */ public function getRepository(): RepositoryInterface { @@ -103,7 +101,7 @@ public function findPackage($name, $constraint): ?BasePackage public function findPackages($name, $constraint = null): array { if (!$this->isAllowed($name)) { - return array(); + return []; } return $this->repo->findPackages($name, $constraint); @@ -112,7 +110,7 @@ public function findPackages($name, $constraint = null): array /** * @inheritDoc */ - public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = array()): array + public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []): array { foreach ($packageNameMap as $name => $constraint) { if (!$this->isAllowed($name)) { @@ -121,12 +119,12 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities } if (!$packageNameMap) { - return array('namesFound' => array(), 'packages' => array()); + return ['namesFound' => [], 'packages' => []]; } $result = $this->repo->loadPackages($packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded); if (!$this->canonical) { - $result['namesFound'] = array(); + $result['namesFound'] = []; } return $result; @@ -137,7 +135,7 @@ public function loadPackages(array $packageNameMap, array $acceptableStabilities */ public function search(string $query, int $mode = 0, ?string $type = null): array { - $result = array(); + $result = []; foreach ($this->repo->search($query, $mode, $type) as $package) { if ($this->isAllowed($package['name'])) { @@ -153,7 +151,7 @@ public function search(string $query, int $mode = 0, ?string $type = null): arra */ public function getPackages(): array { - $result = array(); + $result = []; foreach ($this->repo->getPackages() as $package) { if ($this->isAllowed($package->getName())) { $result[] = $package; @@ -168,7 +166,7 @@ public function getPackages(): array */ public function getProviders($packageName): array { - $result = array(); + $result = []; foreach ($this->repo->getProviders($packageName) as $name => $provider) { if ($this->isAllowed($provider['name'])) { $result[$name] = $provider; @@ -190,11 +188,6 @@ public function count(): int return 0; } - /** - * @param string $name - * - * @return bool - */ private function isAllowed(string $name): bool { if (!$this->only && !$this->exclude) { diff --git a/src/Composer/Repository/InstalledRepository.php b/src/Composer/Repository/InstalledRepository.php index b418664a7d1d..e3b52079e351 100644 --- a/src/Composer/Repository/InstalledRepository.php +++ b/src/Composer/Repository/InstalledRepository.php @@ -33,7 +33,6 @@ class InstalledRepository extends CompositeRepository { /** - * @param string $name * @param ConstraintInterface|string|null $constraint * * @return BasePackage[] @@ -47,7 +46,7 @@ public function findPackagesWithReplacersAndProviders(string $name, $constraint $constraint = $versionParser->parseConstraints($constraint); } - $matches = array(); + $matches = []; foreach ($this->getRepositories() as $repo) { foreach ($repo->getPackages() as $candidate) { if ($name === $candidate->getName()) { @@ -87,10 +86,10 @@ public function findPackagesWithReplacersAndProviders(string $name, $constraint * @return array[] An associative array of arrays as described above. * @phpstan-return array */ - public function getDependents($needle, ?ConstraintInterface $constraint = null, bool $invert = false, bool $recurse = true, array $packagesFound = null): array + public function getDependents($needle, ?ConstraintInterface $constraint = null, bool $invert = false, bool $recurse = true, ?array $packagesFound = null): array { $needles = array_map('strtolower', (array) $needle); - $results = array(); + $results = []; // initialize the array with the needles before any recursion occurs if (null === $packagesFound) { @@ -127,12 +126,12 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, if ($constraint === null || ($link->getConstraint()->matches($constraint) === true)) { // already displayed this node's dependencies, cutting short if (in_array($link->getTarget(), $packagesInTree)) { - $results[] = array($package, $link, false); + $results[] = [$package, $link, false]; continue; } $packagesInTree[] = $link->getTarget(); - $dependents = $recurse ? $this->getDependents($link->getTarget(), null, false, true, $packagesInTree) : array(); - $results[] = array($package, $link, $dependents); + $dependents = $recurse ? $this->getDependents($link->getTarget(), null, false, true, $packagesInTree) : []; + $results[] = [$package, $link, $dependents]; $needles[] = $link->getTarget(); } } @@ -152,12 +151,12 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, if ($constraint === null || ($link->getConstraint()->matches($constraint) === !$invert)) { // already displayed this node's dependencies, cutting short if (in_array($link->getSource(), $packagesInTree)) { - $results[] = array($package, $link, false); + $results[] = [$package, $link, false]; continue; } $packagesInTree[] = $link->getSource(); - $dependents = $recurse ? $this->getDependents($link->getSource(), null, false, true, $packagesInTree) : array(); - $results[] = array($package, $link, $dependents); + $dependents = $recurse ? $this->getDependents($link->getSource(), null, false, true, $packagesInTree) : []; + $results[] = [$package, $link, $dependents]; } } } @@ -169,7 +168,7 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, foreach ($this->findPackages($link->getTarget()) as $pkg) { $version = new Constraint('=', $pkg->getVersion()); if ($link->getConstraint()->matches($version) === $invert) { - $results[] = array($package, $link, false); + $results[] = [$package, $link, false]; } } } @@ -181,7 +180,7 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, foreach ($this->findPackages($link->getTarget()) as $pkg) { $version = new Constraint('=', $pkg->getVersion()); if ($link->getConstraint()->matches($version) === $invert) { - $results[] = array($package, $link, false); + $results[] = [$package, $link, false]; } } } @@ -197,7 +196,7 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, $platformPkg = $this->findPackage($link->getTarget(), '*'); $description = $platformPkg ? 'but '.$platformPkg->getPrettyVersion().' is installed' : 'but it is missing'; - $results[] = array($package, new Link($package->getName(), $link->getTarget(), new MatchAllConstraint, Link::TYPE_REQUIRE, $link->getPrettyConstraint().' '.$description), false); + $results[] = [$package, new Link($package->getName(), $link->getTarget(), new MatchAllConstraint, Link::TYPE_REQUIRE, $link->getPrettyConstraint().' '.$description), false]; continue; } @@ -224,17 +223,17 @@ public function getDependents($needle, ?ConstraintInterface $constraint = null, if ($rootPackage) { foreach (array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()) as $rootReq) { if (in_array($rootReq->getTarget(), $pkg->getNames()) && !$rootReq->getConstraint()->matches($link->getConstraint())) { - $results[] = array($package, $link, false); - $results[] = array($rootPackage, $rootReq, false); + $results[] = [$package, $link, false]; + $results[] = [$rootPackage, $rootReq, false]; continue 3; } } - $results[] = array($package, $link, false); - $results[] = array($rootPackage, new Link($rootPackage->getName(), $link->getTarget(), new MatchAllConstraint, Link::TYPE_DOES_NOT_REQUIRE, 'but ' . $pkg->getPrettyVersion() . ' is installed'), false); + $results[] = [$package, $link, false]; + $results[] = [$rootPackage, new Link($rootPackage->getName(), $link->getTarget(), new MatchAllConstraint, Link::TYPE_DOES_NOT_REQUIRE, 'but ' . $pkg->getPrettyVersion() . ' is installed'), false]; } else { // no root so let's just print whatever we found - $results[] = array($package, $link, false); + $results[] = [$package, $link, false]; } } diff --git a/src/Composer/Repository/PackageRepository.php b/src/Composer/Repository/PackageRepository.php index 4fbadccef328..67aadc42a769 100644 --- a/src/Composer/Repository/PackageRepository.php +++ b/src/Composer/Repository/PackageRepository.php @@ -38,7 +38,7 @@ public function __construct(array $config) // make sure we have an array of package definitions if (!is_numeric(key($this->config))) { - $this->config = array($this->config); + $this->config = [$this->config]; } } diff --git a/src/Composer/Repository/PathRepository.php b/src/Composer/Repository/PathRepository.php index 777cb2f109af..06676e73e60d 100644 --- a/src/Composer/Repository/PathRepository.php +++ b/src/Composer/Repository/PathRepository.php @@ -16,8 +16,6 @@ use Composer\EventDispatcher\EventDispatcher; use Composer\IO\IOInterface; use Composer\Json\JsonFile; -use Composer\Package\CompleteAliasPackage; -use Composer\Package\CompletePackage; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; @@ -108,10 +106,8 @@ class PathRepository extends ArrayRepository implements ConfigurableRepositoryIn * Initializes path repository. * * @param array{url?: string, options?: array{symlink?: bool, reference?: string, relative?: bool, versions?: array}} $repoConfig - * @param IOInterface $io - * @param Config $config */ - public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader = null, EventDispatcher $dispatcher = null, ProcessExecutor $process = null) + public function __construct(array $repoConfig, IOInterface $io, Config $config, ?HttpDownloader $httpDownloader = null, ?EventDispatcher $dispatcher = null, ?ProcessExecutor $process = null) { if (!isset($repoConfig['url'])) { throw new \RuntimeException('You must specify the `url` configuration for the path repository'); @@ -122,7 +118,7 @@ public function __construct(array $repoConfig, IOInterface $io, Config $config, $this->process = $process ?? new ProcessExecutor($io); $this->versionGuesser = new VersionGuesser($config, $this->process, new VersionParser()); $this->repoConfig = $repoConfig; - $this->options = $repoConfig['options'] ?? array(); + $this->options = $repoConfig['options'] ?? []; if (!isset($this->options['relative'])) { $filesystem = new Filesystem(); $this->options['relative'] = !$filesystem->isAbsolutePath($this->url); @@ -177,10 +173,10 @@ protected function initialize(): void $json = file_get_contents($composerFilePath); $package = JsonFile::parseJson($json, $composerFilePath); - $package['dist'] = array( + $package['dist'] = [ 'type' => 'path', 'url' => $url, - ); + ]; $reference = $this->options['reference'] ?? 'auto'; if ('none' === $reference) { $package['dist']['reference'] = null; @@ -189,7 +185,7 @@ protected function initialize(): void } // copy symlink/relative options to transport options - $package['transport-options'] = array_intersect_key($this->options, array('symlink' => true, 'relative' => true)); + $package['transport-options'] = array_intersect_key($this->options, ['symlink' => true, 'relative' => true]); // use the version provided as option if available if (isset($package['name'], $this->options['versions'][$package['name']])) { $package['version'] = $this->options['versions'][$package['name']]; diff --git a/src/Composer/Repository/PlatformRepository.php b/src/Composer/Repository/PlatformRepository.php index 22feb91d6c4e..4c9d76bee91a 100644 --- a/src/Composer/Repository/PlatformRepository.php +++ b/src/Composer/Repository/PlatformRepository.php @@ -55,14 +55,14 @@ class PlatformRepository extends ArrayRepository * * @var array */ - private $overrides = array(); + private $overrides = []; /** * Stores which packages have been disabled and their actual version * * @var array */ - private $disabledPackages = array(); + private $disabledPackages = []; /** @var Runtime */ private $runtime; @@ -72,7 +72,7 @@ class PlatformRepository extends ArrayRepository /** * @param array $overrides */ - public function __construct(array $packages = array(), array $overrides = array(), Runtime $runtime = null, HhvmDetector $hhvmDetector = null) + public function __construct(array $packages = [], array $overrides = [], ?Runtime $runtime = null, ?HhvmDetector $hhvmDetector = null) { $this->runtime = $runtime ?: new Runtime(); $this->hhvmDetector = $hhvmDetector ?: new HhvmDetector(); @@ -83,7 +83,7 @@ public function __construct(array $packages = array(), array $overrides = array( if ($name === 'php' && $version === false) { throw new \UnexpectedValueException('config.platform.'.$name.' cannot be set to false as you cannot disable php entirely.'); } - $this->overrides[strtolower($name)] = array('name' => $name, 'version' => $version); + $this->overrides[strtolower($name)] = ['name' => $name, 'version' => $version]; } parent::__construct($packages); } @@ -93,10 +93,6 @@ public function getRepoName(): string return 'platform repo'; } - /** - * @param string $name - * @return bool - */ public function isPlatformPackageDisabled(string $name): bool { return isset($this->disabledPackages[$name]); @@ -179,7 +175,7 @@ protected function initialize(): void // The AF_INET6 constant is only defined if ext-sockets is available but // IPv6 support might still be available. - if ($this->runtime->hasConstant('AF_INET6') || Silencer::call(array($this->runtime, 'invoke'), 'inet_pton', array('::')) !== false) { + if ($this->runtime->hasConstant('AF_INET6') || Silencer::call([$this->runtime, 'invoke'], 'inet_pton', ['::']) !== false) { $phpIpv6 = new CompletePackage('php-ipv6', $version, $prettyVersion); $phpIpv6->setDescription('The PHP interpreter, with IPv6 support'); $this->addPackage($phpIpv6); @@ -189,7 +185,7 @@ protected function initialize(): void // Extensions scanning foreach ($loadedExtensions as $name) { - if (in_array($name, array('standard', 'Core'))) { + if (in_array($name, ['standard', 'Core'])) { continue; } @@ -240,9 +236,9 @@ protected function initialize(): void $library = strtolower($sslMatches['library']); if ($library === 'openssl') { $parsedVersion = Version::parseOpenssl($sslMatches['version'], $isFips); - $this->addLibrary($name.'-openssl'.($isFips ? '-fips' : ''), $parsedVersion, 'curl OpenSSL version ('.$parsedVersion.')', array(), $isFips ? array('curl-openssl') : array()); + $this->addLibrary($name.'-openssl'.($isFips ? '-fips' : ''), $parsedVersion, 'curl OpenSSL version ('.$parsedVersion.')', [], $isFips ? ['curl-openssl'] : []); } else { - $this->addLibrary($name.'-'.$library, $sslMatches['version'], 'curl '.$library.' version ('.$sslMatches['version'].')', array('curl-openssl')); + $this->addLibrary($name.'-'.$library, $sslMatches['version'], 'curl '.$library.' version ('.$sslMatches['version'].')', ['curl-openssl']); } } @@ -271,7 +267,7 @@ protected function initialize(): void if (Preg::isMatch('/^"Olson" Timezone Database Version => (?.+?)(\.system)?$/im', $info, $zoneinfoMatches)) { // If the timezonedb is provided by ext/timezonedb, register that version as a replacement if ($external && in_array('timezonedb', $loadedExtensions, true)) { - $this->addLibrary('timezonedb-zoneinfo', $zoneinfoMatches['version'], 'zoneinfo ("Olson") database for date (replaced by timezonedb)', array($name.'-zoneinfo')); + $this->addLibrary('timezonedb-zoneinfo', $zoneinfoMatches['version'], 'zoneinfo ("Olson") database for date (replaced by timezonedb)', [$name.'-zoneinfo']); } else { $this->addLibrary($name.'-zoneinfo', $zoneinfoMatches['version'], 'zoneinfo ("Olson") database for date'); } @@ -337,12 +333,12 @@ protected function initialize(): void // Add a separate version for the CLDR library version if ($this->runtime->hasClass('ResourceBundle')) { - $cldrVersion = $this->runtime->invoke(array('ResourceBundle', 'create'), array('root', 'ICUDATA', false))->get('Version'); + $cldrVersion = $this->runtime->invoke(['ResourceBundle', 'create'], ['root', 'ICUDATA', false])->get('Version'); $this->addLibrary('icu-cldr', $cldrVersion, 'ICU CLDR project version'); } if ($this->runtime->hasClass('IntlChar')) { - $this->addLibrary('icu-unicode', implode('.', array_slice($this->runtime->invoke(array('IntlChar', 'getUnicodeVersion')), 0, 3)), 'ICU unicode version'); + $this->addLibrary('icu-unicode', implode('.', array_slice($this->runtime->invoke(['IntlChar', 'getUnicodeVersion']), 0, 3)), 'ICU unicode version'); } break; @@ -356,7 +352,7 @@ protected function initialize(): void $version .= '.'.$matches['patch']; } - $this->addLibrary($name.'-imagemagick', $version, null, array('imagick')); + $this->addLibrary($name.'-imagemagick', $version, null, ['imagick']); break; case 'ldap': @@ -371,8 +367,8 @@ protected function initialize(): void // ext/dom, ext/simplexml, ext/xmlreader and ext/xmlwriter use the same libxml as the ext/libxml $libxmlProvides = array_map(static function ($extension): string { return $extension . '-libxml'; - }, array_intersect($loadedExtensions, array('dom', 'simplexml', 'xml', 'xmlreader', 'xmlwriter'))); - $this->addLibrary($name, $this->runtime->getConstant('LIBXML_DOTTED_VERSION'), 'libxml library version', array(), $libxmlProvides); + }, array_intersect($loadedExtensions, ['dom', 'simplexml', 'xml', 'xmlreader', 'xmlwriter'])); + $this->addLibrary($name, $this->runtime->getConstant('LIBXML_DOTTED_VERSION'), 'libxml library version', [], $libxmlProvides); break; @@ -408,7 +404,7 @@ protected function initialize(): void // OpenSSL 1.1.1g 21 Apr 2020 if (Preg::isMatch('{^(?:OpenSSL|LibreSSL)?\s*(?\S+)}i', $this->runtime->getConstant('OPENSSL_VERSION_TEXT'), $matches)) { $parsedVersion = Version::parseOpenssl($matches['version'], $isFips); - $this->addLibrary($name.($isFips ? '-fips' : ''), $parsedVersion, $this->runtime->getConstant('OPENSSL_VERSION_TEXT'), array(), $isFips ? array($name) : array()); + $this->addLibrary($name.($isFips ? '-fips' : ''), $parsedVersion, $this->runtime->getConstant('OPENSSL_VERSION_TEXT'), [], $isFips ? [$name] : []); } break; @@ -479,7 +475,7 @@ protected function initialize(): void break; case 'xsl': - $this->addLibrary('libxslt', $this->runtime->getConstant('LIBXSLT_DOTTED_VERSION'), null, array('xsl')); + $this->addLibrary('libxslt', $this->runtime->getConstant('LIBXSLT_DOTTED_VERSION'), null, ['xsl']); $info = $this->runtime->getExtensionInfo('xsl'); if (Preg::isMatch('/^libxslt compiled against libxml Version => (?.+)$/im', $info, $matches)) { @@ -497,7 +493,7 @@ protected function initialize(): void case 'zip': if ($this->runtime->hasConstant('LIBZIP_VERSION', 'ZipArchive')) { - $this->addLibrary($name.'-libzip', $this->runtime->getConstant('LIBZIP_VERSION', 'ZipArchive'), null, array('zip')); + $this->addLibrary($name.'-libzip', $this->runtime->getConstant('LIBZIP_VERSION', 'ZipArchive'), null, ['zip']); } break; @@ -580,16 +576,13 @@ public function addPackage(PackageInterface $package): void /** * @param array{version: string, name: string} $override - * @param string|null $name - * - * @return CompletePackage */ private function addOverriddenPackage(array $override, ?string $name = null): CompletePackage { $version = $this->versionParser->normalize($override['version']); $package = new CompletePackage($name ?: $override['name'], $version, $override['version']); $package->setDescription('Package overridden via config.platform'); - $package->setExtra(array('config.platform' => true)); + $package->setExtra(['config.platform' => true]); parent::addPackage($package); if ($package->getName() === 'php') { @@ -599,13 +592,10 @@ private function addOverriddenPackage(array $override, ?string $name = null): Co return $package; } - /** - * @return void - */ private function addDisabledPackage(CompletePackage $package): void { $package->setDescription($package->getDescription().'. Package disabled via config.platform'); - $package->setExtra(array('config.platform' => true)); + $package->setExtra(['config.platform' => true]); $this->disabledPackages[$package->getName()] = $package; } @@ -634,33 +624,24 @@ private function addExtension(string $name, string $prettyVersion): void $ext->setDescription('The '.$name.' PHP extension'.$extraDescription); if ($name === 'uuid') { - $ext->setReplaces(array( + $ext->setReplaces([ 'lib-uuid' => new Link('ext-uuid', 'lib-uuid', new Constraint('=', $version), Link::TYPE_REPLACE, $ext->getPrettyVersion()), - )); + ]); } $this->addPackage($ext); } - /** - * @param string $name - * @return string - */ private function buildPackageName(string $name): string { return 'ext-' . str_replace(' ', '-', strtolower($name)); } /** - * @param string $name - * @param string|null $prettyVersion - * @param string|null $description * @param string[] $replaces * @param string[] $provides - * - * @return void */ - private function addLibrary(string $name, ?string $prettyVersion, ?string $description = null, array $replaces = array(), array $provides = array()): void + private function addLibrary(string $name, ?string $prettyVersion, ?string $description = null, array $replaces = [], array $provides = []): void { if (null === $prettyVersion) { return; @@ -678,12 +659,12 @@ private function addLibrary(string $name, ?string $prettyVersion, ?string $descr $lib = new CompletePackage('lib-'.$name, $version, $prettyVersion); $lib->setDescription($description); - $replaceLinks = array(); + $replaceLinks = []; foreach ($replaces as $replace) { $replace = strtolower($replace); $replaceLinks[$replace] = new Link('lib-'.$name, 'lib-'.$replace, new Constraint('=', $version), Link::TYPE_REPLACE, $lib->getPrettyVersion()); } - $provideLinks = array(); + $provideLinks = []; foreach ($provides as $provide) { $provide = strtolower($provide); $provideLinks[$provide] = new Link('lib-'.$name, 'lib-'.$provide, new Constraint('=', $version), Link::TYPE_PROVIDE, $lib->getPrettyVersion()); @@ -696,13 +677,10 @@ private function addLibrary(string $name, ?string $prettyVersion, ?string $descr /** * Check if a package name is a platform package. - * - * @param string $name - * @return bool */ public static function isPlatformPackage(string $name): bool { - static $cache = array(); + static $cache = []; if (isset($cache[$name])) { return $cache[$name]; @@ -719,7 +697,6 @@ public static function isPlatformPackage(string $name): bool * be correct. * * @internal - * @return string|null */ public static function getPlatformPhpVersion(): ?string { @@ -730,7 +707,7 @@ public function search(string $query, int $mode = 0, ?string $type = null): arra { // suppress vendor search as there are no vendors to match in platform packages if ($mode === self::SEARCH_VENDOR) { - return array(); + return []; } return parent::search($query, $mode, $type); diff --git a/src/Composer/Repository/RepositoryFactory.php b/src/Composer/Repository/RepositoryFactory.php index e24fa159685e..62e9183246ff 100644 --- a/src/Composer/Repository/RepositoryFactory.php +++ b/src/Composer/Repository/RepositoryFactory.php @@ -27,23 +27,19 @@ class RepositoryFactory { /** - * @param IOInterface $io - * @param Config $config - * @param string $repository - * @param bool $allowFilesystem * @return array|mixed */ public static function configFromString(IOInterface $io, Config $config, string $repository, bool $allowFilesystem = false) { if (0 === strpos($repository, 'http')) { - $repoConfig = array('type' => 'composer', 'url' => $repository); + $repoConfig = ['type' => 'composer', 'url' => $repository]; } elseif ("json" === pathinfo($repository, PATHINFO_EXTENSION)) { $json = new JsonFile($repository, Factory::createHttpDownloader($io, $config)); $data = $json->read(); if (!empty($data['packages']) || !empty($data['includes']) || !empty($data['provider-includes'])) { - $repoConfig = array('type' => 'composer', 'url' => 'file://' . strtr(realpath($repository), '\\', '/')); + $repoConfig = ['type' => 'composer', 'url' => 'file://' . strtr(realpath($repository), '\\', '/')]; } elseif ($allowFilesystem) { - $repoConfig = array('type' => 'filesystem', 'json' => $json); + $repoConfig = ['type' => 'filesystem', 'json' => $json]; } else { throw new \InvalidArgumentException("Invalid repository URL ($repository) given. This file does not contain a valid composer repository."); } @@ -57,14 +53,7 @@ public static function configFromString(IOInterface $io, Config $config, string return $repoConfig; } - /** - * @param IOInterface $io - * @param Config $config - * @param string $repository - * @param bool $allowFilesystem - * @return RepositoryInterface - */ - public static function fromString(IOInterface $io, Config $config, string $repository, bool $allowFilesystem = false, RepositoryManager $rm = null): RepositoryInterface + public static function fromString(IOInterface $io, Config $config, string $repository, bool $allowFilesystem = false, ?RepositoryManager $rm = null): RepositoryInterface { $repoConfig = static::configFromString($io, $config, $repository, $allowFilesystem); @@ -72,29 +61,23 @@ public static function fromString(IOInterface $io, Config $config, string $repos } /** - * @param IOInterface $io - * @param Config $config * @param array $repoConfig - * @return RepositoryInterface */ - public static function createRepo(IOInterface $io, Config $config, array $repoConfig, RepositoryManager $rm = null): RepositoryInterface + public static function createRepo(IOInterface $io, Config $config, array $repoConfig, ?RepositoryManager $rm = null): RepositoryInterface { if (!$rm) { @trigger_error('Not passing a repository manager when calling createRepo is deprecated since Composer 2.3.6', E_USER_DEPRECATED); $rm = static::manager($io, $config); } - $repos = self::createRepos($rm, array($repoConfig)); + $repos = self::createRepos($rm, [$repoConfig]); return reset($repos); } /** - * @param IOInterface|null $io - * @param Config|null $config - * @param RepositoryManager|null $rm * @return RepositoryInterface[] */ - public static function defaultRepos(IOInterface $io = null, Config $config = null, RepositoryManager $rm = null): array + public static function defaultRepos(?IOInterface $io = null, ?Config $config = null, ?RepositoryManager $rm = null): array { if (null === $rm) { @trigger_error('Not passing a repository manager when calling defaultRepos is deprecated since Composer 2.3.6, use defaultReposWithDefaultManager() instead if you cannot get a manager.', E_USER_DEPRECATED); @@ -117,13 +100,10 @@ public static function defaultRepos(IOInterface $io = null, Config $config = nul } /** - * @param IOInterface $io - * @param Config $config * @param EventDispatcher $eventDispatcher * @param HttpDownloader $httpDownloader - * @return RepositoryManager */ - public static function manager(IOInterface $io, Config $config, HttpDownloader $httpDownloader = null, EventDispatcher $eventDispatcher = null, ProcessExecutor $process = null): RepositoryManager + public static function manager(IOInterface $io, Config $config, ?HttpDownloader $httpDownloader = null, ?EventDispatcher $eventDispatcher = null, ?ProcessExecutor $process = null): RepositoryManager { if ($httpDownloader === null) { $httpDownloader = Factory::createHttpDownloader($io, $config); @@ -164,7 +144,6 @@ public static function defaultReposWithDefaultManager(IOInterface $io): array return RepositoryFactory::defaultRepos($io, $config, $manager); } - /** * @param array $repoConfigs * @@ -172,7 +151,7 @@ public static function defaultReposWithDefaultManager(IOInterface $io): array */ private static function createRepos(RepositoryManager $rm, array $repoConfigs): array { - $repos = array(); + $repos = []; foreach ($repoConfigs as $index => $repo) { if (is_string($repo)) { @@ -200,8 +179,6 @@ private static function createRepos(RepositoryManager $rm, array $repoConfigs): * @param int|string $index * @param array{url?: string} $repo * @param array $existingRepos - * - * @return string */ public static function generateRepositoryName($index, array $repo, array $existingRepos): string { diff --git a/src/Composer/Repository/RepositoryInterface.php b/src/Composer/Repository/RepositoryInterface.php index 9b612f610890..c26248801a26 100644 --- a/src/Composer/Repository/RepositoryInterface.php +++ b/src/Composer/Repository/RepositoryInterface.php @@ -81,7 +81,7 @@ public function getPackages(); * @phpstan-param array $packageNameMap * @phpstan-return array{namesFound: array, packages: array} */ - public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = array()); + public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []); /** * Searches the repository for packages containing the query diff --git a/src/Composer/Repository/RepositoryManager.php b/src/Composer/Repository/RepositoryManager.php index d1b516cb4612..65dad875ebd8 100644 --- a/src/Composer/Repository/RepositoryManager.php +++ b/src/Composer/Repository/RepositoryManager.php @@ -31,9 +31,9 @@ class RepositoryManager /** @var InstalledRepositoryInterface */ private $localRepository; /** @var list */ - private $repositories = array(); + private $repositories = []; /** @var array> */ - private $repositoryClasses = array(); + private $repositoryClasses = []; /** @var IOInterface */ private $io; /** @var Config */ @@ -45,7 +45,7 @@ class RepositoryManager /** @var ProcessExecutor */ private $process; - public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $eventDispatcher = null, ProcessExecutor $process = null) + public function __construct(IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $eventDispatcher = null, ?ProcessExecutor $process = null) { $this->io = $io; $this->config = $config; @@ -59,8 +59,6 @@ public function __construct(IOInterface $io, Config $config, HttpDownloader $htt * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against - * - * @return PackageInterface|null */ public function findPackage(string $name, $constraint): ?PackageInterface { @@ -84,7 +82,7 @@ public function findPackage(string $name, $constraint): ?PackageInterface */ public function findPackages(string $name, $constraint): array { - $packages = array(); + $packages = []; foreach ($this->getRepositories() as $repository) { $packages = array_merge($packages, $repository->findPackages($name, $constraint)); @@ -97,8 +95,6 @@ public function findPackages(string $name, $constraint): array * Adds repository * * @param RepositoryInterface $repository repository instance - * - * @return void */ public function addRepository(RepositoryInterface $repository): void { @@ -111,8 +107,6 @@ public function addRepository(RepositoryInterface $repository): void * This is useful when injecting additional repositories that should trump Packagist, e.g. from a plugin. * * @param RepositoryInterface $repository repository instance - * - * @return void */ public function prependRepository(RepositoryInterface $repository): void { @@ -126,9 +120,8 @@ public function prependRepository(RepositoryInterface $repository): void * @param array $config repository configuration * @param string $name repository name * @throws \InvalidArgumentException if repository for provided type is not registered - * @return RepositoryInterface */ - public function createRepository(string $type, array $config, string $name = null): RepositoryInterface + public function createRepository(string $type, array $config, ?string $name = null): RepositoryInterface { if (!isset($this->repositoryClasses[$type])) { throw new \InvalidArgumentException('Repository type is not registered: '.$type); @@ -159,8 +152,6 @@ public function createRepository(string $type, array $config, string $name = nul * * @param string $type installation type * @param class-string $class class name of the repo implementation - * - * @return void */ public function setRepositoryClass(string $type, $class): void { @@ -181,8 +172,6 @@ public function getRepositories(): array * Sets local repository for the project. * * @param InstalledRepositoryInterface $repository repository instance - * - * @return void */ public function setLocalRepository(InstalledRepositoryInterface $repository): void { @@ -191,8 +180,6 @@ public function setLocalRepository(InstalledRepositoryInterface $repository): vo /** * Returns local repository for the project. - * - * @return InstalledRepositoryInterface */ public function getLocalRepository(): InstalledRepositoryInterface { diff --git a/src/Composer/Repository/RepositorySet.php b/src/Composer/Repository/RepositorySet.php index 3f408ad0d336..34164e453c0d 100644 --- a/src/Composer/Repository/RepositorySet.php +++ b/src/Composer/Repository/RepositorySet.php @@ -60,7 +60,7 @@ class RepositorySet private $rootReferences; /** @var RepositoryInterface[] */ - private $repositories = array(); + private $repositories = []; /** * @var int[] array of stability => BasePackage::STABILITY_* value @@ -95,7 +95,6 @@ class RepositorySet * passing minimumStability is all you need to worry about. The rest is for advanced pool creation including * aliases, pinned references and other special cases. * - * @param string $minimumStability * @param int[] $stabilityFlags an array of package name => BasePackage::STABILITY_* value * @phpstan-param array $stabilityFlags * @param array[] $rootAliases @@ -106,12 +105,12 @@ class RepositorySet * @phpstan-param array $rootRequires * @param array $temporaryConstraints Runtime temporary constraints that will be used to filter packages */ - public function __construct(string $minimumStability = 'stable', array $stabilityFlags = array(), array $rootAliases = array(), array $rootReferences = array(), array $rootRequires = array(), array $temporaryConstraints = []) + public function __construct(string $minimumStability = 'stable', array $stabilityFlags = [], array $rootAliases = [], array $rootReferences = [], array $rootRequires = [], array $temporaryConstraints = []) { $this->rootAliases = self::getRootAliasesPerPackage($rootAliases); $this->rootReferences = $rootReferences; - $this->acceptableStabilities = array(); + $this->acceptableStabilities = []; foreach (BasePackage::$stabilities as $stability => $value) { if ($value <= BasePackage::$stabilities[$minimumStability]) { $this->acceptableStabilities[$stability] = $value; @@ -128,11 +127,6 @@ public function __construct(string $minimumStability = 'stable', array $stabilit $this->temporaryConstraints = $temporaryConstraints; } - /** - * @param bool $allow - * - * @return void - */ public function allowInstalledRepositories(bool $allow = true): void { $this->allowInstalledRepositories = $allow; @@ -162,8 +156,6 @@ public function getTemporaryConstraints(): array * repository the search for that package ends, and following repos will not be consulted. * * @param RepositoryInterface $repo A package repository - * - * @return void */ public function addRepository(RepositoryInterface $repo): void { @@ -174,7 +166,7 @@ public function addRepository(RepositoryInterface $repo): void if ($repo instanceof CompositeRepository) { $repos = $repo->getRepositories(); } else { - $repos = array($repo); + $repos = [$repo]; } foreach ($repos as $repo) { @@ -187,24 +179,22 @@ public function addRepository(RepositoryInterface $repo): void * * Returned in the order of repositories, matching priority * - * @param string $name - * @param ConstraintInterface|null $constraint * @param int $flags any of the ALLOW_* constants from this class to tweak what is returned * @return BasePackage[] */ - public function findPackages(string $name, ConstraintInterface $constraint = null, int $flags = 0): array + public function findPackages(string $name, ?ConstraintInterface $constraint = null, int $flags = 0): array { $ignoreStability = ($flags & self::ALLOW_UNACCEPTABLE_STABILITIES) !== 0; $loadFromAllRepos = ($flags & self::ALLOW_SHADOWED_REPOSITORIES) !== 0; - $packages = array(); + $packages = []; if ($loadFromAllRepos) { foreach ($this->repositories as $repository) { - $packages[] = $repository->findPackages($name, $constraint) ?: array(); + $packages[] = $repository->findPackages($name, $constraint) ?: []; } } else { foreach ($this->repositories as $repository) { - $result = $repository->loadPackages(array($name => $constraint), $ignoreStability ? BasePackage::$stabilities : $this->acceptableStabilities, $ignoreStability ? array() : $this->stabilityFlags); + $result = $repository->loadPackages([$name => $constraint], $ignoreStability ? BasePackage::$stabilities : $this->acceptableStabilities, $ignoreStability ? [] : $this->stabilityFlags); $packages[] = $result['packages']; foreach ($result['namesFound'] as $nameFound) { @@ -216,14 +206,14 @@ public function findPackages(string $name, ConstraintInterface $constraint = nul } } - $candidates = $packages ? call_user_func_array('array_merge', $packages) : array(); + $candidates = $packages ? array_merge(...$packages) : []; // when using loadPackages above (!$loadFromAllRepos) the repos already filter for stability so no need to do it again if ($ignoreStability || !$loadFromAllRepos) { return $candidates; } - $result = array(); + $result = []; foreach ($candidates as $candidate) { if ($this->isPackageAcceptable($candidate->getNames(), $candidate->getStability())) { $result[] = $candidate; @@ -285,14 +275,12 @@ private function getSecurityAdvisoriesForConstraints(array $packageConstraintMap } /** - * @param string $packageName - * * @return array[] an array with the provider name as key and value of array('name' => '...', 'description' => '...', 'type' => '...') * @phpstan-return array */ public function getProviders(string $packageName): array { - $providers = array(); + $providers = []; foreach ($this->repositories as $repository) { if ($repoProviders = $repository->getProviders($packageName)) { $providers = array_merge($providers, $repoProviders); @@ -307,7 +295,6 @@ public function getProviders(string $packageName): array * * @param string[] $names * @param string $stability one of 'stable', 'RC', 'beta', 'alpha' or 'dev' - * @return bool */ public function isPackageAcceptable(array $names, string $stability): bool { @@ -316,10 +303,8 @@ public function isPackageAcceptable(array $names, string $stability): bool /** * Create a pool for dependency resolution from the packages in this repository set. - * - * @return Pool */ - public function createPool(Request $request, IOInterface $io, EventDispatcher $eventDispatcher = null, PoolOptimizer $poolOptimizer = null): Pool + public function createPool(Request $request, IOInterface $io, ?EventDispatcher $eventDispatcher = null, ?PoolOptimizer $poolOptimizer = null): Pool { $poolBuilder = new PoolBuilder($this->acceptableStabilities, $this->stabilityFlags, $this->rootAliases, $this->rootReferences, $io, $eventDispatcher, $poolOptimizer, $this->temporaryConstraints); @@ -336,8 +321,6 @@ public function createPool(Request $request, IOInterface $io, EventDispatcher $e /** * Create a pool for dependency resolution from the packages in this repository set. - * - * @return Pool */ public function createPoolWithAllPackages(): Pool { @@ -349,7 +332,7 @@ public function createPoolWithAllPackages(): Pool $this->locked = true; - $packages = array(); + $packages = []; foreach ($this->repositories as $repository) { foreach ($repository->getPackages() as $package) { $packages[] = $package; @@ -373,23 +356,16 @@ public function createPoolWithAllPackages(): Pool return new Pool($packages); } - /** - * @param string $packageName - * - * @return Pool - */ - public function createPoolForPackage(string $packageName, LockArrayRepository $lockedRepo = null): Pool + public function createPoolForPackage(string $packageName, ?LockArrayRepository $lockedRepo = null): Pool { // TODO unify this with above in some simpler version without "request"? - return $this->createPoolForPackages(array($packageName), $lockedRepo); + return $this->createPoolForPackages([$packageName], $lockedRepo); } /** * @param string[] $packageNames - * - * @return Pool */ - public function createPoolForPackages(array $packageNames, LockArrayRepository $lockedRepo = null): Pool + public function createPoolForPackages(array $packageNames, ?LockArrayRepository $lockedRepo = null): Pool { $request = new Request($lockedRepo); @@ -412,13 +388,13 @@ public function createPoolForPackages(array $packageNames, LockArrayRepository $ */ private static function getRootAliasesPerPackage(array $aliases): array { - $normalizedAliases = array(); + $normalizedAliases = []; foreach ($aliases as $alias) { - $normalizedAliases[$alias['package']][$alias['version']] = array( + $normalizedAliases[$alias['package']][$alias['version']] = [ 'alias' => $alias['alias'], 'alias_normalized' => $alias['alias_normalized'], - ); + ]; } return $normalizedAliases; diff --git a/src/Composer/Repository/RepositoryUtils.php b/src/Composer/Repository/RepositoryUtils.php index f963b34b544b..13de4e2ce478 100644 --- a/src/Composer/Repository/RepositoryUtils.php +++ b/src/Composer/Repository/RepositoryUtils.php @@ -31,7 +31,7 @@ class RepositoryUtils * @param array $bucket Do not pass this in, only used to avoid recursion with circular deps * @return list */ - public static function filterRequiredPackages(array $packages, PackageInterface $requirer, array $bucket = array()): array + public static function filterRequiredPackages(array $packages, PackageInterface $requirer, array $bucket = []): array { $requires = $requirer->getRequires(); diff --git a/src/Composer/Repository/RootPackageRepository.php b/src/Composer/Repository/RootPackageRepository.php index 0cce7ec53d42..2e60e3a69b21 100644 --- a/src/Composer/Repository/RootPackageRepository.php +++ b/src/Composer/Repository/RootPackageRepository.php @@ -25,7 +25,7 @@ class RootPackageRepository extends ArrayRepository { public function __construct(RootPackageInterface $package) { - parent::__construct(array($package)); + parent::__construct([$package]); } public function getRepoName(): string diff --git a/src/Composer/Repository/Vcs/FossilDriver.php b/src/Composer/Repository/Vcs/FossilDriver.php index 32d54bf673db..e55b0d3acd74 100644 --- a/src/Composer/Repository/Vcs/FossilDriver.php +++ b/src/Composer/Repository/Vcs/FossilDriver.php @@ -68,8 +68,6 @@ public function initialize(): void /** * Check that fossil can be invoked via command line. - * - * @return void */ protected function checkFossil(): void { @@ -80,8 +78,6 @@ protected function checkFossil(): void /** * Clone or update existing local fossil repository. - * - * @return void */ protected function updateLocalRepo(): void { @@ -143,7 +139,7 @@ public function getUrl(): string */ public function getSource(string $identifier): array { - return array('type' => 'fossil', 'url' => $this->getUrl(), 'reference' => $identifier); + return ['type' => 'fossil', 'url' => $this->getUrl(), 'reference' => $identifier]; } /** @@ -175,7 +171,7 @@ public function getFileContent(string $file, string $identifier): ?string public function getChangeDate(string $identifier): ?\DateTimeImmutable { $this->process->execute('fossil finfo -b -n 1 composer.json', $output, $this->checkoutDir); - list(, $date) = explode(' ', trim($output), 3); + [, $date] = explode(' ', trim($output), 3); return new \DateTimeImmutable($date, new \DateTimeZone('UTC')); } @@ -186,7 +182,7 @@ public function getChangeDate(string $identifier): ?\DateTimeImmutable public function getTags(): array { if (null === $this->tags) { - $tags = array(); + $tags = []; $this->process->execute('fossil tag list', $output, $this->checkoutDir); foreach ($this->process->splitLines($output) as $tag) { @@ -205,7 +201,7 @@ public function getTags(): array public function getBranches(): array { if (null === $this->branches) { - $branches = array(); + $branches = []; $this->process->execute('fossil branch list', $output, $this->checkoutDir); foreach ($this->process->splitLines($output) as $branch) { diff --git a/src/Composer/Repository/Vcs/GitBitbucketDriver.php b/src/Composer/Repository/Vcs/GitBitbucketDriver.php index 985ed21fd71d..558f2d8e077f 100644 --- a/src/Composer/Repository/Vcs/GitBitbucketDriver.php +++ b/src/Composer/Repository/Vcs/GitBitbucketDriver.php @@ -72,12 +72,12 @@ public function initialize(): void $this->originUrl = 'bitbucket.org'; $this->cache = new Cache( $this->io, - implode('/', array( + implode('/', [ $this->config->get('cache-repo-dir'), $this->originUrl, $this->owner, $this->repository, - )) + ]) ); $this->cache->setReadOnly($this->config->get('cache-read-only')); } @@ -98,7 +98,6 @@ public function getUrl(): string * Attempts to fetch the repository data via the BitBucket API and * sets some parameters which are used in other methods * - * @return bool * @phpstan-impure */ protected function getRepoData(): bool @@ -108,7 +107,7 @@ protected function getRepoData(): bool $this->owner, $this->repository, http_build_query( - array('fields' => '-project,-owner'), + ['fields' => '-project,-owner'], '', '&' ) @@ -269,7 +268,7 @@ public function getSource(string $identifier): array return $this->fallbackDriver->getSource($identifier); } - return array('type' => $this->vcsType, 'url' => $this->getUrl(), 'reference' => $identifier); + return ['type' => $this->vcsType, 'url' => $this->getUrl(), 'reference' => $identifier]; } /** @@ -288,7 +287,7 @@ public function getDist(string $identifier): ?array $identifier ); - return array('type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => ''); + return ['type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => '']; } /** @@ -301,16 +300,16 @@ public function getTags(): array } if (null === $this->tags) { - $tags = array(); + $tags = []; $resource = sprintf( '%s?%s', $this->tagsUrl, http_build_query( - array( + [ 'pagelen' => 100, 'fields' => 'values.name,values.target.hash,next', 'sort' => '-target.date', - ), + ], '', '&' ) @@ -344,16 +343,16 @@ public function getBranches(): array } if (null === $this->branches) { - $branches = array(); + $branches = []; $resource = sprintf( '%s?%s', $this->branchesUrl, http_build_query( - array( + [ 'pagelen' => 100, 'fields' => 'values.name,values.target.hash,values.heads,next', 'sort' => '-target.date', - ), + ], '', '&' ) @@ -381,7 +380,6 @@ public function getBranches(): array * Get the remote content. * * @param string $url The URL of content - * @param bool $fetchingRepoData * * @return Response The result * @@ -394,7 +392,7 @@ protected function fetchWithOAuthCredentials(string $url, bool $fetchingRepoData } catch (TransportException $e) { $bitbucketUtil = new Bitbucket($this->io, $this->config, $this->process, $this->httpDownloader); - if (in_array($e->getCode(), array(403, 404), true) || (401 === $e->getCode() && strpos($e->getMessage(), 'Could not authenticate against') === 0)) { + if (in_array($e->getCode(), [403, 404], true) || (401 === $e->getCode() && strpos($e->getMessage(), 'Could not authenticate against') === 0)) { if (!$this->io->hasAuthentication($this->originUrl) && $bitbucketUtil->authorizeOAuth($this->originUrl) ) { @@ -404,7 +402,7 @@ protected function fetchWithOAuthCredentials(string $url, bool $fetchingRepoData if (!$this->io->isInteractive() && $fetchingRepoData) { $this->attemptCloneFallback(); - return new Response(array('url' => 'dummy'), 200, array(), 'null'); + return new Response(['url' => 'dummy'], 200, [], 'null'); } } @@ -414,8 +412,6 @@ protected function fetchWithOAuthCredentials(string $url, bool $fetchingRepoData /** * Generate an SSH URL - * - * @return string */ protected function generateSshUrl(): string { @@ -445,14 +441,10 @@ protected function attemptCloneFallback(): bool } } - /** - * @param string $url - * @return void - */ protected function setupFallbackDriver(string $url): void { $this->fallbackDriver = new GitDriver( - array('url' => $url), + ['url' => $url], $this->io, $this->config, $this->httpDownloader, @@ -463,7 +455,6 @@ protected function setupFallbackDriver(string $url): void /** * @param array $cloneLinks - * @return void */ protected function parseCloneUrls(array $cloneLinks): void { diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php index 731c5bde0a23..95b30f54fb04 100644 --- a/src/Composer/Repository/Vcs/GitDriver.php +++ b/src/Composer/Repository/Vcs/GitDriver.php @@ -13,7 +13,6 @@ namespace Composer\Repository\Vcs; use Composer\Pcre\Preg; -use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\Util\Url; @@ -131,7 +130,7 @@ public function getUrl(): string */ public function getSource(string $identifier): array { - return array('type' => 'git', 'url' => $this->getUrl(), 'reference' => $identifier); + return ['type' => 'git', 'url' => $this->getUrl(), 'reference' => $identifier]; } /** @@ -180,7 +179,7 @@ public function getChangeDate(string $identifier): ?\DateTimeImmutable public function getTags(): array { if (null === $this->tags) { - $this->tags = array(); + $this->tags = []; $this->process->execute('git show-ref --tags --dereference', $output, $this->repoDir); foreach ($output = $this->process->splitLines($output) as $tag) { @@ -199,7 +198,7 @@ public function getTags(): array public function getBranches(): array { if (null === $this->branches) { - $branches = array(); + $branches = []; $this->process->execute('git branch --no-color --no-abbrev -v', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { diff --git a/src/Composer/Repository/Vcs/GitHubDriver.php b/src/Composer/Repository/Vcs/GitHubDriver.php index 0e59f52396f0..7ca7bde066d4 100644 --- a/src/Composer/Repository/Vcs/GitHubDriver.php +++ b/src/Composer/Repository/Vcs/GitHubDriver.php @@ -81,9 +81,6 @@ public function initialize(): void $this->fetchRootIdentifier(); } - /** - * @return string - */ public function getRepositoryUrl(): string { return 'https://'.$this->originUrl.'/'.$this->owner.'/'.$this->repository; @@ -113,9 +110,6 @@ public function getUrl(): string return 'https://' . $this->originUrl . '/'.$this->owner.'/'.$this->repository.'.git'; } - /** - * @return string - */ protected function getApiUrl(): string { if ('github.com' === $this->originUrl) { @@ -143,7 +137,7 @@ public function getSource(string $identifier): array $url = $this->getUrl(); } - return array('type' => 'git', 'url' => $url, 'reference' => $identifier); + return ['type' => 'git', 'url' => $url, 'reference' => $identifier]; } /** @@ -153,7 +147,7 @@ public function getDist(string $identifier): ?array { $url = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/zipball/'.$identifier; - return array('type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => ''); + return ['type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => '']; } /** @@ -212,11 +206,11 @@ private function getFundingInfo() return $this->fundingInfo = false; } - foreach (array($this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/contents/.github/FUNDING.yml', $this->getApiUrl() . '/repos/'.$this->owner.'/.github/contents/FUNDING.yml') as $file) { + foreach ([$this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/contents/.github/FUNDING.yml', $this->getApiUrl() . '/repos/'.$this->owner.'/.github/contents/FUNDING.yml'] as $file) { try { - $response = $this->httpDownloader->get($file, array( + $response = $this->httpDownloader->get($file, [ 'retry-auth-failure' => false, - ))->decodeJson(); + ])->decodeJson(); } catch (TransportException $e) { continue; } @@ -229,7 +223,7 @@ private function getFundingInfo() return $this->fundingInfo = false; } - $result = array(); + $result = []; $key = null; foreach (Preg::split('{\r?\n}', $funding) as $line) { $line = trim($line); @@ -240,10 +234,10 @@ private function getFundingInfo() } if (Preg::isMatch('{^\[(.*)\](?:\s*#.*)?$}', $match[2], $match2)) { foreach (array_map('trim', Preg::split('{[\'"]?\s*,\s*[\'"]?}', $match2[1])) as $item) { - $result[] = array('type' => $match[1], 'url' => trim($item, '"\' ')); + $result[] = ['type' => $match[1], 'url' => trim($item, '"\' ')]; } } elseif (Preg::isMatch('{^([^#].*?)(\s+#.*)?$}', $match[2], $match2)) { - $result[] = array('type' => $match[1], 'url' => trim($match2[1], '"\' ')); + $result[] = ['type' => $match[1], 'url' => trim($match2[1], '"\' ')]; } $key = null; } elseif (Preg::isMatch('{^(\w+)\s*:\s*#\s*$}', $line, $match)) { @@ -252,7 +246,7 @@ private function getFundingInfo() Preg::isMatch('{^-\s*(.+)(\s+#.*)?$}', $line, $match) || Preg::isMatch('{^(.+),(\s*#.*)?$}', $line, $match) )) { - $result[] = array('type' => $key, 'url' => trim($match[1], '"\' ')); + $result[] = ['type' => $key, 'url' => trim($match[1], '"\' ')]; } elseif ($key && $line === ']') { $key = null; } @@ -342,7 +336,7 @@ public function getTags(): array return $this->gitDriver->getTags(); } if (null === $this->tags) { - $tags = array(); + $tags = []; $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/tags?per_page=100'; do { @@ -370,7 +364,7 @@ public function getBranches(): array return $this->gitDriver->getBranches(); } if (null === $this->branches) { - $branches = array(); + $branches = []; $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/git/refs/heads?per_page=100'; do { @@ -429,8 +423,6 @@ public function getRepoData(): ?array /** * Generate an SSH URL - * - * @return string */ protected function generateSshUrl(): string { @@ -443,8 +435,6 @@ protected function generateSshUrl(): string /** * @inheritDoc - * - * @param bool $fetchingRepoData */ protected function getContents(string $url, bool $fetchingRepoData = false): Response { @@ -468,11 +458,11 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res if (!$this->io->isInteractive()) { $this->attemptCloneFallback(); - return new Response(array('url' => 'dummy'), 200, array(), 'null'); + return new Response(['url' => 'dummy'], 200, [], 'null'); } - $scopesIssued = array(); - $scopesNeeded = array(); + $scopesIssued = []; + $scopesNeeded = []; if ($headers = $e->getHeaders()) { if ($scopes = Response::findHeaderValue($headers, 'X-OAuth-Scopes')) { $scopesIssued = explode(' ', $scopes); @@ -498,7 +488,7 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res if (!$this->io->isInteractive() && $fetchingRepoData) { $this->attemptCloneFallback(); - return new Response(array('url' => 'dummy'), 200, array(), 'null'); + return new Response(['url' => 'dummy'], 200, [], 'null'); } $rateLimited = $gitHubUtil->isRateLimited((array) $e->getHeaders()); @@ -534,7 +524,6 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res /** * Fetch root identifier from GitHub * - * @return void * @throws TransportException */ protected function fetchRootIdentifier(): void @@ -599,15 +588,10 @@ protected function attemptCloneFallback(): bool } } - /** - * @param string $url - * - * @return void - */ protected function setupGitDriver(string $url): void { $this->gitDriver = new GitDriver( - array('url' => $url), + ['url' => $url], $this->io, $this->config, $this->httpDownloader, @@ -616,9 +600,6 @@ protected function setupGitDriver(string $url): void $this->gitDriver->initialize(); } - /** - * @return string|null - */ protected function getNextPage(Response $response): ?string { $header = $response->getHeader('link'); diff --git a/src/Composer/Repository/Vcs/GitLabDriver.php b/src/Composer/Repository/Vcs/GitLabDriver.php index bbcd2a0052fa..8bdea65a9b53 100644 --- a/src/Composer/Repository/Vcs/GitLabDriver.php +++ b/src/Composer/Repository/Vcs/GitLabDriver.php @@ -48,7 +48,7 @@ class GitLabDriver extends VcsDriver /** * @var array Keeps commits returned by GitLab API as commit id => info */ - private $commits = array(); + private $commits = []; /** @var array Map of tag name to identifier */ private $tags; @@ -113,7 +113,7 @@ public function initialize(): void if (is_string($protocol = $this->config->get('gitlab-protocol'))) { // https treated as a synonym for http. - if (!in_array($protocol, array('git', 'http', 'https'))) { + if (!in_array($protocol, ['git', 'http', 'https'])) { throw new \RuntimeException('gitlab-protocol must be one of git, http.'); } $this->protocol = $protocol === 'git' ? 'ssh' : 'http'; @@ -137,8 +137,6 @@ public function initialize(): void * Mainly useful for tests. * * @internal - * - * @return void */ public function setHttpDownloader(HttpDownloader $httpDownloader): void { @@ -233,9 +231,6 @@ public function getChangeDate(string $identifier): ?\DateTimeImmutable return null; } - /** - * @return string - */ public function getRepositoryUrl(): string { if ($this->protocol) { @@ -264,7 +259,7 @@ public function getDist(string $identifier): ?array { $url = $this->getApiUrl().'/repository/archive.zip?sha='.$identifier; - return array('type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => ''); + return ['type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => '']; } /** @@ -276,7 +271,7 @@ public function getSource(string $identifier): array return $this->gitDriver->getSource($identifier); } - return array('type' => 'git', 'url' => $this->getRepositoryUrl(), 'reference' => $identifier); + return ['type' => 'git', 'url' => $this->getRepositoryUrl(), 'reference' => $identifier]; } /** @@ -333,16 +328,13 @@ public function getApiUrl(): string /** * Urlencode all non alphanumeric characters. rawurlencode() can not be used as it does not encode `.` - * - * @param string $string - * @return string */ private function urlEncodeAll(string $string): string { $encoded = ''; for ($i = 0; isset($string[$i]); $i++) { $character = $string[$i]; - if (!ctype_alnum($character) && !in_array($character, array('-', '_'), true)) { + if (!ctype_alnum($character) && !in_array($character, ['-', '_'], true)) { $character = '%' . sprintf('%02X', ord($character)); } $encoded .= $character; @@ -352,8 +344,6 @@ private function urlEncodeAll(string $string): string } /** - * @param string $type - * * @return string[] where keys are named references like tags or branches and the value a sha */ protected function getReferences(string $type): array @@ -361,7 +351,7 @@ protected function getReferences(string $type): array $perPage = 100; $resource = $this->getApiUrl().'/repository/'.$type.'?per_page='.$perPage; - $references = array(); + $references = []; do { $response = $this->getContents($resource); $data = $response->decodeJson(); @@ -384,9 +374,6 @@ protected function getReferences(string $type): array return $references; } - /** - * @return void - */ protected function fetchProject(): void { // we need to fetch the default branch from the api @@ -431,8 +418,6 @@ protected function attemptCloneFallback(): bool /** * Generate an SSH URL - * - * @return string */ protected function generateSshUrl(): string { @@ -443,23 +428,15 @@ protected function generateSshUrl(): string return 'git@' . $this->originUrl . ':'.$this->namespace.'/'.$this->repository.'.git'; } - /** - * @return string - */ protected function generatePublicUrl(): string { return $this->scheme . '://' . $this->originUrl . '/'.$this->namespace.'/'.$this->repository.'.git'; } - /** - * @param string $url - * - * @return void - */ protected function setupGitDriver(string $url): void { $this->gitDriver = new GitDriver( - array('url' => $url), + ['url' => $url], $this->io, $this->config, $this->httpDownloader, @@ -470,8 +447,6 @@ protected function setupGitDriver(string $url): void /** * @inheritDoc - * - * @param bool $fetchingRepoData */ protected function getContents(string $url, bool $fetchingRepoData = false): Response { @@ -502,7 +477,7 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res $this->attemptCloneFallback(); - return new Response(array('url' => 'dummy'), 200, array(), 'null'); + return new Response(['url' => 'dummy'], 200, [], 'null'); } } @@ -544,7 +519,7 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res if (!$this->io->isInteractive()) { $this->attemptCloneFallback(); - return new Response(array('url' => 'dummy'), 200, array(), 'null'); + return new Response(['url' => 'dummy'], 200, [], 'null'); } $this->io->writeError('Failed to download ' . $this->namespace . '/' . $this->repository . ':' . $e->getMessage() . ''); $gitLabUtil->authorizeOAuthInteractively($this->scheme, $this->originUrl, 'Your credentials are required to fetch private repository metadata ('.$this->url.')'); @@ -559,7 +534,7 @@ protected function getContents(string $url, bool $fetchingRepoData = false): Res if (!$this->io->isInteractive() && $fetchingRepoData) { $this->attemptCloneFallback(); - return new Response(array('url' => 'dummy'), 200, array(), 'null'); + return new Response(['url' => 'dummy'], 200, [], 'null'); } throw $e; @@ -599,9 +574,6 @@ public static function supports(IOInterface $io, Config $config, string $url, bo return true; } - /** - * @return string|null - */ protected function getNextPage(Response $response): ?string { $header = $response->getHeader('link'); @@ -618,7 +590,6 @@ protected function getNextPage(Response $response): ?string /** * @param array $configuredDomains - * @param string $guessedDomain * @param array $urlParts * @param string $portNumber * diff --git a/src/Composer/Repository/Vcs/HgDriver.php b/src/Composer/Repository/Vcs/HgDriver.php index 73ad1a2e3871..477dea59c16b 100644 --- a/src/Composer/Repository/Vcs/HgDriver.php +++ b/src/Composer/Repository/Vcs/HgDriver.php @@ -110,7 +110,7 @@ public function getUrl(): string */ public function getSource(string $identifier): array { - return array('type' => 'hg', 'url' => $this->getUrl(), 'reference' => $identifier); + return ['type' => 'hg', 'url' => $this->getUrl(), 'reference' => $identifier]; } /** @@ -163,7 +163,7 @@ public function getChangeDate(string $identifier): ?\DateTimeImmutable public function getTags(): array { if (null === $this->tags) { - $tags = array(); + $tags = []; $this->process->execute('hg tags', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $tag) { @@ -185,8 +185,8 @@ public function getTags(): array public function getBranches(): array { if (null === $this->branches) { - $branches = array(); - $bookmarks = array(); + $branches = []; + $bookmarks = []; $this->process->execute('hg branches', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { diff --git a/src/Composer/Repository/Vcs/PerforceDriver.php b/src/Composer/Repository/Vcs/PerforceDriver.php index 396c9489447e..a77c8c94ceb5 100644 --- a/src/Composer/Repository/Vcs/PerforceDriver.php +++ b/src/Composer/Repository/Vcs/PerforceDriver.php @@ -53,8 +53,6 @@ public function initialize(): void /** * @param array $repoConfig - * - * @return void */ private function initPerforce(array $repoConfig): void { @@ -123,12 +121,12 @@ public function getDist(string $identifier): ?array */ public function getSource(string $identifier): array { - return array( + return [ 'type' => 'perforce', 'url' => $this->repoConfig['url'], 'reference' => $identifier, 'p4user' => $this->perforce->getUser(), - ); + ]; } /** @@ -178,17 +176,11 @@ public function cleanup(): void $this->perforce = null; } - /** - * @return string - */ public function getDepot(): string { return $this->depot; } - /** - * @return string - */ public function getBranch(): string { return $this->branch; diff --git a/src/Composer/Repository/Vcs/SvnDriver.php b/src/Composer/Repository/Vcs/SvnDriver.php index 579a46beadd8..d1d67a14cf9b 100644 --- a/src/Composer/Repository/Vcs/SvnDriver.php +++ b/src/Composer/Repository/Vcs/SvnDriver.php @@ -111,7 +111,7 @@ public function getUrl(): string */ public function getSource(string $identifier): array { - return array('type' => 'svn', 'url' => $this->baseUrl, 'reference' => $identifier); + return ['type' => 'svn', 'url' => $this->baseUrl, 'reference' => $identifier]; } /** @@ -173,10 +173,6 @@ public function getComposerInformation(string $identifier): ?array return $this->infoCache[$identifier]; } - /** - * @param string $file - * @param string $identifier - */ public function getFileContent(string $file, string $identifier): ?string { $identifier = '/' . trim($identifier, '/') . '/'; @@ -235,7 +231,7 @@ public function getChangeDate(string $identifier): ?\DateTimeImmutable public function getTags(): array { if (null === $this->tags) { - $tags = array(); + $tags = []; if ($this->tagsPath !== false) { $output = $this->execute('svn ls --verbose', $this->baseUrl . '/' . $this->tagsPath); @@ -266,7 +262,7 @@ public function getTags(): array public function getBranches(): array { if (null === $this->branches) { - $branches = array(); + $branches = []; if (false === $this->trunkPath) { $trunkParent = $this->baseUrl . '/'; @@ -360,10 +356,6 @@ public static function supports(IOInterface $io, Config $config, string $url, bo /** * An absolute path (leading '/') is converted to a file:// url. - * - * @param string $url - * - * @return string */ protected static function normalizeUrl(string $url): string { @@ -382,7 +374,6 @@ protected static function normalizeUrl(string $url): string * @param string $command The svn command to run. * @param string $url The SVN URL. * @throws \RuntimeException - * @return string */ protected function execute(string $command, string $url): string { @@ -409,8 +400,6 @@ protected function execute(string $command, string $url): string * * @param string $baseDir The path to trunk/branch/tag * @param string $revision The revision mark to add to identifier - * - * @return string */ protected function buildIdentifier(string $baseDir, string $revision): string { diff --git a/src/Composer/Repository/Vcs/VcsDriver.php b/src/Composer/Repository/Vcs/VcsDriver.php index 74fcfd76c27c..b780304f3368 100644 --- a/src/Composer/Repository/Vcs/VcsDriver.php +++ b/src/Composer/Repository/Vcs/VcsDriver.php @@ -45,7 +45,7 @@ abstract class VcsDriver implements VcsDriverInterface /** @var HttpDownloader */ protected $httpDownloader; /** @var array */ - protected $infoCache = array(); + protected $infoCache = []; /** @var ?Cache */ protected $cache; @@ -75,9 +75,6 @@ final public function __construct(array $repoConfig, IOInterface $io, Config $co /** * Returns whether or not the given $identifier should be cached or not. - * - * @param string $identifier - * @return bool */ protected function shouldCache(string $identifier): bool { @@ -107,8 +104,6 @@ public function getComposerInformation(string $identifier): ?array } /** - * @param string $identifier - * * @return array|null */ protected function getBaseComposerInformation(string $identifier): ?array @@ -166,12 +161,11 @@ protected function getScheme(): string * * @param string $url The URL of content * - * @return Response * @throws TransportException */ protected function getContents(string $url): Response { - $options = $this->repoConfig['options'] ?? array(); + $options = $this->repoConfig['options'] ?? []; return $this->httpDownloader->get($url, $options); } @@ -181,6 +175,5 @@ protected function getContents(string $url): Response */ public function cleanup(): void { - } } diff --git a/src/Composer/Repository/Vcs/VcsDriverInterface.php b/src/Composer/Repository/Vcs/VcsDriverInterface.php index fd5684851a6d..96a4b8ad3414 100644 --- a/src/Composer/Repository/Vcs/VcsDriverInterface.php +++ b/src/Composer/Repository/Vcs/VcsDriverInterface.php @@ -23,8 +23,6 @@ interface VcsDriverInterface { /** * Initializes the driver (git clone, svn checkout, fetch info etc) - * - * @return void */ public function initialize(): void; @@ -38,17 +36,11 @@ public function getComposerInformation(string $identifier): ?array; /** * Return the content of $file or null if the file does not exist. - * - * @param string $file - * @param string $identifier - * @return string|null */ public function getFileContent(string $file, string $identifier): ?string; /** * Get the changedate for $identifier. - * - * @param string $identifier */ public function getChangeDate(string $identifier): ?\DateTimeImmutable; @@ -89,8 +81,6 @@ public function getSource(string $identifier): array; /** * Return the URL of the repository - * - * @return string */ public function getUrl(): string; @@ -105,8 +95,6 @@ public function hasComposerFile(string $identifier): bool; /** * Performs any cleanup necessary as the driver is not longer needed - * - * @return void */ public function cleanup(): void; @@ -117,7 +105,6 @@ public function cleanup(): void; * @param Config $config current $config * @param string $url URL to validate/check * @param bool $deep unless true, only shallow checks (url matching typically) should be done - * @return bool */ public static function supports(IOInterface $io, Config $config, string $url, bool $deep = false): bool; } diff --git a/src/Composer/Repository/VcsRepository.php b/src/Composer/Repository/VcsRepository.php index 95828c1e24b8..75b138b79073 100644 --- a/src/Composer/Repository/VcsRepository.php +++ b/src/Composer/Repository/VcsRepository.php @@ -66,18 +66,18 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt /** @var ?VersionCacheInterface */ private $versionCache; /** @var string[] */ - private $emptyReferences = array(); + private $emptyReferences = []; /** @var array<'tags'|'branches', array> */ - private $versionTransportExceptions = array(); + private $versionTransportExceptions = []; /** * @param array{url: string, type?: string}&array $repoConfig * @param array>|null $drivers */ - public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, EventDispatcher $dispatcher = null, ProcessExecutor $process = null, array $drivers = null, VersionCacheInterface $versionCache = null) + public function __construct(array $repoConfig, IOInterface $io, Config $config, HttpDownloader $httpDownloader, ?EventDispatcher $dispatcher = null, ?ProcessExecutor $process = null, ?array $drivers = null, ?VersionCacheInterface $versionCache = null) { parent::__construct(); - $this->drivers = $drivers ?: array( + $this->drivers = $drivers ?: [ 'github' => 'Composer\Repository\Vcs\GitHubDriver', 'gitlab' => 'Composer\Repository\Vcs\GitLabDriver', 'bitbucket' => 'Composer\Repository\Vcs\GitBitbucketDriver', @@ -88,7 +88,7 @@ public function __construct(array $repoConfig, IOInterface $io, Config $config, 'fossil' => 'Composer\Repository\Vcs\FossilDriver', // svn must be last because identifying a subversion server for sure is practically impossible 'svn' => 'Composer\Repository\Vcs\SvnDriver', - ); + ]; $this->url = $repoConfig['url']; $this->io = $io; @@ -118,17 +118,11 @@ public function getRepoConfig() return $this->repoConfig; } - /** - * @return void - */ public function setLoader(LoaderInterface $loader): void { $this->loader = $loader; } - /** - * @return VcsDriverInterface|null - */ public function getDriver(): ?VcsDriverInterface { if ($this->driver) { @@ -164,9 +158,6 @@ public function getDriver(): ?VcsDriverInterface return null; } - /** - * @return bool - */ public function hadInvalidBranches(): bool { return $this->branchErrorOccurred; @@ -328,7 +319,7 @@ protected function initialize() $branches = $driver->getBranches(); // make sure the root identifier branch gets loaded first if ($hasRootIdentifierComposerJson && isset($branches[$driver->getRootIdentifier()])) { - $branches = array($driver->getRootIdentifier() => $branches[$driver->getRootIdentifier()]) + $branches; + $branches = [$driver->getRootIdentifier() => $branches[$driver->getRootIdentifier()]] + $branches; } foreach ($branches as $branch => $identifier) { @@ -430,9 +421,7 @@ protected function initialize() } /** - * @param VcsDriverInterface $driver * @param array{name?: string, dist?: array{type: string, url: string, reference: string, shasum: string}, source?: array{type: string, url: string, reference: string}} $data - * @param string $identifier * * @return array{name: string|null, dist: array{type: string, url: string, reference: string, shasum: string}|null, source: array{type: string, url: string, reference: string}} */ @@ -455,8 +444,6 @@ protected function preProcess(VcsDriverInterface $driver, array $data, string $i } /** - * @param string $branch - * * @return string|false */ private function validateBranch(string $branch) @@ -475,8 +462,6 @@ private function validateBranch(string $branch) } /** - * @param string $version - * * @return string|false */ private function validateTag(string $version) @@ -490,12 +475,6 @@ private function validateTag(string $version) } /** - * @param string $version - * @param string $identifier - * @param bool $isVerbose - * @param bool $isVeryVerbose - * @param bool $isDefaultBranch - * * @return \Composer\Package\CompletePackage|\Composer\Package\CompleteAliasPackage|null|false null if no cache present, false if the absence of a version was cached */ private function getCachedPackageVersion(string $version, string $identifier, bool $isVerbose, bool $isVeryVerbose, bool $isDefaultBranch = false) @@ -541,11 +520,8 @@ private function getCachedPackageVersion(string $version, string $identifier, bo return null; } - /** - * @return bool - */ private function shouldRethrowTransportException(TransportException $e): bool { - return in_array($e->getCode(), array(401, 403, 429), true) || $e->getCode() >= 500; + return in_array($e->getCode(), [401, 403, 429], true) || $e->getCode() >= 500; } } diff --git a/src/Composer/Repository/VersionCacheInterface.php b/src/Composer/Repository/VersionCacheInterface.php index 520007a98a0a..ac0c41764eb3 100644 --- a/src/Composer/Repository/VersionCacheInterface.php +++ b/src/Composer/Repository/VersionCacheInterface.php @@ -15,8 +15,6 @@ interface VersionCacheInterface { /** - * @param string $version - * @param string $identifier * @return mixed[]|null|false Package version data if found, false to indicate the identifier is known but has no package, null for an unknown identifier */ public function getVersionPackage(string $version, string $identifier); diff --git a/src/Composer/Repository/WritableArrayRepository.php b/src/Composer/Repository/WritableArrayRepository.php index 8fb92a7a44f1..349c324724b6 100644 --- a/src/Composer/Repository/WritableArrayRepository.php +++ b/src/Composer/Repository/WritableArrayRepository.php @@ -12,7 +12,6 @@ namespace Composer\Repository; -use Composer\Package\AliasPackage; use Composer\Installer\InstallationManager; /** @@ -27,7 +26,7 @@ class WritableArrayRepository extends ArrayRepository implements WritableReposit /** * @var string[] */ - protected $devPackageNames = array(); + protected $devPackageNames = []; /** @var bool|null */ private $devMode = null; diff --git a/src/Composer/Script/Event.php b/src/Composer/Script/Event.php index 4b8ba2468d22..fc3386f67706 100644 --- a/src/Composer/Script/Event.php +++ b/src/Composer/Script/Event.php @@ -54,7 +54,7 @@ class Event extends BaseEvent * @param array $args Arguments passed by the user * @param mixed[] $flags Optional flags to pass data not as argument */ - public function __construct(string $name, Composer $composer, IOInterface $io, bool $devMode = false, array $args = array(), array $flags = array()) + public function __construct(string $name, Composer $composer, IOInterface $io, bool $devMode = false, array $args = [], array $flags = []) { parent::__construct($name, $args, $flags); $this->composer = $composer; @@ -64,8 +64,6 @@ public function __construct(string $name, Composer $composer, IOInterface $io, b /** * Returns the composer instance. - * - * @return Composer */ public function getComposer(): Composer { @@ -74,8 +72,6 @@ public function getComposer(): Composer /** * Returns the IO instance. - * - * @return IOInterface */ public function getIO(): IOInterface { @@ -84,8 +80,6 @@ public function getIO(): IOInterface /** * Return the dev mode flag - * - * @return bool */ public function isDevMode(): bool { @@ -105,7 +99,6 @@ public function getOriginatingEvent(): ?BaseEvent /** * Set the originating event. * - * @param BaseEvent $event * @return $this */ public function setOriginatingEvent(BaseEvent $event): self @@ -117,9 +110,6 @@ public function setOriginatingEvent(BaseEvent $event): self /** * Returns the upper-most event in chain. - * - * @param BaseEvent $event - * @return BaseEvent */ private function calculateOriginatingEvent(BaseEvent $event): BaseEvent { diff --git a/src/Composer/SelfUpdate/Keys.php b/src/Composer/SelfUpdate/Keys.php index 72df28fd701a..595ffa73729d 100644 --- a/src/Composer/SelfUpdate/Keys.php +++ b/src/Composer/SelfUpdate/Keys.php @@ -19,16 +19,11 @@ */ class Keys { - /** - * @param string $path - * - * @return string - */ public static function fingerprint(string $path): string { $hash = strtoupper(hash('sha256', Preg::replace('{\s}', '', file_get_contents($path)))); - return implode(' ', array( + return implode(' ', [ substr($hash, 0, 8), substr($hash, 8, 8), substr($hash, 16, 8), @@ -38,6 +33,6 @@ public static function fingerprint(string $path): string substr($hash, 40, 8), substr($hash, 48, 8), substr($hash, 56, 8), - )); + ]); } } diff --git a/src/Composer/SelfUpdate/Versions.php b/src/Composer/SelfUpdate/Versions.php index af5b552def71..b6145fc482e6 100644 --- a/src/Composer/SelfUpdate/Versions.php +++ b/src/Composer/SelfUpdate/Versions.php @@ -45,9 +45,6 @@ public function __construct(Config $config, HttpDownloader $httpDownloader) $this->config = $config; } - /** - * @return string - */ public function getChannel(): string { if ($this->channel) { @@ -57,7 +54,7 @@ public function getChannel(): string $channelFile = $this->config->get('home').'/update-channel'; if (file_exists($channelFile)) { $channel = trim(file_get_contents($channelFile)); - if (in_array($channel, array('stable', 'preview', 'snapshot', '2.2'), true)) { + if (in_array($channel, ['stable', 'preview', 'snapshot', '2.2'], true)) { return $this->channel = $channel; } } @@ -65,12 +62,7 @@ public function getChannel(): string return $this->channel = 'stable'; } - /** - * @param string $channel - * - * @return void - */ - public function setChannel(string $channel, IOInterface $io = null): void + public function setChannel(string $channel, ?IOInterface $io = null): void { if (!in_array($channel, self::$channels, true)) { throw new \InvalidArgumentException('Invalid channel '.$channel.', must be one of: ' . implode(', ', self::$channels)); @@ -90,8 +82,6 @@ public function setChannel(string $channel, IOInterface $io = null): void } /** - * @param string|null $channel - * * @return array{path: string, version: string, min-php: int, eol?: true} */ public function getLatest(?string $channel = null): array diff --git a/src/Composer/Util/AuthHelper.php b/src/Composer/Util/AuthHelper.php index 5e0fa48748c1..ec3476670ded 100644 --- a/src/Composer/Util/AuthHelper.php +++ b/src/Composer/Util/AuthHelper.php @@ -27,7 +27,7 @@ class AuthHelper /** @var Config */ protected $config; /** @var array Map of origins to message displayed */ - private $displayedOriginAuthentications = array(); + private $displayedOriginAuthentications = []; public function __construct(IOInterface $io, Config $config) { @@ -36,10 +36,7 @@ public function __construct(IOInterface $io, Config $config) } /** - * @param string $origin * @param 'prompt'|bool $storeAuth - * - * @return void */ public function storeAuth(string $origin, $storeAuth): void { @@ -52,7 +49,7 @@ public function storeAuth(string $origin, $storeAuth): void 'Do you want to store credentials for '.$origin.' in '.$configSource->getName().' ? [Yn] ', static function ($value): string { $input = strtolower(substr(trim($value), 0, 1)); - if (in_array($input, array('y','n'))) { + if (in_array($input, ['y','n'])) { return $input; } throw new \RuntimeException('Please answer (y)es or (n)o'); @@ -74,8 +71,6 @@ static function ($value): string { } /** - * @param string $url - * @param string $origin * @param int $statusCode HTTP status code that triggered this call * @param string|null $reason a message/description explaining why this was called * @param string[] $headers @@ -84,7 +79,7 @@ static function ($value): string { * retried, if storeAuth is true then on a successful retry the authentication should be persisted to auth.json * @phpstan-return array{retry: bool, storeAuth: 'prompt'|bool} */ - public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, ?string $reason = null, array $headers = array(), int $retryCount = 0): array + public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, ?string $reason = null, array $headers = [], int $retryCount = 0): array { $storeAuth = false; @@ -104,7 +99,7 @@ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, } $this->io->ask('After authorizing your token, confirm that you would like to retry the request'); - return array('retry' => true, 'storeAuth' => $storeAuth); + return ['retry' => true, 'storeAuth' => $storeAuth]; } if ($rateLimited) { @@ -141,7 +136,7 @@ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, $auth = null; if ($this->io->hasAuthentication($origin)) { $auth = $this->io->getAuthentication($origin); - if (in_array($auth['password'], array('gitlab-ci-token', 'private-token', 'oauth2'), true)) { + if (in_array($auth['password'], ['gitlab-ci-token', 'private-token', 'oauth2'], true)) { throw new TransportException("Invalid credentials for '" . $url . "', aborting.", $statusCode); } } @@ -207,7 +202,7 @@ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, // if two or more requests are started together for the same host, and the first // received authentication already, we let the others retry before failing them if ($retryCount === 0) { - return array('retry' => true, 'storeAuth' => false); + return ['retry' => true, 'storeAuth' => false]; } throw new TransportException("Invalid credentials (HTTP $statusCode) for '$url', aborting.", $statusCode); @@ -220,13 +215,11 @@ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, $storeAuth = $this->config->get('store-auths'); } - return array('retry' => true, 'storeAuth' => $storeAuth); + return ['retry' => true, 'storeAuth' => $storeAuth]; } /** * @param string[] $headers - * @param string $origin - * @param string $url * * @return string[] updated headers array */ @@ -245,7 +238,7 @@ public function addAuthenticationHeader(array $headers, string $origin, string $ } } elseif ( in_array($origin, $this->config->get('gitlab-domains'), true) - && in_array($auth['password'], array('oauth2', 'private-token', 'gitlab-ci-token'), true) + && in_array($auth['password'], ['oauth2', 'private-token', 'gitlab-ci-token'], true) ) { if ($auth['password'] === 'oauth2') { $headers[] = 'Authorization: Bearer '.$auth['username']; @@ -273,7 +266,7 @@ public function addAuthenticationHeader(array $headers, string $origin, string $ $this->io->writeError($authenticationDisplayMessage, true, IOInterface::DEBUG); $this->displayedOriginAuthentications[$origin] = $authenticationDisplayMessage; } - } elseif (in_array($origin, array('api.bitbucket.org', 'api.github.com'), true)) { + } elseif (in_array($origin, ['api.bitbucket.org', 'api.github.com'], true)) { return $this->addAuthenticationHeader($headers, str_replace('api.', '', $origin), $url); } diff --git a/src/Composer/Util/Bitbucket.php b/src/Composer/Util/Bitbucket.php index c74870b6793d..e77598df2954 100644 --- a/src/Composer/Util/Bitbucket.php +++ b/src/Composer/Util/Bitbucket.php @@ -46,7 +46,7 @@ class Bitbucket * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking * @param int $time Timestamp, injectable for mocking */ - public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, HttpDownloader $httpDownloader = null, int $time = null) + public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?HttpDownloader $httpDownloader = null, ?int $time = null) { $this->io = $io; $this->config = $config; @@ -55,9 +55,6 @@ public function __construct(IOInterface $io, Config $config, ProcessExecutor $pr $this->time = $time; } - /** - * @return string - */ public function getToken(): string { if (!isset($this->token['access_token'])) { @@ -89,19 +86,16 @@ public function authorizeOAuth(string $originUrl): bool return false; } - /** - * @return bool - */ private function requestAccessToken(): bool { try { - $response = $this->httpDownloader->get(self::OAUTH2_ACCESS_TOKEN_URL, array( + $response = $this->httpDownloader->get(self::OAUTH2_ACCESS_TOKEN_URL, [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'content' => 'grant_type=client_credentials', - ), - )); + ], + ]); $token = $response->decodeJson(); if (!isset($token['expires_in']) || !isset($token['access_token'])) { @@ -119,7 +113,7 @@ private function requestAccessToken(): bool return false; } - if (in_array($e->getCode(), array(403, 401))) { + if (in_array($e->getCode(), [403, 401])) { $this->io->writeError('Invalid OAuth consumer provided.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org "'); @@ -141,7 +135,7 @@ private function requestAccessToken(): bool * @throws TransportException|\Exception * @return bool true on success */ - public function authorizeOAuthInteractively(string $originUrl, string $message = null): bool + public function authorizeOAuthInteractively(string $originUrl, ?string $message = null): bool { if ($message) { $this->io->writeError($message); @@ -189,11 +183,6 @@ public function authorizeOAuthInteractively(string $originUrl, string $message = /** * Retrieves an access token from Bitbucket. - * - * @param string $originUrl - * @param string $consumerKey - * @param string $consumerSecret - * @return string */ public function requestToken(string $originUrl, string $consumerKey, string $consumerSecret): string { @@ -217,12 +206,6 @@ public function requestToken(string $originUrl, string $consumerKey, string $con /** * Store the new/updated credentials to the configuration - * - * @param string $originUrl - * @param string $consumerKey - * @param string $consumerSecret - * - * @return void */ private function storeInAuthConfig(string $originUrl, string $consumerKey, string $consumerSecret): void { @@ -233,20 +216,16 @@ private function storeInAuthConfig(string $originUrl, string $consumerKey, strin } $time = null === $this->time ? time() : $this->time; - $consumer = array( + $consumer = [ "consumer-key" => $consumerKey, "consumer-secret" => $consumerSecret, "access-token" => $this->token['access_token'], "access-token-expiration" => $time + $this->token['expires_in'], - ); + ]; $this->config->getAuthConfigSource()->addConfigSetting('bitbucket-oauth.'.$originUrl, $consumer); } - /** - * @param string $originUrl - * @return bool - */ private function getTokenFromConfig(string $originUrl): bool { $authConfig = $this->config->get('bitbucket-oauth'); @@ -258,9 +237,9 @@ private function getTokenFromConfig(string $originUrl): bool return false; } - $this->token = array( + $this->token = [ 'access_token' => $authConfig[$originUrl]['access-token'], - ); + ]; return true; } diff --git a/src/Composer/Util/ComposerMirror.php b/src/Composer/Util/ComposerMirror.php index 9fb9f158ce07..6f23c22c3615 100644 --- a/src/Composer/Util/ComposerMirror.php +++ b/src/Composer/Util/ComposerMirror.php @@ -21,16 +21,6 @@ */ class ComposerMirror { - /** - * @param string $mirrorUrl - * @param string $packageName - * @param string $version - * @param string|null $reference - * @param string|null $type - * @param string|null $prettyVersion - * - * @return string - */ public static function processUrl(string $mirrorUrl, string $packageName, string $version, ?string $reference, ?string $type, ?string $prettyVersion = null): string { if ($reference) { @@ -38,8 +28,8 @@ public static function processUrl(string $mirrorUrl, string $packageName, string } $version = strpos($version, '/') === false ? $version : md5($version); - $from = array('%package%', '%version%', '%reference%', '%type%'); - $to = array($packageName, $version, $reference, $type); + $from = ['%package%', '%version%', '%reference%', '%type%']; + $to = [$packageName, $version, $reference, $type]; if (null !== $prettyVersion) { $from[] = '%prettyVersion%'; $to[] = $prettyVersion; @@ -48,14 +38,6 @@ public static function processUrl(string $mirrorUrl, string $packageName, string return str_replace($from, $to, $mirrorUrl); } - /** - * @param string $mirrorUrl - * @param string $packageName - * @param string $url - * @param string|null $type - * - * @return string - */ public static function processGitUrl(string $mirrorUrl, string $packageName, string $url, ?string $type): string { if (Preg::isMatch('#^(?:(?:https?|git)://github\.com/|git@github\.com:)([^/]+)/(.+?)(?:\.git)?$#', $url, $match)) { @@ -67,20 +49,12 @@ public static function processGitUrl(string $mirrorUrl, string $packageName, str } return str_replace( - array('%package%', '%normalizedUrl%', '%type%'), - array($packageName, $url, $type), + ['%package%', '%normalizedUrl%', '%type%'], + [$packageName, $url, $type], $mirrorUrl ); } - /** - * @param string $mirrorUrl - * @param string $packageName - * @param string $url - * @param string $type - * - * @return string - */ public static function processHgUrl(string $mirrorUrl, string $packageName, string $url, string $type): string { return self::processGitUrl($mirrorUrl, $packageName, $url, $type); diff --git a/src/Composer/Util/ConfigValidator.php b/src/Composer/Util/ConfigValidator.php index 82cd39171bda..44c2c3a2c2d8 100644 --- a/src/Composer/Util/ConfigValidator.php +++ b/src/Composer/Util/ConfigValidator.php @@ -52,9 +52,9 @@ public function __construct(IOInterface $io) */ public function validate(string $file, int $arrayLoaderValidationFlags = ValidatingArrayLoader::CHECK_ALL, int $flags = self::CHECK_VERSION): array { - $errors = array(); - $publishErrors = array(); - $warnings = array(); + $errors = []; + $publishErrors = []; + $warnings = []; // validate json schema $laxValid = false; @@ -77,7 +77,7 @@ public function validate(string $file, int $arrayLoaderValidationFlags = Validat } catch (\Exception $e) { $errors[] = $e->getMessage(); - return array($errors, $publishErrors, $warnings); + return [$errors, $publishErrors, $warnings]; } if (is_array($manifest)) { @@ -157,9 +157,9 @@ public function validate(string $file, int $arrayLoaderValidationFlags = Validat } // check for meaningless provide/replace satisfying requirements - foreach (array('provide', 'replace') as $linkType) { + foreach (['provide', 'replace'] as $linkType) { if (isset($manifest[$linkType])) { - foreach (array('require', 'require-dev') as $requireType) { + foreach (['require', 'require-dev'] as $requireType) { if (isset($manifest[$requireType])) { foreach ($manifest[$linkType] as $provide => $constraint) { if (isset($manifest[$requireType][$provide])) { @@ -172,8 +172,8 @@ public function validate(string $file, int $arrayLoaderValidationFlags = Validat } // check for commit references - $require = $manifest['require'] ?? array(); - $requireDev = $manifest['require-dev'] ?? array(); + $require = $manifest['require'] ?? []; + $requireDev = $manifest['require-dev'] ?? []; $packages = array_merge($require, $requireDev); foreach ($packages as $package => $version) { if (Preg::isMatch('/#/', $version)) { @@ -185,8 +185,8 @@ public function validate(string $file, int $arrayLoaderValidationFlags = Validat } // report scripts-descriptions for non-existent scripts - $scriptsDescriptions = $manifest['scripts-descriptions'] ?? array(); - $scripts = $manifest['scripts'] ?? array(); + $scriptsDescriptions = $manifest['scripts-descriptions'] ?? []; + $scripts = $manifest['scripts'] ?? []; foreach ($scriptsDescriptions as $scriptName => $scriptDescription) { if (!array_key_exists($scriptName, $scripts)) { $warnings[] = sprintf( @@ -219,6 +219,6 @@ public function validate(string $file, int $arrayLoaderValidationFlags = Validat $warnings = array_merge($warnings, $loader->getWarnings()); - return array($errors, $publishErrors, $warnings); + return [$errors, $publishErrors, $warnings]; } } diff --git a/src/Composer/Util/ErrorHandler.php b/src/Composer/Util/ErrorHandler.php index d918504fcdbb..4ed0cfefba1c 100644 --- a/src/Composer/Util/ErrorHandler.php +++ b/src/Composer/Util/ErrorHandler.php @@ -34,7 +34,6 @@ class ErrorHandler * * @static * @throws \ErrorException - * @return bool */ public static function handle(int $level, string $message, string $file, int $line): bool { @@ -73,14 +72,10 @@ public static function handle(int $level, string $message, string $file, int $li /** * Register error handler. - * - * @param IOInterface|null $io - * - * @return void */ - public static function register(IOInterface $io = null): void + public static function register(?IOInterface $io = null): void { - set_error_handler(array(__CLASS__, 'handle')); + set_error_handler([__CLASS__, 'handle']); error_reporting(E_ALL | E_STRICT); self::$io = $io; } diff --git a/src/Composer/Util/Filesystem.php b/src/Composer/Util/Filesystem.php index a04513cd64ec..92cc0af1143c 100644 --- a/src/Composer/Util/Filesystem.php +++ b/src/Composer/Util/Filesystem.php @@ -28,14 +28,12 @@ class Filesystem /** @var ?ProcessExecutor */ private $processExecutor; - public function __construct(ProcessExecutor $executor = null) + public function __construct(?ProcessExecutor $executor = null) { $this->processExecutor = $executor; } /** - * @param string $file - * * @return bool */ public function remove(string $file) @@ -54,7 +52,6 @@ public function remove(string $file) /** * Checks if a directory is empty * - * @param string $dir * @return bool */ public function isDirEmpty(string $dir) @@ -69,9 +66,6 @@ public function isDirEmpty(string $dir) } /** - * @param string $dir - * @param bool $ensureDirectoryExists - * * @return void */ public function emptyDirectory(string $dir, bool $ensureDirectoryExists = true) @@ -103,7 +97,6 @@ public function emptyDirectory(string $dir, bool $ensureDirectoryExists = true) * Uses the process component if proc_open is enabled on the PHP * installation. * - * @param string $directory * @throws \RuntimeException * @return bool */ @@ -138,7 +131,6 @@ public function removeDirectory(string $directory) * Uses the process component if proc_open is enabled on the PHP * installation. * - * @param string $directory * @throws \RuntimeException * @return PromiseInterface */ @@ -172,9 +164,6 @@ public function removeDirectoryAsync(string $directory) } /** - * @param string $directory - * @param bool $fallbackToPhp - * * @return bool|null Returns null, when no edge case was hit. Otherwise a bool whether removal was successful */ private function removeEdgeCases(string $directory, bool $fallbackToPhp = true): ?bool @@ -213,7 +202,6 @@ private function removeEdgeCases(string $directory, bool $fallbackToPhp = true): * before directories, creating a single non-recursive loop * to delete files/directories in the correct order. * - * @param string $directory * @return bool */ public function removeDirectoryPhp(string $directory) @@ -252,8 +240,6 @@ public function removeDirectoryPhp(string $directory) } /** - * @param string $directory - * * @return void */ public function ensureDirectoryExists(string $directory) @@ -275,7 +261,6 @@ public function ensureDirectoryExists(string $directory) /** * Attempts to unlink a file and in case of failure retries after 350ms on windows * - * @param string $path * @throws \RuntimeException * @return bool */ @@ -306,7 +291,6 @@ public function unlink(string $path) /** * Attempts to rmdir a file and in case of failure retries after 350ms on windows * - * @param string $path * @throws \RuntimeException * @return bool */ @@ -340,8 +324,6 @@ public function rmdir(string $path) * Some systems can't rename and also don't have proc_open, * which requires this solution. * - * @param string $source - * @param string $target * * @return void */ @@ -360,8 +342,6 @@ public function copyThenRemove(string $source, string $target) /** * Copies a file or directory from $source to $target. * - * @param string $source - * @param string $target * @return bool */ public function copy(string $source, string $target) @@ -388,9 +368,6 @@ public function copy(string $source, string $target) } /** - * @param string $source - * @param string $target - * * @return void */ public function rename(string $source, string $target) @@ -438,8 +415,6 @@ public function rename(string $source, string $target) /** * Returns the shortest path from $from to $to * - * @param string $from - * @param string $to * @param bool $directories if true, the source/target are considered to be directories * @throws \InvalidArgumentException * @return string @@ -485,10 +460,7 @@ public function findShortestPath(string $from, string $to, bool $directories = f /** * Returns PHP code that, when executed in $from, will return the path to $to * - * @param string $from - * @param string $to * @param bool $directories if true, the source/target are considered to be directories - * @param bool $staticCode * @throws \InvalidArgumentException * @return string */ @@ -532,7 +504,6 @@ public function findShortestPathCode(string $from, string $to, bool $directories /** * Checks if the given path is absolute * - * @param string $path * @return bool */ public function isAbsolutePath(string $path) @@ -569,7 +540,7 @@ public function size(string $path) */ public function normalizePath(string $path) { - $parts = array(); + $parts = []; $path = strtr($path, '\\', '/'); $prefix = ''; $absolute = ''; @@ -603,7 +574,9 @@ public function normalizePath(string $path) } // ensure c: is normalized to C: - $prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', static function (array $m) { return strtoupper($m[0]); }, $prefix); + $prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', static function (array $m) { + return strtoupper($m[0]); + }, $prefix); return $prefix.$absolute.implode('/', $parts); } @@ -613,7 +586,6 @@ public function normalizePath(string $path) * * And other possible unforeseen disasters, see https://github.com/composer/composer/pull/9422 * - * @param string $path * @return string */ public static function trimTrailingSlash(string $path) @@ -628,7 +600,6 @@ public static function trimTrailingSlash(string $path) /** * Return if the given path is local * - * @param string $path * @return bool */ public static function isLocalPath(string $path) @@ -637,8 +608,6 @@ public static function isLocalPath(string $path) } /** - * @param string $path - * * @return string */ public static function getPlatformPath(string $path) @@ -656,7 +625,6 @@ public static function getPlatformPath(string $path) * This will also check for readability by reading the file as is_readable can not be trusted on network-mounts * and \\wsl$ paths. See https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 * - * @param string $path * @return bool */ public static function isReadable(string $path) @@ -678,8 +646,6 @@ public static function isReadable(string $path) } /** - * @param string $directory - * * @return int */ protected function directorySize(string $directory) @@ -713,10 +679,6 @@ protected function getProcess() * delete symbolic link implementation (commonly known as "unlink()") * * symbolic links on windows which link to directories need rmdir instead of unlink - * - * @param string $path - * - * @return bool */ private function unlinkImplementation(string $path): bool { @@ -754,7 +716,6 @@ public function relativeSymlink(string $target, string $link) /** * return true if that directory is a symlink. * - * @param string $directory * * @return bool */ @@ -769,11 +730,6 @@ public function isSymlinkedDirectory(string $directory) return is_link($resolved); } - /** - * @param string $directory - * - * @return bool - */ private function unlinkSymlinkedDirectory(string $directory): bool { $resolved = $this->resolveSymlinkedDirectorySymlink($directory); @@ -806,8 +762,6 @@ private function resolveSymlinkedDirectorySymlink(string $pathname): string /** * Creates an NTFS junction. * - * @param string $target - * @param string $junction * * @return void */ @@ -872,7 +826,6 @@ public function isJunction(string $junction) /** * Removes a Windows NTFS junction. * - * @param string $junction * @return bool */ public function removeJunction(string $junction) @@ -889,9 +842,6 @@ public function removeJunction(string $junction) } /** - * @param string $path - * @param string $content - * * @return int|false */ public function filePutContentsIfModified(string $path, string $content) @@ -907,8 +857,6 @@ public function filePutContentsIfModified(string $path, string $content) /** * Copy file using stream_copy_to_stream to work around https://bugs.php.net/bug.php?id=6463 * - * @param string $source - * @param string $target * * @return void */ diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php index e3e34dd7afba..f43ba052b975 100644 --- a/src/Composer/Util/Git.php +++ b/src/Composer/Util/Git.php @@ -42,14 +42,8 @@ public function __construct(IOInterface $io, Config $config, ProcessExecutor $pr } /** - * @param callable $commandCallable - * @param string $url - * @param string|null $cwd - * @param bool $initialClone * @param mixed $commandOutput the output will be written into this var if passed by ref * if a callable is passed it will be used as output handler - * - * @return void */ public function runCommand(callable $commandCallable, string $url, ?string $cwd, bool $initialClone = false, &$commandOutput = null): void { @@ -76,7 +70,7 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, $protocols = $this->config->get('github-protocols'); // public github, autoswitch protocols if (Preg::isMatch('{^(?:https?|git)://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)) { - $messages = array(); + $messages = []; foreach ($protocols as $protocol) { if ('ssh' === $protocol) { $protoUrl = "git@" . $match[1] . ":" . $match[2]; @@ -84,7 +78,7 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, $protoUrl = $protocol . "://" . $match[1] . "/" . $match[2]; } - if (0 === $this->process->execute(call_user_func($commandCallable, $protoUrl), $commandOutput, $cwd)) { + if (0 === $this->process->execute($commandCallable($protoUrl), $commandOutput, $cwd)) { return; } $messages[] = '- ' . $protoUrl . "\n" . Preg::replace('#^#m', ' ', $this->process->getErrorOutput()); @@ -103,10 +97,10 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, // if we have a private github url and the ssh protocol is disabled then we skip it and directly fallback to https $bypassSshForGitHub = Preg::isMatch('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\.git$}i', $url) && !in_array('ssh', $protocols, true); - $command = call_user_func($commandCallable, $url); + $command = $commandCallable($url); $auth = null; - $credentials = array(); + $credentials = []; if ($bypassSshForGitHub || 0 !== $this->process->execute($command, $commandOutput, $cwd)) { $errorMsg = $this->process->getErrorOutput(); // private github repository without ssh key access, try https with auth @@ -125,12 +119,12 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, if ($this->io->hasAuthentication($match[1])) { $auth = $this->io->getAuthentication($match[1]); $authUrl = 'https://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[1] . '/' . $match[2] . '.git'; - $command = call_user_func($commandCallable, $authUrl); + $command = $commandCallable($authUrl); if (0 === $this->process->execute($command, $commandOutput, $cwd)) { return; } - $credentials = array(rawurlencode($auth['username']), rawurlencode($auth['password'])); + $credentials = [rawurlencode($auth['username']), rawurlencode($auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } } elseif (Preg::isMatch('{^https://(bitbucket\.org)/(.*?)(?:\.git)?$}i', $url, $match)) { //bitbucket oauth @@ -160,17 +154,17 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, $auth = $this->io->getAuthentication($match[1]); $authUrl = 'https://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[1] . '/' . $match[2] . '.git'; - $command = call_user_func($commandCallable, $authUrl); + $command = $commandCallable($authUrl); if (0 === $this->process->execute($command, $commandOutput, $cwd)) { return; } - $credentials = array(rawurlencode($auth['username']), rawurlencode($auth['password'])); + $credentials = [rawurlencode($auth['username']), rawurlencode($auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } else { // Falling back to ssh $sshUrl = 'git@bitbucket.org:' . $match[2] . '.git'; $this->io->writeError(' No bitbucket authentication configured. Falling back to ssh.'); - $command = call_user_func($commandCallable, $sshUrl); + $command = $commandCallable($sshUrl); if (0 === $this->process->execute($command, $commandOutput, $cwd)) { return; } @@ -202,17 +196,17 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, $authUrl = $match[1] . '://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[2] . '/' . $match[3]; } - $command = call_user_func($commandCallable, $authUrl); + $command = $commandCallable($authUrl); if (0 === $this->process->execute($command, $commandOutput, $cwd)) { return; } - $credentials = array(rawurlencode($auth['username']), rawurlencode($auth['password'])); + $credentials = [rawurlencode($auth['username']), rawurlencode($auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } } elseif ($this->isAuthenticationFailure($url, $match)) { // private non-github/gitlab/bitbucket repo that failed to authenticate if (strpos($match[2], '@')) { - list($authParts, $match[2]) = explode('@', $match[2], 2); + [$authParts, $match[2]] = explode('@', $match[2], 2); } $storeAuth = false; @@ -222,24 +216,24 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, $defaultUsername = null; if (isset($authParts) && $authParts) { if (false !== strpos($authParts, ':')) { - list($defaultUsername, ) = explode(':', $authParts, 2); + [$defaultUsername, ] = explode(':', $authParts, 2); } else { $defaultUsername = $authParts; } } $this->io->writeError(' Authentication required (' . $match[2] . '):'); - $auth = array( + $auth = [ 'username' => $this->io->ask(' Username: ', $defaultUsername), 'password' => $this->io->askAndHideAnswer(' Password: '), - ); + ]; $storeAuth = $this->config->get('store-auths'); } if (null !== $auth) { $authUrl = $match[1] . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[2] . $match[3]; - $command = call_user_func($commandCallable, $authUrl); + $command = $commandCallable($authUrl); if (0 === $this->process->execute($command, $commandOutput, $cwd)) { $this->io->setAuthentication($match[2], $auth['username'], $auth['password']); $authHelper = new AuthHelper($this->io, $this->config); @@ -248,7 +242,7 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, return; } - $credentials = array(rawurlencode($auth['username']), rawurlencode($auth['password'])); + $credentials = [rawurlencode($auth['username']), rawurlencode($auth['password'])]; $errorMsg = $this->process->getErrorOutput(); } } @@ -265,12 +259,6 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, } } - /** - * @param string $url - * @param string $dir - * - * @return bool - */ public function syncMirror(string $url, string $dir): bool { if (Platform::getEnv('COMPOSER_DISABLE_NETWORK') && Platform::getEnv('COMPOSER_DISABLE_NETWORK') !== 'prime') { @@ -309,13 +297,6 @@ public function syncMirror(string $url, string $dir): bool return true; } - /** - * @param string $url - * @param string $dir - * @param string $ref - * - * @return bool - */ public function fetchRefOrSyncMirror(string $url, string $dir, string $ref): bool { if ($this->checkRefIsInMirror($dir, $ref)) { @@ -329,9 +310,6 @@ public function fetchRefOrSyncMirror(string $url, string $dir, string $ref): boo return false; } - /** - * @return string - */ public static function getNoShowSignatureFlag(ProcessExecutor $process): string { $gitVersion = self::getVersion($process); @@ -342,12 +320,6 @@ public static function getNoShowSignatureFlag(ProcessExecutor $process): string return ''; } - /** - * @param string $dir - * @param string $ref - * - * @return bool - */ private function checkRefIsInMirror(string $dir, string $ref): bool { if (is_dir($dir) && 0 === $this->process->execute('git rev-parse --git-dir', $output, $dir) && trim($output) === '.') { @@ -362,10 +334,7 @@ private function checkRefIsInMirror(string $dir, string $ref): bool } /** - * @param string $url * @param string[] $match - * - * @return bool */ private function isAuthenticationFailure(string $url, array &$match): bool { @@ -373,13 +342,13 @@ private function isAuthenticationFailure(string $url, array &$match): bool return false; } - $authFailures = array( + $authFailures = [ 'fatal: Authentication failed', 'remote error: Invalid username or password.', 'error: 401 Unauthorized', 'fatal: unable to access', 'fatal: could not read Username', - ); + ]; $errorOutput = $this->process->getErrorOutput(); foreach ($authFailures as $authFailure) { @@ -423,9 +392,6 @@ public function getMirrorDefaultBranch(string $url, string $dir, bool $isLocalPa return null; } - /** - * @return void - */ public static function cleanEnv(): void { // added in git 1.7.1, prevents prompting the user for username/password @@ -468,7 +434,6 @@ public static function getGitLabDomainsRegex(Config $config): string /** * @param non-empty-string $message - * @param string $url * * @return never */ @@ -502,17 +467,14 @@ public static function getVersion(ProcessExecutor $process): ?string } /** - * @param string $error * @param string[] $credentials - * - * @return string */ private function maskCredentials(string $error, array $credentials): string { - $maskedCredentials = array(); + $maskedCredentials = []; foreach ($credentials as $credential) { - if (in_array($credential, array('private-token', 'x-token-auth', 'oauth2', 'gitlab-ci-token', 'x-oauth-basic'))) { + if (in_array($credential, ['private-token', 'x-token-auth', 'oauth2', 'gitlab-ci-token', 'x-oauth-basic'])) { $maskedCredentials[] = $credential; } elseif (strlen($credential) > 6) { $maskedCredentials[] = substr($credential, 0, 3) . '...' . substr($credential, -3); diff --git a/src/Composer/Util/GitHub.php b/src/Composer/Util/GitHub.php index cd717fa24b51..c1f693d55dbe 100644 --- a/src/Composer/Util/GitHub.php +++ b/src/Composer/Util/GitHub.php @@ -40,7 +40,7 @@ class GitHub * @param ProcessExecutor $process Process instance, injectable for mocking * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking */ - public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, HttpDownloader $httpDownloader = null) + public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?HttpDownloader $httpDownloader = null) { $this->io = $io; $this->config = $config; @@ -79,7 +79,7 @@ public function authorizeOAuth(string $originUrl): bool * @throws TransportException|\Exception * @return bool true on success */ - public function authorizeOAuthInteractively(string $originUrl, string $message = null): bool + public function authorizeOAuthInteractively(string $originUrl, ?string $message = null): bool { if ($message) { $this->io->writeError($message); @@ -115,11 +115,11 @@ public function authorizeOAuthInteractively(string $originUrl, string $message = try { $apiUrl = ('github.com' === $originUrl) ? 'api.github.com/' : $originUrl . '/api/v3/'; - $this->httpDownloader->get('https://'. $apiUrl, array( + $this->httpDownloader->get('https://'. $apiUrl, [ 'retry-auth-failure' => false, - )); + ]); } catch (TransportException $e) { - if (in_array($e->getCode(), array(403, 401))) { + if (in_array($e->getCode(), [403, 401])) { $this->io->writeError('Invalid token provided.'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth github-oauth.github.com "'); @@ -147,17 +147,17 @@ public function authorizeOAuthInteractively(string $originUrl, string $message = */ public function getRateLimit(array $headers): array { - $rateLimit = array( + $rateLimit = [ 'limit' => '?', 'reset' => '?', - ); + ]; foreach ($headers as $header) { $header = trim($header); if (false === strpos($header, 'X-RateLimit-')) { continue; } - list($type, $value) = explode(':', $header, 2); + [$type, $value] = explode(':', $header, 2); switch ($type) { case 'X-RateLimit-Limit': $rateLimit['limit'] = (int) trim($value); @@ -175,8 +175,6 @@ public function getRateLimit(array $headers): array * Extract SSO URL from response. * * @param string[] $headers Headers from Composer\Downloader\TransportException. - * - * @return string|null */ public function getSsoUrl(array $headers): ?string { @@ -197,8 +195,6 @@ public function getSsoUrl(array $headers): ?string * Finds whether a request failed due to rate limiting * * @param string[] $headers Headers from Composer\Downloader\TransportException. - * - * @return bool */ public function isRateLimited(array $headers): bool { @@ -217,8 +213,6 @@ public function isRateLimited(array $headers): bool * @see https://docs.github.com/en/rest/overview/other-authentication-methods#authenticating-for-saml-sso * * @param string[] $headers Headers from Composer\Downloader\TransportException. - * - * @return bool */ public function requiresSso(array $headers): bool { diff --git a/src/Composer/Util/GitLab.php b/src/Composer/Util/GitLab.php index ce32e9535bdd..ce04d29fec75 100644 --- a/src/Composer/Util/GitLab.php +++ b/src/Composer/Util/GitLab.php @@ -40,7 +40,7 @@ class GitLab * @param ProcessExecutor $process Process instance, injectable for mocking * @param HttpDownloader $httpDownloader Remote Filesystem, injectable for mocking */ - public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, HttpDownloader $httpDownloader = null) + public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $process = null, ?HttpDownloader $httpDownloader = null) { $this->io = $io; $this->config = $config; @@ -95,7 +95,7 @@ public function authorizeOAuth(string $originUrl): bool // Composer expects the GitLab token to be stored as username and 'private-token' or 'gitlab-ci-token' to be stored as password // Detect cases where this is reversed and resolve automatically resolve it - if (in_array($username, array('private-token', 'gitlab-ci-token', 'oauth2'), true)) { + if (in_array($username, ['private-token', 'gitlab-ci-token', 'oauth2'], true)) { $this->io->setAuthentication($originUrl, $password, $username); } else { $this->io->setAuthentication($originUrl, $username, $password); @@ -119,7 +119,7 @@ public function authorizeOAuth(string $originUrl): bool * * @return bool true on success */ - public function authorizeOAuthInteractively(string $scheme, string $originUrl, string $message = null): bool + public function authorizeOAuthInteractively(string $scheme, string $originUrl, ?string $message = null): bool { if ($message) { $this->io->writeError($message); @@ -137,7 +137,7 @@ public function authorizeOAuthInteractively(string $scheme, string $originUrl, s } catch (TransportException $e) { // 401 is bad credentials, // 403 is max login attempts exceeded - if (in_array($e->getCode(), array(403, 401))) { + if (in_array($e->getCode(), [403, 401])) { if (401 === $e->getCode()) { $response = json_decode($e->getResponse(), true); if (isset($response['error']) && $response['error'] === 'invalid_grant') { @@ -197,6 +197,7 @@ public function authorizeOAuthRefresh(string $scheme, string $originUrl): bool $response = $this->refreshToken($scheme, $originUrl); } catch (TransportException $e) { $this->io->writeError("Couldn't refresh access token: ".$e->getMessage()); + return false; } @@ -216,9 +217,6 @@ public function authorizeOAuthRefresh(string $scheme, string $originUrl): bool } /** - * @param string $scheme - * @param string $originUrl - * * @return array{access_token: non-empty-string, refresh_token: non-empty-string, token_type: non-empty-string, expires_in?: positive-int, created_at: positive-int} * * @see https://docs.gitlab.com/ee/api/oauth2.html#resource-owner-password-credentials-flow @@ -228,22 +226,22 @@ private function createToken(string $scheme, string $originUrl): array $username = $this->io->ask('Username: '); $password = $this->io->askAndHideAnswer('Password: '); - $headers = array('Content-Type: application/x-www-form-urlencoded'); + $headers = ['Content-Type: application/x-www-form-urlencoded']; $apiUrl = $originUrl; - $data = http_build_query(array( + $data = http_build_query([ 'username' => $username, 'password' => $password, 'grant_type' => 'password', - ), '', '&'); - $options = array( + ], '', '&'); + $options = [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'header' => $headers, 'content' => $data, - ), - ); + ], + ]; $token = $this->httpDownloader->get($scheme.'://'.$apiUrl.'/oauth/token', $options)->decodeJson(); @@ -270,9 +268,6 @@ public function isOAuthExpired(string $originUrl): bool } /** - * @param string $scheme - * @param string $originUrl - * * @return array{access_token: non-empty-string, refresh_token: non-empty-string, token_type: non-empty-string, expires_in: positive-int, created_at: positive-int} * * @see https://docs.gitlab.com/ee/api/oauth2.html#resource-owner-password-credentials-flow @@ -285,20 +280,20 @@ private function refreshToken(string $scheme, string $originUrl): array } $refreshToken = $authTokens[$originUrl]['refresh-token']; - $headers = array('Content-Type: application/x-www-form-urlencoded'); + $headers = ['Content-Type: application/x-www-form-urlencoded']; - $data = http_build_query(array( + $data = http_build_query([ 'refresh_token' => $refreshToken, 'grant_type' => 'refresh_token', - ), '', '&'); - $options = array( + ], '', '&'); + $options = [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'header' => $headers, 'content' => $data, - ), - ); + ], + ]; $token = $this->httpDownloader->get($scheme.'://'.$originUrl.'/oauth/token', $options)->decodeJson(); $this->io->writeError('GitLab token successfully refreshed', true, IOInterface::VERY_VERBOSE); diff --git a/src/Composer/Util/Hg.php b/src/Composer/Util/Hg.php index 76d063dbe815..f6a4275f7d2d 100644 --- a/src/Composer/Util/Hg.php +++ b/src/Composer/Util/Hg.php @@ -46,19 +46,12 @@ public function __construct(IOInterface $io, Config $config, ProcessExecutor $pr $this->process = $process; } - /** - * @param callable $commandCallable - * @param string $url - * @param string|null $cwd - * - * @return void - */ public function runCommand(callable $commandCallable, string $url, ?string $cwd): void { $this->config->prohibitUrlByConfig($url, $this->io); // Try as is - $command = call_user_func($commandCallable, $url); + $command = $commandCallable($url); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; @@ -69,7 +62,7 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd) $auth = $this->io->getAuthentication($match[5]); $authenticatedUrl = $match[1] . '://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[5] . (!empty($match[6]) ? $match[6] : null); - $command = call_user_func($commandCallable, $authenticatedUrl); + $command = $commandCallable($authenticatedUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; @@ -85,7 +78,6 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd) /** * @param non-empty-string $message - * @param string $url * * @return never */ diff --git a/src/Composer/Util/Http/CurlDownloader.php b/src/Composer/Util/Http/CurlDownloader.php index 98af5c1a1be2..bb81ac654c61 100644 --- a/src/Composer/Util/Http/CurlDownloader.php +++ b/src/Composer/Util/Http/CurlDownloader.php @@ -38,7 +38,7 @@ class CurlDownloader /** @var ?resource */ private $shareHandle; /** @var Job[] */ - private $jobs = array(); + private $jobs = []; /** @var IOInterface */ private $io; /** @var Config */ @@ -56,22 +56,22 @@ class CurlDownloader /** @var bool */ private $supportsSecureProxy; /** @var array */ - protected $multiErrors = array( - CURLM_BAD_HANDLE => array('CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'), - CURLM_BAD_EASY_HANDLE => array('CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."), - CURLM_OUT_OF_MEMORY => array('CURLM_OUT_OF_MEMORY', 'You are doomed.'), - CURLM_INTERNAL_ERROR => array('CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!'), - ); + protected $multiErrors = [ + CURLM_BAD_HANDLE => ['CURLM_BAD_HANDLE', 'The passed-in handle is not a valid CURLM handle.'], + CURLM_BAD_EASY_HANDLE => ['CURLM_BAD_EASY_HANDLE', "An easy handle was not good/valid. It could mean that it isn't an easy handle at all, or possibly that the handle already is in used by this or another multi handle."], + CURLM_OUT_OF_MEMORY => ['CURLM_OUT_OF_MEMORY', 'You are doomed.'], + CURLM_INTERNAL_ERROR => ['CURLM_INTERNAL_ERROR', 'This can only be returned if libcurl bugs. Please report it to us!'], + ]; /** @var mixed[] */ - private static $options = array( - 'http' => array( + private static $options = [ + 'http' => [ 'method' => CURLOPT_CUSTOMREQUEST, 'content' => CURLOPT_POSTFIELDS, 'header' => CURLOPT_HTTPHEADER, 'timeout' => CURLOPT_TIMEOUT, - ), - 'ssl' => array( + ], + 'ssl' => [ 'cafile' => CURLOPT_CAINFO, 'capath' => CURLOPT_CAPATH, 'verify_peer' => CURLOPT_SSL_VERIFYPEER, @@ -79,24 +79,23 @@ class CurlDownloader 'local_cert' => CURLOPT_SSLCERT, 'local_pk' => CURLOPT_SSLKEY, 'passphrase' => CURLOPT_SSLKEYPASSWD, - ), - ); + ], + ]; /** @var array */ - private static $timeInfo = array( + private static $timeInfo = [ 'total_time' => true, 'namelookup_time' => true, 'connect_time' => true, 'pretransfer_time' => true, 'starttransfer_time' => true, 'redirect_time' => true, - ); + ]; /** * @param mixed[] $options - * @param bool $disableTls */ - public function __construct(IOInterface $io, Config $config, array $options = array(), bool $disableTls = false) + public function __construct(IOInterface $io, Config $config, array $options = [], bool $disableTls = false) { $this->io = $io; $this->config = $config; @@ -125,18 +124,13 @@ public function __construct(IOInterface $io, Config $config, array $options = ar } /** - * @param callable $resolve - * @param callable $reject - * @param string $origin - * @param string $url * @param mixed[] $options - * @param null|string $copyTo * * @return int internal job id */ public function download(callable $resolve, callable $reject, string $origin, string $url, array $options, ?string $copyTo = null): int { - $attributes = array(); + $attributes = []; if (isset($options['retry-auth-failure'])) { $attributes['retryAuthFailure'] = $options['retry-auth-failure']; unset($options['retry-auth-failure']); @@ -146,18 +140,13 @@ public function download(callable $resolve, callable $reject, string $origin, st } /** - * @param callable $resolve - * @param callable $reject - * @param string $origin - * @param string $url * @param mixed[] $options - * @param null|string $copyTo * * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, retries?: int<0, max>, storeAuth?: 'prompt'|bool} $attributes * * @return int internal job id */ - private function initDownload(callable $resolve, callable $reject, string $origin, string $url, array $options, ?string $copyTo = null, array $attributes = array()): int + private function initDownload(callable $resolve, callable $reject, string $origin, string $url, array $options, ?string $copyTo = null, array $attributes = []): int { // set defaults in a PHPStan-happy way (array_merge is not well supported) $attributes['retryAuthFailure'] = $attributes['retryAuthFailure'] ?? true; @@ -178,7 +167,6 @@ private function initDownload(callable $resolve, callable $reject, string $origi throw new \RuntimeException('Failed to open a temp stream to store curl headers'); } - if ($copyTo) { $errorMessage = ''; // @phpstan-ignore-next-line @@ -211,10 +199,10 @@ private function initDownload(callable $resolve, callable $reject, string $origi } if (!isset($options['http']['header'])) { - $options['http']['header'] = array(); + $options['http']['header'] = []; } - $options['http']['header'] = array_diff($options['http']['header'], array('Connection: close')); + $options['http']['header'] = array_diff($options['http']['header'], ['Connection: close']); $options['http']['header'][] = 'Connection: keep-alive'; $version = curl_version(); @@ -259,7 +247,7 @@ private function initDownload(callable $resolve, callable $reject, string $origi $progress = array_diff_key(curl_getinfo($curlHandle), self::$timeInfo); - $this->jobs[(int) $curlHandle] = array( + $this->jobs[(int) $curlHandle] = [ 'url' => $url, 'origin' => $origin, 'attributes' => $attributes, @@ -271,7 +259,7 @@ private function initDownload(callable $resolve, callable $reject, string $origi 'bodyHandle' => $bodyHandle, 'resolve' => $resolve, 'reject' => $reject, - ); + ]; $usingProxy = $proxy->getFormattedUrl(' using proxy (%s)'); $ifModified = false !== stripos(implode(',', $options['http']['header']), 'if-modified-since:') ? ' if modified' : ''; @@ -285,10 +273,6 @@ private function initDownload(callable $resolve, callable $reject, string $origi return (int) $curlHandle; } - /** - * @param int $id - * @return void - */ public function abortRequest(int $id): void { if (isset($this->jobs[$id], $this->jobs[$id]['curlHandle'])) { @@ -308,9 +292,6 @@ public function abortRequest(int $id): void } } - /** - * @return void - */ public function tick(): void { static $timeoutWarning = false; @@ -360,12 +341,12 @@ public function tick(): void if ( (!isset($job['options']['http']['method']) || $job['options']['http']['method'] === 'GET') && ( - in_array($errno, array(7 /* CURLE_COULDNT_CONNECT */, 16 /* CURLE_HTTP2 */, 92 /* CURLE_HTTP2_STREAM */, 6 /* CURLE_COULDNT_RESOLVE_HOST */), true) + in_array($errno, [7 /* CURLE_COULDNT_CONNECT */, 16 /* CURLE_HTTP2 */, 92 /* CURLE_HTTP2_STREAM */, 6 /* CURLE_COULDNT_RESOLVE_HOST */], true) || ($errno === 35 /* CURLE_SSL_CONNECT_ERROR */ && false !== strpos($error, 'Connection reset by peer')) ) && $job['attributes']['retries'] < $this->maxRetries ) { $this->io->writeError('Retrying ('.($job['attributes']['retries'] + 1).') ' . Url::sanitize($job['url']) . ' due to curl error '. $errno, true, IOInterface::DEBUG); - $this->restartJobWithDelay($job, $job['url'], array('retries' => $job['attributes']['retries'] + 1)); + $this->restartJobWithDelay($job, $job['url'], ['retries' => $job['attributes']['retries'] + 1]); continue; } @@ -392,7 +373,7 @@ public function tick(): void rewind($job['bodyHandle']); $contents = stream_get_contents($job['bodyHandle']); } - $response = new CurlResponse(array('url' => $progress['url']), $statusCode, $headers, $contents, $progress); + $response = new CurlResponse(['url' => $progress['url']], $statusCode, $headers, $contents, $progress); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } else { $maxFileSize = $job['options']['max_file_size'] ?? null; @@ -408,7 +389,7 @@ public function tick(): void $contents = stream_get_contents($job['bodyHandle']); } - $response = new CurlResponse(array('url' => $progress['url']), $statusCode, $headers, $contents, $progress); + $response = new CurlResponse(['url' => $progress['url']], $statusCode, $headers, $contents, $progress); $this->io->writeError('['.$statusCode.'] '.Url::sanitize($progress['url']), true, IOInterface::DEBUG); } fclose($job['bodyHandle']); @@ -419,7 +400,7 @@ public function tick(): void $result = $this->isAuthenticatedRetryNeeded($job, $response); if ($result['retry']) { - $this->restartJob($job, $job['url'], array('storeAuth' => $result['storeAuth'])); + $this->restartJob($job, $job['url'], ['storeAuth' => $result['storeAuth']]); continue; } @@ -427,7 +408,7 @@ public function tick(): void if ($statusCode >= 300 && $statusCode <= 399 && $statusCode !== 304 && $job['attributes']['redirects'] < $this->maxRedirects) { $location = $this->handleRedirect($job, $response); if ($location) { - $this->restartJob($job, $location, array('redirects' => $job['attributes']['redirects'] + 1)); + $this->restartJob($job, $location, ['redirects' => $job['attributes']['redirects'] + 1]); continue; } } @@ -436,11 +417,11 @@ public function tick(): void if ($statusCode >= 400 && $statusCode <= 599) { if ( (!isset($job['options']['http']['method']) || $job['options']['http']['method'] === 'GET') - && in_array($statusCode, array(423, 425, 500, 502, 503, 504, 507, 510), true) + && in_array($statusCode, [423, 425, 500, 502, 503, 504, 507, 510], true) && $job['attributes']['retries'] < $this->maxRetries ) { $this->io->writeError('Retrying ('.($job['attributes']['retries'] + 1).') ' . Url::sanitize($job['url']) . ' due to status code '. $statusCode, true, IOInterface::DEBUG); - $this->restartJobWithDelay($job, $job['url'], array('retries' => $job['attributes']['retries'] + 1)); + $this->restartJobWithDelay($job, $job['url'], ['retries' => $job['attributes']['retries'] + 1]); continue; } @@ -454,9 +435,9 @@ public function tick(): void // resolve promise if (null !== $job['filename']) { rename($job['filename'].'~', $job['filename']); - call_user_func($job['resolve'], $response); + $job['resolve']($response); } else { - call_user_func($job['resolve'], $response); + $job['resolve']($response); } } catch (\Exception $e) { if ($e instanceof TransportException) { @@ -503,7 +484,6 @@ public function tick(): void /** * @param Job $job - * @return string */ private function handleRedirect(array $job, Response $response): string { @@ -542,7 +522,7 @@ private function handleRedirect(array $job, Response $response): string */ private function isAuthenticatedRetryNeeded(array $job, Response $response): array { - if (in_array($response->getStatusCode(), array(401, 403)) && $job['attributes']['retryAuthFailure']) { + if (in_array($response->getStatusCode(), [401, 403]) && $job['attributes']['retryAuthFailure']) { $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], $response->getStatusCode(), $response->getStatusMessage(), $response->getHeaders(), $job['attributes']['retries']); if ($result['retry']) { @@ -575,7 +555,7 @@ private function isAuthenticatedRetryNeeded(array $job, Response $response): arr if ($needsAuthRetry) { if ($job['attributes']['retryAuthFailure']) { - $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], 401, null, array(), $job['attributes']['retries']); + $result = $this->authHelper->promptAuthIfNeeded($job['url'], $job['origin'], 401, null, [], $job['attributes']['retries']); if ($result['retry']) { return $result; } @@ -584,18 +564,15 @@ private function isAuthenticatedRetryNeeded(array $job, Response $response): arr throw $this->failResponse($job, $response, $needsAuthRetry); } - return array('retry' => false, 'storeAuth' => false); + return ['retry' => false, 'storeAuth' => false]; } /** * @param Job $job - * @param string $url * * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, storeAuth?: 'prompt'|bool, retries?: int<1, max>} $attributes - * - * @return void */ - private function restartJob(array $job, string $url, array $attributes = array()): void + private function restartJob(array $job, string $url, array $attributes = []): void { if (null !== $job['filename']) { @unlink($job['filename'].'~'); @@ -609,11 +586,8 @@ private function restartJob(array $job, string $url, array $attributes = array() /** * @param Job $job - * @param string $url * * @param array{retryAuthFailure?: bool, redirects?: int<0, max>, storeAuth?: 'prompt'|bool, retries: int<1, max>} $attributes - * - * @return void */ private function restartJobWithDelay(array $job, string $url, array $attributes): void { @@ -628,8 +602,6 @@ private function restartJobWithDelay(array $job, string $url, array $attributes) /** * @param Job $job - * @param string $errorMessage - * @return TransportException */ private function failResponse(array $job, Response $response, string $errorMessage): TransportException { @@ -638,7 +610,7 @@ private function failResponse(array $job, Response $response, string $errorMessa } $details = ''; - if (in_array(strtolower((string) $response->getHeader('content-type')), array('application/json', 'application/json; charset=utf-8'), true)) { + if (in_array(strtolower((string) $response->getHeader('content-type')), ['application/json', 'application/json; charset=utf-8'], true)) { $details = ':'.PHP_EOL.substr($response->getBody(), 0, 200).(strlen($response->getBody()) > 200 ? '...' : ''); } @@ -647,7 +619,6 @@ private function failResponse(array $job, Response $response, string $errorMessa /** * @param Job $job - * @return void */ private function rejectJob(array $job, \Exception $e): void { @@ -660,13 +631,9 @@ private function rejectJob(array $job, \Exception $e): void if (null !== $job['filename']) { @unlink($job['filename'].'~'); } - call_user_func($job['reject'], $e); + $job['reject']($e); } - /** - * @param int $code - * @return void - */ private function checkCurlResult(int $code): void { if ($code !== CURLM_OK && $code !== CURLM_CALL_MULTI_PERFORM) { diff --git a/src/Composer/Util/Http/CurlResponse.php b/src/Composer/Util/Http/CurlResponse.php index 41c7037274cf..aca8f37edb9d 100644 --- a/src/Composer/Util/Http/CurlResponse.php +++ b/src/Composer/Util/Http/CurlResponse.php @@ -27,7 +27,7 @@ class CurlResponse extends Response /** * @phpstan-param CurlInfo $curlInfo */ - public function __construct(array $request, $code, array $headers, $body, array $curlInfo) + public function __construct(array $request, ?int $code, array $headers, ?string $body, array $curlInfo) { parent::__construct($request, $code, $headers, $body); $this->curlInfo = $curlInfo; diff --git a/src/Composer/Util/Http/ProxyHelper.php b/src/Composer/Util/Http/ProxyHelper.php index a83fd454aca9..be4711bf9e03 100644 --- a/src/Composer/Util/Http/ProxyHelper.php +++ b/src/Composer/Util/Http/ProxyHelper.php @@ -34,33 +34,32 @@ public static function getProxyData(): array // Handle http_proxy/HTTP_PROXY on CLI only for security reasons if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - if ($env = self::getProxyEnv(array('http_proxy', 'HTTP_PROXY'), $name)) { + if ($env = self::getProxyEnv(['http_proxy', 'HTTP_PROXY'], $name)) { $httpProxy = self::checkProxy($env, $name); } } // Prefer CGI_HTTP_PROXY if available - if ($env = self::getProxyEnv(array('CGI_HTTP_PROXY'), $name)) { + if ($env = self::getProxyEnv(['CGI_HTTP_PROXY'], $name)) { $httpProxy = self::checkProxy($env, $name); } // Handle https_proxy/HTTPS_PROXY - if ($env = self::getProxyEnv(array('https_proxy', 'HTTPS_PROXY'), $name)) { + if ($env = self::getProxyEnv(['https_proxy', 'HTTPS_PROXY'], $name)) { $httpsProxy = self::checkProxy($env, $name); } else { $httpsProxy = $httpProxy; } // Handle no_proxy - $noProxy = self::getProxyEnv(array('no_proxy', 'NO_PROXY'), $name); + $noProxy = self::getProxyEnv(['no_proxy', 'NO_PROXY'], $name); - return array($httpProxy, $httpsProxy, $noProxy); + return [$httpProxy, $httpsProxy, $noProxy]; } /** * Returns http context options for the proxy url * - * @param string $proxyUrl * * @return array{http: array{proxy: string, header?: string}} */ @@ -70,7 +69,7 @@ public static function getContextOptions(string $proxyUrl): array // Remove any authorization $proxyUrl = self::formatParsedUrl($proxy, false); - $proxyUrl = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyUrl); + $proxyUrl = str_replace(['http://', 'https://'], ['tcp://', 'ssl://'], $proxyUrl); $options['http']['proxy'] = $proxyUrl; @@ -92,10 +91,7 @@ public static function getContextOptions(string $proxyUrl): array /** * Sets/unsets request_fulluri value in http context options array * - * @param string $requestUrl * @param mixed[] $options Set by method - * - * @return void */ public static function setRequestFullUri(string $requestUrl, array &$options): void { @@ -128,8 +124,6 @@ private static function getProxyEnv(array $names, ?string &$name): ?string /** * Checks and formats a proxy url from the environment * - * @param string $proxyUrl - * @param string $envName * @throws \RuntimeException on malformed url * @return string The formatted proxy url */ @@ -157,7 +151,6 @@ private static function checkProxy(string $proxyUrl, string $envName): string * Formats a url from its component parts * * @param array{scheme?: string, host: string, port?: int, user?: string, pass?: string} $proxy - * @param bool $includeAuth * * @return string The formatted value */ diff --git a/src/Composer/Util/Http/ProxyManager.php b/src/Composer/Util/Http/ProxyManager.php index fa91bf7e0b00..2f8764f829f5 100644 --- a/src/Composer/Util/Http/ProxyManager.php +++ b/src/Composer/Util/Http/ProxyManager.php @@ -42,22 +42,19 @@ class ProxyManager private function __construct() { - $this->fullProxy = $this->safeProxy = array( + $this->fullProxy = $this->safeProxy = [ 'http' => null, 'https' => null, - ); + ]; - $this->streams['http'] = $this->streams['https'] = array( + $this->streams['http'] = $this->streams['https'] = [ 'options' => null, - ); + ]; $this->hasProxy = false; $this->initProxyData(); } - /** - * @return ProxyManager - */ public static function getInstance(): ProxyManager { if (!self::$instance) { @@ -69,8 +66,6 @@ public static function getInstance(): ProxyManager /** * Clears the persistent instance - * - * @return void */ public static function reset(): void { @@ -79,9 +74,6 @@ public static function reset(): void /** * Returns a RequestProxy instance for the request url - * - * @param string $requestUrl - * @return RequestProxy */ public function getProxyForRequest(string $requestUrl): RequestProxy { @@ -91,10 +83,10 @@ public function getProxyForRequest(string $requestUrl): RequestProxy $scheme = parse_url($requestUrl, PHP_URL_SCHEME) ?: 'http'; $proxyUrl = ''; - $options = array(); + $options = []; $formattedProxyUrl = ''; - if ($this->hasProxy && in_array($scheme, array('http', 'https'), true) && $this->fullProxy[$scheme]) { + if ($this->hasProxy && in_array($scheme, ['http', 'https'], true) && $this->fullProxy[$scheme]) { if ($this->noProxy($requestUrl)) { $formattedProxyUrl = 'excluded by no_proxy'; } else { @@ -130,20 +122,18 @@ public function getFormattedProxy(): ?string /** * Initializes proxy values from the environment - * - * @return void */ private function initProxyData(): void { try { - list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData(); + [$httpProxy, $httpsProxy, $noProxy] = ProxyHelper::getProxyData(); } catch (\RuntimeException $e) { $this->error = $e->getMessage(); return; } - $info = array(); + $info = []; if ($httpProxy) { $info[] = $this->setData($httpProxy, 'http'); @@ -180,9 +170,6 @@ private function setData($url, $scheme): string /** * Returns true if a url matches no_proxy value - * - * @param string $requestUrl - * @return bool */ private function noProxy(string $requestUrl): bool { diff --git a/src/Composer/Util/Http/RequestProxy.php b/src/Composer/Util/Http/RequestProxy.php index 36a5fdbabdfe..c80c8799ea4f 100644 --- a/src/Composer/Util/Http/RequestProxy.php +++ b/src/Composer/Util/Http/RequestProxy.php @@ -30,9 +30,7 @@ class RequestProxy private $url; /** - * @param string $url * @param mixed[] $contextOptions - * @param string $formattedUrl */ public function __construct(string $url, array $contextOptions, string $formattedUrl) { diff --git a/src/Composer/Util/Http/Response.php b/src/Composer/Util/Http/Response.php index 1c685265c71e..53afb67bacd6 100644 --- a/src/Composer/Util/Http/Response.php +++ b/src/Composer/Util/Http/Response.php @@ -31,10 +31,8 @@ class Response private $body; /** - * @param Request $request - * @param int $code + * @param Request $request * @param list $headers - * @param null|string $body */ public function __construct(array $request, ?int $code, array $headers, ?string $body) { @@ -47,17 +45,11 @@ public function __construct(array $request, ?int $code, array $headers, ?string $this->body = $body; } - /** - * @return int - */ public function getStatusCode(): int { return $this->code; } - /** - * @return string|null - */ public function getStatusMessage(): ?string { $value = null; @@ -81,7 +73,6 @@ public function getHeaders(): array } /** - * @param string $name * @return ?string */ public function getHeader(string $name): ?string @@ -106,7 +97,6 @@ public function decodeJson() } /** - * @return void * @phpstan-impure */ public function collect(): void @@ -118,7 +108,6 @@ public function collect(): void /** * @param string[] $headers array of returned headers like from getLastHeaders() * @param string $name header name (case insensitive) - * @return string|null */ public static function findHeaderValue(array $headers, string $name): ?string { diff --git a/src/Composer/Util/HttpDownloader.php b/src/Composer/Util/HttpDownloader.php index 68f2110858e9..9e2303974781 100644 --- a/src/Composer/Util/HttpDownloader.php +++ b/src/Composer/Util/HttpDownloader.php @@ -43,9 +43,9 @@ class HttpDownloader /** @var Config */ private $config; /** @var array */ - private $jobs = array(); + private $jobs = []; /** @var mixed[] */ - private $options = array(); + private $options = []; /** @var int */ private $runningJobs = 0; /** @var int */ @@ -65,9 +65,8 @@ class HttpDownloader * @param IOInterface $io The IO instance * @param Config $config The config * @param mixed[] $options The options - * @param bool $disableTls */ - public function __construct(IOInterface $io, Config $config, array $options = array(), bool $disableTls = false) + public function __construct(IOInterface $io, Config $config, array $options = [], bool $disableTls = false) { $this->io = $io; @@ -103,9 +102,9 @@ public function __construct(IOInterface $io, Config $config, array $options = ar * @throws TransportException * @return Response */ - public function get(string $url, array $options = array()) + public function get(string $url, array $options = []) { - list($job) = $this->addJob(array('url' => $url, 'options' => $options, 'copyTo' => null), true); + [$job] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => null], true); $this->wait($job['id']); $response = $this->getResponse($job['id']); @@ -122,9 +121,9 @@ public function get(string $url, array $options = array()) * @throws TransportException * @return PromiseInterface */ - public function add(string $url, array $options = array()) + public function add(string $url, array $options = []) { - list(, $promise) = $this->addJob(array('url' => $url, 'options' => $options, 'copyTo' => null)); + [, $promise] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => null]); return $promise; } @@ -139,9 +138,9 @@ public function add(string $url, array $options = array()) * @throws TransportException * @return Response */ - public function copy(string $url, string $to, array $options = array()) + public function copy(string $url, string $to, array $options = []) { - list($job) = $this->addJob(array('url' => $url, 'options' => $options, 'copyTo' => $to), true); + [$job] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => $to], true); $this->wait($job['id']); return $this->getResponse($job['id']); @@ -157,9 +156,9 @@ public function copy(string $url, string $to, array $options = array()) * @throws TransportException * @return PromiseInterface */ - public function addCopy(string $url, string $to, array $options = array()) + public function addCopy(string $url, string $to, array $options = []) { - list(, $promise) = $this->addJob(array('url' => $url, 'options' => $options, 'copyTo' => $to)); + [, $promise] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => $to]); return $promise; } @@ -194,13 +193,13 @@ private function addJob(array $request, bool $sync = false): array $request['options'] = array_replace_recursive($this->options, $request['options']); /** @var Job */ - $job = array( + $job = [ 'id' => $this->idGen++, 'status' => self::STATUS_QUEUED, 'request' => $request, 'sync' => $sync, 'origin' => Url::getOrigin($this->config, $request['url']), - ); + ]; if (!$sync && !$this->allowAsync) { throw new \LogicException('You must use the HttpDownloader instance which is part of a Composer\Loop instance to be able to run async http requests'); @@ -282,13 +281,9 @@ private function addJob(array $request, bool $sync = false): array $this->startJob($job['id']); } - return array($job, $promise); + return [$job, $promise]; } - /** - * @param int $id - * @return void - */ private function startJob(int $id): void { $job = &$this->jobs[$id]; @@ -308,7 +303,7 @@ private function startJob(int $id): void if ($this->disabled) { if (isset($job['request']['options']['http']['header']) && false !== stripos(implode('', $job['request']['options']['http']['header']), 'if-modified-since')) { - $resolve(new Response(array('url' => $url), 304, array(), '')); + $resolve(new Response(['url' => $url], 304, [], '')); } else { $e = new TransportException('Network disabled, request canceled: '.Url::sanitize($url), 499); $e->setStatusCode(499); @@ -350,8 +345,6 @@ public function wait(?int $index = null) /** * @internal - * - * @return void */ public function enableAsync(): void { @@ -396,7 +389,6 @@ public function countActiveJobs(?int $index = null): int /** * @param int $index Job id - * @return Response */ private function getResponse(int $index): Response { @@ -422,9 +414,7 @@ private function getResponse(int $index): Response /** * @internal * - * @param string $url * @param array{warning?: string, info?: string, warning-versions?: string, info-versions?: string, warnings?: array, infos?: array} $data - * @return void */ public static function outputWarnings(IOInterface $io, string $url, $data): void { @@ -437,7 +427,7 @@ public static function outputWarnings(IOInterface $io, string $url, $data): void }; // legacy warning/info keys - foreach (array('warning', 'info') as $type) { + foreach (['warning', 'info'] as $type) { if (empty($data[$type])) { continue; } @@ -455,7 +445,7 @@ public static function outputWarnings(IOInterface $io, string $url, $data): void } // modern Composer 2.2+ format with support for multiple warning/info messages - foreach (array('warnings', 'infos') as $key) { + foreach (['warnings', 'infos'] as $key) { if (empty($data[$key])) { continue; } @@ -490,20 +480,20 @@ public static function getExceptionHints(\Throwable $e): ?array || false !== strpos($e->getMessage(), 'Could not resolve host') ) { Silencer::suppress(); - $testConnectivity = file_get_contents('https://8.8.8.8', false, stream_context_create(array( - 'ssl' => array('verify_peer' => false), - 'http' => array('follow_location' => false, 'ignore_errors' => true), - ))); + $testConnectivity = file_get_contents('https://8.8.8.8', false, stream_context_create([ + 'ssl' => ['verify_peer' => false], + 'http' => ['follow_location' => false, 'ignore_errors' => true], + ])); Silencer::restore(); if (false !== $testConnectivity) { - return array( + return [ 'The following exception probably indicates you have misconfigured DNS resolver(s)', - ); + ]; } - return array( + return [ 'The following exception probably indicates you are offline or have misconfigured DNS resolver(s)', - ); + ]; } return null; @@ -511,7 +501,6 @@ public static function getExceptionHints(\Throwable $e): ?array /** * @param Job $job - * @return bool */ private function canUseCurl(array $job): bool { @@ -532,7 +521,6 @@ private function canUseCurl(array $job): bool /** * @internal - * @return bool */ public static function isCurlEnabled(): bool { diff --git a/src/Composer/Util/IniHelper.php b/src/Composer/Util/IniHelper.php index 111ad66d5d51..c01a97dbb4a4 100644 --- a/src/Composer/Util/IniHelper.php +++ b/src/Composer/Util/IniHelper.php @@ -38,8 +38,6 @@ public static function getAll(): array /** * Describes the location of the loaded php.ini file(s) - * - * @return string */ public static function getMessage(): string { diff --git a/src/Composer/Util/Loop.php b/src/Composer/Util/Loop.php index 1ea0bdeb6637..a1abed9a51d3 100644 --- a/src/Composer/Util/Loop.php +++ b/src/Composer/Util/Loop.php @@ -26,11 +26,11 @@ class Loop /** @var ProcessExecutor|null */ private $processExecutor; /** @var PromiseInterface[][] */ - private $currentPromises = array(); + private $currentPromises = []; /** @var int */ private $waitIndex = 0; - public function __construct(HttpDownloader $httpDownloader, ProcessExecutor $processExecutor = null) + public function __construct(HttpDownloader $httpDownloader, ?ProcessExecutor $processExecutor = null) { $this->httpDownloader = $httpDownloader; $this->httpDownloader->enableAsync(); @@ -41,17 +41,11 @@ public function __construct(HttpDownloader $httpDownloader, ProcessExecutor $pro } } - /** - * @return HttpDownloader - */ public function getHttpDownloader(): HttpDownloader { return $this->httpDownloader; } - /** - * @return ProcessExecutor|null - */ public function getProcessExecutor(): ?ProcessExecutor { return $this->processExecutor; @@ -60,9 +54,8 @@ public function getProcessExecutor(): ?ProcessExecutor /** * @param PromiseInterface[] $promises * @param ?ProgressBar $progress - * @return void */ - public function wait(array $promises, ProgressBar $progress = null): void + public function wait(array $promises, ?ProgressBar $progress = null): void { /** @var \Exception|null */ $uncaught = null; @@ -119,9 +112,6 @@ static function ($e) use (&$uncaught): void { } } - /** - * @return void - */ public function abortJobs(): void { foreach ($this->currentPromises as $promiseGroup) { diff --git a/src/Composer/Util/NoProxyPattern.php b/src/Composer/Util/NoProxyPattern.php index 857095b667a4..ebba753691bd 100644 --- a/src/Composer/Util/NoProxyPattern.php +++ b/src/Composer/Util/NoProxyPattern.php @@ -23,12 +23,12 @@ class NoProxyPattern /** * @var string[] */ - protected $hostNames = array(); + protected $hostNames = []; /** * @var (null|object)[] */ - protected $rules = array(); + protected $rules = []; /** * @var bool @@ -46,10 +46,6 @@ public function __construct(string $pattern) /** * Returns true if a URL matches the NO_PROXY pattern - * - * @param string $url - * - * @return bool */ public function test(string $url): bool { @@ -73,7 +69,6 @@ public function test(string $url): bool /** * Returns false is the url cannot be parsed, otherwise a data object * - * @param string $url * * @return bool|stdClass */ @@ -97,7 +92,7 @@ protected function getUrlData(string $url) } $hostName = $host . ($port ? ':' . $port : ''); - list($host, $port, $err) = $this->splitHostPort($hostName); + [$host, $port, $err] = $this->splitHostPort($hostName); if ($err || !$this->ipCheckData($host, $ipdata)) { return false; @@ -108,12 +103,6 @@ protected function getUrlData(string $url) /** * Returns true if the url is matched by a rule - * - * @param int $index - * @param string $hostName - * @param stdClass $url - * - * @return bool */ protected function match(int $index, string $hostName, stdClass $url): bool { @@ -148,11 +137,6 @@ protected function match(int $index, string $hostName, stdClass $url): bool /** * Returns true if the target ip is in the network range - * - * @param stdClass $network - * @param stdClass $target - * - * @return bool */ protected function matchRange(stdClass $network, stdClass $target): bool { @@ -181,8 +165,6 @@ protected function matchRange(stdClass $network, stdClass $target): bool /** * Finds or creates rule data for a hostname * - * @param int $index - * @param string $hostName * * @return null|stdClass Null if the hostname is invalid */ @@ -193,7 +175,7 @@ private function getRule(int $index, string $hostName): ?stdClass } $this->rules[$index] = null; - list($host, $port, $err) = $this->splitHostPort($hostName); + [$host, $port, $err] = $this->splitHostPort($hostName); if ($err || !$this->ipCheckData($host, $ipdata, true)) { return null; @@ -207,7 +189,6 @@ private function getRule(int $index, string $hostName): ?stdClass /** * Creates an object containing IP data if the host is an IP address * - * @param string $host * @param null|stdClass $ipdata Set by method if IP address found * @param bool $allowPrefix Whether a CIDR prefix-length is expected * @@ -222,7 +203,7 @@ private function ipCheckData(string $host, ?stdClass &$ipdata, bool $allowPrefix // Check for a CIDR prefix-length if (strpos($host, '/') !== false) { - list($host, $prefix) = explode('/', $host); + [$host, $prefix] = explode('/', $host); if (!$allowPrefix || !$this->validateInt($prefix, 0, 128)) { return false; @@ -236,7 +217,7 @@ private function ipCheckData(string $host, ?stdClass &$ipdata, bool $allowPrefix return !$modified; } - list($ip, $size) = $this->ipGetAddr($host); + [$ip, $size] = $this->ipGetAddr($host); if ($prefix !== null) { // Check for a valid prefix @@ -244,7 +225,7 @@ private function ipCheckData(string $host, ?stdClass &$ipdata, bool $allowPrefix return false; } - list($ip, $netmask) = $this->ipGetNetwork($ip, $size, $prefix); + [$ip, $netmask] = $this->ipGetNetwork($ip, $size, $prefix); } $ipdata = $this->makeIpData($ip, $size, $netmask); @@ -258,7 +239,6 @@ private function ipCheckData(string $host, ?stdClass &$ipdata, bool $allowPrefix * IPv4 addresses are always mapped to IPv6, which simplifies handling * and comparison. * - * @param string $host * * @return mixed[] in_addr, size */ @@ -268,7 +248,7 @@ private function ipGetAddr(string $host): array $size = strlen($ip); $mapped = $this->ipMapTo6($ip, $size); - return array($mapped, $size); + return [$mapped, $size]; } /** @@ -276,8 +256,6 @@ private function ipGetAddr(string $host): array * * @param int $prefix CIDR prefix-length * @param int $size Byte size of in_addr - * - * @return string */ private function ipGetMask(int $prefix, int $size): string { @@ -324,7 +302,7 @@ private function ipGetNetwork(string $rangeIp, int $size, int $prefix): array $net .= chr($ip[$i] & $mask[$i]); } - return array($net, $netmask); + return [$net, $netmask]; } /** @@ -347,21 +325,15 @@ private function ipMapTo6(string $binary, int $size): string /** * Creates a rule data object - * - * @param string $host - * @param int $port - * @param null|stdClass $ipdata - * - * @return stdClass */ private function makeData(string $host, int $port, ?stdClass $ipdata): stdClass { - return (object) array( + return (object) [ 'host' => $host, 'name' => '.' . ltrim($host, '.'), 'port' => $port, 'ipdata' => $ipdata, - ); + ]; } /** @@ -370,29 +342,26 @@ private function makeData(string $host, int $port, ?stdClass $ipdata): stdClass * @param string $ip in_addr * @param int $size Byte size of in_addr * @param null|string $netmask Network mask - * - * @return stdClass */ private function makeIpData(string $ip, int $size, ?string $netmask): stdClass { - return (object) array( + return (object) [ 'ip' => $ip, 'size' => $size, 'netmask' => $netmask, - ); + ]; } /** * Splits the hostname into host and port components * - * @param string $hostName * * @return mixed[] host, port, if there was error */ private function splitHostPort(string $hostName): array { // host, port, err - $error = array('', '', true); + $error = ['', '', true]; $port = 0; $ip6 = ''; @@ -427,26 +396,20 @@ private function splitHostPort(string $hostName): array $host = $ip6 . $hostName; - return array($host, $port, false); + return [$host, $port, false]; } /** * Wrapper around filter_var FILTER_VALIDATE_INT - * - * @param string $int - * @param int $min - * @param int $max - * - * @return bool */ private function validateInt(string $int, int $min, int $max): bool { - $options = array( - 'options' => array( + $options = [ + 'options' => [ 'min_range' => $min, 'max_range' => $max, - ), - ); + ], + ]; return false !== filter_var($int, FILTER_VALIDATE_INT, $options); } diff --git a/src/Composer/Util/PackageSorter.php b/src/Composer/Util/PackageSorter.php index 6060c2781925..85c6ba7accc9 100644 --- a/src/Composer/Util/PackageSorter.php +++ b/src/Composer/Util/PackageSorter.php @@ -28,7 +28,7 @@ class PackageSorter */ public static function getMostCurrentVersion(array $packages): ?PackageInterface { - return array_reduce($packages, function ($carry, $pkg) { + return array_reduce($packages, static function ($carry, $pkg) { if ($carry === null) { return $pkg; } @@ -70,9 +70,9 @@ public static function sortPackagesAlphabetically(array $packages): array * @param array $weights Pre-set weights for some packages to give them more (negative number) or less (positive) weight offsets * @return PackageInterface[] sorted array */ - public static function sortPackages(array $packages, array $weights = array()): array + public static function sortPackages(array $packages, array $weights = []): array { - $usageList = array(); + $usageList = []; foreach ($packages as $package) { $links = $package->getRequires(); @@ -84,8 +84,8 @@ public static function sortPackages(array $packages, array $weights = array()): $usageList[$target][] = $package->getName(); } } - $computing = array(); - $computed = array(); + $computing = []; + $computed = []; $computeImportance = static function ($name) use (&$computeImportance, &$computing, &$computed, $usageList, $weights) { // reusing computed importance if (isset($computed[$name])) { @@ -112,12 +112,12 @@ public static function sortPackages(array $packages, array $weights = array()): return $weight; }; - $weightedPackages = array(); + $weightedPackages = []; foreach ($packages as $index => $package) { $name = $package->getName(); $weight = $computeImportance($name); - $weightedPackages[] = array('name' => $name, 'weight' => $weight, 'index' => $index); + $weightedPackages[] = ['name' => $name, 'weight' => $weight, 'index' => $index]; } usort($weightedPackages, static function (array $a, array $b): int { @@ -128,7 +128,7 @@ public static function sortPackages(array $packages, array $weights = array()): return strnatcasecmp($a['name'], $b['name']); }); - $sortedPackages = array(); + $sortedPackages = []; foreach ($weightedPackages as $pkg) { $sortedPackages[] = $packages[$pkg['index']]; diff --git a/src/Composer/Util/Perforce.php b/src/Composer/Util/Perforce.php index 8355d7f6f2e0..d24209a42183 100644 --- a/src/Composer/Util/Perforce.php +++ b/src/Composer/Util/Perforce.php @@ -60,11 +60,6 @@ class Perforce /** * @phpstan-param RepoConfig $repoConfig - * @param string $port - * @param string $path - * @param ProcessExecutor $process - * @param bool $isWindows - * @param IOInterface $io */ public function __construct($repoConfig, string $port, string $path, ProcessExecutor $process, bool $isWindows, IOInterface $io) { @@ -78,24 +73,12 @@ public function __construct($repoConfig, string $port, string $path, ProcessExec /** * @phpstan-param RepoConfig $repoConfig - * @param string $port - * @param string $path - * @param ProcessExecutor $process - * @param IOInterface $io - * - * @return self */ public static function create($repoConfig, string $port, string $path, ProcessExecutor $process, IOInterface $io): self { return new Perforce($repoConfig, $port, $path, $process, Platform::isWindows(), $io); } - /** - * @param string $url - * @param ProcessExecutor $processExecutor - * - * @return bool - */ public static function checkServerExists(string $url, ProcessExecutor $processExecutor): bool { return 0 === $processExecutor->execute('p4 -p ' . ProcessExecutor::escape($url) . ' info -s', $ignoredOutput); @@ -103,8 +86,6 @@ public static function checkServerExists(string $url, ProcessExecutor $processEx /** * @phpstan-param RepoConfig $repoConfig - * - * @return void */ public function initialize($repoConfig): void { @@ -132,12 +113,6 @@ public function initialize($repoConfig): void } } - /** - * @param string|null $depot - * @param string|null $branch - * - * @return void - */ public function initializeDepotAndBranch(?string $depot, ?string $branch): void { if (isset($depot)) { @@ -156,9 +131,6 @@ public function generateUniquePerforceClientName(): string return gethostname() . "_" . time(); } - /** - * @return void - */ public function cleanupClientSpec(): void { $client = $this->getClient(); @@ -173,8 +145,6 @@ public function cleanupClientSpec(): void /** * @param non-empty-string $command - * - * @return int */ protected function executeCommand($command): int { @@ -183,32 +153,21 @@ protected function executeCommand($command): int return $this->process->execute($command, $this->commandResult); } - /** - * @return string - */ public function getClient(): string { if (!isset($this->p4Client)) { - $cleanStreamName = str_replace(array('//', '/', '@'), array('', '_', ''), $this->getStream()); + $cleanStreamName = str_replace(['//', '/', '@'], ['', '_', ''], $this->getStream()); $this->p4Client = 'composer_perforce_' . $this->uniquePerforceClientName . '_' . $cleanStreamName; } return $this->p4Client; } - /** - * @return string - */ protected function getPath(): string { return $this->path; } - /** - * @param string $path - * - * @return void - */ public function initializePath(string $path): void { $this->path = $path; @@ -216,19 +175,11 @@ public function initializePath(string $path): void $fs->ensureDirectoryExists($path); } - /** - * @return string - */ protected function getPort(): string { return $this->p4Port; } - /** - * @param string $stream - * - * @return void - */ public function setStream(string $stream): void { $this->p4Stream = $stream; @@ -239,17 +190,11 @@ public function setStream(string $stream): void } } - /** - * @return bool - */ public function isStream(): bool { return is_string($this->p4DepotType) && (strcmp($this->p4DepotType, 'stream') === 0); } - /** - * @return string - */ public function getStream(): string { if (!isset($this->p4Stream)) { @@ -263,11 +208,6 @@ public function getStream(): string return $this->p4Stream; } - /** - * @param string $stream - * - * @return string - */ public function getStreamWithoutLabel(string $stream): string { $index = strpos($stream, '@'); @@ -286,27 +226,16 @@ public function getP4ClientSpec(): string return $this->path . '/' . $this->getClient() . '.p4.spec'; } - /** - * @return string|null - */ public function getUser(): ?string { return $this->p4User; } - /** - * @param string|null $user - * - * @return void - */ public function setUser(?string $user): void { $this->p4User = $user; } - /** - * @return void - */ public function queryP4User(): void { $this->getUser(); @@ -327,7 +256,6 @@ public function queryP4User(): void } /** - * @param string $name * @return ?string */ protected function getP4variable(string $name): ?string @@ -362,9 +290,6 @@ protected function getP4variable(string $name): ?string return $result; } - /** - * @return string|null - */ public function queryP4Password(): ?string { if (isset($this->p4Password)) { @@ -380,9 +305,6 @@ public function queryP4Password(): ?string } /** - * @param string $command - * @param bool $useClient - * * @return non-empty-string */ public function generateP4Command(string $command, bool $useClient = true): string @@ -397,9 +319,6 @@ public function generateP4Command(string $command, bool $useClient = true): stri return $p4Command; } - /** - * @return bool - */ public function isLoggedIn(): bool { $command = $this->generateP4Command('login -s', false); @@ -420,9 +339,6 @@ public function isLoggedIn(): bool return true; } - /** - * @return void - */ public function connectClient(): void { $p4CreateClientCommand = $this->generateP4Command( @@ -431,11 +347,6 @@ public function connectClient(): void $this->executeCommand($p4CreateClientCommand); } - /** - * @param string|null $sourceReference - * - * @return void - */ public function syncCodeBase(?string $sourceReference): void { $prevDir = Platform::getCwd(); @@ -450,8 +361,6 @@ public function syncCodeBase(?string $sourceReference): void /** * @param resource|false $spec - * - * @return void */ public function writeClientSpecToFile($spec): void { @@ -476,9 +385,6 @@ public function writeClientSpecToFile($spec): void } } - /** - * @return void - */ public function writeP4ClientSpec(): void { $clientSpec = $this->getP4ClientSpec(); @@ -495,8 +401,6 @@ public function writeP4ClientSpec(): void /** * @param resource $pipe * @param mixed $name - * - * @return void */ protected function read($pipe, $name): void { @@ -509,11 +413,6 @@ protected function read($pipe, $name): void } } - /** - * @param string|null $password - * - * @return int - */ public function windowsLogin(?string $password): int { $command = $this->generateP4Command(' login -a'); @@ -523,9 +422,6 @@ public function windowsLogin(?string $password): int return $process->run(); } - /** - * @return void - */ public function p4Login(): void { $this->queryP4User(); @@ -544,8 +440,6 @@ public function p4Login(): void } /** - * @param string $identifier - * * @return mixed[]|null */ public function getComposerInformation(string $identifier): ?array @@ -559,12 +453,6 @@ public function getComposerInformation(string $identifier): ?array return json_decode($composerFileContent, true); } - /** - * @param string $file - * @param string $identifier - * - * @return string|null - */ public function getFileContent(string $file, string $identifier): ?string { $path = $this->getFilePath($file, $identifier); @@ -580,12 +468,6 @@ public function getFileContent(string $file, string $identifier): ?string return $result; } - /** - * @param string $file - * @param string $identifier - * - * @return string|null - */ public function getFilePath(string $file, string $identifier): ?string { $index = strpos($identifier, '@'); @@ -616,7 +498,7 @@ public function getFilePath(string $file, string $identifier): ?string */ public function getBranches(): array { - $possibleBranches = array(); + $possibleBranches = []; if (!$this->isStream()) { $possibleBranches[$this->p4Branch] = $this->getStream(); } else { @@ -640,7 +522,7 @@ public function getBranches(): array $lastCommitArr = explode(' ', $lastCommit); $lastCommitNum = $lastCommitArr[1]; - return array('master' => $possibleBranches[$this->p4Branch] . '@'. $lastCommitNum); + return ['master' => $possibleBranches[$this->p4Branch] . '@'. $lastCommitNum]; } /** @@ -652,7 +534,7 @@ public function getTags(): array $this->executeCommand($command); $result = $this->commandResult; $resArray = explode(PHP_EOL, $result); - $tags = array(); + $tags = []; foreach ($resArray as $line) { if (strpos($line, 'Label') !== false) { $fields = explode(' ', $line); @@ -663,9 +545,6 @@ public function getTags(): array return $tags; } - /** - * @return bool - */ public function checkStream(): bool { $command = $this->generateP4Command('depots', false); @@ -687,7 +566,6 @@ public function checkStream(): bool } /** - * @param string $reference * @return mixed|null */ protected function getChangeList(string $reference): mixed @@ -709,8 +587,6 @@ protected function getChangeList(string $reference): mixed } /** - * @param string $fromReference - * @param string $toReference * @return mixed|null */ public function getCommitLogs(string $fromReference, string $toReference): mixed @@ -731,9 +607,6 @@ public function getCommitLogs(string $fromReference, string $toReference): mixed return $this->commandResult; } - /** - * @return Filesystem - */ public function getFilesystem(): Filesystem { if (null === $this->filesystem) { @@ -743,9 +616,6 @@ public function getFilesystem(): Filesystem return $this->filesystem; } - /** - * @return void - */ public function setFilesystem(Filesystem $fs): void { $this->filesystem = $fs; diff --git a/src/Composer/Util/Platform.php b/src/Composer/Util/Platform.php index ad9ffdc16f00..2bbc61225fcd 100644 --- a/src/Composer/Util/Platform.php +++ b/src/Composer/Util/Platform.php @@ -55,7 +55,6 @@ public static function getCwd(bool $allowEmpty = false): string /** * getenv() equivalent but reads from the runtime global variables first * - * @param string $name * @return string|false */ public static function getEnv(string $name) @@ -72,10 +71,6 @@ public static function getEnv(string $name) /** * putenv() equivalent but updates the runtime global variables too - * - * @param string $name - * @param string $value - * @return void */ public static function putEnv(string $name, string $value): void { @@ -86,9 +81,6 @@ public static function putEnv(string $name, string $value): void /** * putenv('X') equivalent but updates the runtime global variables too - * - * @param string $name - * @return void */ public static function clearEnv(string $name): void { @@ -98,9 +90,6 @@ public static function clearEnv(string $name): void /** * Parses tildes and environment variables in paths. - * - * @param string $path - * @return string */ public static function expandPath(string $path): string { @@ -176,7 +165,6 @@ public static function isWindows(): bool } /** - * @param string $str * @return int return a guaranteed binary length of the string, regardless of silly mbstring configs */ public static function strlen(string $str): int @@ -195,7 +183,6 @@ public static function strlen(string $str): int /** * @param ?resource $fd Open file descriptor or null to default to STDOUT - * @return bool */ public static function isTty($fd = null): bool { @@ -208,7 +195,7 @@ public static function isTty($fd = null): bool // detect msysgit/mingw and assume this is a tty because detection // does not work correctly, see https://github.com/composer/composer/issues/9690 - if (in_array(strtoupper(self::getEnv('MSYSTEM') ?: ''), array('MINGW32', 'MINGW64'), true)) { + if (in_array(strtoupper(self::getEnv('MSYSTEM') ?: ''), ['MINGW32', 'MINGW64'], true)) { return true; } @@ -236,9 +223,6 @@ public static function isInputCompletionProcess(): bool return '_complete' === ($_SERVER['argv'][1] ?? null); } - /** - * @return void - */ public static function workaroundFilesystemIssues(): void { if (self::isVirtualBoxGuest()) { @@ -250,8 +234,6 @@ public static function workaroundFilesystemIssues(): void * Attempts detection of VirtualBox guest VMs * * This works based on the process' user being "vagrant", the COMPOSER_RUNTIME_ENV env var being set to "virtualbox", or lsmod showing the virtualbox guest additions are loaded - * - * @return bool */ private static function isVirtualBoxGuest(): bool { diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 3f57239bf0a9..aab99f7880a5 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -46,7 +46,7 @@ class ProcessExecutor /** * @phpstan-var array> */ - private $jobs = array(); + private $jobs = []; /** @var int */ private $runningJobs = 0; /** @var int */ @@ -56,7 +56,7 @@ class ProcessExecutor /** @var bool */ private $allowAsync = false; - public function __construct(IOInterface $io = null) + public function __construct(?IOInterface $io = null) { $this->io = $io; } @@ -97,10 +97,7 @@ public function executeTty($command, ?string $cwd = null): int /** * @param string|list $command - * @param null|string $cwd - * @param bool $tty * @param mixed $output - * @return int */ private function doExecute($command, ?string $cwd, bool $tty, &$output = null): int { @@ -158,7 +155,6 @@ private function doExecute($command, ?string $cwd, bool $tty, &$output = null): * * @param string|list $command the command to execute * @param string $cwd the working directory - * @return PromiseInterface */ public function executeAsync($command, ?string $cwd = null): PromiseInterface { @@ -166,12 +162,12 @@ public function executeAsync($command, ?string $cwd = null): PromiseInterface throw new \LogicException('You must use the ProcessExecutor instance which is part of a Composer\Loop instance to be able to run async processes'); } - $job = array( + $job = [ 'id' => $this->idGen++, 'status' => self::STATUS_QUEUED, 'command' => $command, 'cwd' => $cwd, - ); + ]; $resolver = static function ($resolve, $reject) use (&$job): void { $job['status'] = ProcessExecutor::STATUS_QUEUED; @@ -245,10 +241,6 @@ protected function outputHandler(string $type, string $buffer): void } } - /** - * @param int $id - * @return void - */ private function startJob(int $id): void { $job = &$this->jobs[$id]; @@ -272,7 +264,7 @@ private function startJob(int $id): void $process = new Process($command, $cwd, null, null, static::getTimeout()); } } catch (\Throwable $e) { - call_user_func($job['reject'], $e); + $job['reject']($e); return; } @@ -282,7 +274,7 @@ private function startJob(int $id): void try { $process->start(); } catch (\Throwable $e) { - call_user_func($job['reject'], $e); + $job['reject']($e); return; } @@ -300,7 +292,6 @@ public function resetMaxJobs(): void /** * @param ?int $index job id - * @return void */ public function wait($index = null): void { @@ -315,8 +306,6 @@ public function wait($index = null): void /** * @internal - * - * @return void */ public function enableAsync(): void { @@ -370,20 +359,17 @@ private function markJobDone(): void } /** - * @param null|string $output * @return string[] */ public function splitLines(?string $output): array { $output = trim((string) $output); - return $output === '' ? array() : Preg::split('{\r?\n}', $output); + return $output === '' ? [] : Preg::split('{\r?\n}', $output); } /** * Get any error output from the last command - * - * @return string */ public function getErrorOutput(): string { @@ -400,7 +386,6 @@ public static function getTimeout(): int /** * @param int $timeout the timeout in seconds - * @return void */ public static function setTimeout(int $timeout): void { @@ -456,8 +441,6 @@ private function outputCommandRun($command, ?string $cwd, bool $async): void * MIT Licensed (c) John Stevenson * * @param string|false|null $argument - * - * @return string */ private static function escapeArgument($argument): string { diff --git a/src/Composer/Util/RemoteFilesystem.php b/src/Composer/Util/RemoteFilesystem.php index 0585beeea68e..3ff6f2e4015b 100644 --- a/src/Composer/Util/RemoteFilesystem.php +++ b/src/Composer/Util/RemoteFilesystem.php @@ -49,7 +49,7 @@ class RemoteFilesystem /** @var ?int */ private $lastProgress; /** @var mixed[] */ - private $options = array(); + private $options = []; /** @var bool */ private $disableTls = false; /** @var string[] */ @@ -73,10 +73,9 @@ class RemoteFilesystem * @param IOInterface $io The IO instance * @param Config $config The config * @param mixed[] $options The options - * @param bool $disableTls * @param AuthHelper $authHelper */ - public function __construct(IOInterface $io, Config $config, array $options = array(), bool $disableTls = false, AuthHelper $authHelper = null) + public function __construct(IOInterface $io, Config $config, array $options = [], bool $disableTls = false, ?AuthHelper $authHelper = null) { $this->io = $io; @@ -106,7 +105,7 @@ public function __construct(IOInterface $io, Config $config, array $options = ar * * @return bool true */ - public function copy(string $originUrl, string $fileUrl, string $fileName, bool $progress = true, array $options = array()) + public function copy(string $originUrl, string $fileUrl, string $fileName, bool $progress = true, array $options = []) { return $this->get($originUrl, $fileUrl, $options, $fileName, $progress); } @@ -121,7 +120,7 @@ public function copy(string $originUrl, string $fileUrl, string $fileName, bool * * @return bool|string The content */ - public function getContents(string $originUrl, string $fileUrl, bool $progress = true, array $options = array()) + public function getContents(string $originUrl, string $fileUrl, bool $progress = true, array $options = []) { return $this->get($originUrl, $fileUrl, $options, null, $progress); } @@ -217,7 +216,7 @@ public function findStatusMessage(array $headers) * * @return bool|string */ - protected function get(string $originUrl, string $fileUrl, array $additionalOptions = array(), string $fileName = null, bool $progress = true) + protected function get(string $originUrl, string $fileUrl, array $additionalOptions = [], ?string $fileName = null, bool $progress = true) { $this->scheme = parse_url(strtr($fileUrl, '\\', '/'), PHP_URL_SCHEME); $this->bytesMax = 0; @@ -227,7 +226,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti $this->progress = $progress; $this->lastProgress = null; $retryAuthFailure = true; - $this->lastHeaders = array(); + $this->lastHeaders = []; $this->redirects = 1; // The first request counts. $tempAdditionalOptions = $additionalOptions; @@ -271,7 +270,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti unset($options['max_file_size']); } - $ctx = StreamContextFactory::getContext($fileUrl, $options, array('notification' => array($this, 'callbackGet'))); + $ctx = StreamContextFactory::getContext($fileUrl, $options, ['notification' => [$this, 'callbackGet']]); $proxy = $this->proxyManager->getProxyForRequest($fileUrl); $usingProxy = $proxy->getFormattedUrl(' using proxy (%s)'); @@ -298,7 +297,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti return true; }); - $http_response_header = array(); + $http_response_header = []; try { $result = $this->getRemoteContents($originUrl, $fileUrl, $ctx, $http_response_header, $maxFileSize); @@ -308,7 +307,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti HttpDownloader::outputWarnings($this->io, $originUrl, json_decode($result, true)); } - if (in_array($statusCode, array(401, 403)) && $retryAuthFailure) { + if (in_array($statusCode, [401, 403]) && $retryAuthFailure) { $this->promptAuthAndRetry($statusCode, $this->findStatusMessage($http_response_header), $http_response_header); } } @@ -347,10 +346,10 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) { $this->degradedMode = true; $this->io->writeError(''); - $this->io->writeError(array( + $this->io->writeError([ ''.$e->getMessage().'', 'Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info', - )); + ]); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } @@ -428,11 +427,11 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti } $this->degradedMode = true; - $this->io->writeError(array( + $this->io->writeError([ '', 'Failed to decode response: '.$e->getMessage().'', 'Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info', - )); + ]); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } @@ -482,10 +481,10 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) { $this->degradedMode = true; $this->io->writeError(''); - $this->io->writeError(array( + $this->io->writeError([ ''.$e->getMessage().'', 'Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info', - )); + ]); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } @@ -511,7 +510,7 @@ protected function get(string $originUrl, string $fileUrl, array $additionalOpti * * @return string|false The response contents or false on failure */ - protected function getRemoteContents(string $originUrl, string $fileUrl, $context, array &$responseHeaders = null, int $maxFileSize = null) + protected function getRemoteContents(string $originUrl, string $fileUrl, $context, ?array &$responseHeaders = null, ?int $maxFileSize = null) { $result = false; @@ -531,7 +530,7 @@ protected function getRemoteContents(string $originUrl, string $fileUrl, $contex } // https://www.php.net/manual/en/reserved.variables.httpresponseheader.php - $responseHeaders = $http_response_header ?? array(); + $responseHeaders = $http_response_header ?? []; if (null !== $e) { throw $e; @@ -587,12 +586,11 @@ protected function callbackGet(int $notificationCode, int $severity, ?string $me /** * @param positive-int $httpStatus - * @param string|null $reason * @param string[] $headers * * @return void */ - protected function promptAuthAndRetry($httpStatus, ?string $reason = null, array $headers = array()) + protected function promptAuthAndRetry($httpStatus, ?string $reason = null, array $headers = []) { $result = $this->authHelper->promptAuthIfNeeded($this->fileUrl, $this->originUrl, $httpStatus, $reason, $headers, 1 /** always pass 1 as RemoteFilesystem is single threaded there is no race condition possible */); @@ -605,15 +603,14 @@ protected function promptAuthAndRetry($httpStatus, ?string $reason = null, array } /** - * @param string $originUrl * @param mixed[] $additionalOptions * * @return mixed[] */ protected function getOptionsForUrl(string $originUrl, array $additionalOptions) { - $tlsOptions = array(); - $headers = array(); + $tlsOptions = []; + $headers = []; if (extension_loaded('zlib')) { $headers[] = 'Accept-Encoding: gzip'; @@ -695,8 +692,6 @@ private function handleRedirect(array $http_response_header, array $additionalOp /** * @param string|false $result * @param string[] $http_response_header - * - * @return string|null */ private function decodeResult($result, array $http_response_header): ?string { @@ -719,8 +714,6 @@ private function decodeResult($result, array $http_response_header): ?string /** * @param string|false $result - * - * @return string|null */ private function normalizeResult($result): ?string { diff --git a/src/Composer/Util/Silencer.php b/src/Composer/Util/Silencer.php index c01404be6265..f2b9f73fc9ad 100644 --- a/src/Composer/Util/Silencer.php +++ b/src/Composer/Util/Silencer.php @@ -22,7 +22,7 @@ class Silencer /** * @var int[] Unpop stack */ - private static $stack = array(); + private static $stack = []; /** * Suppresses given mask or errors. @@ -44,8 +44,6 @@ public static function suppress(?int $mask = null): int /** * Restores a single state. - * - * @return void */ public static function restore(): void { diff --git a/src/Composer/Util/StreamContextFactory.php b/src/Composer/Util/StreamContextFactory.php index c905df4f81fa..18425d7ade2b 100644 --- a/src/Composer/Util/StreamContextFactory.php +++ b/src/Composer/Util/StreamContextFactory.php @@ -37,13 +37,13 @@ final class StreamContextFactory * @throws \RuntimeException if https proxy required and OpenSSL uninstalled * @return resource Default context */ - public static function getContext(string $url, array $defaultOptions = array(), array $defaultParams = array()) + public static function getContext(string $url, array $defaultOptions = [], array $defaultParams = []) { - $options = array('http' => array( + $options = ['http' => [ // specify defaults again to try and work better with curlwrappers enabled 'follow_location' => 1, 'max_redirects' => 20, - )); + ]]; $options = array_replace_recursive($options, self::initOptions($url, $defaultOptions)); unset($defaultOptions['http']['header']); @@ -57,7 +57,6 @@ public static function getContext(string $url, array $defaultOptions = array(), } /** - * @param string $url * @param mixed[] $options * @param bool $forCurl When true, will not add proxy values as these are handled separately * @phpstan-return array{http: array{header: string[], proxy?: string, request_fulluri: bool}, ssl?: mixed[]} @@ -67,7 +66,7 @@ public static function initOptions(string $url, array $options, bool $forCurl = { // Make sure the headers are in an array form if (!isset($options['http']['header'])) { - $options['http']['header'] = array(); + $options['http']['header'] = []; } if (is_string($options['http']['header'])) { $options['http']['header'] = explode("\r\n", $options['http']['header']); @@ -134,9 +133,9 @@ function_exists('php_uname') ? php_uname('r') : 'Unknown', * * @return mixed[] */ - public static function getTlsDefaults(array $options, LoggerInterface $logger = null): array + public static function getTlsDefaults(array $options, ?LoggerInterface $logger = null): array { - $ciphers = implode(':', array( + $ciphers = implode(':', [ 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES256-GCM-SHA384', @@ -178,7 +177,7 @@ public static function getTlsDefaults(array $options, LoggerInterface $logger = '!EDH-DSS-DES-CBC3-SHA', '!EDH-RSA-DES-CBC3-SHA', '!KRB5-DES-CBC3-SHA', - )); + ]); /** * CN_match and SNI_server_name are only known once a URL is passed. @@ -186,15 +185,15 @@ public static function getTlsDefaults(array $options, LoggerInterface $logger = * * cafile or capath can be overridden by passing in those options to constructor. */ - $defaults = array( - 'ssl' => array( + $defaults = [ + 'ssl' => [ 'ciphers' => $ciphers, 'verify_peer' => true, 'verify_depth' => 7, 'SNI_enabled' => true, 'capture_peer_cert' => true, - ), - ); + ], + ]; if (isset($options['ssl'])) { $defaults['ssl'] = array_replace_recursive($defaults['ssl'], $options['ssl']); diff --git a/src/Composer/Util/Svn.php b/src/Composer/Util/Svn.php index d385ccb74bf1..ea7d5dbeb7a1 100644 --- a/src/Composer/Util/Svn.php +++ b/src/Composer/Util/Svn.php @@ -70,12 +70,9 @@ class Svn private static $version; /** - * @param string $url - * @param \Composer\IO\IOInterface $io - * @param Config $config * @param ProcessExecutor $process */ - public function __construct(string $url, IOInterface $io, Config $config, ProcessExecutor $process = null) + public function __construct(string $url, IOInterface $io, Config $config, ?ProcessExecutor $process = null) { $this->url = $url; $this->io = $io; @@ -83,9 +80,6 @@ public function __construct(string $url, IOInterface $io, Config $config, Proces $this->process = $process ?: new ProcessExecutor($io); } - /** - * @return void - */ public static function cleanEnv(): void { // clean up env for OSX, see https://github.com/composer/composer/issues/2146#issuecomment-35478940 @@ -103,7 +97,6 @@ public static function cleanEnv(): void * @param bool $verbose Output all output to the user * * @throws \RuntimeException - * @return string */ public function execute(string $command, string $url, ?string $cwd = null, ?string $path = null, bool $verbose = false): string { @@ -123,9 +116,8 @@ public function execute(string $command, string $url, ?string $cwd = null, ?stri * @param bool $verbose Output all output to the user * * @throws \RuntimeException - * @return string */ - public function executeLocal(string $command, string $path, string $cwd = null, bool $verbose = false): string + public function executeLocal(string $command, string $path, ?string $cwd = null, bool $verbose = false): string { // A local command has no remote url return $this->executeWithAuthRetry($command, $cwd, '', $path, $verbose); @@ -156,7 +148,7 @@ private function executeWithAuthRetry(string $svnCommand, ?string $cwd, string $ } $errorOutput = $this->process->getErrorOutput(); - $fullOutput = trim(implode("\n", array($output, $errorOutput))); + $fullOutput = trim(implode("\n", [$output, $errorOutput])); // the error is not auth-related if (false === stripos($fullOutput, 'Could not authenticate to server:') @@ -181,10 +173,6 @@ private function executeWithAuthRetry(string $svnCommand, ?string $cwd, string $ ); } - /** - * @param bool $cacheCredentials - * @return void - */ public function setCacheCredentials(bool $cacheCredentials): void { $this->cacheCredentials = $cacheCredentials; @@ -208,10 +196,10 @@ protected function doAuthDance(): Svn $this->io->writeError("The Subversion server ({$this->url}) requested credentials:"); $this->hasAuth = true; - $this->credentials = array( + $this->credentials = [ 'username' => (string) $this->io->ask("Username: ", ''), 'password' => (string) $this->io->askAndHideAnswer("Password: "), - ); + ]; $this->cacheCredentials = $this->io->askConfirmation("Should Subversion cache these credentials? (yes/no) "); @@ -224,8 +212,6 @@ protected function doAuthDance(): Svn * @param string $cmd Usually 'svn ls' or something like that. * @param string $url Repo URL. * @param string $path Target for a checkout - * - * @return string */ protected function getCommand(string $cmd, string $url, ?string $path = null): string { @@ -248,8 +234,6 @@ protected function getCommand(string $cmd, string $url, ?string $path = null): s * Return the credential string for the svn command. * * Adds --no-auth-cache when credentials are present. - * - * @return string */ protected function getCredentialString(): string { @@ -269,7 +253,6 @@ protected function getCredentialString(): string * Get the password for the svn command. Can be empty. * * @throws \LogicException - * @return string */ protected function getPassword(): string { @@ -284,7 +267,6 @@ protected function getPassword(): string * Get the username for the svn command. * * @throws \LogicException - * @return string */ protected function getUsername(): string { @@ -297,8 +279,6 @@ protected function getUsername(): string /** * Detect Svn Auth. - * - * @return bool */ protected function hasAuth(): bool { @@ -315,8 +295,6 @@ protected function hasAuth(): bool /** * Return the no-auth-cache switch. - * - * @return string */ protected function getAuthCache(): string { @@ -325,8 +303,6 @@ protected function getAuthCache(): string /** * Create the auth params from the configuration file. - * - * @return bool */ private function createAuthFromConfig(): bool { @@ -338,10 +314,10 @@ private function createAuthFromConfig(): bool $host = parse_url($this->url, PHP_URL_HOST); if (isset($authConfig[$host])) { - $this->credentials = array( + $this->credentials = [ 'username' => $authConfig[$host]['username'], 'password' => $authConfig[$host]['password'], - ); + ]; return $this->hasAuth = true; } @@ -351,8 +327,6 @@ private function createAuthFromConfig(): bool /** * Create the auth params from the url - * - * @return bool */ private function createAuthFromUrl(): bool { @@ -361,18 +335,16 @@ private function createAuthFromUrl(): bool return $this->hasAuth = false; } - $this->credentials = array( + $this->credentials = [ 'username' => $uri['user'], 'password' => !empty($uri['pass']) ? $uri['pass'] : '', - ); + ]; return $this->hasAuth = true; } /** * Returns the version of the svn binary contained in PATH - * - * @return string|null */ public function binaryVersion(): ?string { diff --git a/src/Composer/Util/SyncHelper.php b/src/Composer/Util/SyncHelper.php index 819115d83e6c..1981692123b0 100644 --- a/src/Composer/Util/SyncHelper.php +++ b/src/Composer/Util/SyncHelper.php @@ -28,10 +28,8 @@ class SyncHelper * @param string $path the installation path for the package * @param PackageInterface $package the package to install * @param PackageInterface|null $prevPackage the previous package if this is an update and not an initial installation - * - * @return void */ - public static function downloadAndInstallPackageSync(Loop $loop, DownloaderInterface $downloader, string $path, PackageInterface $package, PackageInterface $prevPackage = null): void + public static function downloadAndInstallPackageSync(Loop $loop, DownloaderInterface $downloader, string $path, PackageInterface $package, ?PackageInterface $prevPackage = null): void { $type = $prevPackage ? 'update' : 'install'; @@ -57,14 +55,11 @@ public static function downloadAndInstallPackageSync(Loop $loop, DownloaderInter * Waits for a promise to resolve * * @param Loop $loop Loop instance which you can get from $composer->getLoop() - * @param PromiseInterface|null $promise - * - * @return void */ - public static function await(Loop $loop, PromiseInterface $promise = null): void + public static function await(Loop $loop, ?PromiseInterface $promise = null): void { if ($promise) { - $loop->wait(array($promise)); + $loop->wait([$promise]); } } } diff --git a/src/Composer/Util/Tar.php b/src/Composer/Util/Tar.php index 489565b1be90..bb8c8c3d2a21 100644 --- a/src/Composer/Util/Tar.php +++ b/src/Composer/Util/Tar.php @@ -17,11 +17,6 @@ */ class Tar { - /** - * @param string $pathToArchive - * - * @return string|null - */ public static function getComposerJson(string $pathToArchive): ?string { $phar = new \PharData($pathToArchive); @@ -34,11 +29,7 @@ public static function getComposerJson(string $pathToArchive): ?string } /** - * @param \PharData $phar - * * @throws \RuntimeException - * - * @return string */ private static function extractComposerJsonFromFolder(\PharData $phar): string { @@ -46,7 +37,7 @@ private static function extractComposerJsonFromFolder(\PharData $phar): string return $phar['composer.json']->getContent(); } - $topLevelPaths = array(); + $topLevelPaths = []; foreach ($phar as $folderFile) { $name = $folderFile->getBasename(); diff --git a/src/Composer/Util/TlsHelper.php b/src/Composer/Util/TlsHelper.php index 8de4dc83695b..aca227270bfe 100644 --- a/src/Composer/Util/TlsHelper.php +++ b/src/Composer/Util/TlsHelper.php @@ -27,10 +27,8 @@ final class TlsHelper * @param mixed $certificate X.509 certificate * @param string $hostname Hostname in the URL * @param string $cn Set to the common name of the certificate iff match found - * - * @return bool */ - public static function checkCertificateHost($certificate, string $hostname, string &$cn = null): bool + public static function checkCertificateHost($certificate, string $hostname, ?string &$cn = null): bool { $names = self::getCertificateNames($certificate); @@ -38,7 +36,7 @@ public static function checkCertificateHost($certificate, string $hostname, stri return false; } - $combinedNames = array_merge($names['san'], array($names['cn'])); + $combinedNames = array_merge($names['san'], [$names['cn']]); $hostname = strtolower($hostname); foreach ($combinedNames as $certName) { @@ -74,7 +72,7 @@ public static function getCertificateNames($certificate): ?array } $commonName = strtolower($info['subject']['commonName']); - $subjectAltNames = array(); + $subjectAltNames = []; if (isset($info['extensions']['subjectAltName'])) { $subjectAltNames = Preg::split('{\s*,\s*}', $info['extensions']['subjectAltName']); @@ -88,10 +86,10 @@ public static function getCertificateNames($certificate): ?array $subjectAltNames = array_values($subjectAltNames); } - return array( + return [ 'cn' => $commonName, 'san' => $subjectAltNames, - ); + ]; } /** @@ -132,9 +130,6 @@ public static function getCertificateNames($certificate): ?array * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @param string $certificate - * @return string */ public static function getCertificateFingerprint(string $certificate): string { @@ -158,8 +153,6 @@ public static function getCertificateFingerprint(string $certificate): string * * This checks if OpenSSL extensions is vulnerable to remote code execution * via the exploit documented as CVE-2013-6420. - * - * @return bool */ public static function isOpensslParseSafe(): bool { @@ -170,8 +163,6 @@ public static function isOpensslParseSafe(): bool * Convert certificate name into matching function. * * @param string $certName CN/SAN - * - * @return callable|null */ private static function certNameMatcher(string $certName): ?callable { diff --git a/src/Composer/Util/Url.php b/src/Composer/Util/Url.php index b98178505609..143b19f489b9 100644 --- a/src/Composer/Util/Url.php +++ b/src/Composer/Util/Url.php @@ -21,9 +21,6 @@ class Url { /** - * @param Config $config - * @param string $url - * @param string $ref * @return string the updated URL */ public static function updateDistReference(Config $config, string $url, string $ref): string @@ -60,10 +57,6 @@ public static function updateDistReference(Config $config, string $url, string $ return $url; } - /** - * @param string $url - * @return string - */ public static function getOrigin(Config $config, string $url): string { if (0 === strpos($url, 'file://')) { @@ -103,10 +96,6 @@ public static function getOrigin(Config $config, string $url): string return $origin; } - /** - * @param string $url - * @return string - */ public static function sanitize(string $url): string { // GitHub repository rename result in redirect locations containing the access_token as GET parameter diff --git a/src/Composer/Util/Zip.php b/src/Composer/Util/Zip.php index 96b705c8f38f..9fd8f07857d6 100644 --- a/src/Composer/Util/Zip.php +++ b/src/Composer/Util/Zip.php @@ -19,10 +19,6 @@ class Zip { /** * Gets content of the root composer.json inside a ZIP archive. - * - * @param string $pathToZip - * - * @return string|null */ public static function getComposerJson(string $pathToZip): ?string { @@ -59,11 +55,7 @@ public static function getComposerJson(string $pathToZip): ?string /** * Find a file by name, returning the one that has the shortest path. * - * @param \ZipArchive $zip - * @param string $filename * @throws \RuntimeException - * - * @return int */ private static function locateFile(\ZipArchive $zip, string $filename): int { @@ -72,7 +64,7 @@ private static function locateFile(\ZipArchive $zip, string $filename): int return $index; } - $topLevelPaths = array(); + $topLevelPaths = []; for ($i = 0; $i < $zip->numFiles; $i++) { $name = $zip->getNameIndex($i); $dirname = dirname($name); diff --git a/tests/Composer/Test/Advisory/AuditorTest.php b/tests/Composer/Test/Advisory/AuditorTest.php index 1dec611d4037..7f074bb0d71e 100644 --- a/tests/Composer/Test/Advisory/AuditorTest.php +++ b/tests/Composer/Test/Advisory/AuditorTest.php @@ -1,22 +1,27 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\Test\Advisory; use Composer\Advisory\PartialSecurityAdvisory; use Composer\Advisory\SecurityAdvisory; -use Composer\IO\IOInterface; use Composer\IO\NullIO; -use Composer\Json\JsonFile; use Composer\Package\Package; use Composer\Package\Version\VersionParser; use Composer\Repository\ComposerRepository; use Composer\Repository\RepositorySet; use Composer\Test\TestCase; use Composer\Advisory\Auditor; -use Composer\Util\Http\Response; -use Composer\Util\HttpDownloader; use InvalidArgumentException; -use PHPUnit\Framework\MockObject\MockObject; class AuditorTest extends TestCase { @@ -83,7 +88,7 @@ private function getRepoSet(): RepositorySet $repo ->method('getSecurityAdvisories') - ->willReturnCallback(function (array $packageConstraintMap, bool $allowPartialAdvisories) { + ->willReturnCallback(static function (array $packageConstraintMap, bool $allowPartialAdvisories) { $advisories = []; $parser = new VersionParser(); @@ -92,16 +97,16 @@ private function getRepoSet(): RepositorySet * @param string $name * @return ($allowPartialAdvisories is false ? SecurityAdvisory|null : PartialSecurityAdvisory|SecurityAdvisory|null) */ - $create = function (array $data, string $name) use ($parser, $allowPartialAdvisories, $packageConstraintMap): ?PartialSecurityAdvisory { - $advisory = PartialSecurityAdvisory::create($name, $data, $parser); - if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { - throw new \RuntimeException('Advisory for '.$name.' could not be loaded as a full advisory from test repo'); - } - if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { - return null; - } + $create = static function (array $data, string $name) use ($parser, $allowPartialAdvisories, $packageConstraintMap): ?PartialSecurityAdvisory { + $advisory = PartialSecurityAdvisory::create($name, $data, $parser); + if (!$allowPartialAdvisories && !$advisory instanceof SecurityAdvisory) { + throw new \RuntimeException('Advisory for '.$name.' could not be loaded as a full advisory from test repo'); + } + if (!$advisory->affectedVersions->matches($packageConstraintMap[$name])) { + return null; + } - return $advisory; + return $advisory; }; foreach (self::getMockAdvisories() as $package => $list) { @@ -109,7 +114,9 @@ private function getRepoSet(): RepositorySet continue; } $advisories[$package] = array_filter(array_map( - function ($data) use ($package, $create) { return $create($data, $package); }, + static function ($data) use ($package, $create) { + return $create($data, $package); + }, $list )); } @@ -174,7 +181,7 @@ public static function getMockAdvisories(): array ], 'reportedAt' => '', 'composerRepository' => 'https://packagist.org', - ] + ], ], 'vendor1/package2' => [ [ @@ -244,7 +251,7 @@ public static function getMockAdvisories(): array ], 'reportedAt' => '2015-05-25 13:21:00', 'composerRepository' => 'https://packagist.org', - ] + ], ], 'vendory/packagey' => [ [ diff --git a/tests/Composer/Test/AllFunctionalTest.php b/tests/Composer/Test/AllFunctionalTest.php index 81ee7b382809..f006d756cb2a 100644 --- a/tests/Composer/Test/AllFunctionalTest.php +++ b/tests/Composer/Test/AllFunctionalTest.php @@ -99,7 +99,6 @@ public function testBuildPhar(): void /** * @dataProvider getTestFiles * @depends testBuildPhar - * @param string $testFile */ public function testIntegration(string $testFile): void { @@ -114,15 +113,15 @@ public function testIntegration(string $testFile): void $fs->copy($testFileSetupDir, $this->testDir); } - $env = array( + $env = [ 'COMPOSER_HOME' => $this->testDir.'home', 'COMPOSER_CACHE_DIR' => $this->testDir.'cache', - ); + ]; $proc = Process::fromShellCommandline(escapeshellcmd(PHP_BINARY).' '.escapeshellarg(self::$pharPath).' --no-ansi '.$testData['RUN'], $this->testDir, $env, null, 300); $output = ''; - $exitCode = $proc->run(function ($type, $buffer) use (&$output): void { + $exitCode = $proc->run(static function ($type, $buffer) use (&$output): void { $output .= $buffer; }); @@ -182,22 +181,21 @@ public function testIntegration(string $testFile): void */ public function getTestFiles(): array { - $tests = array(); + $tests = []; foreach (Finder::create()->in(__DIR__.'/Fixtures/functional')->name('*.test')->files() as $file) { - $tests[$file->getFilename()] = array((string) $file); + $tests[$file->getFilename()] = [(string) $file]; } return $tests; } /** - * @param string $file * @return array{RUN: string, EXPECT?: string, EXPECT-EXIT-CODE?: int, EXPECT-REGEX?: string, EXPECT-REGEXES?: string, TEST?: string} */ private function parseTestFile(string $file): array { $tokens = Preg::split('#(?:^|\n*)--([A-Z-]+)--\n#', file_get_contents($file), -1, PREG_SPLIT_DELIM_CAPTURE); - $data = array(); + $data = []; $section = null; foreach ($tokens as $token) { @@ -252,10 +250,6 @@ private function parseTestFile(string $file): array return $data; // @phpstan-ignore-line } - /** - * @param string $output - * @return string - */ private function cleanOutput(string $output): string { $processed = ''; diff --git a/tests/Composer/Test/ApplicationTest.php b/tests/Composer/Test/ApplicationTest.php index 7588e830b724..0cd0d1b3886e 100644 --- a/tests/Composer/Test/ApplicationTest.php +++ b/tests/Composer/Test/ApplicationTest.php @@ -14,7 +14,6 @@ use Composer\Console\Application; use Composer\Util\Platform; -use Composer\XdebugHandler\XdebugHandler; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\BufferedOutput; diff --git a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php index 9129b9e68c92..b662ff8d903e 100644 --- a/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php +++ b/tests/Composer/Test/Autoload/AutoloadGeneratorTest.php @@ -97,17 +97,17 @@ protected function setUp(): void $this->config = $this->getMockBuilder('Composer\Config')->getMock(); - $this->configValueMap = array( + $this->configValueMap = [ 'vendor-dir' => function (): string { return $this->vendorDir; }, - 'platform-check' => function (): bool { + 'platform-check' => static function (): bool { return true; }, - 'use-include-path' => function (): bool { + 'use-include-path' => static function (): bool { return false; }, - ); + ]; $this->config->expects($this->atLeastOnce()) ->method('get') @@ -139,7 +139,7 @@ protected function setUp(): void $this->repository = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock(); $this->repository->expects($this->any()) ->method('getDevPackageNames') - ->willReturn(array()); + ->willReturn([]); $this->eventDispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') ->disableOriginalConstructor() @@ -165,21 +165,21 @@ protected function tearDown(): void public function testRootPackageAutoloading(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array( + $package->setAutoload([ + 'psr-0' => [ 'Main' => 'src/', - 'Lala' => array('src/', 'lib/'), - ), - 'psr-4' => array( + 'Lala' => ['src/', 'lib/'], + ], + 'psr-4' => [ 'Acme\Fruit\\' => 'src-fruit/', - 'Acme\Cake\\' => array('src-cake/', 'lib-cake/'), - ), - 'classmap' => array('composersrc/'), - )); + 'Acme\Cake\\' => ['src-cake/', 'lib-cake/'], + ], + 'classmap' => ['composersrc/'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/composer'); $this->fs->ensureDirectoryExists($this->workingDir.'/src/Lala/Test'); @@ -210,21 +210,21 @@ public function testRootPackageAutoloading(): void public function testRootPackageDevAutoloading(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array( + $package->setAutoload([ + 'psr-0' => [ 'Main' => 'src/', - ), - )); - $package->setDevAutoload(array( - 'files' => array('devfiles/foo.php'), - 'psr-0' => array( + ], + ]); + $package->setDevAutoload([ + 'files' => ['devfiles/foo.php'], + 'psr-0' => [ 'Main' => 'tests/', - ), - )); + ], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/composer'); $this->fs->ensureDirectoryExists($this->workingDir.'/src/Main'); @@ -248,18 +248,18 @@ public function testRootPackageDevAutoloading(): void public function testRootPackageDevAutoloadingDisabledByDefault(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array( + $package->setAutoload([ + 'psr-0' => [ 'Main' => 'src/', - ), - )); - $package->setDevAutoload(array( - 'files' => array('devfiles/foo.php'), - )); + ], + ]); + $package->setDevAutoload([ + 'files' => ['devfiles/foo.php'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/composer'); $this->fs->ensureDirectoryExists($this->workingDir.'/src/Main'); @@ -283,18 +283,18 @@ public function testVendorDirSameAsWorkingDir(): void $this->vendorDir = $this->workingDir; $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Main' => 'src/', 'Lala' => 'src/'), - 'psr-4' => array( + $package->setAutoload([ + 'psr-0' => ['Main' => 'src/', 'Lala' => 'src/'], + 'psr-4' => [ 'Acme\Fruit\\' => 'src-fruit/', - 'Acme\Cake\\' => array('src-cake/', 'lib-cake/'), - ), - 'classmap' => array('composersrc/'), - )); + 'Acme\Cake\\' => ['src-cake/', 'lib-cake/'], + ], + 'classmap' => ['composersrc/'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/src/Main'); @@ -312,18 +312,18 @@ public function testVendorDirSameAsWorkingDir(): void public function testRootPackageAutoloadingAlternativeVendorDir(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Main' => 'src/', 'Lala' => 'src/'), - 'psr-4' => array( + $package->setAutoload([ + 'psr-0' => ['Main' => 'src/', 'Lala' => 'src/'], + 'psr-4' => [ 'Acme\Fruit\\' => 'src-fruit/', - 'Acme\Cake\\' => array('src-cake/', 'lib-cake/'), - ), - 'classmap' => array('composersrc/'), - )); + 'Acme\Cake\\' => ['src-cake/', 'lib-cake/'], + ], + 'classmap' => ['composersrc/'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->vendorDir .= '/subdir'; @@ -341,16 +341,16 @@ public function testRootPackageAutoloadingAlternativeVendorDir(): void public function testRootPackageAutoloadingWithTargetDir(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Main\\Foo' => '', 'Main\\Bar' => ''), - 'classmap' => array('Main/Foo/src', 'lib'), - 'files' => array('foo.php', 'Main/Foo/bar.php'), - )); + $package->setAutoload([ + 'psr-0' => ['Main\\Foo' => '', 'Main\\Bar' => ''], + 'classmap' => ['Main/Foo/src', 'lib'], + 'files' => ['foo.php', 'Main/Foo/bar.php'], + ]); $package->setTargetDir('Main/Foo/'); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->vendorDir.'/a'); $this->fs->ensureDirectoryExists($this->workingDir.'/src'); @@ -372,17 +372,17 @@ public function testRootPackageAutoloadingWithTargetDir(): void public function testVendorsAutoloading(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); $packages[] = $c = new AliasPackage($b, '1.2', '1.2'); - $a->setAutoload(array('psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'))); - $b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/'))); + $a->setAutoload(['psr-0' => ['A' => 'src/', 'A\\B' => 'lib/']]); + $b->setAutoload(['psr-0' => ['B\\Sub\\Name' => 'src/']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -401,21 +401,21 @@ public function testVendorsAutoloading(): void public function testNonDevAutoloadExclusionWithRecursion(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setAutoload(array('psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'))); - $a->setRequires(array( + $a->setAutoload(['psr-0' => ['A' => 'src/', 'A\\B' => 'lib/']]); + $a->setRequires([ 'b/b' => new Link('a/a', 'b/b', new MatchAllConstraint()), - )); - $b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/'))); - $b->setRequires(array( + ]); + $b->setAutoload(['psr-0' => ['B\\Sub\\Name' => 'src/']]); + $b->setRequires([ 'a/a' => new Link('b/b', 'a/a', new MatchAllConstraint()), - )); + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -434,17 +434,17 @@ public function testNonDevAutoloadExclusionWithRecursion(): void public function testNonDevAutoloadShouldIncludeReplacedPackages(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array('a/a' => new Link('a', 'a/a', new MatchAllConstraint()))); + $package->setRequires(['a/a' => new Link('a', 'a/a', new MatchAllConstraint())]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setRequires(array('b/c' => new Link('a/a', 'b/c', new MatchAllConstraint()))); + $a->setRequires(['b/c' => new Link('a/a', 'b/c', new MatchAllConstraint())]); - $b->setAutoload(array('psr-4' => array('B\\' => 'src/'))); + $b->setAutoload(['psr-4' => ['B\\' => 'src/']]); $b->setReplaces( - array('b/c' => new Link('b/b', 'b/c', new Constraint('==', '1.0'), Link::TYPE_REPLACE)) + ['b/c' => new Link('b/b', 'b/c', new Constraint('==', '1.0'), Link::TYPE_REPLACE)] ); $this->repository->expects($this->once()) @@ -457,10 +457,10 @@ public function testNonDevAutoloadShouldIncludeReplacedPackages(): void $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_5'); $this->assertEquals( - array( + [ 'B\\C\\C' => $this->vendorDir.'/b/b/src/C/C.php', 'Composer\\InstalledVersions' => $this->vendorDir . '/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); } @@ -468,21 +468,21 @@ public function testNonDevAutoloadShouldIncludeReplacedPackages(): void public function testNonDevAutoloadExclusionWithRecursionReplace(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setAutoload(array('psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'))); - $a->setRequires(array( + $a->setAutoload(['psr-0' => ['A' => 'src/', 'A\\B' => 'lib/']]); + $a->setRequires([ 'c/c' => new Link('a/a', 'c/c', new MatchAllConstraint()), - )); - $b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/'))); - $b->setReplaces(array( + ]); + $b->setAutoload(['psr-0' => ['B\\Sub\\Name' => 'src/']]); + $b->setReplaces([ 'c/c' => new Link('b/b', 'c/c', new MatchAllConstraint()), - )); + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -501,33 +501,33 @@ public function testNonDevAutoloadExclusionWithRecursionReplace(): void public function testNonDevAutoloadReplacesNestedRequirements(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); $packages[] = $c = new Package('c/c', '1.0', '1.0'); $packages[] = $d = new Package('d/d', '1.0', '1.0'); $packages[] = $e = new Package('e/e', '1.0', '1.0'); - $a->setAutoload(array('classmap' => array('src/A.php'))); - $a->setRequires(array( + $a->setAutoload(['classmap' => ['src/A.php']]); + $a->setRequires([ 'b/b' => new Link('a/a', 'b/b', new MatchAllConstraint()), - )); - $b->setAutoload(array('classmap' => array('src/B.php'))); - $b->setRequires(array( + ]); + $b->setAutoload(['classmap' => ['src/B.php']]); + $b->setRequires([ 'e/e' => new Link('b/b', 'e/e', new MatchAllConstraint()), - )); - $c->setAutoload(array('classmap' => array('src/C.php'))); - $c->setReplaces(array( + ]); + $c->setAutoload(['classmap' => ['src/C.php']]); + $c->setReplaces([ 'b/b' => new Link('c/c', 'b/b', new MatchAllConstraint()), - )); - $c->setRequires(array( + ]); + $c->setRequires([ 'd/d' => new Link('c/c', 'd/d', new MatchAllConstraint()), - )); - $d->setAutoload(array('classmap' => array('src/D.php'))); - $e->setAutoload(array('classmap' => array('src/E.php'))); + ]); + $d->setAutoload(['classmap' => ['src/D.php']]); + $e->setAutoload(['classmap' => ['src/E.php']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -553,36 +553,36 @@ public function testNonDevAutoloadReplacesNestedRequirements(): void public function testPharAutoload(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), - )); + ]); - $package->setAutoload(array( - 'psr-0' => array( + $package->setAutoload([ + 'psr-0' => [ 'Foo' => 'foo.phar', 'Bar' => 'dir/bar.phar/src', - ), - 'psr-4' => array( + ], + 'psr-4' => [ 'Baz\\' => 'baz.phar', 'Qux\\' => 'dir/qux.phar/src', - ), - )); + ], + ]); $vendorPackage = new Package('a/a', '1.0', '1.0'); - $vendorPackage->setAutoload(array( - 'psr-0' => array( + $vendorPackage->setAutoload([ + 'psr-0' => [ 'Lorem' => 'lorem.phar', 'Ipsum' => 'dir/ipsum.phar/src', - ), - 'psr-4' => array( + ], + 'psr-4' => [ 'Dolor\\' => 'dolor.phar', 'Sit\\' => 'dir/sit.phar/src', - ), - )); + ], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array($vendorPackage))); + ->will($this->returnValue([$vendorPackage])); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, 'Phar'); @@ -595,21 +595,21 @@ public function testPSRToClassMapIgnoresNonExistingDir(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Prefix' => 'foo/bar/non/existing/'), - 'psr-4' => array('Prefix\\' => 'foo/bar/non/existing2/'), - )); + $package->setAutoload([ + 'psr-0' => ['Prefix' => 'foo/bar/non/existing/'], + 'psr-4' => ['Prefix\\' => 'foo/bar/non/existing2/'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_8'); $this->assertFileExists($this->vendorDir.'/composer/autoload_classmap.php', "ClassMap file needs to be generated."); $this->assertEquals( - array( + [ 'Composer\\InstalledVersions' => $this->vendorDir.'/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); } @@ -618,14 +618,14 @@ public function testPSRToClassMapIgnoresNonPSRClasses(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('psr0_' => 'psr0/'), - 'psr-4' => array('psr4\\' => 'psr4/'), - )); + $package->setAutoload([ + 'psr-0' => ['psr0_' => 'psr0/'], + 'psr-4' => ['psr4\\' => 'psr4/'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/psr0/psr0'); $this->fs->ensureDirectoryExists($this->workingDir.'/psr4'); @@ -658,16 +658,16 @@ public function testPSRToClassMapIgnoresNonPSRClasses(): void public function testVendorsClassMapAutoloading(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setAutoload(array('classmap' => array('src/'))); - $b->setAutoload(array('classmap' => array('src/', 'lib/'))); + $a->setAutoload(['classmap' => ['src/']]); + $b->setAutoload(['classmap' => ['src/', 'lib/']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -684,12 +684,12 @@ public function testVendorsClassMapAutoloading(): void $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, '_6'); $this->assertFileExists($this->vendorDir.'/composer/autoload_classmap.php', "ClassMap file needs to be generated."); $this->assertEquals( - array( + [ 'ClassMapBar' => $this->vendorDir.'/b/b/src/b.php', 'ClassMapBaz' => $this->vendorDir.'/b/b/lib/c.php', 'ClassMapFoo' => $this->vendorDir.'/a/a/src/a.php', 'Composer\\InstalledVersions' => $this->vendorDir.'/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); $this->assertAutoloadFiles('classmap4', $this->vendorDir.'/composer', 'classmap'); @@ -698,17 +698,17 @@ public function testVendorsClassMapAutoloading(): void public function testVendorsClassMapAutoloadingWithTargetDir(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setAutoload(array('classmap' => array('target/src/', 'lib/'))); + $a->setAutoload(['classmap' => ['target/src/', 'lib/']]); $a->setTargetDir('target'); - $b->setAutoload(array('classmap' => array('src/'))); + $b->setAutoload(['classmap' => ['src/']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -725,12 +725,12 @@ public function testVendorsClassMapAutoloadingWithTargetDir(): void $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, '_6'); $this->assertFileExists($this->vendorDir.'/composer/autoload_classmap.php', "ClassMap file needs to be generated."); $this->assertEquals( - array( + [ 'ClassMapBar' => $this->vendorDir.'/a/a/target/lib/b.php', 'ClassMapBaz' => $this->vendorDir.'/b/b/src/c.php', 'ClassMapFoo' => $this->vendorDir.'/a/a/target/src/a.php', 'Composer\\InstalledVersions' => $this->vendorDir.'/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); } @@ -738,19 +738,19 @@ public function testVendorsClassMapAutoloadingWithTargetDir(): void public function testClassMapAutoloadingEmptyDirAndExactFile(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), 'c/c' => new Link('a', 'c/c', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); $packages[] = $c = new Package('c/c', '1.0', '1.0'); - $a->setAutoload(array('classmap' => array(''))); - $b->setAutoload(array('classmap' => array('test.php'))); - $c->setAutoload(array('classmap' => array('./'))); + $a->setAutoload(['classmap' => ['']]); + $b->setAutoload(['classmap' => ['test.php']]); + $c->setAutoload(['classmap' => ['./']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -767,12 +767,12 @@ public function testClassMapAutoloadingEmptyDirAndExactFile(): void $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', false, '_7'); $this->assertFileExists($this->vendorDir.'/composer/autoload_classmap.php', "ClassMap file needs to be generated."); $this->assertEquals( - array( + [ 'ClassMapBar' => $this->vendorDir.'/b/b/test.php', 'ClassMapBaz' => $this->vendorDir.'/c/c/foo/test.php', 'ClassMapFoo' => $this->vendorDir.'/a/a/src/a.php', 'Composer\\InstalledVersions' => $this->vendorDir.'/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); $this->assertAutoloadFiles('classmap5', $this->vendorDir.'/composer', 'classmap'); @@ -783,19 +783,19 @@ public function testClassMapAutoloadingEmptyDirAndExactFile(): void public function testClassMapAutoloadingAuthoritativeAndApcu(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), 'c/c' => new Link('a', 'c/c', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); $packages[] = $c = new Package('c/c', '1.0', '1.0'); - $a->setAutoload(array('psr-4' => array('' => 'src/'))); - $b->setAutoload(array('psr-4' => array('' => './'))); - $c->setAutoload(array('psr-4' => array('' => 'foo/'))); + $a->setAutoload(['psr-4' => ['' => 'src/']]); + $b->setAutoload(['psr-4' => ['' => './']]); + $c->setAutoload(['psr-4' => ['' => 'foo/']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -815,12 +815,12 @@ public function testClassMapAutoloadingAuthoritativeAndApcu(): void $this->assertFileExists($this->vendorDir.'/composer/autoload_classmap.php', "ClassMap file needs to be generated."); $this->assertEquals( - array( + [ 'ClassMapBar' => $this->vendorDir.'/b/b/ClassMapBar.php', 'ClassMapBaz' => $this->vendorDir.'/c/c/foo/ClassMapBaz.php', 'ClassMapFoo' => $this->vendorDir.'/a/a/src/ClassMapFoo.php', 'Composer\\InstalledVersions' => $this->vendorDir.'/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); $this->assertAutoloadFiles('classmap8', $this->vendorDir.'/composer', 'classmap'); @@ -832,19 +832,19 @@ public function testClassMapAutoloadingAuthoritativeAndApcu(): void public function testClassMapAutoloadingAuthoritativeAndApcuPrefix(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), 'c/c' => new Link('a', 'c/c', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); $packages[] = $c = new Package('c/c', '1.0', '1.0'); - $a->setAutoload(array('psr-4' => array('' => 'src/'))); - $b->setAutoload(array('psr-4' => array('' => './'))); - $c->setAutoload(array('psr-4' => array('' => 'foo/'))); + $a->setAutoload(['psr-4' => ['' => 'src/']]); + $b->setAutoload(['psr-4' => ['' => './']]); + $c->setAutoload(['psr-4' => ['' => 'foo/']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -864,12 +864,12 @@ public function testClassMapAutoloadingAuthoritativeAndApcuPrefix(): void $this->assertFileExists($this->vendorDir.'/composer/autoload_classmap.php', "ClassMap file needs to be generated."); $this->assertEquals( - array( + [ 'ClassMapBar' => $this->vendorDir.'/b/b/ClassMapBar.php', 'ClassMapBaz' => $this->vendorDir.'/c/c/foo/ClassMapBaz.php', 'ClassMapFoo' => $this->vendorDir.'/a/a/src/ClassMapFoo.php', 'Composer\\InstalledVersions' => $this->vendorDir.'/composer/InstalledVersions.php', - ), + ], include $this->vendorDir.'/composer/autoload_classmap.php' ); $this->assertAutoloadFiles('classmap8', $this->vendorDir.'/composer', 'classmap'); @@ -881,20 +881,20 @@ public function testClassMapAutoloadingAuthoritativeAndApcuPrefix(): void public function testFilesAutoloadGeneration(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array('files' => array('root.php'))); - $package->setRequires(array( + $package->setAutoload(['files' => ['root.php']]); + $package->setRequires([ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), 'c/c' => new Link('a', 'c/c', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); $packages[] = $c = new Package('c/c', '1.0', '1.0'); - $a->setAutoload(array('files' => array('test.php'))); - $b->setAutoload(array('files' => array('test2.php'))); - $c->setAutoload(array('files' => array('test3.php', 'foo/bar/test4.php'))); + $a->setAutoload(['files' => ['test.php']]); + $b->setAutoload(['files' => ['test2.php']]); + $c->setAutoload(['files' => ['test3.php', 'foo/bar/test4.php']]); $c->setTargetDir('foo/bar'); $this->repository->expects($this->once()) @@ -928,32 +928,32 @@ public function testFilesAutoloadGeneration(): void public function testFilesAutoloadGenerationRemoveExtraEntitiesFromAutoloadFiles(): void { $autoloadPackage = new RootPackage('root/a', '1.0', '1.0'); - $autoloadPackage->setAutoload(array('files' => array('root.php'))); - $autoloadPackage->setIncludePaths(array('/lib', '/src')); + $autoloadPackage->setAutoload(['files' => ['root.php']]); + $autoloadPackage->setIncludePaths(['/lib', '/src']); $notAutoloadPackage = new RootPackage('root/a', '1.0', '1.0'); - $requires = array( + $requires = [ 'a/a' => new Link('a', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), 'c/c' => new Link('a', 'c/c', new MatchAllConstraint()), - ); + ]; $autoloadPackage->setRequires($requires); $notAutoloadPackage->setRequires($requires); - $autoloadPackages = array(); + $autoloadPackages = []; $autoloadPackages[] = $a = new Package('a/a', '1.0', '1.0'); $autoloadPackages[] = $b = new Package('b/b', '1.0', '1.0'); $autoloadPackages[] = $c = new Package('c/c', '1.0', '1.0'); - $a->setAutoload(array('files' => array('test.php'))); - $a->setIncludePaths(array('lib1', 'src1')); - $b->setAutoload(array('files' => array('test2.php'))); - $b->setIncludePaths(array('lib2')); - $c->setAutoload(array('files' => array('test3.php', 'foo/bar/test4.php'))); - $c->setIncludePaths(array('lib3')); + $a->setAutoload(['files' => ['test.php']]); + $a->setIncludePaths(['lib1', 'src1']); + $b->setAutoload(['files' => ['test2.php']]); + $b->setIncludePaths(['lib2']); + $c->setAutoload(['files' => ['test3.php', 'foo/bar/test4.php']]); + $c->setIncludePaths(['lib3']); $c->setTargetDir('foo/bar'); - $notAutoloadPackages = array(); + $notAutoloadPackages = []; $notAutoloadPackages[] = $a = new Package('a/a', '1.0', '1.0'); $notAutoloadPackages[] = $b = new Package('b/b', '1.0', '1.0'); $notAutoloadPackages[] = $c = new Package('c/c', '1.0', '1.0'); @@ -999,15 +999,15 @@ public function testFilesAutoloadGenerationRemoveExtraEntitiesFromAutoloadFiles( public function testFilesAutoloadOrderByDependencies(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array('files' => array('root2.php'))); - $package->setRequires(array( + $package->setAutoload(['files' => ['root2.php']]); + $package->setRequires([ 'z/foo' => new Link('a', 'z/foo', new MatchAllConstraint()), 'b/bar' => new Link('a', 'b/bar', new MatchAllConstraint()), 'd/d' => new Link('a', 'd/d', new MatchAllConstraint()), 'e/e' => new Link('a', 'e/e', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $z = new Package('z/foo', '1.0', '1.0'); $packages[] = $b = new Package('b/bar', '1.0', '1.0'); $packages[] = $d = new Package('d/d', '1.0', '1.0'); @@ -1022,19 +1022,19 @@ public function testFilesAutoloadOrderByDependencies(): void // z requires c // (b, e, z ordered alphabetically) - $z->setAutoload(array('files' => array('testA.php'))); - $z->setRequires(array('c/lorem' => new Link('z/foo', 'c/lorem', new MatchAllConstraint()))); + $z->setAutoload(['files' => ['testA.php']]); + $z->setRequires(['c/lorem' => new Link('z/foo', 'c/lorem', new MatchAllConstraint())]); - $b->setAutoload(array('files' => array('testB.php'))); - $b->setRequires(array('c/lorem' => new Link('b/bar', 'c/lorem', new MatchAllConstraint()), 'd/d' => new Link('b/bar', 'd/d', new MatchAllConstraint()))); + $b->setAutoload(['files' => ['testB.php']]); + $b->setRequires(['c/lorem' => new Link('b/bar', 'c/lorem', new MatchAllConstraint()), 'd/d' => new Link('b/bar', 'd/d', new MatchAllConstraint())]); - $c->setAutoload(array('files' => array('testC.php'))); + $c->setAutoload(['files' => ['testC.php']]); - $d->setAutoload(array('files' => array('testD.php'))); - $d->setRequires(array('c/lorem' => new Link('d/d', 'c/lorem', new MatchAllConstraint()))); + $d->setAutoload(['files' => ['testD.php']]); + $d->setRequires(['c/lorem' => new Link('d/d', 'c/lorem', new MatchAllConstraint())]); - $e->setAutoload(array('files' => array('testE.php'))); - $e->setRequires(array('c/lorem' => new Link('e/e', 'c/lorem', new MatchAllConstraint()))); + $e->setAutoload(['files' => ['testE.php']]); + $e->setRequires(['c/lorem' => new Link('e/e', 'c/lorem', new MatchAllConstraint())]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -1077,25 +1077,25 @@ public function testFilesAutoloadOrderByDependencies(): void public function testOverrideVendorsAutoloading(): void { $rootPackage = new RootPackage('root/z', '1.0', '1.0'); - $rootPackage->setAutoload(array( - 'psr-0' => array('A\\B' => $this->workingDir.'/lib'), - 'classmap' => array($this->workingDir.'/src'), - )); - $rootPackage->setRequires(array( + $rootPackage->setAutoload([ + 'psr-0' => ['A\\B' => $this->workingDir.'/lib'], + 'classmap' => [$this->workingDir.'/src'], + ]); + $rootPackage->setRequires([ 'a/a' => new Link('z', 'a/a', new MatchAllConstraint()), 'b/b' => new Link('z', 'b/b', new MatchAllConstraint()), - )); + ]); - $packages = array(); + $packages = []; $packages[] = $a = new Package('a/a', '1.0', '1.0'); $packages[] = $b = new Package('b/b', '1.0', '1.0'); - $a->setAutoload(array( - 'psr-0' => array('A' => 'src/', 'A\\B' => 'lib/'), - 'classmap' => array('classmap'), - )); - $b->setAutoload(array( - 'psr-0' => array('B\\Sub\\Name' => 'src/'), - )); + $a->setAutoload([ + 'psr-0' => ['A' => 'src/', 'A\\B' => 'lib/'], + 'classmap' => ['classmap'], + ]); + $b->setAutoload([ + 'psr-0' => ['B\\Sub\\Name' => 'src/'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') @@ -1172,16 +1172,16 @@ public function testOverrideVendorsAutoloading(): void public function testIncludePathFileGeneration(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $packages = array(); + $packages = []; $a = new Package("a/a", "1.0", "1.0"); - $a->setIncludePaths(array("lib/")); + $a->setIncludePaths(["lib/"]); $b = new Package("b/b", "1.0", "1.0"); - $b->setIncludePaths(array("library")); + $b->setIncludePaths(["library"]); $c = new Package("c", "1.0", "1.0"); - $c->setIncludePaths(array("library")); + $c->setIncludePaths(["library"]); $packages[] = $a; $packages[] = $b; @@ -1197,11 +1197,11 @@ public function testIncludePathFileGeneration(): void $this->assertFileContentEquals(__DIR__.'/Fixtures/include_paths.php', $this->vendorDir.'/composer/include_paths.php'); $this->assertEquals( - array( + [ $this->vendorDir."/a/a/lib", $this->vendorDir."/b/b/library", $this->vendorDir."/c/library", - ), + ], require $this->vendorDir."/composer/include_paths.php" ); } @@ -1209,10 +1209,10 @@ public function testIncludePathFileGeneration(): void public function testIncludePathsArePrependedInAutoloadFile(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $packages = array(); + $packages = []; $a = new Package("a/a", "1.0", "1.0"); - $a->setIncludePaths(array("lib/")); + $a->setIncludePaths(["lib/"]); $packages[] = $a; @@ -1240,10 +1240,10 @@ public function testIncludePathsArePrependedInAutoloadFile(): void public function testIncludePathsInRootPackage(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setIncludePaths(array('/lib', '/src')); + $package->setIncludePaths(['/lib', '/src']); - $packages = array($a = new Package("a/a", "1.0", "1.0")); - $a->setIncludePaths(array("lib/")); + $packages = [$a = new Package("a/a", "1.0", "1.0")]; + $a->setIncludePaths(["lib/"]); $this->repository->expects($this->once()) ->method("getCanonicalPackages") @@ -1269,7 +1269,7 @@ public function testIncludePathsInRootPackage(): void public function testIncludePathFileWithoutPathsIsSkipped(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $packages = array(); + $packages = []; $a = new Package("a/a", "1.0", "1.0"); $packages[] = $a; @@ -1296,11 +1296,11 @@ public function testPreAndPostEventsAreDispatchedDuringAutoloadDump(): void ); $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array('psr-0' => array('Prefix' => 'foo/bar/non/existing/'))); + $package->setAutoload(['psr-0' => ['Prefix' => 'foo/bar/non/existing/']]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->generator->setRunScripts(true); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_8'); @@ -1309,14 +1309,14 @@ public function testPreAndPostEventsAreDispatchedDuringAutoloadDump(): void public function testUseGlobalIncludePath(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Main\\Foo' => '', 'Main\\Bar' => ''), - )); + $package->setAutoload([ + 'psr-0' => ['Main\\Foo' => '', 'Main\\Bar' => ''], + ]); $package->setTargetDir('Main/Foo/'); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->configValueMap['use-include-path'] = true; @@ -1336,34 +1336,34 @@ public function testVendorDirExcludedFromWorkingDir(): void chdir($workingDir); $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Foo' => 'src'), - 'psr-4' => array('Acme\Foo\\' => 'src-psr4'), - 'classmap' => array('classmap'), - 'files' => array('test.php'), - )); - $package->setRequires(array( + $package->setAutoload([ + 'psr-0' => ['Foo' => 'src'], + 'psr-4' => ['Acme\Foo\\' => 'src-psr4'], + 'classmap' => ['classmap'], + 'files' => ['test.php'], + ]); + $package->setRequires([ 'b/b' => new Link('a', 'b/b', new MatchAllConstraint()), - )); + ]); $vendorPackage = new Package('b/b', '1.0', '1.0'); - $vendorPackage->setAutoload(array( - 'psr-0' => array('Bar' => 'lib'), - 'psr-4' => array('Acme\Bar\\' => 'lib-psr4'), - 'classmap' => array('classmaps'), - 'files' => array('bootstrap.php'), - )); + $vendorPackage->setAutoload([ + 'psr-0' => ['Bar' => 'lib'], + 'psr-4' => ['Acme\Bar\\' => 'lib-psr4'], + 'classmap' => ['classmaps'], + 'files' => ['bootstrap.php'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array($vendorPackage))); + ->will($this->returnValue([$vendorPackage])); $im = $this->getMockBuilder('Composer\Installer\InstallationManager') ->disableOriginalConstructor() ->getMock(); $im->expects($this->any()) ->method('getInstallPath') - ->will($this->returnCallback(function ($package) use ($vendorDir): string { + ->will($this->returnCallback(static function ($package) use ($vendorDir): string { $targetDir = $package->getTargetDir(); return $vendorDir.'/'.$package->getName() . ($targetDir ? '/'.$targetDir : ''); @@ -1448,17 +1448,17 @@ public function testUpLevelRelativePaths(): void chdir($workingDir); $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Foo' => '../path/../src'), - 'psr-4' => array('Acme\Foo\\' => '../path/../src-psr4'), - 'classmap' => array('../classmap', '../classmap2/subdir', 'classmap3', 'classmap4'), - 'files' => array('../test.php'), - 'exclude-from-classmap' => array('./../classmap/excluded', '../classmap2', 'classmap3/classes.php', 'classmap4/*/classes.php'), - )); + $package->setAutoload([ + 'psr-0' => ['Foo' => '../path/../src'], + 'psr-4' => ['Acme\Foo\\' => '../path/../src-psr4'], + 'classmap' => ['../classmap', '../classmap2/subdir', 'classmap3', 'classmap4'], + 'files' => ['../test.php'], + 'exclude-from-classmap' => ['./../classmap/excluded', '../classmap2', 'classmap3/classes.php', 'classmap4/*/classes.php'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/src/Foo'); $this->fs->ensureDirectoryExists($this->workingDir.'/classmap/excluded'); @@ -1528,18 +1528,18 @@ public function testUpLevelRelativePaths(): void public function testAutoloadRulesInPackageThatDoesNotExistOnDisk(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setRequires(array( + $package->setRequires([ 'dep/a' => new Link('root/a', 'dep/a', new MatchAllConstraint(), 'requires'), - )); + ]); $dep = new CompletePackage('dep/a', '1.0', '1.0'); $this->repository->expects($this->any()) ->method('getCanonicalPackages') - ->will($this->returnValue(array($dep))); + ->will($this->returnValue([$dep])); - $dep->setAutoload(array( - 'psr-0' => array('Foo' => './src'), - )); + $dep->setAutoload([ + 'psr-0' => ['Foo' => './src'], + ]); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_19'); $expectedNamespace = <<<'EOF' @@ -1557,9 +1557,9 @@ public function testAutoloadRulesInPackageThatDoesNotExistOnDisk(): void EOF; $this->assertStringEqualsFile($this->vendorDir.'/composer/autoload_namespaces.php', $expectedNamespace); - $dep->setAutoload(array( - 'psr-4' => array('Acme\Foo\\' => './src-psr4'), - )); + $dep->setAutoload([ + 'psr-4' => ['Acme\Foo\\' => './src-psr4'], + ]); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_19'); $expectedPsr4 = <<<'EOF' @@ -1577,47 +1577,47 @@ public function testAutoloadRulesInPackageThatDoesNotExistOnDisk(): void EOF; $this->assertStringEqualsFile($this->vendorDir.'/composer/autoload_psr4.php', $expectedPsr4); - $dep->setAutoload(array( - 'classmap' => array('classmap'), - )); + $dep->setAutoload([ + 'classmap' => ['classmap'], + ]); try { $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_19'); } catch (\RuntimeException $e) { $this->assertSame('Could not scan for classes inside "'.$this->vendorDir.'/dep/a/classmap" which does not appear to be a file nor a folder', $e->getMessage()); } - $dep->setAutoload(array( - 'files' => array('./test.php'), - )); + $dep->setAutoload([ + 'files' => ['./test.php'], + ]); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_19'); $this->assertStringContainsString("\$vendorDir . '/dep/a/test.php',\n", (string) file_get_contents($this->vendorDir.'/composer/autoload_files.php')); - $package->setAutoload(array( - 'exclude-from-classmap' => array('../excludedroot', 'root/excl'), - )); - $dep->setAutoload(array( - 'exclude-from-classmap' => array('../../excluded', 'foo/bar'), - )); - $map = $this->generator->buildPackageMap($this->im, $package, array($dep)); + $package->setAutoload([ + 'exclude-from-classmap' => ['../excludedroot', 'root/excl'], + ]); + $dep->setAutoload([ + 'exclude-from-classmap' => ['../../excluded', 'foo/bar'], + ]); + $map = $this->generator->buildPackageMap($this->im, $package, [$dep]); $parsed = $this->generator->parseAutoloads($map, $package); - $this->assertSame(array( + $this->assertSame([ preg_quote(strtr((string) realpath(dirname($this->workingDir)), '\\', '/')).'/excludedroot($|/)', - preg_quote(strtr((string) realpath($this->workingDir), '\\', '/')).'/root/excl($|/)' - ), $parsed['exclude-from-classmap']); + preg_quote(strtr((string) realpath($this->workingDir), '\\', '/')).'/root/excl($|/)', + ], $parsed['exclude-from-classmap']); } public function testEmptyPaths(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array('Foo' => ''), - 'psr-4' => array('Acme\Foo\\' => ''), - 'classmap' => array(''), - )); + $package->setAutoload([ + 'psr-0' => ['Foo' => ''], + 'psr-4' => ['Acme\Foo\\' => ''], + 'classmap' => [''], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/Foo'); file_put_contents($this->workingDir.'/Foo/Bar.php', 'setAutoload(array( - 'psr-0' => array('Foo' => 'composer-test-autoload-src/src'), - 'psr-4' => array('Acme\Foo\\' => 'composer-test-autoload-src/src-psr4'), - )); + $package->setAutoload([ + 'psr-0' => ['Foo' => 'composer-test-autoload-src/src'], + 'psr-4' => ['Acme\Foo\\' => 'composer-test-autoload-src/src-psr4'], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->vendorDir.'/a'); @@ -1724,17 +1724,17 @@ public function testVendorSubstringPath(): void public function testExcludeFromClassmap(): void { $package = new RootPackage('root/a', '1.0', '1.0'); - $package->setAutoload(array( - 'psr-0' => array( + $package->setAutoload([ + 'psr-0' => [ 'Main' => 'src/', - 'Lala' => array('src/', 'lib/'), - ), - 'psr-4' => array( + 'Lala' => ['src/', 'lib/'], + ], + 'psr-4' => [ 'Acme\Fruit\\' => 'src-fruit/', - 'Acme\Cake\\' => array('src-cake/', 'lib-cake/'), - ), - 'classmap' => array('composersrc/'), - 'exclude-from-classmap' => array( + 'Acme\Cake\\' => ['src-cake/', 'lib-cake/'], + ], + 'classmap' => ['composersrc/'], + 'exclude-from-classmap' => [ '/composersrc/foo/bar/', '/composersrc/excludedTests/', '/composersrc/ClassToExclude.php', @@ -1742,12 +1742,12 @@ public function testExcludeFromClassmap(): void '**/excsubpath', 'composers', // should _not_ cause exclusion of /composersrc/**, as it is equivalent to /composers/** '/src-ca/', // should _not_ cause exclusion of /src-cake/**, as it is equivalent to /src-ca/** - ), - )); + ], + ]); $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->fs->ensureDirectoryExists($this->workingDir.'/composer'); $this->fs->ensureDirectoryExists($this->workingDir.'/src/Lala/Test'); @@ -1792,14 +1792,13 @@ public function testExcludeFromClassmap(): void /** * @param array $requires - * @param string|null $expectedFixture * @param array $provides * @param array $replaces * @param bool|array $ignorePlatformReqs * * @dataProvider platformCheckProvider */ - public function testGeneratesPlatformCheck(array $requires, ?string $expectedFixture, array $provides = array(), array $replaces = array(), $ignorePlatformReqs = false): void + public function testGeneratesPlatformCheck(array $requires, ?string $expectedFixture, array $provides = [], array $replaces = [], $ignorePlatformReqs = false): void { $package = new RootPackage('root/a', '1.0', '1.0'); $package->setRequires($requires); @@ -1814,7 +1813,7 @@ public function testGeneratesPlatformCheck(array $requires, ?string $expectedFix $this->repository->expects($this->once()) ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $this->generator->setPlatformRequirementFilter(PlatformRequirementFilterFactory::fromBoolOrList($ignorePlatformReqs)); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_1'); @@ -1835,111 +1834,104 @@ public function platformCheckProvider(): array { $versionParser = new VersionParser(); - return array( - 'Typical project requirements' => array( - array( + return [ + 'Typical project requirements' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')), - ), + ], 'typical', - ), - 'No PHP lower bound' => array( - array( + ], + 'No PHP lower bound' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('< 8')), - ), + ], null, - ), - 'No PHP upper bound' => array( - array( + ], + 'No PHP upper bound' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('>= 7.2')), - ), + ], 'no_php_upper_bound', - ), - 'Specific PHP release version' => array( - array( + ], + 'Specific PHP release version' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')), - ), + ], 'specific_php_release', - ), - 'No PHP required' => array( - array( + ], + 'No PHP required' => [ + [ 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')), - ), + ], 'no_php_required', - ), - 'Ignoring all platform requirements skips check completely' => array( - array( + ], + 'Ignoring all platform requirements skips check completely' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')), - ), + ], null, - array(), - array(), + [], + [], true, - ), - 'Ignored platform requirements are not checked for' => array( - array( + ], + 'Ignored platform requirements are not checked for' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-pdo' => new Link('a', 'ext-pdo', $versionParser->parseConstraints('*')), - ), + ], 'no_php_required', - array(), - array(), - array('php', 'ext-pdo'), - ), - 'Via wildcard ignored platform requirements are not checked for' => array( - array( + [], + [], + ['php', 'ext-pdo'], + ], + 'Via wildcard ignored platform requirements are not checked for' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2.8')), 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('*')), 'ext-json' => new Link('a', 'ext-json', $versionParser->parseConstraints('*')), 'ext-fileinfo' => new Link('a', 'ext-fileinfo', $versionParser->parseConstraints('*')), 'ext-filesystem' => new Link('a', 'ext-filesystem', $versionParser->parseConstraints('*')), 'ext-filter' => new Link('a', 'ext-filter', $versionParser->parseConstraints('*')), - ), + ], 'no_php_required', - array(), - array(), - array('php', 'ext-fil*'), - ), - 'No extensions required' => array( - array( + [], + [], + ['php', 'ext-fil*'], + ], + 'No extensions required' => [ + [ 'php' => new Link('a', 'php', $versionParser->parseConstraints('^7.2')), - ), + ], 'no_extensions_required', - ), - 'Replaced/provided extensions are not checked for + checking case insensitivity' => array( - array( + ], + 'Replaced/provided extensions are not checked for + checking case insensitivity' => [ + [ 'ext-xml' => new Link('a', 'ext-xml', $versionParser->parseConstraints('^7.2')), 'ext-pdo' => new Link('a', 'ext-Pdo', $versionParser->parseConstraints('^7.2')), 'ext-bcmath' => new Link('a', 'ext-bcMath', $versionParser->parseConstraints('^7.2')), - ), + ], 'replaced_provided_exts', - array( + [ // constraint does not satisfy all the ^7.2 requirement so we do not accept it as being replaced 'ext-pdo' => new Link('a', 'ext-PDO', $versionParser->parseConstraints('7.1.*')), // valid replace of bcmath so no need to check for it 'ext-bcmath' => new Link('a', 'ext-BCMath', $versionParser->parseConstraints('^7.1')), - ), - array( + ], + [ // valid provide of ext-xml so no need to check for it 'ext-xml' => new Link('a', 'ext-XML', $versionParser->parseConstraints('*')), - ), - ), - ); + ], + ], + ]; } - /** - * @param string $name - * @param string $dir - * @param string $type - * - * @return void - */ private function assertAutoloadFiles(string $name, string $dir, string $type = 'namespaces'): void { $a = __DIR__.'/Fixtures/autoload_'.$name.'.php'; @@ -1947,13 +1939,6 @@ private function assertAutoloadFiles(string $name, string $dir, string $type = ' $this->assertFileContentEquals($a, $b); } - /** - * @param string $expected - * @param string $actual - * @param string|null $message - * - * @return void - */ public static function assertFileContentEquals(string $expected, string $actual, ?string $message = null): void { self::assertSame( diff --git a/tests/Composer/Test/Autoload/ClassLoaderTest.php b/tests/Composer/Test/Autoload/ClassLoaderTest.php index 81d6f5fd0b60..37bfc784d596 100644 --- a/tests/Composer/Test/Autoload/ClassLoaderTest.php +++ b/tests/Composer/Test/Autoload/ClassLoaderTest.php @@ -44,11 +44,11 @@ public function testLoadClass(string $class): void */ public function getLoadClassTests(): array { - return array( - array('Namespaced\\Foo'), - array('Pearlike_Foo'), - array('ShinyVendor\\ShinyPackage\\SubNamespace\\Foo'), - ); + return [ + ['Namespaced\\Foo'], + ['Pearlike_Foo'], + ['ShinyVendor\\ShinyPackage\\SubNamespace\\Foo'], + ]; } /** diff --git a/tests/Composer/Test/CacheTest.php b/tests/Composer/Test/CacheTest.php index 51954c84e8a8..81a07b6d1368 100644 --- a/tests/Composer/Test/CacheTest.php +++ b/tests/Composer/Test/CacheTest.php @@ -31,7 +31,7 @@ class CacheTest extends TestCase public function setUp(): void { $this->root = self::getUniqueTmpDirectory(); - $this->files = array(); + $this->files = []; $zeros = str_repeat('0', 1000); for ($i = 0; $i < 4; $i++) { @@ -44,8 +44,8 @@ public function setUp(): void $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $this->cache = $this->getMockBuilder('Composer\Cache') - ->onlyMethods(array('getFinder')) - ->setConstructorArgs(array($io, $this->root)) + ->onlyMethods(['getFinder']) + ->setConstructorArgs([$io, $this->root]) ->getMock(); $this->cache ->expects($this->any()) diff --git a/tests/Composer/Test/Command/ArchiveCommandTest.php b/tests/Composer/Test/Command/ArchiveCommandTest.php index 0d7b074012dd..fa7ce960ab2c 100644 --- a/tests/Composer/Test/Command/ArchiveCommandTest.php +++ b/tests/Composer/Test/Command/ArchiveCommandTest.php @@ -23,7 +23,7 @@ class ArchiveCommandTest extends TestCase { public function testUsesConfigFromComposerObject(): void { - $input = new ArrayInput(array()); + $input = new ArrayInput([]); $output = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface') ->getMock(); @@ -33,7 +33,7 @@ public function testUsesConfigFromComposerObject(): void $composer = new Composer; $config = new Config; - $config->merge(array('config' => array('archive-format' => 'zip'))); + $config->merge(['config' => ['archive-format' => 'zip']]); $composer->setConfig($config); $manager = $this->getMockBuilder('Composer\Package\Archiver\ArchiveManager') @@ -50,13 +50,13 @@ public function testUsesConfigFromComposerObject(): void $composer->setPackage($package); $command = $this->getMockBuilder('Composer\Command\ArchiveCommand') - ->onlyMethods(array( + ->onlyMethods([ 'mergeApplicationDefinition', 'getSynopsis', 'initialize', 'tryComposer', 'requireComposer', - ))->getMock(); + ])->getMock(); $command->expects($this->atLeastOnce())->method('tryComposer') ->willReturn($composer); $command->expects($this->atLeastOnce())->method('requireComposer') @@ -67,20 +67,20 @@ public function testUsesConfigFromComposerObject(): void public function testUsesConfigFromFactoryWhenComposerIsNotDefined(): void { - $input = new ArrayInput(array()); + $input = new ArrayInput([]); $output = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface') ->getMock(); $config = Factory::createConfig(); $command = $this->getMockBuilder('Composer\Command\ArchiveCommand') - ->onlyMethods(array( + ->onlyMethods([ 'mergeApplicationDefinition', 'getSynopsis', 'initialize', 'tryComposer', 'archive', - ))->getMock(); + ])->getMock(); $command->expects($this->once())->method('tryComposer') ->willReturn(null); $command->expects($this->once())->method('archive') diff --git a/tests/Composer/Test/Command/BumpCommandTest.php b/tests/Composer/Test/Command/BumpCommandTest.php index 30770c9f515c..63e7cf30f2f5 100644 --- a/tests/Composer/Test/Command/BumpCommandTest.php +++ b/tests/Composer/Test/Command/BumpCommandTest.php @@ -68,7 +68,7 @@ public function provideTests(): \Generator 'require-dev' => [ 'dev/pkg' => '^2.3.4.5', ], - ] + ], ]; yield 'bump only dev with --dev-only' => [ @@ -90,7 +90,7 @@ public function provideTests(): \Generator 'require-dev' => [ 'dev/pkg' => '^2.3.4.5', ], - ] + ], ]; yield 'bump only non-dev with --no-dev-only' => [ @@ -112,7 +112,7 @@ public function provideTests(): \Generator 'require-dev' => [ 'dev/pkg' => '~2.0', ], - ] + ], ]; yield 'bump works from installed repo without lock file' => [ @@ -129,8 +129,7 @@ public function provideTests(): \Generator 'second/pkg' => '^3.4', ], ], - false + false, ]; - } } diff --git a/tests/Composer/Test/Command/ConfigCommandTest.php b/tests/Composer/Test/Command/ConfigCommandTest.php index b8ab10e32049..d6d148e6a70f 100644 --- a/tests/Composer/Test/Command/ConfigCommandTest.php +++ b/tests/Composer/Test/Command/ConfigCommandTest.php @@ -12,11 +12,7 @@ namespace Composer\Test\Command; -use Composer\Composer; -use Composer\Config; -use Composer\Script\Event as ScriptEvent; use Composer\Test\TestCase; -use Composer\Util\Filesystem; class ConfigCommandTest extends TestCase { diff --git a/tests/Composer/Test/Command/RunScriptCommandTest.php b/tests/Composer/Test/Command/RunScriptCommandTest.php index b26bd397d3b2..13f1b5f52594 100644 --- a/tests/Composer/Test/Command/RunScriptCommandTest.php +++ b/tests/Composer/Test/Command/RunScriptCommandTest.php @@ -16,14 +16,11 @@ use Composer\Config; use Composer\Script\Event as ScriptEvent; use Composer\Test\TestCase; -use Composer\Util\Filesystem; class RunScriptCommandTest extends TestCase { /** * @dataProvider getDevOptions - * @param bool $dev - * @param bool $noDev */ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool $noDev): void { @@ -32,18 +29,18 @@ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool $input = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface')->getMock(); $input ->method('getOption') - ->will($this->returnValueMap(array( - array('list', false), - array('dev', $dev), - array('no-dev', $noDev), - ))); + ->will($this->returnValueMap([ + ['list', false], + ['dev', $dev], + ['no-dev', $noDev], + ])); $input ->method('getArgument') - ->will($this->returnValueMap(array( - array('script', $scriptName), - array('args', array()), - ))); + ->will($this->returnValueMap([ + ['script', $scriptName], + ['args', []], + ])); $input ->method('hasArgument') ->with('command') @@ -62,7 +59,7 @@ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool $ed->expects($this->once()) ->method('hasEventListeners') - ->with($this->callback(function (ScriptEvent $event) use ($scriptName, $expectedDevMode): bool { + ->with($this->callback(static function (ScriptEvent $event) use ($scriptName, $expectedDevMode): bool { return $event->getName() === $scriptName && $event->isDevMode() === $expectedDevMode; })) @@ -70,19 +67,19 @@ public function testDetectAndPassDevModeToEventAndToDispatching(bool $dev, bool $ed->expects($this->once()) ->method('dispatchScript') - ->with($scriptName, $expectedDevMode, array()) + ->with($scriptName, $expectedDevMode, []) ->willReturn(0); $composer = $this->createComposerInstance(); $composer->setEventDispatcher($ed); $command = $this->getMockBuilder('Composer\Command\RunScriptCommand') - ->onlyMethods(array( + ->onlyMethods([ 'mergeApplicationDefinition', 'getSynopsis', 'initialize', 'requireComposer', - )) + ]) ->getMock(); $command->expects($this->any())->method('requireComposer')->willReturn($composer); @@ -115,12 +112,12 @@ public function testCanListScripts(): void /** @return bool[][] **/ public function getDevOptions(): array { - return array( - array(true, true), - array(true, false), - array(false, true), - array(false, false), - ); + return [ + [true, true], + [true, false], + [false, true], + [false, false], + ]; } /** @return Composer **/ diff --git a/tests/Composer/Test/CompletionFunctionalTest.php b/tests/Composer/Test/CompletionFunctionalTest.php index 32baa33ce315..43c0ddcd1ec6 100644 --- a/tests/Composer/Test/CompletionFunctionalTest.php +++ b/tests/Composer/Test/CompletionFunctionalTest.php @@ -1,4 +1,4 @@ -getMockBuilder('Composer\IO\IOInterface')->getMock(); - $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')->setConstructorArgs(array($io))->getMock(); + $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager')->setConstructorArgs([$io])->getMock(); $composer->setDownloadManager($manager); $this->assertSame($manager, $composer->getDownloadManager()); diff --git a/tests/Composer/Test/Config/JsonConfigSourceTest.php b/tests/Composer/Test/Config/JsonConfigSourceTest.php index f3e6021a0bdd..01dca600eeb0 100644 --- a/tests/Composer/Test/Config/JsonConfigSourceTest.php +++ b/tests/Composer/Test/Config/JsonConfigSourceTest.php @@ -24,11 +24,6 @@ class JsonConfigSourceTest extends TestCase /** @var string */ private $workingDir; - /** - * @param string $name - * - * @return string - */ protected function fixturePath(string $name): string { return __DIR__.'/Fixtures/'.$name; @@ -53,7 +48,7 @@ public function testAddRepository(): void $config = $this->workingDir.'/composer.json'; copy($this->fixturePath('composer-repositories.json'), $config); $jsonConfigSource = new JsonConfigSource(new JsonFile($config)); - $jsonConfigSource->addRepository('example_tld', array('type' => 'git', 'url' => 'example.tld')); + $jsonConfigSource->addRepository('example_tld', ['type' => 'git', 'url' => 'example.tld']); $this->assertFileEquals($this->fixturePath('config/config-with-exampletld-repository.json'), $config); } @@ -63,15 +58,15 @@ public function testAddRepositoryWithOptions(): void $config = $this->workingDir.'/composer.json'; copy($this->fixturePath('composer-repositories.json'), $config); $jsonConfigSource = new JsonConfigSource(new JsonFile($config)); - $jsonConfigSource->addRepository('example_tld', array( + $jsonConfigSource->addRepository('example_tld', [ 'type' => 'composer', 'url' => 'https://example.tld', - 'options' => array( - 'ssl' => array( + 'options' => [ + 'ssl' => [ 'local_cert' => '/home/composer/.ssl/composer.pem', - ), - ), - )); + ], + ], + ]); $this->assertFileEquals($this->fixturePath('config/config-with-exampletld-repository-and-options.json'), $config); } @@ -150,25 +145,19 @@ public function testRemoveLink(string $sourceFile, string $type, string $name, s } /** - * @param string $type - * @param string $name - * @param string $value - * @param string $fixtureBasename - * @param string $before - * * @return string[] * * @phpstan-return array{string, string, string, string, string} */ protected function addLinkDataArguments(string $type, string $name, string $value, string $fixtureBasename, string $before): array { - return array( + return [ $before, $type, $name, $value, $this->fixturePath('addLink/'.$fixtureBasename.'.json'), - ); + ]; } /** @@ -180,7 +169,7 @@ public function provideAddLinkData(): array $oneOfEverything = $this->fixturePath('composer-one-of-everything.json'); $twoOfEverything = $this->fixturePath('composer-two-of-everything.json'); - return array( + return [ $this->addLinkDataArguments('require', 'my-vend/my-lib', '1.*', 'require-from-empty', $empty), $this->addLinkDataArguments('require', 'my-vend/my-lib', '1.*', 'require-from-oneOfEverything', $oneOfEverything), $this->addLinkDataArguments('require', 'my-vend/my-lib', '1.*', 'require-from-twoOfEverything', $twoOfEverything), @@ -204,27 +193,22 @@ public function provideAddLinkData(): array $this->addLinkDataArguments('conflict', 'my-vend/my-old-app', '1.*', 'conflict-from-empty', $empty), $this->addLinkDataArguments('conflict', 'my-vend/my-old-app', '1.*', 'conflict-from-oneOfEverything', $oneOfEverything), $this->addLinkDataArguments('conflict', 'my-vend/my-old-app', '1.*', 'conflict-from-twoOfEverything', $twoOfEverything), - ); + ]; } /** - * @param string $type - * @param string $name - * @param string $fixtureBasename - * @param string|null $after - * * @return string[] * * @phpstan-return array{string, string, string, string} */ protected function removeLinkDataArguments(string $type, string $name, string $fixtureBasename, ?string $after = null): array { - return array( + return [ $this->fixturePath('removeLink/'.$fixtureBasename.'.json'), $type, $name, $after ?: $this->fixturePath('removeLink/'.$fixtureBasename.'-after.json'), - ); + ]; } /** @@ -235,7 +219,7 @@ public function provideRemoveLinkData(): array $oneOfEverything = $this->fixturePath('composer-one-of-everything.json'); $twoOfEverything = $this->fixturePath('composer-two-of-everything.json'); - return array( + return [ $this->removeLinkDataArguments('require', 'my-vend/my-lib', 'require-to-empty'), $this->removeLinkDataArguments('require', 'my-vend/my-lib', 'require-to-oneOfEverything', $oneOfEverything), $this->removeLinkDataArguments('require', 'my-vend/my-lib', 'require-to-twoOfEverything', $twoOfEverything), @@ -259,6 +243,6 @@ public function provideRemoveLinkData(): array $this->removeLinkDataArguments('conflict', 'my-vend/my-old-app', 'conflict-to-empty'), $this->removeLinkDataArguments('conflict', 'my-vend/my-old-app', 'conflict-to-oneOfEverything', $oneOfEverything), $this->removeLinkDataArguments('conflict', 'my-vend/my-old-app', 'conflict-to-twoOfEverything', $twoOfEverything), - ); + ]; } } diff --git a/tests/Composer/Test/ConfigTest.php b/tests/Composer/Test/ConfigTest.php index 9fe1da3fcf22..a8b828fe4ff3 100644 --- a/tests/Composer/Test/ConfigTest.php +++ b/tests/Composer/Test/ConfigTest.php @@ -13,9 +13,7 @@ namespace Composer\Test; use Composer\Config; -use Composer\IO\BaseIO; use Composer\IO\IOInterface; -use Composer\IO\NullIO; use Composer\Util\Platform; class ConfigTest extends TestCase @@ -30,116 +28,116 @@ public function testAddPackagistRepository(array $expected, array $localConfig, { $config = new Config(false); if ($systemConfig) { - $config->merge(array('repositories' => $systemConfig)); + $config->merge(['repositories' => $systemConfig]); } - $config->merge(array('repositories' => $localConfig)); + $config->merge(['repositories' => $localConfig]); $this->assertEquals($expected, $config->getRepositories()); } public function dataAddPackagistRepository(): array { - $data = array(); - $data['local config inherits system defaults'] = array( - array( - 'packagist.org' => array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - array(), - ); + $data = []; + $data['local config inherits system defaults'] = [ + [ + 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + [], + ]; - $data['local config can disable system config by name'] = array( - array(), - array( - array('packagist.org' => false), - ), - ); + $data['local config can disable system config by name'] = [ + [], + [ + ['packagist.org' => false], + ], + ]; - $data['local config can disable system config by name bc'] = array( - array(), - array( - array('packagist' => false), - ), - ); + $data['local config can disable system config by name bc'] = [ + [], + [ + ['packagist' => false], + ], + ]; - $data['local config adds above defaults'] = array( - array( - 1 => array('type' => 'vcs', 'url' => 'git://github.com/composer/composer.git'), - 0 => array('type' => 'pear', 'url' => 'http://pear.composer.org'), - 'packagist.org' => array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - array( - array('type' => 'vcs', 'url' => 'git://github.com/composer/composer.git'), - array('type' => 'pear', 'url' => 'http://pear.composer.org'), - ), - ); + $data['local config adds above defaults'] = [ + [ + 1 => ['type' => 'vcs', 'url' => 'git://github.com/composer/composer.git'], + 0 => ['type' => 'pear', 'url' => 'http://pear.composer.org'], + 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + [ + ['type' => 'vcs', 'url' => 'git://github.com/composer/composer.git'], + ['type' => 'pear', 'url' => 'http://pear.composer.org'], + ], + ]; - $data['system config adds above core defaults'] = array( - array( - 'example.com' => array('type' => 'composer', 'url' => 'http://example.com'), - 'packagist.org' => array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - array(), - array( - 'example.com' => array('type' => 'composer', 'url' => 'http://example.com'), - ), - ); + $data['system config adds above core defaults'] = [ + [ + 'example.com' => ['type' => 'composer', 'url' => 'http://example.com'], + 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + [], + [ + 'example.com' => ['type' => 'composer', 'url' => 'http://example.com'], + ], + ]; - $data['local config can disable repos by name and re-add them anonymously to bring them above system config'] = array( - array( - 0 => array('type' => 'composer', 'url' => 'http://packagist.org'), - 'example.com' => array('type' => 'composer', 'url' => 'http://example.com'), - ), - array( - array('packagist.org' => false), - array('type' => 'composer', 'url' => 'http://packagist.org'), - ), - array( - 'example.com' => array('type' => 'composer', 'url' => 'http://example.com'), - ), - ); + $data['local config can disable repos by name and re-add them anonymously to bring them above system config'] = [ + [ + 0 => ['type' => 'composer', 'url' => 'http://packagist.org'], + 'example.com' => ['type' => 'composer', 'url' => 'http://example.com'], + ], + [ + ['packagist.org' => false], + ['type' => 'composer', 'url' => 'http://packagist.org'], + ], + [ + 'example.com' => ['type' => 'composer', 'url' => 'http://example.com'], + ], + ]; - $data['local config can override by name to bring a repo above system config'] = array( - array( - 'packagist.org' => array('type' => 'composer', 'url' => 'http://packagistnew.org'), - 'example.com' => array('type' => 'composer', 'url' => 'http://example.com'), - ), - array( - 'packagist.org' => array('type' => 'composer', 'url' => 'http://packagistnew.org'), - ), - array( - 'example.com' => array('type' => 'composer', 'url' => 'http://example.com'), - ), - ); + $data['local config can override by name to bring a repo above system config'] = [ + [ + 'packagist.org' => ['type' => 'composer', 'url' => 'http://packagistnew.org'], + 'example.com' => ['type' => 'composer', 'url' => 'http://example.com'], + ], + [ + 'packagist.org' => ['type' => 'composer', 'url' => 'http://packagistnew.org'], + ], + [ + 'example.com' => ['type' => 'composer', 'url' => 'http://example.com'], + ], + ]; - $data['local config redefining packagist.org by URL override it if no named keys are used'] = array( - array( - array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - array( - array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - ); + $data['local config redefining packagist.org by URL override it if no named keys are used'] = [ + [ + ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + [ + ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + ]; - $data['local config redefining packagist.org by URL override it also with named keys'] = array( - array( - 'example' => array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - array( - 'example' => array('type' => 'composer', 'url' => 'https://repo.packagist.org'), - ), - ); + $data['local config redefining packagist.org by URL override it also with named keys'] = [ + [ + 'example' => ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + [ + 'example' => ['type' => 'composer', 'url' => 'https://repo.packagist.org'], + ], + ]; - $data['incorrect local config does not cause ErrorException'] = array( - array( - 'packagist.org' => array('type' => 'composer', 'url' => 'https://repo.packagist.org'), + $data['incorrect local config does not cause ErrorException'] = [ + [ + 'packagist.org' => ['type' => 'composer', 'url' => 'https://repo.packagist.org'], 'type' => 'vcs', 'url' => 'http://example.com', - ), - array( + ], + [ 'type' => 'vcs', 'url' => 'http://example.com', - ), - ); + ], + ]; return $data; } @@ -147,8 +145,8 @@ public function dataAddPackagistRepository(): array public function testPreferredInstallAsString(): void { $config = new Config(false); - $config->merge(array('config' => array('preferred-install' => 'source'))); - $config->merge(array('config' => array('preferred-install' => 'dist'))); + $config->merge(['config' => ['preferred-install' => 'source']]); + $config->merge(['config' => ['preferred-install' => 'dist']]); $this->assertEquals('dist', $config->get('preferred-install')); } @@ -156,29 +154,29 @@ public function testPreferredInstallAsString(): void public function testMergePreferredInstall(): void { $config = new Config(false); - $config->merge(array('config' => array('preferred-install' => 'dist'))); - $config->merge(array('config' => array('preferred-install' => array('foo/*' => 'source')))); + $config->merge(['config' => ['preferred-install' => 'dist']]); + $config->merge(['config' => ['preferred-install' => ['foo/*' => 'source']]]); // This assertion needs to make sure full wildcard preferences are placed last // Handled by composer because we convert string preferences for BC, all other // care for ordering and collision prevention is up to the user - $this->assertEquals(array('foo/*' => 'source', '*' => 'dist'), $config->get('preferred-install')); + $this->assertEquals(['foo/*' => 'source', '*' => 'dist'], $config->get('preferred-install')); } public function testMergeGithubOauth(): void { $config = new Config(false); - $config->merge(array('config' => array('github-oauth' => array('foo' => 'bar')))); - $config->merge(array('config' => array('github-oauth' => array('bar' => 'baz')))); + $config->merge(['config' => ['github-oauth' => ['foo' => 'bar']]]); + $config->merge(['config' => ['github-oauth' => ['bar' => 'baz']]]); - $this->assertEquals(array('foo' => 'bar', 'bar' => 'baz'), $config->get('github-oauth')); + $this->assertEquals(['foo' => 'bar', 'bar' => 'baz'], $config->get('github-oauth')); } public function testVarReplacement(): void { $config = new Config(false); - $config->merge(array('config' => array('a' => 'b', 'c' => '{$a}'))); - $config->merge(array('config' => array('bin-dir' => '$HOME', 'cache-dir' => '~/foo/'))); + $config->merge(['config' => ['a' => 'b', 'c' => '{$a}']]); + $config->merge(['config' => ['bin-dir' => '$HOME', 'cache-dir' => '~/foo/']]); $home = rtrim(getenv('HOME') ?: getenv('USERPROFILE'), '\\/'); $this->assertEquals('b', $config->get('c')); @@ -189,11 +187,11 @@ public function testVarReplacement(): void public function testRealpathReplacement(): void { $config = new Config(false, '/foo/bar'); - $config->merge(array('config' => array( + $config->merge(['config' => [ 'bin-dir' => '$HOME/foo', 'cache-dir' => '/baz/', 'vendor-dir' => 'vendor', - ))); + ]]); $home = rtrim(getenv('HOME') ?: getenv('USERPROFILE'), '\\/'); $this->assertEquals('/foo/bar/vendor', $config->get('vendor-dir')); @@ -204,9 +202,9 @@ public function testRealpathReplacement(): void public function testStreamWrapperDirs(): void { $config = new Config(false, '/foo/bar'); - $config->merge(array('config' => array( + $config->merge(['config' => [ 'cache-dir' => 's3://baz/', - ))); + ]]); $this->assertEquals('s3://baz', $config->get('cache-dir')); } @@ -214,10 +212,10 @@ public function testStreamWrapperDirs(): void public function testFetchingRelativePaths(): void { $config = new Config(false, '/foo/bar'); - $config->merge(array('config' => array( + $config->merge(['config' => [ 'bin-dir' => '{$vendor-dir}/foo', 'vendor-dir' => 'vendor', - ))); + ]]); $this->assertEquals('/foo/bar/vendor', $config->get('vendor-dir')); $this->assertEquals('/foo/bar/vendor/foo', $config->get('bin-dir')); @@ -228,27 +226,25 @@ public function testFetchingRelativePaths(): void public function testOverrideGithubProtocols(): void { $config = new Config(false); - $config->merge(array('config' => array('github-protocols' => array('https', 'ssh')))); - $config->merge(array('config' => array('github-protocols' => array('https')))); + $config->merge(['config' => ['github-protocols' => ['https', 'ssh']]]); + $config->merge(['config' => ['github-protocols' => ['https']]]); - $this->assertEquals(array('https'), $config->get('github-protocols')); + $this->assertEquals(['https'], $config->get('github-protocols')); } public function testGitDisabledByDefaultInGithubProtocols(): void { $config = new Config(false); - $config->merge(array('config' => array('github-protocols' => array('https', 'git')))); - $this->assertEquals(array('https'), $config->get('github-protocols')); + $config->merge(['config' => ['github-protocols' => ['https', 'git']]]); + $this->assertEquals(['https'], $config->get('github-protocols')); - $config->merge(array('config' => array('secure-http' => false))); - $this->assertEquals(array('https', 'git'), $config->get('github-protocols')); + $config->merge(['config' => ['secure-http' => false]]); + $this->assertEquals(['https', 'git'], $config->get('github-protocols')); } /** * @dataProvider allowedUrlProvider * @doesNotPerformAssertions - * - * @param string $url */ public function testAllowedUrlsPass(string $url): void { @@ -258,8 +254,6 @@ public function testAllowedUrlsPass(string $url): void /** * @dataProvider prohibitedUrlProvider - * - * @param string $url */ public function testProhibitedUrlsThrowException(string $url): void { @@ -274,7 +268,7 @@ public function testProhibitedUrlsThrowException(string $url): void */ public function allowedUrlProvider(): array { - $urls = array( + $urls = [ 'https://packagist.org', 'git@github.com:composer/composer.git', 'hg://user:pass@my.satis/satis', @@ -283,10 +277,10 @@ public function allowedUrlProvider(): array 'file://example.org/mygit.git', 'git:Department/Repo.git', 'ssh://[user@]host.xz[:port]/path/to/repo.git/', - ); + ]; - return array_combine($urls, array_map(function ($e): array { - return array($e); + return array_combine($urls, array_map(static function ($e): array { + return [$e]; }, $urls)); } @@ -295,7 +289,7 @@ public function allowedUrlProvider(): array */ public function prohibitedUrlProvider(): array { - $urls = array( + $urls = [ 'http://packagist.org', 'http://10.1.0.1/satis', 'http://127.0.0.1/satis', @@ -304,10 +298,10 @@ public function prohibitedUrlProvider(): array 'svn://192.168.0.1/trunk', 'svn://1.2.3.4/trunk', 'git://5.6.7.8/git.git', - ); + ]; - return array_combine($urls, array_map(function ($e): array { - return array($e); + return array_combine($urls, array_map(static function ($e): array { + return [$e]; }, $urls)); } @@ -325,7 +319,7 @@ public function testProhibitedUrlsWarningVerifyPeer(): void 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, - ] + ], ]); } @@ -336,11 +330,11 @@ public function testDisableTlsCanBeOverridden(): void { $config = new Config; $config->merge( - array('config' => array('disable-tls' => 'false')) + ['config' => ['disable-tls' => 'false']] ); $this->assertFalse($config->get('disable-tls')); $config->merge( - array('config' => array('disable-tls' => 'true')) + ['config' => ['disable-tls' => 'true']] ); $this->assertTrue($config->get('disable-tls')); } @@ -374,7 +368,7 @@ public function testGetSourceOfValue(): void $this->assertSame(Config::SOURCE_DEFAULT, $config->getSourceOfValue('process-timeout')); $config->merge( - array('config' => array('process-timeout' => 1)), + ['config' => ['process-timeout' => 1]], 'phpunit-test' ); @@ -412,30 +406,30 @@ public function testGetDefaultsToAnEmptyArray(): void public function testMergesPluginConfig(): void { $config = new Config(false); - $config->merge(array('config' => array('allow-plugins' => array('some/plugin' => true)))); - $this->assertEquals(array('some/plugin' => true), $config->get('allow-plugins')); + $config->merge(['config' => ['allow-plugins' => ['some/plugin' => true]]]); + $this->assertEquals(['some/plugin' => true], $config->get('allow-plugins')); - $config->merge(array('config' => array('allow-plugins' => array('another/plugin' => true)))); - $this->assertEquals(array('some/plugin' => true, 'another/plugin' => true), $config->get('allow-plugins')); + $config->merge(['config' => ['allow-plugins' => ['another/plugin' => true]]]); + $this->assertEquals(['some/plugin' => true, 'another/plugin' => true], $config->get('allow-plugins')); } public function testOverridesGlobalBooleanPluginsConfig(): void { $config = new Config(false); - $config->merge(array('config' => array('allow-plugins' => true))); + $config->merge(['config' => ['allow-plugins' => true]]); $this->assertEquals(true, $config->get('allow-plugins')); - $config->merge(array('config' => array('allow-plugins' => array('another/plugin' => true)))); - $this->assertEquals(array('another/plugin' => true), $config->get('allow-plugins')); + $config->merge(['config' => ['allow-plugins' => ['another/plugin' => true]]]); + $this->assertEquals(['another/plugin' => true], $config->get('allow-plugins')); } public function testAllowsAllPluginsFromLocalBoolean(): void { $config = new Config(false); - $config->merge(array('config' => array('allow-plugins' => array('some/plugin' => true)))); - $this->assertEquals(array('some/plugin' => true), $config->get('allow-plugins')); + $config->merge(['config' => ['allow-plugins' => ['some/plugin' => true]]]); + $this->assertEquals(['some/plugin' => true], $config->get('allow-plugins')); - $config->merge(array('config' => array('allow-plugins' => true))); + $config->merge(['config' => ['allow-plugins' => true]]); $this->assertEquals(true, $config->get('allow-plugins')); } } diff --git a/tests/Composer/Test/Console/HtmlOutputFormatterTest.php b/tests/Composer/Test/Console/HtmlOutputFormatterTest.php index 46ab0caab58a..6d02a7396f1a 100644 --- a/tests/Composer/Test/Console/HtmlOutputFormatterTest.php +++ b/tests/Composer/Test/Console/HtmlOutputFormatterTest.php @@ -20,9 +20,9 @@ class HtmlOutputFormatterTest extends TestCase { public function testFormatting(): void { - $formatter = new HtmlOutputFormatter(array( + $formatter = new HtmlOutputFormatter([ 'warning' => new OutputFormatterStyle('black', 'yellow'), - )); + ]); $this->assertEquals( 'text green yellow black w/ yello bg', diff --git a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php index 4d0c3c136ccd..08eaf18f9cff 100644 --- a/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php +++ b/tests/Composer/Test/DependencyResolver/DefaultPolicyTest.php @@ -48,8 +48,8 @@ public function testSelectSingle(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($packageA->getId()); - $expected = array($packageA->getId()); + $literals = [$packageA->getId()]; + $expected = [$packageA->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -64,8 +64,8 @@ public function testSelectNewest(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($packageA1->getId(), $packageA2->getId()); - $expected = array($packageA2->getId()); + $literals = [$packageA1->getId(), $packageA2->getId()]; + $expected = [$packageA2->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -80,8 +80,8 @@ public function testSelectNewestPicksLatest(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($packageA1->getId(), $packageA2->getId()); - $expected = array($packageA2->getId()); + $literals = [$packageA1->getId(), $packageA2->getId()]; + $expected = [$packageA2->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -96,8 +96,8 @@ public function testSelectNewestPicksLatestStableWithPreferStable(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($packageA1->getId(), $packageA2->getId()); - $expected = array($packageA1->getId()); + $literals = [$packageA1->getId(), $packageA2->getId()]; + $expected = [$packageA1->getId()]; $policy = new DefaultPolicy(true); $selected = $policy->selectPreferredPackages($pool, $literals); @@ -113,8 +113,8 @@ public function testSelectNewestWithDevPicksNonDev(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($packageA1->getId(), $packageA2->getId()); - $expected = array($packageA2->getId()); + $literals = [$packageA1->getId(), $packageA2->getId()]; + $expected = [$packageA2->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -136,8 +136,8 @@ public function testRepositoryOrderingAffectsPriority(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($package1->getId(), $package2->getId(), $package3->getId(), $package4->getId()); - $expected = array($package2->getId()); + $literals = [$package1->getId(), $package2->getId(), $package3->getId(), $package4->getId()]; + $expected = [$package2->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); $this->assertSame($expected, $selected); @@ -148,7 +148,7 @@ public function testRepositoryOrderingAffectsPriority(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $expected = array($package4->getId()); + $expected = [$package4->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); $this->assertSame($expected, $selected); @@ -173,12 +173,12 @@ public function testSelectLocalReposFirst(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); $packages = $pool->whatProvides('a', new Constraint('=', '2.1.9999999.9999999-dev')); - $literals = array(); + $literals = []; foreach ($packages as $package) { $literals[] = $package->getId(); } - $expected = array($packageAAliasImportant->getId()); + $expected = [$packageAAliasImportant->getId()]; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -190,14 +190,14 @@ public function testSelectAllProviders(): void $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '2.0')); - $packageA->setProvides(array('x' => new Link('A', 'X', new Constraint('==', '1.0'), Link::TYPE_PROVIDE))); - $packageB->setProvides(array('x' => new Link('B', 'X', new Constraint('==', '1.0'), Link::TYPE_PROVIDE))); + $packageA->setProvides(['x' => new Link('A', 'X', new Constraint('==', '1.0'), Link::TYPE_PROVIDE)]); + $packageB->setProvides(['x' => new Link('B', 'X', new Constraint('==', '1.0'), Link::TYPE_PROVIDE)]); $this->repositorySet->addRepository($this->repo); - $pool = $this->repositorySet->createPoolForPackages(array('A', 'B'), $this->repoLocked); + $pool = $this->repositorySet->createPoolForPackages(['A', 'B'], $this->repoLocked); - $literals = array($packageA->getId(), $packageB->getId()); + $literals = [$packageA->getId(), $packageB->getId()]; $expected = $literals; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -210,13 +210,13 @@ public function testPreferNonReplacingFromSameRepo(): void $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '2.0')); - $packageB->setReplaces(array('a' => new Link('B', 'A', new Constraint('==', '1.0'), Link::TYPE_REPLACE))); + $packageB->setReplaces(['a' => new Link('B', 'A', new Constraint('==', '1.0'), Link::TYPE_REPLACE)]); $this->repositorySet->addRepository($this->repo); - $pool = $this->repositorySet->createPoolForPackages(array('A', 'B'), $this->repoLocked); + $pool = $this->repositorySet->createPoolForPackages(['A', 'B'], $this->repoLocked); - $literals = array($packageA->getId(), $packageB->getId()); + $literals = [$packageA->getId(), $packageB->getId()]; $expected = $literals; $selected = $this->policy->selectPreferredPackages($pool, $literals); @@ -230,14 +230,14 @@ public function testPreferReplacingPackageFromSameVendor(): void $this->repo->addPackage($packageB = $this->getPackage('vendor-b/replacer', '1.0')); $this->repo->addPackage($packageA = $this->getPackage('vendor-a/replacer', '1.0')); - $packageA->setReplaces(array('vendor-a/package' => new Link('vendor-a/replacer', 'vendor-a/package', new Constraint('==', '1.0'), Link::TYPE_REPLACE))); - $packageB->setReplaces(array('vendor-a/package' => new Link('vendor-b/replacer', 'vendor-a/package', new Constraint('==', '1.0'), Link::TYPE_REPLACE))); + $packageA->setReplaces(['vendor-a/package' => new Link('vendor-a/replacer', 'vendor-a/package', new Constraint('==', '1.0'), Link::TYPE_REPLACE)]); + $packageB->setReplaces(['vendor-a/package' => new Link('vendor-b/replacer', 'vendor-a/package', new Constraint('==', '1.0'), Link::TYPE_REPLACE)]); $this->repositorySet->addRepository($this->repo); - $pool = $this->repositorySet->createPoolForPackages(array('vendor-a/replacer', 'vendor-b/replacer'), $this->repoLocked); + $pool = $this->repositorySet->createPoolForPackages(['vendor-a/replacer', 'vendor-b/replacer'], $this->repoLocked); - $literals = array($packageA->getId(), $packageB->getId()); + $literals = [$packageA->getId(), $packageB->getId()]; $expected = $literals; $selected = $this->policy->selectPreferredPackages($pool, $literals, 'vendor-a/package'); @@ -251,9 +251,9 @@ public function testPreferReplacingPackageFromSameVendor(): void $repositorySet = new RepositorySet('dev'); $repositorySet->addRepository($this->repo); - $pool = $this->repositorySet->createPoolForPackages(array('vendor-a/replacer', 'vendor-b/replacer'), $this->repoLocked); + $pool = $this->repositorySet->createPoolForPackages(['vendor-a/replacer', 'vendor-b/replacer'], $this->repoLocked); - $literals = array($packageA->getId(), $packageB->getId()); + $literals = [$packageA->getId(), $packageB->getId()]; $expected = $literals; $selected = $this->policy->selectPreferredPackages($pool, $literals, 'vendor-a/package'); @@ -270,8 +270,8 @@ public function testSelectLowest(): void $pool = $this->repositorySet->createPoolForPackage('A', $this->repoLocked); - $literals = array($packageA1->getId(), $packageA2->getId()); - $expected = array($packageA1->getId()); + $literals = [$packageA1->getId(), $packageA2->getId()]; + $expected = [$packageA1->getId()]; $selected = $policy->selectPreferredPackages($pool, $literals); diff --git a/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php b/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php index 316fd82b55cb..e6c804454e04 100644 --- a/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php +++ b/tests/Composer/Test/DependencyResolver/PoolBuilderTest.php @@ -36,8 +36,6 @@ class PoolBuilderTest extends TestCase { /** * @dataProvider getIntegrationTests - * @param string $file - * @param string $message * @param string[] $expect * @param string[] $expectOptimized * @param mixed[] $root @@ -47,11 +45,11 @@ class PoolBuilderTest extends TestCase */ public function testPoolBuilder(string $file, string $message, array $expect, array $expectOptimized, array $root, array $requestData, array $packageRepos, array $fixed): void { - $rootAliases = !empty($root['aliases']) ? $root['aliases'] : array(); + $rootAliases = !empty($root['aliases']) ? $root['aliases'] : []; $minimumStability = !empty($root['minimum-stability']) ? $root['minimum-stability'] : 'stable'; - $stabilityFlags = !empty($root['stability-flags']) ? $root['stability-flags'] : array(); - $rootReferences = !empty($root['references']) ? $root['references'] : array(); - $stabilityFlags = array_map(function ($stability): int { + $stabilityFlags = !empty($root['stability-flags']) ? $root['stability-flags'] : []; + $rootReferences = !empty($root['references']) ? $root['references'] : []; + $stabilityFlags = array_map(static function ($stability): int { return BasePackage::$stabilities[$stability]; }, $stabilityFlags); @@ -62,8 +60,8 @@ public function testPoolBuilder(string $file, string $message, array $expect, ar } $loader = new ArrayLoader(null, true); - $packageIds = array(); - $loadPackage = function ($data) use ($loader, &$packageIds): \Composer\Package\PackageInterface { + $packageIds = []; + $loadPackage = static function ($data) use ($loader, &$packageIds): \Composer\Package\PackageInterface { /** @var ?int $id */ $id = null; if (!empty($data['id'])) { @@ -154,12 +152,12 @@ public function testPoolBuilder(string $file, string $message, array $expect, ar */ private function getPackageResultSet(Pool $pool, array $packageIds): array { - $result = array(); + $result = []; for ($i = 1, $count = count($pool); $i <= $count; $i++) { $result[] = $pool->packageById($i); } - return array_map(function (BasePackage $package) use ($packageIds) { + return array_map(static function (BasePackage $package) use ($packageIds) { if ($id = array_search($package, $packageIds, true)) { return $id; } @@ -190,7 +188,7 @@ private function getPackageResultSet(Pool $pool, array $packageIds): array public function getIntegrationTests(): array { $fixturesDir = realpath(__DIR__.'/Fixtures/poolbuilder/'); - $tests = array(); + $tests = []; foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($fixturesDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) { $file = (string) $file; @@ -204,10 +202,10 @@ public function getIntegrationTests(): array $message = $testData['TEST']; $request = JsonFile::parseJson($testData['REQUEST']); - $root = !empty($testData['ROOT']) ? JsonFile::parseJson($testData['ROOT']) : array(); + $root = !empty($testData['ROOT']) ? JsonFile::parseJson($testData['ROOT']) : []; $packageRepos = JsonFile::parseJson($testData['PACKAGE-REPOS']); - $fixed = array(); + $fixed = []; if (!empty($testData['FIXED'])) { $fixed = JsonFile::parseJson($testData['FIXED']); } @@ -217,7 +215,7 @@ public function getIntegrationTests(): array die(sprintf('Test "%s" is not valid: '.$e->getMessage(), str_replace($fixturesDir.'/', '', $file))); } - $tests[basename($file)] = array(str_replace($fixturesDir.'/', '', $file), $message, $expect, $expectOptimized, $root, $request, $packageRepos, $fixed); + $tests[basename($file)] = [str_replace($fixturesDir.'/', '', $file), $message, $expect, $expectOptimized, $root, $request, $packageRepos, $fixed]; } return $tests; @@ -230,7 +228,7 @@ protected function readTestFile(string $file, string $fixturesDir): array { $tokens = Preg::split('#(?:^|\n*)--([A-Z-]+)--\n#', file_get_contents($file), -1, PREG_SPLIT_DELIM_CAPTURE); - $sectionInfo = array( + $sectionInfo = [ 'TEST' => true, 'ROOT' => false, 'REQUEST' => true, @@ -238,10 +236,10 @@ protected function readTestFile(string $file, string $fixturesDir): array 'PACKAGE-REPOS' => true, 'EXPECT' => true, 'EXPECT-OPTIMIZED' => false, - ); + ]; $section = null; - $data = array(); + $data = []; foreach ($tokens as $i => $token) { if (null === $section && empty($token)) { continue; // skip leading blank diff --git a/tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php b/tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php index 18ef95dc378f..88dc2bfd8827 100644 --- a/tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php +++ b/tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php @@ -32,7 +32,6 @@ class PoolOptimizerTest extends TestCase * @param mixed[] $requestData * @param BasePackage[] $packagesBefore * @param BasePackage[] $expectedPackages - * @param string $message */ public function testPoolOptimizer(array $requestData, array $packagesBefore, array $expectedPackages, string $message): void { @@ -74,7 +73,7 @@ public function testPoolOptimizer(array $requestData, array $packagesBefore, arr public function provideIntegrationTests(): array { $fixturesDir = realpath(__DIR__.'/Fixtures/pooloptimizer/'); - $tests = array(); + $tests = []; foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($fixturesDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) { $file = (string) $file; @@ -92,7 +91,7 @@ public function provideIntegrationTests(): array die(sprintf('Test "%s" is not valid: '.$e->getMessage(), str_replace($fixturesDir.'/', '', $file))); } - $tests[basename($file)] = array($requestData, $packagesBefore, $expectedPackages, $message); + $tests[basename($file)] = [$requestData, $packagesBefore, $expectedPackages, $message]; } return $tests; @@ -106,15 +105,15 @@ protected function readTestFile(string $file, string $fixturesDir): array $tokens = Preg::split('#(?:^|\n*)--([A-Z-]+)--\n#', file_get_contents($file), -1, PREG_SPLIT_DELIM_CAPTURE); /** @var array $sectionInfo */ - $sectionInfo = array( + $sectionInfo = [ 'TEST' => true, 'REQUEST' => true, 'POOL-BEFORE' => true, 'POOL-AFTER' => true, - ); + ]; $section = null; - $data = array(); + $data = []; foreach ($tokens as $i => $token) { if (null === $section && empty($token)) { continue; // skip leading blank @@ -157,7 +156,7 @@ protected function readTestFile(string $file, string $fixturesDir): array */ private function reducePackagesInfoForComparison(array $packages): array { - $packagesInfo = array(); + $packagesInfo = []; foreach ($packages as $package) { $packagesInfo[] = $package->getName() . '@' . $package->getVersion() . ($package instanceof AliasPackage ? ' (alias of '.$package->getAliasOf()->getVersion().')' : ''); @@ -174,7 +173,7 @@ private function reducePackagesInfoForComparison(array $packages): array */ private function loadPackages(array $packagesData): array { - $packages = array(); + $packages = []; foreach ($packagesData as $packageData) { $packages[] = $package = $this->loadPackage($packageData); @@ -188,7 +187,6 @@ private function loadPackages(array $packagesData): array /** * @param mixed[] $packageData - * @return BasePackage */ private function loadPackage(array $packageData): BasePackage { diff --git a/tests/Composer/Test/DependencyResolver/PoolTest.php b/tests/Composer/Test/DependencyResolver/PoolTest.php index 6952955d86c2..62e8eb5d3888 100644 --- a/tests/Composer/Test/DependencyResolver/PoolTest.php +++ b/tests/Composer/Test/DependencyResolver/PoolTest.php @@ -21,10 +21,10 @@ public function testPool(): void { $package = $this->getPackage('foo', '1'); - $pool = $this->createPool(array($package)); + $pool = $this->createPool([$package]); - $this->assertEquals(array($package), $pool->whatProvides('foo')); - $this->assertEquals(array($package), $pool->whatProvides('foo')); + $this->assertEquals([$package], $pool->whatProvides('foo')); + $this->assertEquals([$package], $pool->whatProvides('foo')); } public function testWhatProvidesPackageWithConstraint(): void @@ -32,20 +32,20 @@ public function testWhatProvidesPackageWithConstraint(): void $firstPackage = $this->getPackage('foo', '1'); $secondPackage = $this->getPackage('foo', '2'); - $pool = $this->createPool(array( + $pool = $this->createPool([ $firstPackage, $secondPackage, - )); + ]); - $this->assertEquals(array($firstPackage, $secondPackage), $pool->whatProvides('foo')); - $this->assertEquals(array($secondPackage), $pool->whatProvides('foo', $this->getVersionConstraint('==', '2'))); + $this->assertEquals([$firstPackage, $secondPackage], $pool->whatProvides('foo')); + $this->assertEquals([$secondPackage], $pool->whatProvides('foo', $this->getVersionConstraint('==', '2'))); } public function testPackageById(): void { $package = $this->getPackage('foo', '1'); - $pool = $this->createPool(array($package)); + $pool = $this->createPool([$package]); $this->assertSame($package, $pool->packageById(1)); } @@ -54,14 +54,13 @@ public function testWhatProvidesWhenPackageCannotBeFound(): void { $pool = $this->createPool(); - $this->assertEquals(array(), $pool->whatProvides('foo')); + $this->assertEquals([], $pool->whatProvides('foo')); } /** * @param array<\Composer\Package\BasePackage>|null $packages - * @return \Composer\DependencyResolver\Pool */ - protected function createPool(?array $packages = array()): Pool + protected function createPool(?array $packages = []): Pool { return new Pool($packages); } diff --git a/tests/Composer/Test/DependencyResolver/RequestTest.php b/tests/Composer/Test/DependencyResolver/RequestTest.php index a749be8bf4f7..6b1e7d84a8f0 100644 --- a/tests/Composer/Test/DependencyResolver/RequestTest.php +++ b/tests/Composer/Test/DependencyResolver/RequestTest.php @@ -34,9 +34,9 @@ public function testRequestInstall(): void $request->requireName('foo'); $this->assertEquals( - array( + [ 'foo' => new MatchAllConstraint(), - ), + ], $request->getRequires() ); } @@ -56,9 +56,9 @@ public function testRequestInstallSamePackageFromDifferentRepositories(): void $request->requireName('foo', $constraint = $this->getVersionConstraint('=', '1')); $this->assertEquals( - array( + [ 'foo' => $constraint, - ), + ], $request->getRequires() ); } diff --git a/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php b/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php index 7e55c7013138..d158335d3eea 100644 --- a/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php +++ b/tests/Composer/Test/DependencyResolver/RuleSetIteratorTest.php @@ -31,32 +31,32 @@ protected function setUp(): void { $this->pool = new Pool(); - $this->rules = array( - RuleSet::TYPE_REQUEST => array( - new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - ), - RuleSet::TYPE_LEARNED => array( - new GenericRule(array(), Rule::RULE_LEARNED, 1), - ), - RuleSet::TYPE_PACKAGE => array(), - ); + $this->rules = [ + RuleSet::TYPE_REQUEST => [ + new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + ], + RuleSet::TYPE_LEARNED => [ + new GenericRule([], Rule::RULE_LEARNED, 1), + ], + RuleSet::TYPE_PACKAGE => [], + ]; } public function testForeach(): void { $ruleSetIterator = new RuleSetIterator($this->rules); - $result = array(); + $result = []; foreach ($ruleSetIterator as $rule) { $result[] = $rule; } - $expected = array( + $expected = [ $this->rules[RuleSet::TYPE_REQUEST][0], $this->rules[RuleSet::TYPE_REQUEST][1], $this->rules[RuleSet::TYPE_LEARNED][0], - ); + ]; $this->assertEquals($expected, $result); } @@ -65,16 +65,16 @@ public function testKeys(): void { $ruleSetIterator = new RuleSetIterator($this->rules); - $result = array(); + $result = []; foreach ($ruleSetIterator as $key => $rule) { $result[] = $key; } - $expected = array( + $expected = [ RuleSet::TYPE_REQUEST, RuleSet::TYPE_REQUEST, RuleSet::TYPE_LEARNED, - ); + ]; $this->assertEquals($expected, $result); } diff --git a/tests/Composer/Test/DependencyResolver/RuleSetTest.php b/tests/Composer/Test/DependencyResolver/RuleSetTest.php index 2912ebc3f5d0..0bbb42804623 100644 --- a/tests/Composer/Test/DependencyResolver/RuleSetTest.php +++ b/tests/Composer/Test/DependencyResolver/RuleSetTest.php @@ -24,16 +24,16 @@ class RuleSetTest extends TestCase { public function testAdd(): void { - $rules = array( - RuleSet::TYPE_PACKAGE => array(), - RuleSet::TYPE_REQUEST => array( - new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - ), - RuleSet::TYPE_LEARNED => array( - new GenericRule(array(), Rule::RULE_LEARNED, 1), - ), - ); + $rules = [ + RuleSet::TYPE_PACKAGE => [], + RuleSet::TYPE_REQUEST => [ + new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + new GenericRule([2], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + ], + RuleSet::TYPE_LEARNED => [ + new GenericRule([], Rule::RULE_LEARNED, 1), + ], + ]; $ruleSet = new RuleSet; @@ -46,13 +46,13 @@ public function testAdd(): void public function testAddIgnoresDuplicates(): void { - $rules = array( - RuleSet::TYPE_REQUEST => array( - new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), - ), - ); + $rules = [ + RuleSet::TYPE_REQUEST => [ + new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), + ], + ]; $ruleSet = new RuleSet; @@ -60,7 +60,7 @@ public function testAddIgnoresDuplicates(): void $ruleSet->add($rules[RuleSet::TYPE_REQUEST][1], RuleSet::TYPE_REQUEST); $ruleSet->add($rules[RuleSet::TYPE_REQUEST][2], RuleSet::TYPE_REQUEST); - $this->assertCount(1, $ruleSet->getIteratorFor(array(RuleSet::TYPE_REQUEST))); + $this->assertCount(1, $ruleSet->getIteratorFor([RuleSet::TYPE_REQUEST])); } public function testAddWhenTypeIsNotRecognized(): void @@ -69,15 +69,15 @@ public function testAddWhenTypeIsNotRecognized(): void self::expectException('OutOfBoundsException'); // @phpstan-ignore-next-line - $ruleSet->add(new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), 7); + $ruleSet->add(new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), 7); } public function testCount(): void { $ruleSet = new RuleSet; - $ruleSet->add(new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), RuleSet::TYPE_REQUEST); - $ruleSet->add(new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)), RuleSet::TYPE_REQUEST); + $ruleSet->add(new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), RuleSet::TYPE_REQUEST); + $ruleSet->add(new GenericRule([2], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]), RuleSet::TYPE_REQUEST); $this->assertEquals(2, $ruleSet->count()); } @@ -86,7 +86,7 @@ public function testRuleById(): void { $ruleSet = new RuleSet; - $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $ruleSet->add($rule, RuleSet::TYPE_REQUEST); $this->assertSame($rule, $ruleSet->ruleById[0]); @@ -96,8 +96,8 @@ public function testGetIterator(): void { $ruleSet = new RuleSet; - $rule1 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule1 = new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([2], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $ruleSet->add($rule1, RuleSet::TYPE_REQUEST); $ruleSet->add($rule2, RuleSet::TYPE_LEARNED); @@ -111,8 +111,8 @@ public function testGetIterator(): void public function testGetIteratorFor(): void { $ruleSet = new RuleSet; - $rule1 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule1 = new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([2], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $ruleSet->add($rule1, RuleSet::TYPE_REQUEST); $ruleSet->add($rule2, RuleSet::TYPE_LEARNED); @@ -125,8 +125,8 @@ public function testGetIteratorFor(): void public function testGetIteratorWithout(): void { $ruleSet = new RuleSet; - $rule1 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(2), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule1 = new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([2], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $ruleSet->add($rule1, RuleSet::TYPE_REQUEST); $ruleSet->add($rule2, RuleSet::TYPE_LEARNED); @@ -138,16 +138,16 @@ public function testGetIteratorWithout(): void public function testPrettyString(): void { - $pool = new Pool(array( + $pool = new Pool([ $p = $this->getPackage('foo', '2.1'), - )); + ]); $repositorySetMock = $this->getMockBuilder('Composer\Repository\RepositorySet')->disableOriginalConstructor()->getMock(); $requestMock = $this->getMockBuilder('Composer\DependencyResolver\Request')->disableOriginalConstructor()->getMock(); $ruleSet = new RuleSet; $literal = $p->getId(); - $rule = new GenericRule(array($literal), Rule::RULE_ROOT_REQUIRE, array('packageName' => 'foo/bar', 'constraint' => new MatchNoneConstraint)); + $rule = new GenericRule([$literal], Rule::RULE_ROOT_REQUIRE, ['packageName' => 'foo/bar', 'constraint' => new MatchNoneConstraint]); $ruleSet->add($rule, RuleSet::TYPE_REQUEST); diff --git a/tests/Composer/Test/DependencyResolver/RuleTest.php b/tests/Composer/Test/DependencyResolver/RuleTest.php index 9bd9e5377594..d3e2054b7f43 100644 --- a/tests/Composer/Test/DependencyResolver/RuleTest.php +++ b/tests/Composer/Test/DependencyResolver/RuleTest.php @@ -24,7 +24,7 @@ class RuleTest extends TestCase { public function testGetHash(): void { - $rule = new GenericRule(array(123), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([123], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $hash = unpack('ihash', md5('123', true)); $this->assertEquals($hash['hash'], $rule->getHash()); @@ -32,31 +32,31 @@ public function testGetHash(): void public function testEqualsForRulesWithDifferentHashes(): void { - $rule = new GenericRule(array(1, 2), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(1, 3), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([1, 2], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([1, 3], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $this->assertFalse($rule->equals($rule2)); } public function testEqualsForRulesWithDifferLiteralsQuantity(): void { - $rule = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([1, 12], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $this->assertFalse($rule->equals($rule2)); } public function testEqualsForRulesWithSameLiterals(): void { - $rule = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([1, 12], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([1, 12], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $this->assertTrue($rule->equals($rule2)); } public function testSetAndGetType(): void { - $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $rule->setType(RuleSet::TYPE_REQUEST); $this->assertEquals(RuleSet::TYPE_REQUEST, $rule->getType()); @@ -64,7 +64,7 @@ public function testSetAndGetType(): void public function testEnable(): void { - $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $rule->disable(); $rule->enable(); @@ -74,7 +74,7 @@ public function testEnable(): void public function testDisable(): void { - $rule = new GenericRule(array(), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $rule->enable(); $rule->disable(); @@ -84,8 +84,8 @@ public function testDisable(): void public function testIsAssertions(): void { - $rule = new GenericRule(array(1, 12), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); - $rule2 = new GenericRule(array(1), Rule::RULE_ROOT_REQUIRE, array('packageName' => '', 'constraint' => new MatchAllConstraint)); + $rule = new GenericRule([1, 12], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); + $rule2 = new GenericRule([1], Rule::RULE_ROOT_REQUIRE, ['packageName' => '', 'constraint' => new MatchAllConstraint]); $this->assertFalse($rule->isAssertion()); $this->assertTrue($rule2->isAssertion()); @@ -93,10 +93,10 @@ public function testIsAssertions(): void public function testPrettyString(): void { - $pool = new Pool(array( + $pool = new Pool([ $p1 = $this->getPackage('foo', '2.1'), $p2 = $this->getPackage('baz', '1.1'), - )); + ]); $repositorySetMock = $this->getMockBuilder('Composer\Repository\RepositorySet')->disableOriginalConstructor()->getMock(); $requestMock = $this->getMockBuilder('Composer\DependencyResolver\Request')->disableOriginalConstructor()->getMock(); @@ -104,7 +104,7 @@ public function testPrettyString(): void $emptyConstraint = new MatchAllConstraint(); $emptyConstraint->setPrettyString('*'); - $rule = new GenericRule(array($p1->getId(), -$p2->getId()), Rule::RULE_PACKAGE_REQUIRES, new Link('baz', 'foo', $emptyConstraint)); + $rule = new GenericRule([$p1->getId(), -$p2->getId()], Rule::RULE_PACKAGE_REQUIRES, new Link('baz', 'foo', $emptyConstraint)); $this->assertEquals('baz 1.1 relates to foo * -> satisfiable by foo[2.1].', $rule->getPrettyString($repositorySetMock, $requestMock, $pool, false)); } diff --git a/tests/Composer/Test/DependencyResolver/SolverTest.php b/tests/Composer/Test/DependencyResolver/SolverTest.php index a3c2e3d3aced..9955d50c464d 100644 --- a/tests/Composer/Test/DependencyResolver/SolverTest.php +++ b/tests/Composer/Test/DependencyResolver/SolverTest.php @@ -66,9 +66,9 @@ public function testSolverInstallSingle(): void $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageA], + ]); } public function testSolverRemoveIfNotRequested(): void @@ -76,9 +76,9 @@ public function testSolverRemoveIfNotRequested(): void $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->reposComplete(); - $this->checkSolverResult(array( - array('job' => 'remove', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'remove', 'package' => $packageA], + ]); } public function testInstallNonExistingPackageFails(): void @@ -113,9 +113,9 @@ public function testSolverInstallSamePackageFromDifferentRepositories(): void $this->request->requireName('foo'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $foo1), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $foo1], + ]); } public function testSolverInstallWithDeps(): void @@ -124,16 +124,16 @@ public function testSolverInstallWithDeps(): void $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.1'), Link::TYPE_REQUIRE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.1'), Link::TYPE_REQUIRE)]); $this->reposComplete(); $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageB), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageB], + ['job' => 'install', 'package' => $packageA], + ]); } public function testSolverInstallHonoursNotEqualOperator(): void @@ -144,22 +144,22 @@ public function testSolverInstallHonoursNotEqualOperator(): void $this->repo->addPackage($newPackageB12 = $this->getPackage('B', '1.2')); $this->repo->addPackage($newPackageB13 = $this->getPackage('B', '1.3')); - $packageA->setRequires(array( - 'b' => new Link('A', 'B', new MultiConstraint(array( + $packageA->setRequires([ + 'b' => new Link('A', 'B', new MultiConstraint([ $this->getVersionConstraint('<=', '1.3'), $this->getVersionConstraint('<>', '1.3'), $this->getVersionConstraint('!=', '1.2'), - )), Link::TYPE_REQUIRE), - )); + ]), Link::TYPE_REQUIRE), + ]); $this->reposComplete(); $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $newPackageB11), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $newPackageB11], + ['job' => 'install', 'package' => $packageA], + ]); } public function testSolverInstallWithDepsInOrder(): void @@ -168,13 +168,13 @@ public function testSolverInstallWithDepsInOrder(): void $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($packageC = $this->getPackage('C', '1.0')); - $packageB->setRequires(array( + $packageB->setRequires([ 'a' => new Link('B', 'A', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), 'c' => new Link('B', 'C', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); - $packageC->setRequires(array( + ]); + $packageC->setRequires([ 'a' => new Link('C', 'A', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); + ]); $this->reposComplete(); @@ -182,11 +182,11 @@ public function testSolverInstallWithDepsInOrder(): void $this->request->requireName('B'); $this->request->requireName('C'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), - array('job' => 'install', 'package' => $packageC), - array('job' => 'install', 'package' => $packageB), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageA], + ['job' => 'install', 'package' => $packageC], + ['job' => 'install', 'package' => $packageB], + ]); } /** @@ -215,28 +215,28 @@ public function testSolverMultiPackageNameVersionResolutionDependsOnRequireOrder $this->repo->addPackage($extForPhp74 = $this->getPackage('ourcustom/ext-foobar', '1.0')); $this->repo->addPackage($extForPhp80 = $this->getPackage('ourcustom/ext-foobar', '1.0')); - $extForPhp74->setRequires(array( - 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( + $extForPhp74->setRequires([ + 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint([ $this->getVersionConstraint('>=', '7.4.0'), $this->getVersionConstraint('<', '7.5.0'), - )), Link::TYPE_REQUIRE), - )); - $extForPhp80->setRequires(array( - 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( + ]), Link::TYPE_REQUIRE), + ]); + $extForPhp80->setRequires([ + 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint([ $this->getVersionConstraint('>=', '8.0.0'), $this->getVersionConstraint('<', '8.1.0'), - )), Link::TYPE_REQUIRE), - )); + ]), Link::TYPE_REQUIRE), + ]); $this->reposComplete(); $this->request->requireName('ourcustom/PHP'); $this->request->requireName('ourcustom/ext-foobar'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $php80), - array('job' => 'install', 'package' => $extForPhp80), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $php80], + ['job' => 'install', 'package' => $extForPhp80], + ]); // now we flip the requirements around: we request "ext-foobar" before "php" // because the ext-foobar package that requires php74 comes first in the repo, and the one that requires php80 second, the solver will pick the one for php74, and then, as it is a dependency, also php74 @@ -246,10 +246,10 @@ public function testSolverMultiPackageNameVersionResolutionDependsOnRequireOrder $this->request->requireName('ourcustom/ext-foobar'); $this->request->requireName('ourcustom/PHP'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $php74), - array('job' => 'install', 'package' => $extForPhp74), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $php74], + ['job' => 'install', 'package' => $extForPhp74], + ]); } /** @@ -264,38 +264,38 @@ public function testSolverMultiPackageNameVersionResolutionIsIndependentOfRequir $this->repo->addPackage($extForPhp80 = $this->getPackage('ourcustom/ext-foobar', '1.0')); // note we are inserting this one into the repo first, unlike in the previous test $this->repo->addPackage($extForPhp74 = $this->getPackage('ourcustom/ext-foobar', '1.0')); - $extForPhp80->setRequires(array( - 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( + $extForPhp80->setRequires([ + 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint([ $this->getVersionConstraint('>=', '8.0.0'), $this->getVersionConstraint('<', '8.1.0'), - )), Link::TYPE_REQUIRE), - )); - $extForPhp74->setRequires(array( - 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint(array( + ]), Link::TYPE_REQUIRE), + ]); + $extForPhp74->setRequires([ + 'ourcustom/php' => new Link('ourcustom/ext-foobar', 'ourcustom/PHP', new MultiConstraint([ $this->getVersionConstraint('>=', '7.4.0'), $this->getVersionConstraint('<', '7.5.0'), - )), Link::TYPE_REQUIRE), - )); + ]), Link::TYPE_REQUIRE), + ]); $this->reposComplete(); $this->request->requireName('ourcustom/PHP'); $this->request->requireName('ourcustom/ext-foobar'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $php80), - array('job' => 'install', 'package' => $extForPhp80), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $php80], + ['job' => 'install', 'package' => $extForPhp80], + ]); // unlike in the previous test, the order of requirements no longer matters now $this->request = new Request($this->repoLocked); $this->request->requireName('ourcustom/ext-foobar'); $this->request->requireName('ourcustom/PHP'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $php80), - array('job' => 'install', 'package' => $extForPhp80), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $php80], + ['job' => 'install', 'package' => $extForPhp80], + ]); } public function testSolverFixLocked(): void @@ -305,7 +305,7 @@ public function testSolverFixLocked(): void $this->request->fixPackage($packageA); - $this->checkSolverResult(array()); + $this->checkSolverResult([]); } public function testSolverFixLockedWithAlternative(): void @@ -316,7 +316,7 @@ public function testSolverFixLockedWithAlternative(): void $this->request->fixPackage($packageA); - $this->checkSolverResult(array()); + $this->checkSolverResult([]); } public function testSolverUpdateDoesOnlyUpdate(): void @@ -326,14 +326,14 @@ public function testSolverUpdateDoesOnlyUpdate(): void $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); $this->reposComplete(); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0.0.0'), Link::TYPE_REQUIRE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0.0.0'), Link::TYPE_REQUIRE)]); $this->request->fixPackage($packageA); $this->request->requireName('B', $this->getVersionConstraint('=', '1.1.0.0')); - $this->checkSolverResult(array( - array('job' => 'update', 'from' => $packageB, 'to' => $newPackageB), - )); + $this->checkSolverResult([ + ['job' => 'update', 'from' => $packageB, 'to' => $newPackageB], + ]); } public function testSolverUpdateSingle(): void @@ -344,9 +344,9 @@ public function testSolverUpdateSingle(): void $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'update', 'from' => $packageA, 'to' => $newPackageA), - )); + $this->checkSolverResult([ + ['job' => 'update', 'from' => $packageA, 'to' => $newPackageA], + ]); } public function testSolverUpdateAll(): void @@ -356,17 +356,17 @@ public function testSolverUpdateAll(): void $this->repo->addPackage($newPackageA = $this->getPackage('A', '1.1')); $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); - $packageA->setRequires(array('b' => new Link('A', 'B', new MatchAllConstraint(), Link::TYPE_REQUIRE))); - $newPackageA->setRequires(array('b' => new Link('A', 'B', new MatchAllConstraint(), Link::TYPE_REQUIRE))); + $packageA->setRequires(['b' => new Link('A', 'B', new MatchAllConstraint(), Link::TYPE_REQUIRE)]); + $newPackageA->setRequires(['b' => new Link('A', 'B', new MatchAllConstraint(), Link::TYPE_REQUIRE)]); $this->reposComplete(); $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'update', 'from' => $packageB, 'to' => $newPackageB), - array('job' => 'update', 'from' => $packageA, 'to' => $newPackageA), - )); + $this->checkSolverResult([ + ['job' => 'update', 'from' => $packageB, 'to' => $newPackageB], + ['job' => 'update', 'from' => $packageA, 'to' => $newPackageA], + ]); } public function testSolverUpdateCurrent(): void @@ -377,7 +377,7 @@ public function testSolverUpdateCurrent(): void $this->request->requireName('A'); - $this->checkSolverResult(array()); + $this->checkSolverResult([]); } public function testSolverUpdateOnlyUpdatesSelectedPackage(): void @@ -392,9 +392,9 @@ public function testSolverUpdateOnlyUpdatesSelectedPackage(): void $this->request->requireName('A'); $this->request->fixPackage($packageB); - $this->checkSolverResult(array( - array('job' => 'update', 'from' => $packageA, 'to' => $packageAnewer), - )); + $this->checkSolverResult([ + ['job' => 'update', 'from' => $packageA, 'to' => $packageAnewer], + ]); } public function testSolverUpdateConstrained(): void @@ -406,11 +406,11 @@ public function testSolverUpdateConstrained(): void $this->request->requireName('A', $this->getVersionConstraint('<', '2.0.0.0')); - $this->checkSolverResult(array(array( + $this->checkSolverResult([[ 'job' => 'update', 'from' => $packageA, 'to' => $newPackageA, - ))); + ]]); } public function testSolverUpdateFullyConstrained(): void @@ -422,11 +422,11 @@ public function testSolverUpdateFullyConstrained(): void $this->request->requireName('A', $this->getVersionConstraint('<', '2.0.0.0')); - $this->checkSolverResult(array(array( + $this->checkSolverResult([[ 'job' => 'update', 'from' => $packageA, 'to' => $newPackageA, - ))); + ]]); } public function testSolverUpdateFullyConstrainedPrunesInstalledPackages(): void @@ -439,17 +439,17 @@ public function testSolverUpdateFullyConstrainedPrunesInstalledPackages(): void $this->request->requireName('A', $this->getVersionConstraint('<', '2.0.0.0')); - $this->checkSolverResult(array( - array( + $this->checkSolverResult([ + [ 'job' => 'remove', 'package' => $packageB, - ), - array( + ], + [ 'job' => 'update', 'from' => $packageA, 'to' => $newPackageA, - ), - )); + ], + ]); } public function testSolverAllJobs(): void @@ -462,19 +462,19 @@ public function testSolverAllJobs(): void $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); $this->repo->addPackage($packageC = $this->getPackage('C', '1.1')); $this->repo->addPackage($this->getPackage('D', '1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.1'), Link::TYPE_REQUIRE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.1'), Link::TYPE_REQUIRE)]); $this->reposComplete(); $this->request->requireName('A'); $this->request->requireName('C'); - $this->checkSolverResult(array( - array('job' => 'remove', 'package' => $packageD), - array('job' => 'install', 'package' => $packageB), - array('job' => 'install', 'package' => $packageA), - array('job' => 'update', 'from' => $oldPackageC, 'to' => $packageC), - )); + $this->checkSolverResult([ + ['job' => 'remove', 'package' => $packageD], + ['job' => 'install', 'package' => $packageB], + ['job' => 'install', 'package' => $packageA], + ['job' => 'update', 'from' => $oldPackageC, 'to' => $packageC], + ]); } public function testSolverThreeAlternativeRequireAndConflict(): void @@ -483,33 +483,33 @@ public function testSolverThreeAlternativeRequireAndConflict(): void $this->repo->addPackage($middlePackageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($newPackageB = $this->getPackage('B', '1.1')); $this->repo->addPackage($oldPackageB = $this->getPackage('B', '0.9')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.1'), Link::TYPE_REQUIRE))); - $packageA->setConflicts(array('b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.0'), Link::TYPE_CONFLICT))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.1'), Link::TYPE_REQUIRE)]); + $packageA->setConflicts(['b' => new Link('A', 'B', $this->getVersionConstraint('<', '1.0'), Link::TYPE_CONFLICT)]); $this->reposComplete(); $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $middlePackageB), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $middlePackageB], + ['job' => 'install', 'package' => $packageA], + ]); } public function testSolverObsolete(): void { $this->repoLocked->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); - $packageB->setReplaces(array('a' => new Link('B', 'A', new MatchAllConstraint()))); + $packageB->setReplaces(['a' => new Link('B', 'A', new MatchAllConstraint())]); $this->reposComplete(); $this->request->requireName('B'); - $this->checkSolverResult(array( - array('job' => 'remove', 'package' => $packageA), - array('job' => 'install', 'package' => $packageB), - )); + $this->checkSolverResult([ + ['job' => 'remove', 'package' => $packageA], + ['job' => 'install', 'package' => $packageB], + ]); } public function testInstallOneOfTwoAlternatives(): void @@ -521,17 +521,17 @@ public function testInstallOneOfTwoAlternatives(): void $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageA], + ]); } public function testInstallProvider(): void { $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageQ = $this->getPackage('Q', '1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageQ->setProvides(array('b' => new Link('Q', 'B', $this->getVersionConstraint('=', '1.0'), Link::TYPE_PROVIDE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageQ->setProvides(['b' => new Link('Q', 'B', $this->getVersionConstraint('=', '1.0'), Link::TYPE_PROVIDE)]); $this->reposComplete(); @@ -548,25 +548,25 @@ public function testSkipReplacerOfExistingPackage(): void $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageQ = $this->getPackage('Q', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageQ->setReplaces(array('b' => new Link('Q', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageQ->setReplaces(['b' => new Link('Q', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE)]); $this->reposComplete(); $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageB), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageB], + ['job' => 'install', 'package' => $packageA], + ]); } public function testNoInstallReplacerOfMissingPackage(): void { $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageQ = $this->getPackage('Q', '1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageQ->setReplaces(array('b' => new Link('Q', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageQ->setReplaces(['b' => new Link('Q', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE)]); $this->reposComplete(); @@ -582,56 +582,56 @@ public function testSkipReplacedPackageIfReplacerIsSelected(): void $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageQ = $this->getPackage('Q', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageQ->setReplaces(array('b' => new Link('Q', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageQ->setReplaces(['b' => new Link('Q', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE)]); $this->reposComplete(); $this->request->requireName('A'); $this->request->requireName('Q'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageQ), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageQ], + ['job' => 'install', 'package' => $packageA], + ]); } public function testPickOlderIfNewerConflicts(): void { $this->repo->addPackage($packageX = $this->getPackage('X', '1.0')); - $packageX->setRequires(array( + $packageX->setRequires([ 'a' => new Link('X', 'A', $this->getVersionConstraint('>=', '2.0.0.0'), Link::TYPE_REQUIRE), 'b' => new Link('X', 'B', $this->getVersionConstraint('>=', '2.0.0.0'), Link::TYPE_REQUIRE), - )); + ]); $this->repo->addPackage($packageA = $this->getPackage('A', '2.0.0')); $this->repo->addPackage($newPackageA = $this->getPackage('A', '2.1.0')); $this->repo->addPackage($newPackageB = $this->getPackage('B', '2.1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '2.0.0.0'), Link::TYPE_REQUIRE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '2.0.0.0'), Link::TYPE_REQUIRE)]); // new package A depends on version of package B that does not exist // => new package A is not installable - $newPackageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '2.2.0.0'), Link::TYPE_REQUIRE))); + $newPackageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '2.2.0.0'), Link::TYPE_REQUIRE)]); // add a package S replacing both A and B, so that S and B or S and A cannot be simultaneously installed // but an alternative option for A and B both exists // this creates a more difficult so solve conflict $this->repo->addPackage($packageS = $this->getPackage('S', '2.0.0')); - $packageS->setReplaces(array( + $packageS->setReplaces([ 'a' => new Link('S', 'A', $this->getVersionConstraint('>=', '2.0.0.0'), Link::TYPE_REPLACE), 'b' => new Link('S', 'B', $this->getVersionConstraint('>=', '2.0.0.0'), Link::TYPE_REPLACE), - )); + ]); $this->reposComplete(); $this->request->requireName('X'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $newPackageB), - array('job' => 'install', 'package' => $packageA), - array('job' => 'install', 'package' => $packageX), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $newPackageB], + ['job' => 'install', 'package' => $packageA], + ['job' => 'install', 'package' => $packageX], + ]); } public function testInstallCircularRequire(): void @@ -639,17 +639,17 @@ public function testInstallCircularRequire(): void $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB1 = $this->getPackage('B', '0.9')); $this->repo->addPackage($packageB2 = $this->getPackage('B', '1.1')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageB2->setRequires(array('a' => new Link('B', 'A', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageB2->setRequires(['a' => new Link('B', 'A', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); $this->reposComplete(); $this->request->requireName('A'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageB2), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageB2], + ['job' => 'install', 'package' => $packageA], + ]); } public function testInstallAlternativeWithCircularRequire(): void @@ -658,24 +658,24 @@ public function testInstallAlternativeWithCircularRequire(): void $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); $this->repo->addPackage($packageC = $this->getPackage('C', '1.0')); $this->repo->addPackage($packageD = $this->getPackage('D', '1.0')); - $packageA->setRequires(array('b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageB->setRequires(array('virtual' => new Link('B', 'Virtual', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE))); - $packageC->setProvides(array('virtual' => new Link('C', 'Virtual', $this->getVersionConstraint('==', '1.0'), Link::TYPE_PROVIDE))); - $packageD->setProvides(array('virtual' => new Link('D', 'Virtual', $this->getVersionConstraint('==', '1.0'), Link::TYPE_PROVIDE))); + $packageA->setRequires(['b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageB->setRequires(['virtual' => new Link('B', 'Virtual', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE)]); + $packageC->setProvides(['virtual' => new Link('C', 'Virtual', $this->getVersionConstraint('==', '1.0'), Link::TYPE_PROVIDE)]); + $packageD->setProvides(['virtual' => new Link('D', 'Virtual', $this->getVersionConstraint('==', '1.0'), Link::TYPE_PROVIDE)]); - $packageC->setRequires(array('a' => new Link('C', 'A', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE))); - $packageD->setRequires(array('a' => new Link('D', 'A', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE))); + $packageC->setRequires(['a' => new Link('C', 'A', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE)]); + $packageD->setRequires(['a' => new Link('D', 'A', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE)]); $this->reposComplete(); $this->request->requireName('A'); $this->request->requireName('C'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageB), - array('job' => 'install', 'package' => $packageA), - array('job' => 'install', 'package' => $packageC), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageB], + ['job' => 'install', 'package' => $packageA], + ['job' => 'install', 'package' => $packageC], + ]); } /** @@ -689,30 +689,30 @@ public function testUseReplacerIfNecessary(): void $this->repo->addPackage($packageD = $this->getPackage('D', '1.0')); $this->repo->addPackage($packageD2 = $this->getPackage('D', '1.1')); - $packageA->setRequires(array( + $packageA->setRequires([ 'b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), 'c' => new Link('A', 'C', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageD->setReplaces(array( + $packageD->setReplaces([ 'b' => new Link('D', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE), 'c' => new Link('D', 'C', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE), - )); + ]); - $packageD2->setReplaces(array( + $packageD2->setReplaces([ 'b' => new Link('D', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE), 'c' => new Link('D', 'C', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REPLACE), - )); + ]); $this->reposComplete(); $this->request->requireName('A'); $this->request->requireName('D'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageD2), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageD2], + ['job' => 'install', 'package' => $packageA], + ]); } public function testIssue265(): void @@ -725,20 +725,20 @@ public function testIssue265(): void $this->repo->addPackage($packageC = $this->getPackage('C', '2.0-dev')); $this->repo->addPackage($packageD = $this->getPackage('D', '2.0.9')); - $packageC->setRequires(array( + $packageC->setRequires([ 'a' => new Link('C', 'A', $this->getVersionConstraint('>=', '2.0'), Link::TYPE_REQUIRE), 'd' => new Link('C', 'D', $this->getVersionConstraint('>=', '2.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageD->setRequires(array( + $packageD->setRequires([ 'a' => new Link('D', 'A', $this->getVersionConstraint('>=', '2.1'), Link::TYPE_REQUIRE), 'b' => new Link('D', 'B', $this->getVersionConstraint('>=', '2.0-dev'), Link::TYPE_REQUIRE), - )); + ]); - $packageB1->setRequires(array('a' => new Link('B', 'A', $this->getVersionConstraint('==', '2.1.0.0-dev'), Link::TYPE_REQUIRE))); - $packageB2->setRequires(array('a' => new Link('B', 'A', $this->getVersionConstraint('==', '2.1.0.0-dev'), Link::TYPE_REQUIRE))); + $packageB1->setRequires(['a' => new Link('B', 'A', $this->getVersionConstraint('==', '2.1.0.0-dev'), Link::TYPE_REQUIRE)]); + $packageB2->setRequires(['a' => new Link('B', 'A', $this->getVersionConstraint('==', '2.1.0.0-dev'), Link::TYPE_REQUIRE)]); - $packageB2->setReplaces(array('d' => new Link('B', 'D', $this->getVersionConstraint('==', '2.0.9.0'), Link::TYPE_REPLACE))); + $packageB2->setReplaces(['d' => new Link('B', 'D', $this->getVersionConstraint('==', '2.0.9.0'), Link::TYPE_REPLACE)]); $this->reposComplete(); @@ -754,9 +754,9 @@ public function testConflictResultEmpty(): void { $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); - $packageA->setConflicts(array( + $packageA->setConflicts([ 'b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_CONFLICT), - )); + ]); $this->reposComplete(); @@ -788,9 +788,9 @@ public function testUnsatisfiableRequires(): void $this->repo->addPackage($packageA = $this->getPackage('A', '1.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); - $packageA->setRequires(array( + $packageA->setRequires([ 'b' => new Link('A', 'B', $this->getVersionConstraint('>=', '2.0'), Link::TYPE_REQUIRE), - )); + ]); $this->reposComplete(); @@ -821,18 +821,18 @@ public function testRequireMismatchException(): void $this->repo->addPackage($packageC = $this->getPackage('C', '1.0')); $this->repo->addPackage($packageD = $this->getPackage('D', '1.0')); - $packageA->setRequires(array( + $packageA->setRequires([ 'b' => new Link('A', 'B', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); - $packageB->setRequires(array( + ]); + $packageB->setRequires([ 'c' => new Link('B', 'C', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); - $packageC->setRequires(array( + ]); + $packageC->setRequires([ 'd' => new Link('C', 'D', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); - $packageD->setRequires(array( + ]); + $packageD->setRequires([ 'b' => new Link('D', 'B', $this->getVersionConstraint('<', '1.0'), Link::TYPE_REQUIRE), - )); + ]); $this->reposComplete(); @@ -869,23 +869,23 @@ public function testLearnLiteralsWithSortedRuleLiterals(): void $this->repo->addPackage($packageSymfony = $this->getPackage('symfony/symfony', '2.0')); $this->repo->addPackage($packageTwigBridge = $this->getPackage('symfony/twig-bridge', '2.0')); - $packageTwigBridge->setRequires(array( + $packageTwigBridge->setRequires([ 'twig/twig' => new Link('symfony/twig-bridge', 'twig/twig', $this->getVersionConstraint('<', '2.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageSymfony->setReplaces(array( + $packageSymfony->setReplaces([ 'symfony/twig-bridge' => new Link('symfony/symfony', 'symfony/twig-bridge', $this->getVersionConstraint('==', '2.0'), Link::TYPE_REPLACE), - )); + ]); $this->reposComplete(); $this->request->requireName('symfony/twig-bridge'); $this->request->requireName('twig/twig'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageTwig16), - array('job' => 'install', 'package' => $packageTwigBridge), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageTwig16], + ['job' => 'install', 'package' => $packageTwigBridge], + ]); } public function testInstallRecursiveAliasDependencies(): void @@ -894,12 +894,12 @@ public function testInstallRecursiveAliasDependencies(): void $this->repo->addPackage($packageB = $this->getPackage('B', '2.0')); $this->repo->addPackage($packageA2 = $this->getPackage('A', '2.0')); - $packageA2->setRequires(array( + $packageA2->setRequires([ 'b' => new Link('A', 'B', $this->getVersionConstraint('==', '2.0'), Link::TYPE_REQUIRE, '== 2.0'), - )); - $packageB->setRequires(array( + ]); + $packageB->setRequires([ 'a' => new Link('B', 'A', $this->getVersionConstraint('>=', '2.0'), Link::TYPE_REQUIRE), - )); + ]); $this->repo->addPackage($packageA2Alias = $this->getAliasPackage($packageA2, '1.1')); @@ -907,11 +907,11 @@ public function testInstallRecursiveAliasDependencies(): void $this->request->requireName('A', $this->getVersionConstraint('==', '1.1.0.0')); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageB), - array('job' => 'install', 'package' => $packageA2), - array('job' => 'markAliasInstalled', 'package' => $packageA2Alias), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageB], + ['job' => 'install', 'package' => $packageA2], + ['job' => 'markAliasInstalled', 'package' => $packageA2Alias], + ]); } public function testInstallDevAlias(): void @@ -919,9 +919,9 @@ public function testInstallDevAlias(): void $this->repo->addPackage($packageA = $this->getPackage('A', '2.0')); $this->repo->addPackage($packageB = $this->getPackage('B', '1.0')); - $packageB->setRequires(array( + $packageB->setRequires([ 'a' => new Link('B', 'A', $this->getVersionConstraint('<', '2.0'), Link::TYPE_REQUIRE), - )); + ]); $this->repo->addPackage($packageAAlias = $this->getAliasPackage($packageA, '1.1')); @@ -930,11 +930,11 @@ public function testInstallDevAlias(): void $this->request->requireName('A', $this->getVersionConstraint('==', '2.0')); $this->request->requireName('B'); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), - array('job' => 'markAliasInstalled', 'package' => $packageAAlias), - array('job' => 'install', 'package' => $packageB), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageA], + ['job' => 'markAliasInstalled', 'package' => $packageAAlias], + ['job' => 'install', 'package' => $packageB], + ]); } public function testInstallRootAliasesIfAliasOfIsInstalled(): void @@ -957,14 +957,14 @@ public function testInstallRootAliasesIfAliasOfIsInstalled(): void $this->request->requireName('B', $this->getVersionConstraint('==', '1.0')); $this->request->requireName('C', $this->getVersionConstraint('==', '1.0')); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageA), - array('job' => 'markAliasInstalled', 'package' => $packageAAlias), - array('job' => 'install', 'package' => $packageB), - array('job' => 'markAliasInstalled', 'package' => $packageBAlias), - array('job' => 'install', 'package' => $packageC), - array('job' => 'markAliasInstalled', 'package' => $packageCAlias), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageA], + ['job' => 'markAliasInstalled', 'package' => $packageAAlias], + ['job' => 'install', 'package' => $packageB], + ['job' => 'markAliasInstalled', 'package' => $packageBAlias], + ['job' => 'install', 'package' => $packageC], + ['job' => 'markAliasInstalled', 'package' => $packageCAlias], + ]); } /** @@ -990,31 +990,31 @@ public function testLearnPositiveLiteral(): void $this->repo->addPackage($packageG2 = $this->getPackage('G', '2.0')); $this->repo->addPackage($packageG3 = $this->getPackage('G', '3.0')); - $packageA->setRequires(array( + $packageA->setRequires([ 'b' => new Link('A', 'B', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE), 'c' => new Link('A', 'C', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), 'd' => new Link('A', 'D', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageB->setRequires(array( + $packageB->setRequires([ 'e' => new Link('B', 'E', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageC1->setRequires(array( + $packageC1->setRequires([ 'f' => new Link('C', 'F', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE), - )); - $packageC2->setRequires(array( + ]); + $packageC2->setRequires([ 'f' => new Link('C', 'F', $this->getVersionConstraint('==', '1.0'), Link::TYPE_REQUIRE), 'g' => new Link('C', 'G', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageD->setRequires(array( + $packageD->setRequires([ 'f' => new Link('D', 'F', $this->getVersionConstraint('>=', '1.0'), Link::TYPE_REQUIRE), - )); + ]); - $packageE->setRequires(array( + $packageE->setRequires([ 'g' => new Link('E', 'G', $this->getVersionConstraint('<=', '2.0'), Link::TYPE_REQUIRE), - )); + ]); $this->reposComplete(); @@ -1025,33 +1025,27 @@ public function testLearnPositiveLiteral(): void // check correct setup for assertion later $this->assertFalse($this->solver->testFlagLearnedPositiveLiteral); - $this->checkSolverResult(array( - array('job' => 'install', 'package' => $packageF1), - array('job' => 'install', 'package' => $packageD), - array('job' => 'install', 'package' => $packageG2), - array('job' => 'install', 'package' => $packageC2), - array('job' => 'install', 'package' => $packageE), - array('job' => 'install', 'package' => $packageB), - array('job' => 'install', 'package' => $packageA), - )); + $this->checkSolverResult([ + ['job' => 'install', 'package' => $packageF1], + ['job' => 'install', 'package' => $packageD], + ['job' => 'install', 'package' => $packageG2], + ['job' => 'install', 'package' => $packageC2], + ['job' => 'install', 'package' => $packageE], + ['job' => 'install', 'package' => $packageB], + ['job' => 'install', 'package' => $packageA], + ]); // verify that the code path leading to a negative literal resulting in a positive learned literal is actually // executed $this->assertTrue($this->solver->testFlagLearnedPositiveLiteral); } - /** - * @return void - */ protected function reposComplete(): void { $this->repoSet->addRepository($this->repo); $this->repoSet->addRepository($this->repoLocked); } - /** - * @return void - */ protected function createSolver(): void { $io = new NullIO(); @@ -1061,42 +1055,41 @@ protected function createSolver(): void /** * @param array $expected - * @return void */ protected function checkSolverResult(array $expected): void { $this->createSolver(); $transaction = $this->solver->solve($this->request); - $result = array(); + $result = []; foreach ($transaction->getOperations() as $operation) { if ($operation instanceof UpdateOperation) { - $result[] = array( + $result[] = [ 'job' => 'update', 'from' => $operation->getInitialPackage(), 'to' => $operation->getTargetPackage(), - ); + ]; } elseif ($operation instanceof MarkAliasInstalledOperation || $operation instanceof MarkAliasUninstalledOperation) { - $result[] = array( + $result[] = [ 'job' => $operation->getOperationType(), 'package' => $operation->getPackage(), - ); + ]; } elseif ($operation instanceof UninstallOperation || $operation instanceof InstallOperation) { $job = ('uninstall' === $operation->getOperationType() ? 'remove' : 'install'); - $result[] = array( + $result[] = [ 'job' => $job, 'package' => $operation->getPackage(), - ); + ]; } else { throw new \LogicException('Unexpected operation: '.get_class($operation)); } } - $expectedReadable = array(); + $expectedReadable = []; foreach ($expected as $op) { $expectedReadable[] = array_map('strval', $op); } - $resultReadable = array(); + $resultReadable = []; foreach ($result as $op) { $resultReadable[] = array_map('strval', $op); } diff --git a/tests/Composer/Test/DependencyResolver/TransactionTest.php b/tests/Composer/Test/DependencyResolver/TransactionTest.php index 0cb73d3fc821..4f274d25de50 100644 --- a/tests/Composer/Test/DependencyResolver/TransactionTest.php +++ b/tests/Composer/Test/DependencyResolver/TransactionTest.php @@ -30,15 +30,15 @@ public function setUp(): void public function testTransactionGenerationAndSorting(): void { - $presentPackages = array( + $presentPackages = [ $packageA = $this->getPackage('a/a', 'dev-master'), $packageAalias = $this->getAliasPackage($packageA, '1.0.x-dev'), $packageB = $this->getPackage('b/b', '1.0.0'), $packageE = $this->getPackage('e/e', 'dev-foo'), $packageEalias = $this->getAliasPackage($packageE, '1.0.x-dev'), $packageC = $this->getPackage('c/c', '1.0.0'), - ); - $resultPackages = array( + ]; + $resultPackages = [ $packageA, $packageAalias, $packageBnew = $this->getPackage('b/b', '2.1.3'), @@ -54,71 +54,69 @@ public function testTransactionGenerationAndSorting(): void $dlModifyingPlugin = $this->getPackage('x/downloads-modifying', '1.0.0'), $dlModifyingPlugin2Dep = $this->getPackage('x/downloads-modifying2-dep', '1.0.0'), $dlModifyingPlugin2 = $this->getPackage('x/downloads-modifying2', '1.0.0'), - ); + ]; $plugin->setType('composer-installer'); - foreach (array($plugin2, $dlModifyingPlugin, $dlModifyingPlugin2) as $pluginPackage) { + foreach ([$plugin2, $dlModifyingPlugin, $dlModifyingPlugin2] as $pluginPackage) { $pluginPackage->setType('composer-plugin'); } - $plugin2->setRequires(array( + $plugin2->setRequires([ 'x/plugin2-dep' => new Link('x/plugin2', 'x/plugin2-dep', $this->getVersionConstraint('=', '1.0.0'), Link::TYPE_REQUIRE), - )); - $dlModifyingPlugin2->setRequires(array( + ]); + $dlModifyingPlugin2->setRequires([ 'x/downloads-modifying2-dep' => new Link('x/downloads-modifying2', 'x/downloads-modifying2-dep', $this->getVersionConstraint('=', '1.0.0'), Link::TYPE_REQUIRE), - )); - $dlModifyingPlugin->setExtra(array('plugin-modifies-downloads' => true)); - $dlModifyingPlugin2->setExtra(array('plugin-modifies-downloads' => true)); + ]); + $dlModifyingPlugin->setExtra(['plugin-modifies-downloads' => true]); + $dlModifyingPlugin2->setExtra(['plugin-modifies-downloads' => true]); - $packageD->setRequires(array( + $packageD->setRequires([ 'f/f' => new Link('d/d', 'f/f', $this->getVersionConstraint('>', '0.2'), Link::TYPE_REQUIRE), 'g/provider' => new Link('d/d', 'g/provider', $this->getVersionConstraint('>', '0.2'), Link::TYPE_REQUIRE), - )); - $packageG->setProvides(array('g/provider' => new Link('g/g', 'g/provider', $this->getVersionConstraint('==', '1.0.0'), Link::TYPE_PROVIDE))); + ]); + $packageG->setProvides(['g/provider' => new Link('g/g', 'g/provider', $this->getVersionConstraint('==', '1.0.0'), Link::TYPE_PROVIDE)]); - $expectedOperations = array( - array('job' => 'uninstall', 'package' => $packageC), - array('job' => 'uninstall', 'package' => $packageE), - array('job' => 'markAliasUninstalled', 'package' => $packageEalias), - array('job' => 'install', 'package' => $dlModifyingPlugin), - array('job' => 'install', 'package' => $dlModifyingPlugin2Dep), - array('job' => 'install', 'package' => $dlModifyingPlugin2), - array('job' => 'install', 'package' => $plugin), - array('job' => 'install', 'package' => $plugin2Dep), - array('job' => 'install', 'package' => $plugin2), - array('job' => 'install', 'package' => $packageA0first), - array('job' => 'update', 'from' => $packageB, 'to' => $packageBnew), - array('job' => 'install', 'package' => $packageG), - array('job' => 'install', 'package' => $packageF), - array('job' => 'markAliasInstalled', 'package' => $packageFalias2), - array('job' => 'markAliasInstalled', 'package' => $packageFalias1), - array('job' => 'install', 'package' => $packageD), - ); + $expectedOperations = [ + ['job' => 'uninstall', 'package' => $packageC], + ['job' => 'uninstall', 'package' => $packageE], + ['job' => 'markAliasUninstalled', 'package' => $packageEalias], + ['job' => 'install', 'package' => $dlModifyingPlugin], + ['job' => 'install', 'package' => $dlModifyingPlugin2Dep], + ['job' => 'install', 'package' => $dlModifyingPlugin2], + ['job' => 'install', 'package' => $plugin], + ['job' => 'install', 'package' => $plugin2Dep], + ['job' => 'install', 'package' => $plugin2], + ['job' => 'install', 'package' => $packageA0first], + ['job' => 'update', 'from' => $packageB, 'to' => $packageBnew], + ['job' => 'install', 'package' => $packageG], + ['job' => 'install', 'package' => $packageF], + ['job' => 'markAliasInstalled', 'package' => $packageFalias2], + ['job' => 'markAliasInstalled', 'package' => $packageFalias1], + ['job' => 'install', 'package' => $packageD], + ]; $transaction = new Transaction($presentPackages, $resultPackages); $this->checkTransactionOperations($transaction, $expectedOperations); } /** - * @param \Composer\DependencyResolver\Transaction $transaction * @param array $expected - * @return void */ protected function checkTransactionOperations(Transaction $transaction, array $expected): void { - $result = array(); + $result = []; foreach ($transaction->getOperations() as $operation) { if ($operation instanceof UpdateOperation) { - $result[] = array( + $result[] = [ 'job' => 'update', 'from' => $operation->getInitialPackage(), 'to' => $operation->getTargetPackage(), - ); + ]; } elseif ($operation instanceof InstallOperation || $operation instanceof UninstallOperation || $operation instanceof MarkAliasInstalledOperation || $operation instanceof MarkAliasUninstalledOperation) { - $result[] = array( + $result[] = [ 'job' => $operation->getOperationType(), 'package' => $operation->getPackage(), - ); + ]; } else { throw new \UnexpectedValueException('Unknown operation type: '.get_class($operation)); } diff --git a/tests/Composer/Test/Downloader/ArchiveDownloaderTest.php b/tests/Composer/Test/Downloader/ArchiveDownloaderTest.php index c0d4d7ee7477..69a68f7b6f75 100644 --- a/tests/Composer/Test/Downloader/ArchiveDownloaderTest.php +++ b/tests/Composer/Test/Downloader/ArchiveDownloaderTest.php @@ -91,7 +91,6 @@ public function testProcessUrl3(): void /** * @dataProvider provideUrls - * @param string $url */ public function testProcessUrlRewriteDist(string $url): void { @@ -117,20 +116,18 @@ public function testProcessUrlRewriteDist(string $url): void public function provideUrls(): array { - return array( - array('https://api.github.com/repos/composer/composer/zipball/master'), - array('https://api.github.com/repos/composer/composer/tarball/master'), - array('https://github.com/composer/composer/zipball/master'), - array('https://www.github.com/composer/composer/tarball/master'), - array('https://github.com/composer/composer/archive/master.zip'), - array('https://github.com/composer/composer/archive/master.tar.gz'), - ); + return [ + ['https://api.github.com/repos/composer/composer/zipball/master'], + ['https://api.github.com/repos/composer/composer/tarball/master'], + ['https://github.com/composer/composer/zipball/master'], + ['https://www.github.com/composer/composer/tarball/master'], + ['https://github.com/composer/composer/archive/master.zip'], + ['https://github.com/composer/composer/archive/master.tar.gz'], + ]; } /** * @dataProvider provideBitbucketUrls - * @param string $url - * @param string $extension */ public function testProcessUrlRewriteBitbucketDist(string $url, string $extension): void { @@ -156,11 +153,11 @@ public function testProcessUrlRewriteBitbucketDist(string $url, string $extensio public function provideBitbucketUrls(): array { - return array( - array('https://bitbucket.org/davereid/drush-virtualhost/get/77ca490c26ac818e024d1138aa8bd3677d1ef21f', 'zip'), - array('https://bitbucket.org/davereid/drush-virtualhost/get/master', 'tar.gz'), - array('https://bitbucket.org/davereid/drush-virtualhost/get/v1.0', 'tar.bz2'), - ); + return [ + ['https://bitbucket.org/davereid/drush-virtualhost/get/77ca490c26ac818e024d1138aa8bd3677d1ef21f', 'zip'], + ['https://bitbucket.org/davereid/drush-virtualhost/get/master', 'tar.gz'], + ['https://bitbucket.org/davereid/drush-virtualhost/get/v1.0', 'tar.bz2'], + ]; } /** @@ -170,11 +167,11 @@ private function getArchiveDownloaderMock() { return $this->getMockForAbstractClass( 'Composer\Downloader\ArchiveDownloader', - array( + [ $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->config = $this->getMockBuilder('Composer\Config')->getMock(), new \Composer\Util\HttpDownloader($io, $this->config), - ) + ] ); } } diff --git a/tests/Composer/Test/Downloader/DownloadManagerTest.php b/tests/Composer/Test/Downloader/DownloadManagerTest.php index 324fc9772cac..9717c3a7a24d 100644 --- a/tests/Composer/Test/Downloader/DownloadManagerTest.php +++ b/tests/Composer/Test/Downloader/DownloadManagerTest.php @@ -76,8 +76,8 @@ public function testGetDownloaderForCorrectlyInstalledDistPackage(): void ->will($this->returnValue('dist')); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloader')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloader']) ->getMock(); $manager @@ -108,8 +108,8 @@ public function testGetDownloaderForIncorrectlyInstalledDistPackage(): void ->will($this->returnValue('source')); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloader')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloader']) ->getMock(); $manager @@ -142,8 +142,8 @@ public function testGetDownloaderForCorrectlyInstalledSourcePackage(): void ->will($this->returnValue('source')); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloader')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloader']) ->getMock(); $manager @@ -174,8 +174,8 @@ public function testGetDownloaderForIncorrectlyInstalledSourcePackage(): void ->will($this->returnValue('dist')); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloader')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloader']) ->getMock(); $manager @@ -227,8 +227,8 @@ public function testFullPackageDownload(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -278,8 +278,8 @@ public function testFullPackageDownloadFailover(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->exactly(2)) @@ -336,8 +336,8 @@ public function testDistOnlyPackageDownload(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -373,8 +373,8 @@ public function testSourceOnlyPackageDownload(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -403,8 +403,8 @@ public function testMetapackagePackageDownload(): void ->with('source'); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -440,8 +440,8 @@ public function testFullPackageDownloadWithSourcePreferred(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -478,8 +478,8 @@ public function testDistOnlyPackageDownloadWithSourcePreferred(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -516,8 +516,8 @@ public function testSourceOnlyPackageDownloadWithSourcePreferred(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -640,10 +640,7 @@ public function testUpdateDistWithNotEqualTypes(): void /** * @dataProvider updatesProvider - * @param null|string $prevPkgSource - * @param null|bool $prevPkgIsDev * @param string[] $targetAvailable - * @param bool $targetIsDev * @param string[] $expected */ public function testGetAvailableSourcesUpdateSticksToSameSource(?string $prevPkgSource, ?bool $prevPkgIsDev, array $targetAvailable, bool $targetIsDev, array $expected): void @@ -678,25 +675,25 @@ public function testGetAvailableSourcesUpdateSticksToSameSource(?string $prevPkg public static function updatesProvider(): array { - return array( + return [ // prevPkg source, prevPkg isDev, pkg available, pkg isDev, expected // updates keep previous source as preference - array('source', false, array('source', 'dist'), false, array('source', 'dist')), - array('dist', false, array('source', 'dist'), false, array('dist', 'source')), + ['source', false, ['source', 'dist'], false, ['source', 'dist']], + ['dist', false, ['source', 'dist'], false, ['dist', 'source']], // updates do not keep previous source if target package does not have it - array('source', false, array('dist'), false, array('dist')), - array('dist', false, array('source'), false, array('source')), + ['source', false, ['dist'], false, ['dist']], + ['dist', false, ['source'], false, ['source']], // updates do not keep previous source if target is dev and prev wasn't dev and installed from dist - array('source', false, array('source', 'dist'), true, array('source', 'dist')), - array('dist', false, array('source', 'dist'), true, array('source', 'dist')), + ['source', false, ['source', 'dist'], true, ['source', 'dist']], + ['dist', false, ['source', 'dist'], true, ['source', 'dist']], // install picks the right default - array(null, null, array('source', 'dist'), true, array('source', 'dist')), - array(null, null, array('dist'), true, array('dist')), - array(null, null, array('source'), true, array('source')), - array(null, null, array('source', 'dist'), false, array('dist', 'source')), - array(null, null, array('dist'), false, array('dist')), - array(null, null, array('source'), false, array('source')), - ); + [null, null, ['source', 'dist'], true, ['source', 'dist']], + [null, null, ['dist'], true, ['dist']], + [null, null, ['source'], true, ['source']], + [null, null, ['source', 'dist'], false, ['dist', 'source']], + [null, null, ['dist'], false, ['dist']], + [null, null, ['source'], false, ['source']], + ]; } public function testUpdateMetapackage(): void @@ -705,8 +702,8 @@ public function testUpdateMetapackage(): void $target = $this->createPackageMock(); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->exactly(2)) @@ -728,8 +725,8 @@ public function testRemove(): void ->with($package, 'vendor/bundles/FOS/UserBundle'); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -745,8 +742,8 @@ public function testMetapackageRemove(): void $package = $this->createPackageMock(); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -789,8 +786,8 @@ public function testInstallPreferenceWithoutPreferenceDev(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -833,8 +830,8 @@ public function testInstallPreferenceWithoutPreferenceNoDev(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) @@ -880,15 +877,15 @@ public function testInstallPreferenceWithoutMatchDev(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) ->method('getDownloaderForPackage') ->with($package) ->will($this->returnValue($downloader)); - $manager->setPreferences(array('foo/*' => 'source')); + $manager->setPreferences(['foo/*' => 'source']); $manager->download($package, 'target_dir'); } @@ -928,15 +925,15 @@ public function testInstallPreferenceWithoutMatchNoDev(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) ->method('getDownloaderForPackage') ->with($package) ->will($this->returnValue($downloader)); - $manager->setPreferences(array('foo/*' => 'source')); + $manager->setPreferences(['foo/*' => 'source']); $manager->download($package, 'target_dir'); } @@ -976,15 +973,15 @@ public function testInstallPreferenceWithMatchAutoDev(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) ->method('getDownloaderForPackage') ->with($package) ->will($this->returnValue($downloader)); - $manager->setPreferences(array('foo/*' => 'auto')); + $manager->setPreferences(['foo/*' => 'auto']); $manager->download($package, 'target_dir'); } @@ -1024,15 +1021,15 @@ public function testInstallPreferenceWithMatchAutoNoDev(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) ->method('getDownloaderForPackage') ->with($package) ->will($this->returnValue($downloader)); - $manager->setPreferences(array('foo/*' => 'auto')); + $manager->setPreferences(['foo/*' => 'auto']); $manager->download($package, 'target_dir'); } @@ -1068,15 +1065,15 @@ public function testInstallPreferenceWithMatchSource(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) ->method('getDownloaderForPackage') ->with($package) ->will($this->returnValue($downloader)); - $manager->setPreferences(array('foo/*' => 'source')); + $manager->setPreferences(['foo/*' => 'source']); $manager->download($package, 'target_dir'); } @@ -1112,15 +1109,15 @@ public function testInstallPreferenceWithMatchDist(): void ->will($this->returnValue(\React\Promise\resolve(null))); $manager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($this->io, false, $this->filesystem)) - ->onlyMethods(array('getDownloaderForPackage')) + ->setConstructorArgs([$this->io, false, $this->filesystem]) + ->onlyMethods(['getDownloaderForPackage']) ->getMock(); $manager ->expects($this->once()) ->method('getDownloaderForPackage') ->with($package) ->will($this->returnValue($downloader)); - $manager->setPreferences(array('foo/*' => 'dist')); + $manager->setPreferences(['foo/*' => 'dist']); $manager->download($package, 'target_dir'); } diff --git a/tests/Composer/Test/Downloader/FileDownloaderTest.php b/tests/Composer/Test/Downloader/FileDownloaderTest.php index 2bbbdb103c21..ee08a33f2f58 100644 --- a/tests/Composer/Test/Downloader/FileDownloaderTest.php +++ b/tests/Composer/Test/Downloader/FileDownloaderTest.php @@ -38,9 +38,8 @@ public function setUp(): void * @param \Composer\Cache $cache * @param \Composer\Util\HttpDownloader&\PHPUnit\Framework\MockObject\MockObject $httpDownloader * @param \Composer\Util\Filesystem $filesystem - * @return \Composer\Downloader\FileDownloader */ - protected function getDownloader(\Composer\IO\IOInterface $io = null, ?Config $config = null, EventDispatcher $eventDispatcher = null, \Composer\Cache $cache = null, $httpDownloader = null, Filesystem $filesystem = null): FileDownloader + protected function getDownloader(?\Composer\IO\IOInterface $io = null, ?Config $config = null, ?EventDispatcher $eventDispatcher = null, ?\Composer\Cache $cache = null, $httpDownloader = null, ?Filesystem $filesystem = null): FileDownloader { $io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $config = $config ?: $this->getConfig(); @@ -48,7 +47,7 @@ protected function getDownloader(\Composer\IO\IOInterface $io = null, ?Config $c $httpDownloader ->expects($this->any()) ->method('addCopy') - ->will($this->returnValue(\React\Promise\resolve(new Response(array('url' => 'http://example.org/'), 200, array(), 'file~')))); + ->will($this->returnValue(\React\Promise\resolve(new Response(['url' => 'http://example.org/'], 200, [], 'file~')))); $this->httpDownloader = $httpDownloader; return new FileDownloader($io, $config, $httpDownloader, $eventDispatcher, $cache, $filesystem); @@ -109,7 +108,7 @@ public function testDownloadButFileIsUnsaved(): void $ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $ioMock->expects($this->any()) ->method('write') - ->will($this->returnCallback(function ($messages, $newline = true) use ($path) { + ->will($this->returnCallback(static function ($messages, $newline = true) use ($path) { if (is_file($path.'/script.js')) { unlink($path.'/script.js'); } @@ -124,7 +123,7 @@ public function testDownloadButFileIsUnsaved(): void try { $loop = new Loop($this->httpDownloader); $promise = $downloader->download($package, $path); - $loop->wait(array($promise)); + $loop->wait([$promise]); $this->fail('Download was expected to throw'); } catch (\Exception $e) { @@ -166,7 +165,7 @@ public function testDownloadWithCustomProcessedUrl(): void $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->getProcessExecutorMock() ); - $dispatcher->addListener(PluginEvents::PRE_FILE_DOWNLOAD, function (PreFileDownloadEvent $event) use ($expectedUrl): void { + $dispatcher->addListener(PluginEvents::PRE_FILE_DOWNLOAD, static function (PreFileDownloadEvent $event) use ($expectedUrl): void { $event->setProcessedUrl($expectedUrl); }); @@ -198,7 +197,7 @@ public function testDownloadWithCustomProcessedUrl(): void $this->assertEquals($expectedUrl, $url, 'Failed assertion on $url argument of HttpDownloader::addCopy method:'); return \React\Promise\resolve( - new Response(array('url' => 'http://example.org/'), 200, array(), 'file~') + new Response(['url' => 'http://example.org/'], 200, [], 'file~') ); })); @@ -207,7 +206,7 @@ public function testDownloadWithCustomProcessedUrl(): void try { $loop = new Loop($this->httpDownloader); $promise = $downloader->download($package, $path); - $loop->wait(array($promise)); + $loop->wait([$promise]); $this->fail('Download was expected to throw'); } catch (\Exception $e) { @@ -250,7 +249,7 @@ public function testDownloadWithCustomCacheKey(): void $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->getProcessExecutorMock() ); - $dispatcher->addListener(PluginEvents::PRE_FILE_DOWNLOAD, function (PreFileDownloadEvent $event) use ($customCacheKey): void { + $dispatcher->addListener(PluginEvents::PRE_FILE_DOWNLOAD, static function (PreFileDownloadEvent $event) use ($customCacheKey): void { $event->setCustomCacheKey($customCacheKey); }); @@ -282,7 +281,7 @@ public function testDownloadWithCustomCacheKey(): void $this->assertEquals($expectedUrl, $url, 'Failed assertion on $url argument of HttpDownloader::addCopy method:'); return \React\Promise\resolve( - new Response(array('url' => 'http://example.org/'), 200, array(), 'file~') + new Response(['url' => 'http://example.org/'], 200, [], 'file~') ); })); @@ -291,7 +290,7 @@ public function testDownloadWithCustomCacheKey(): void try { $loop = new Loop($this->httpDownloader); $promise = $downloader->download($package, $path); - $loop->wait(array($promise)); + $loop->wait([$promise]); $this->fail('Download was expected to throw'); } catch (\Exception $e) { @@ -354,7 +353,7 @@ public function testDownloadFileWithInvalidChecksum(): void try { $loop = new Loop($this->httpDownloader); $promise = $downloader->download($package, $path); - $loop->wait(array($promise)); + $loop->wait([$promise]); $this->fail('Download was expected to throw'); } catch (\Exception $e) { @@ -403,7 +402,7 @@ public function testDowngradeShowsAppropriateMessage(): void $loop = new Loop($this->httpDownloader); $promise = $downloader->download($newPackage, $path, $oldPackage); - $loop->wait(array($promise)); + $loop->wait([$promise]); $downloader->update($oldPackage, $newPackage, $path); } diff --git a/tests/Composer/Test/Downloader/FossilDownloaderTest.php b/tests/Composer/Test/Downloader/FossilDownloaderTest.php index d6daa53bb286..6e789c76b65b 100644 --- a/tests/Composer/Test/Downloader/FossilDownloaderTest.php +++ b/tests/Composer/Test/Downloader/FossilDownloaderTest.php @@ -40,9 +40,8 @@ protected function tearDown(): void * @param \Composer\Config $config * @param \Composer\Test\Mock\ProcessExecutorMock $executor * @param \Composer\Util\Filesystem $filesystem - * @return FossilDownloader */ - protected function getDownloaderMock(\Composer\IO\IOInterface $io = null, \Composer\Config $config = null, \Composer\Test\Mock\ProcessExecutorMock $executor = null, Filesystem $filesystem = null): FossilDownloader + protected function getDownloaderMock(?\Composer\IO\IOInterface $io = null, ?\Composer\Config $config = null, ?\Composer\Test\Mock\ProcessExecutorMock $executor = null, ?Filesystem $filesystem = null): FossilDownloader { $io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $config = $config ?: $this->getConfig(['secure-http' => false]); @@ -73,14 +72,14 @@ public function testInstall(): void ->will($this->returnValue('trunk')); $packageMock->expects($this->once()) ->method('getSourceUrls') - ->will($this->returnValue(array('http://fossil.kd2.org/kd2fw/'))); + ->will($this->returnValue(['http://fossil.kd2.org/kd2fw/'])); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->getCmd('fossil clone -- \'http://fossil.kd2.org/kd2fw/\' \''.$this->workingDir.'.fossil\''), $this->getCmd('fossil open --nested -- \''.$this->workingDir.'.fossil\''), $this->getCmd('fossil update -- \'trunk\''), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, null, $process); $downloader->install($packageMock, $this->workingDir); @@ -117,16 +116,16 @@ public function testUpdate(): void ->will($this->returnValue('trunk')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('http://fossil.kd2.org/kd2fw/'))); + ->will($this->returnValue(['http://fossil.kd2.org/kd2fw/'])); $packageMock->expects($this->any()) ->method('getVersion') ->will($this->returnValue('1.0.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->getCmd("fossil changes"), $this->getCmd("fossil pull && fossil up 'trunk'"), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, null, $process); $downloader->prepare('update', $packageMock, $this->workingDir, $packageMock); @@ -143,9 +142,9 @@ public function testRemove(): void $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock(); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->getCmd('fossil changes'), - ), true); + ], true); $filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock(); $filesystem->expects($this->once()) diff --git a/tests/Composer/Test/Downloader/GitDownloaderTest.php b/tests/Composer/Test/Downloader/GitDownloaderTest.php index afcf69af0c07..03845dad41e9 100644 --- a/tests/Composer/Test/Downloader/GitDownloaderTest.php +++ b/tests/Composer/Test/Downloader/GitDownloaderTest.php @@ -48,7 +48,6 @@ protected function tearDown(): void /** * @param string|bool $version - * @return void */ private function initGitVersion($version): void { @@ -60,7 +59,6 @@ private function initGitVersion($version): void /** * @param ?\Composer\Config $config - * @return \Composer\Config */ protected function setupConfig($config = null): Config { @@ -69,7 +67,7 @@ protected function setupConfig($config = null): Config } if (!$config->has('home')) { $tmpDir = realpath(sys_get_temp_dir()).DIRECTORY_SEPARATOR.'cmptest-'.md5(uniqid('', true)); - $config->merge(array('config' => array('home' => $tmpDir))); + $config->merge(['config' => ['home' => $tmpDir]]); } return $config; @@ -80,9 +78,8 @@ protected function setupConfig($config = null): Config * @param \Composer\Config $config * @param \Composer\Test\Mock\ProcessExecutorMock $executor * @param \Composer\Util\Filesystem $filesystem - * @return GitDownloader */ - protected function getDownloaderMock(\Composer\IO\IOInterface $io = null, Config $config = null, \Composer\Test\Mock\ProcessExecutorMock $executor = null, Filesystem $filesystem = null): GitDownloader + protected function getDownloaderMock(?\Composer\IO\IOInterface $io = null, ?Config $config = null, ?\Composer\Test\Mock\ProcessExecutorMock $executor = null, ?Filesystem $filesystem = null): GitDownloader { $io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $executor = $executor ?: $this->getProcessExecutorMock(); @@ -116,7 +113,7 @@ public function testDownload(): void ->will($this->returnValue('1234567890123456789012345678901234567890')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://example.com/composer/composer'))); + ->will($this->returnValue(['https://example.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getSourceUrl') ->will($this->returnValue('https://example.com/composer/composer')); @@ -125,11 +122,11 @@ public function testDownload(): void ->will($this->returnValue('dev-master')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->winCompat("git clone --no-checkout -- 'https://example.com/composer/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'https://example.com/composer/composer' && git fetch composer && git remote set-url origin -- 'https://example.com/composer/composer' && git remote set-url composer -- 'https://example.com/composer/composer'"), $this->winCompat("git branch -r"), $this->winCompat("(git checkout 'master' -- || git checkout -B 'master' 'composer/master' --) && git reset --hard '1234567890123456789012345678901234567890' --"), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, null, $process); $downloader->download($packageMock, 'composerPath'); @@ -146,7 +143,7 @@ public function testDownloadWithCache(): void ->will($this->returnValue('1234567890123456789012345678901234567890')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://example.com/composer/composer'))); + ->will($this->returnValue(['https://example.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getSourceUrl') ->will($this->returnValue('https://example.com/composer/composer')); @@ -164,16 +161,16 @@ public function testDownloadWithCache(): void $filesystem->removeDirectory($cachePath); $process = $this->getProcessExecutorMock(); - $process->expects(array( - array('cmd' => $this->winCompat(sprintf("git clone --mirror -- 'https://example.com/composer/composer' '%s'", $cachePath)), 'callback' => function () use ($cachePath): void { + $process->expects([ + ['cmd' => $this->winCompat(sprintf("git clone --mirror -- 'https://example.com/composer/composer' '%s'", $cachePath)), 'callback' => static function () use ($cachePath): void { @mkdir($cachePath, 0777, true); - }), - array('cmd' => 'git rev-parse --git-dir', 'stdout' => '.'), + }], + ['cmd' => 'git rev-parse --git-dir', 'stdout' => '.'], $this->winCompat('git rev-parse --quiet --verify \'1234567890123456789012345678901234567890^{commit}\''), $this->winCompat(sprintf("git clone --no-checkout '%1\$s' 'composerPath' --dissociate --reference '%1\$s' && cd 'composerPath' && git remote set-url origin -- 'https://example.com/composer/composer' && git remote add composer -- 'https://example.com/composer/composer'", $cachePath)), 'git branch -r', $this->winCompat("(git checkout 'master' -- || git checkout -B 'master' 'composer/master' --) && git reset --hard '1234567890123456789012345678901234567890' --"), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, $config, $process); $downloader->download($packageMock, 'composerPath'); @@ -191,7 +188,7 @@ public function testDownloadUsesVariousProtocolsAndSetsPushUrlForGithub(): void ->will($this->returnValue('ref')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/mirrors/composer', 'https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/mirrors/composer', 'https://github.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getSourceUrl') ->will($this->returnValue('https://github.com/composer/composer')); @@ -200,18 +197,18 @@ public function testDownloadUsesVariousProtocolsAndSetsPushUrlForGithub(): void ->will($this->returnValue('1.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => $this->winCompat("git clone --no-checkout -- 'https://github.com/mirrors/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'https://github.com/mirrors/composer' && git fetch composer && git remote set-url origin -- 'https://github.com/mirrors/composer' && git remote set-url composer -- 'https://github.com/mirrors/composer'"), 'return' => 1, 'stderr' => 'Error1', - ), + ], $this->winCompat("git clone --no-checkout -- 'git@github.com:mirrors/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'git@github.com:mirrors/composer' && git fetch composer && git remote set-url origin -- 'git@github.com:mirrors/composer' && git remote set-url composer -- 'git@github.com:mirrors/composer'"), $this->winCompat("git remote set-url origin -- 'https://github.com/composer/composer'"), $this->winCompat("git remote set-url --push origin -- 'git@github.com:composer/composer.git'"), 'git branch -r', $this->winCompat("git checkout 'ref' -- && git reset --hard 'ref' --"), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, new Config(), $process); $downloader->download($packageMock, 'composerPath'); @@ -222,21 +219,19 @@ public function testDownloadUsesVariousProtocolsAndSetsPushUrlForGithub(): void public function pushUrlProvider(): array { - return array( + return [ // ssh proto should use git@ all along - array(array('ssh'), 'git@github.com:composer/composer', 'git@github.com:composer/composer.git'), + [['ssh'], 'git@github.com:composer/composer', 'git@github.com:composer/composer.git'], // auto-proto uses git@ by default for push url, but not fetch - array(array('https', 'ssh', 'git'), 'https://github.com/composer/composer', 'git@github.com:composer/composer.git'), + [['https', 'ssh', 'git'], 'https://github.com/composer/composer', 'git@github.com:composer/composer.git'], // if restricted to https then push url is not overwritten to git@ - array(array('https'), 'https://github.com/composer/composer', 'https://github.com/composer/composer.git'), - ); + [['https'], 'https://github.com/composer/composer', 'https://github.com/composer/composer.git'], + ]; } /** * @dataProvider pushUrlProvider * @param string[] $protocols - * @param string $url - * @param string $pushUrl */ public function testDownloadAndSetPushUrlUseCustomVariousProtocolsForGithub(array $protocols, string $url, string $pushUrl): void { @@ -246,7 +241,7 @@ public function testDownloadAndSetPushUrlUseCustomVariousProtocolsForGithub(arra ->will($this->returnValue('ref')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getSourceUrl') ->will($this->returnValue('https://github.com/composer/composer')); @@ -255,15 +250,15 @@ public function testDownloadAndSetPushUrlUseCustomVariousProtocolsForGithub(arra ->will($this->returnValue('1.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->winCompat("git clone --no-checkout -- '{$url}' 'composerPath' && cd 'composerPath' && git remote add composer -- '{$url}' && git fetch composer && git remote set-url origin -- '{$url}' && git remote set-url composer -- '{$url}'"), $this->winCompat("git remote set-url --push origin -- '{$pushUrl}'"), 'git branch -r', $this->winCompat("git checkout 'ref' -- && git reset --hard 'ref' --"), - ), true); + ], true); $config = new Config(); - $config->merge(array('config' => array('github-protocols' => $protocols))); + $config->merge(['config' => ['github-protocols' => $protocols]]); $downloader = $this->getDownloaderMock(null, $config, $process); $downloader->download($packageMock, 'composerPath'); @@ -280,7 +275,7 @@ public function testDownloadThrowsRuntimeExceptionIfGitCommandFails(): void ->will($this->returnValue('ref')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://example.com/composer/composer'))); + ->will($this->returnValue(['https://example.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getSourceUrl') ->will($this->returnValue('https://example.com/composer/composer')); @@ -289,12 +284,12 @@ public function testDownloadThrowsRuntimeExceptionIfGitCommandFails(): void ->will($this->returnValue('1.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => $this->winCompat("git clone --no-checkout -- 'https://example.com/composer/composer' 'composerPath' && cd 'composerPath' && git remote add composer -- 'https://example.com/composer/composer' && git fetch composer && git remote set-url origin -- 'https://example.com/composer/composer' && git remote set-url composer -- 'https://example.com/composer/composer'"), 'return' => 1, - ), - )); + ], + ]); // not using PHPUnit's expected exception because Prophecy exceptions extend from RuntimeException too so it is not safe try { @@ -340,7 +335,7 @@ public function testUpdate(): void ->will($this->returnValue('ref')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getVersion') ->will($this->returnValue('1.0.0.0')); @@ -349,7 +344,7 @@ public function testUpdate(): void ->will($this->returnValue('1.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->winCompat('git show-ref --head -d'), $this->winCompat('git status --porcelain --untracked-files=no'), $this->winCompat('git remote -v'), @@ -357,7 +352,7 @@ public function testUpdate(): void $this->winCompat('git branch -r'), $this->winCompat("git checkout 'ref' -- && git reset --hard 'ref' --"), $this->winCompat('git remote -v'), - ), true); + ], true); $this->fs->ensureDirectoryExists($this->workingDir.'/.git'); $downloader = $this->getDownloaderMock(null, new Config(), $process); @@ -377,7 +372,7 @@ public function testUpdateWithNewRepoUrl(): void ->will($this->returnValue('ref')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getSourceUrl') ->will($this->returnValue('https://github.com/composer/composer')); @@ -389,24 +384,24 @@ public function testUpdateWithNewRepoUrl(): void ->will($this->returnValue('1.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->winCompat("git show-ref --head -d"), $this->winCompat("git status --porcelain --untracked-files=no"), $this->winCompat("git remote -v"), $this->winCompat($expectedGitUpdateCommand), 'git branch -r', $this->winCompat("git checkout 'ref' -- && git reset --hard 'ref' --"), - array( + [ 'cmd' => $this->winCompat("git remote -v"), 'stdout' => 'origin https://github.com/old/url (fetch) origin https://github.com/old/url (push) composer https://github.com/old/url (fetch) composer https://github.com/old/url (push) ', - ), + ], $this->winCompat("git remote set-url origin -- 'https://github.com/composer/composer'"), $this->winCompat("git remote set-url --push origin -- 'git@github.com:composer/composer.git'"), - ), true); + ], true); $this->fs->ensureDirectoryExists($this->workingDir.'/.git'); $downloader = $this->getDownloaderMock(null, new Config(), $process); @@ -430,26 +425,26 @@ public function testUpdateThrowsRuntimeExceptionIfGitCommandFails(): void ->will($this->returnValue('ref')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getVersion') ->will($this->returnValue('1.0.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->winCompat('git show-ref --head -d'), $this->winCompat('git status --porcelain --untracked-files=no'), $this->winCompat('git remote -v'), - array( + [ 'cmd' => $expectedGitUpdateCommand, 'return' => 1, - ), - array( + ], + [ 'cmd' => $expectedGitUpdateCommand2, 'return' => 1, - ), + ], $this->winCompat('git --version'), - ), true); + ], true); $this->fs->ensureDirectoryExists($this->workingDir.'/.git'); @@ -484,30 +479,30 @@ public function testUpdateDoesntThrowsRuntimeExceptionIfGitCommandFailsAtFirstBu ->will($this->returnValue('1.0.0.0')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array(Platform::isWindows() ? 'C:\\' : '/', 'https://github.com/composer/composer'))); + ->will($this->returnValue([Platform::isWindows() ? 'C:\\' : '/', 'https://github.com/composer/composer'])); $packageMock->expects($this->any()) ->method('getPrettyVersion') ->will($this->returnValue('1.0.0')); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->winCompat('git show-ref --head -d'), $this->winCompat('git status --porcelain --untracked-files=no'), $this->winCompat('git remote -v'), - array( + [ 'cmd' => $expectedFirstGitUpdateCommand, 'return' => 1, - ), + ], $this->winCompat('git --version'), $this->winCompat('git remote -v'), - array( + [ 'cmd' => $expectedSecondGitUpdateCommand, 'return' => 0, - ), + ], $this->winCompat('git branch -r'), $this->winCompat("git checkout 'ref' -- && git reset --hard 'ref' --"), $this->winCompat('git remote -v'), - ), true); + ], true); $this->fs->ensureDirectoryExists($this->workingDir.'/.git'); $downloader = $this->getDownloaderMock(null, new Config(), $process); @@ -531,7 +526,7 @@ public function testDowngradeShowsAppropriateMessage(): void ->will($this->returnValue('ref')); $oldPackage->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('/foo/bar', 'https://github.com/composer/composer'))); + ->will($this->returnValue(['/foo/bar', 'https://github.com/composer/composer'])); $newPackage = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock(); $newPackage->expects($this->any()) @@ -539,7 +534,7 @@ public function testDowngradeShowsAppropriateMessage(): void ->will($this->returnValue('ref')); $newPackage->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/composer/composer'])); $newPackage->expects($this->any()) ->method('getVersion') ->will($this->returnValue('1.0.0.0')); @@ -578,7 +573,7 @@ public function testNotUsingDowngradingWithReferences(): void ->will($this->returnValue('ref')); $oldPackage->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('/foo/bar', 'https://github.com/composer/composer'))); + ->will($this->returnValue(['/foo/bar', 'https://github.com/composer/composer'])); $newPackage = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock(); $newPackage->expects($this->any()) @@ -586,7 +581,7 @@ public function testNotUsingDowngradingWithReferences(): void ->will($this->returnValue('ref')); $newPackage->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/composer/composer'))); + ->will($this->returnValue(['https://github.com/composer/composer'])); $newPackage->expects($this->any()) ->method('getVersion') ->will($this->returnValue('dev-ref2')); @@ -617,10 +612,10 @@ public function testRemove(): void $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock(); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ 'git show-ref --head -d', $expectedGitResetCommand, - ), true); + ], true); $this->fs->ensureDirectoryExists($this->workingDir.'/.git'); @@ -643,10 +638,6 @@ public function testGetInstallationSource(): void $this->assertEquals('source', $downloader->getInstallationSource()); } - /** - * @param string $cmd - * @return string - */ private function winCompat(string $cmd): string { if (Platform::isWindows()) { diff --git a/tests/Composer/Test/Downloader/HgDownloaderTest.php b/tests/Composer/Test/Downloader/HgDownloaderTest.php index 1e861f32b8df..3c0f1afd8b02 100644 --- a/tests/Composer/Test/Downloader/HgDownloaderTest.php +++ b/tests/Composer/Test/Downloader/HgDownloaderTest.php @@ -40,9 +40,8 @@ protected function tearDown(): void * @param \Composer\Config $config * @param \Composer\Test\Mock\ProcessExecutorMock $executor * @param \Composer\Util\Filesystem $filesystem - * @return HgDownloader */ - protected function getDownloaderMock(\Composer\IO\IOInterface $io = null, \Composer\Config $config = null, \Composer\Test\Mock\ProcessExecutorMock $executor = null, Filesystem $filesystem = null): HgDownloader + protected function getDownloaderMock(?\Composer\IO\IOInterface $io = null, ?\Composer\Config $config = null, ?\Composer\Test\Mock\ProcessExecutorMock $executor = null, ?Filesystem $filesystem = null): HgDownloader { $io = $io ?: $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $config = $config ?: $this->getMockBuilder('Composer\Config')->getMock(); @@ -73,13 +72,13 @@ public function testDownload(): void ->will($this->returnValue('ref')); $packageMock->expects($this->once()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://mercurial.dev/l3l0/composer'))); + ->will($this->returnValue(['https://mercurial.dev/l3l0/composer'])); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->getCmd('hg clone -- \'https://mercurial.dev/l3l0/composer\' \''.$this->workingDir.'\''), $this->getCmd('hg up -- \'ref\''), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, null, $process); $downloader->install($packageMock, $this->workingDir); @@ -114,13 +113,13 @@ public function testUpdate(): void ->will($this->returnValue('1.0.0.0')); $packageMock->expects($this->any()) ->method('getSourceUrls') - ->will($this->returnValue(array('https://github.com/l3l0/composer'))); + ->will($this->returnValue(['https://github.com/l3l0/composer'])); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->getCmd('hg st'), $this->getCmd("hg pull -- 'https://github.com/l3l0/composer' && hg up -- 'ref'"), - ), true); + ], true); $downloader = $this->getDownloaderMock(null, null, $process); $downloader->prepare('update', $packageMock, $this->workingDir, $packageMock); @@ -135,9 +134,9 @@ public function testRemove(): void $packageMock = $this->getMockBuilder('Composer\Package\PackageInterface')->getMock(); $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $this->getCmd('hg st'), - ), true); + ], true); $filesystem = $this->getMockBuilder('Composer\Util\Filesystem')->getMock(); $filesystem->expects($this->once()) diff --git a/tests/Composer/Test/Downloader/PerforceDownloaderTest.php b/tests/Composer/Test/Downloader/PerforceDownloaderTest.php index bb9be8a4d7a5..d0f7890cb95c 100644 --- a/tests/Composer/Test/Downloader/PerforceDownloaderTest.php +++ b/tests/Composer/Test/Downloader/PerforceDownloaderTest.php @@ -82,20 +82,18 @@ protected function getMockPackageInterface(VcsRepository $repository) */ protected function getRepoConfig(): array { - return array('url' => 'TEST_URL', 'p4user' => 'TEST_USER'); + return ['url' => 'TEST_URL', 'p4user' => 'TEST_USER']; } /** * @param string[] $repoConfig - * @param \Composer\IO\IOInterface $io - * @param \Composer\Config $config * @return \Composer\Repository\VcsRepository&\PHPUnit\Framework\MockObject\MockObject */ protected function getMockRepository(array $repoConfig, IOInterface $io, Config $config) { $repository = $this->getMockBuilder('Composer\Repository\VcsRepository') - ->onlyMethods(array('getRepoConfig')) - ->setConstructorArgs(array($repoConfig, $io, $config, Factory::createHttpDownloader($io, $config))) + ->onlyMethods(['getRepoConfig']) + ->setConstructorArgs([$repoConfig, $io, $config, Factory::createHttpDownloader($io, $config)]) ->getMock(); $repository->expects($this->any())->method('getRepoConfig')->will($this->returnValue($repoConfig)); @@ -129,7 +127,7 @@ public function testDoInstallWithTag(): void $label = 123; $this->package->expects($this->once())->method('getSourceReference')->will($this->returnValue($ref)); $this->io->expects($this->once())->method('writeError')->with($this->stringContains('Cloning '.$ref)); - $perforceMethods = array('setStream', 'p4Login', 'writeP4ClientSpec', 'connectClient', 'syncCodeBase', 'cleanupClientSpec'); + $perforceMethods = ['setStream', 'p4Login', 'writeP4ClientSpec', 'connectClient', 'syncCodeBase', 'cleanupClientSpec']; $perforce = $this->getMockBuilder('Composer\Util\Perforce')->disableOriginalConstructor()->getMock(); $perforce->expects($this->once())->method('initializePath')->with($this->equalTo($this->testPath)); $perforce->expects($this->once())->method('setStream')->with($this->equalTo($ref)); @@ -152,7 +150,7 @@ public function testDoInstallWithNoTag(): void $label = null; $this->package->expects($this->once())->method('getSourceReference')->will($this->returnValue($ref)); $this->io->expects($this->once())->method('writeError')->with($this->stringContains('Cloning '.$ref)); - $perforceMethods = array('setStream', 'p4Login', 'writeP4ClientSpec', 'connectClient', 'syncCodeBase', 'cleanupClientSpec'); + $perforceMethods = ['setStream', 'p4Login', 'writeP4ClientSpec', 'connectClient', 'syncCodeBase', 'cleanupClientSpec']; $perforce = $this->getMockBuilder('Composer\Util\Perforce')->disableOriginalConstructor()->getMock(); $perforce->expects($this->once())->method('initializePath')->with($this->equalTo($this->testPath)); $perforce->expects($this->once())->method('setStream')->with($this->equalTo($ref)); diff --git a/tests/Composer/Test/Downloader/XzDownloaderTest.php b/tests/Composer/Test/Downloader/XzDownloaderTest.php index 200ae49acb9d..ed70c87c151c 100644 --- a/tests/Composer/Test/Downloader/XzDownloaderTest.php +++ b/tests/Composer/Test/Downloader/XzDownloaderTest.php @@ -61,7 +61,7 @@ public function testErrorMessages(): void try { $loop = new Loop($httpDownloader); $promise = $downloader->download($package, $this->testDir.'/install-path'); - $loop->wait(array($promise)); + $loop->wait([$promise]); $downloader->install($package, $this->testDir.'/install-path'); $this->fail('Download of invalid tarball should throw an exception'); diff --git a/tests/Composer/Test/Downloader/ZipDownloaderTest.php b/tests/Composer/Test/Downloader/ZipDownloaderTest.php index 65581a87728e..56aa7a04d457 100644 --- a/tests/Composer/Test/Downloader/ZipDownloaderTest.php +++ b/tests/Composer/Test/Downloader/ZipDownloaderTest.php @@ -57,10 +57,8 @@ protected function tearDown(): void } /** - * @param string $name * @param mixed $value * @param ?\Composer\Test\Downloader\MockedZipDownloader $obj - * @return void */ public function setPrivateProperty(string $name, $value, $obj = null): void { @@ -91,11 +89,11 @@ public function testErrorMessages(): void ; $this->package->expects($this->any()) ->method('getDistUrls') - ->will($this->returnValue(array($distUrl))) + ->will($this->returnValue([$distUrl])) ; $this->package->expects($this->atLeastOnce()) ->method('getTransportOptions') - ->will($this->returnValue(array())) + ->will($this->returnValue([])) ; $downloader = new ZipDownloader($this->io, $this->config, $this->httpDownloader); @@ -103,7 +101,7 @@ public function testErrorMessages(): void try { $loop = new Loop($this->httpDownloader); $promise = $downloader->download($this->package, $path = sys_get_temp_dir().'/composer-zip-test'); - $loop->wait(array($promise)); + $loop->wait([$promise]); $downloader->install($this->package, $path); $this->fail('Download of invalid zip files should throw an exception'); @@ -185,7 +183,7 @@ public function testSystemUnzipOnlyFailed(): void self::expectExceptionMessage('Failed to extract : (1) unzip'); $this->setPrivateProperty('isWindows', false); $this->setPrivateProperty('hasZipArchive', false); - $this->setPrivateProperty('unzipCommands', array(array('unzip', 'unzip -qq %s -d %s'))); + $this->setPrivateProperty('unzipCommands', [['unzip', 'unzip -qq %s -d %s']]); $procMock = $this->getMockBuilder('Symfony\Component\Process\Process')->disableOriginalConstructor()->getMock(); $procMock->expects($this->any()) @@ -212,7 +210,7 @@ public function testSystemUnzipOnlyGood(): void { $this->setPrivateProperty('isWindows', false); $this->setPrivateProperty('hasZipArchive', false); - $this->setPrivateProperty('unzipCommands', array(array('unzip', 'unzip -qq %s -d %s'))); + $this->setPrivateProperty('unzipCommands', [['unzip', 'unzip -qq %s -d %s']]); $procMock = $this->getMockBuilder('Symfony\Component\Process\Process')->disableOriginalConstructor()->getMock(); $procMock->expects($this->any()) @@ -317,7 +315,6 @@ public function testNonWindowsFallbackFailed(): void /** * @param ?\React\Promise\PromiseInterface $promise - * @return void */ private function wait($promise): void { @@ -326,9 +323,9 @@ private function wait($promise): void } $e = null; - $promise->then(function (): void { + $promise->then(static function (): void { // noop - }, function ($ex) use (&$e): void { + }, static function ($ex) use (&$e): void { $e = $ex; }); @@ -340,12 +337,12 @@ private function wait($promise): void class MockedZipDownloader extends ZipDownloader { - public function download(PackageInterface $package, $path, PackageInterface $prevPackage = null, $output = true): PromiseInterface + public function download(PackageInterface $package, $path, ?PackageInterface $prevPackage = null, bool $output = true): PromiseInterface { return \React\Promise\resolve(null); } - public function install(PackageInterface $package, $path, $output = true): PromiseInterface + public function install(PackageInterface $package, $path, bool $output = true): PromiseInterface { return \React\Promise\resolve(null); } diff --git a/tests/Composer/Test/EventDispatcher/EventDispatcherTest.php b/tests/Composer/Test/EventDispatcher/EventDispatcherTest.php index 05ca1a272ed5..ce6a3666074e 100644 --- a/tests/Composer/Test/EventDispatcher/EventDispatcherTest.php +++ b/tests/Composer/Test/EventDispatcher/EventDispatcherTest.php @@ -33,9 +33,9 @@ public function testListenerExceptionsAreCaught(): void self::expectException('RuntimeException'); $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $dispatcher = $this->getDispatcherStubForListenersTest(array( + $dispatcher = $this->getDispatcherStubForListenersTest([ 'Composer\Test\EventDispatcher\EventDispatcherTest::call', - ), $io); + ], $io); $io->expects($this->once()) ->method('isVerbose') @@ -53,26 +53,24 @@ public function testListenerExceptionsAreCaught(): void /** * @dataProvider provideValidCommands - * - * @param string $command */ public function testDispatcherCanExecuteSingleCommandLineScript(string $command): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ $command, - ), true); + ], true); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $process, - )) - ->onlyMethods(array('getListeners')) + ]) + ->onlyMethods(['getListeners']) ->getMock(); - $listener = array($command); + $listener = [$command]; $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listener)); @@ -82,8 +80,6 @@ public function testDispatcherCanExecuteSingleCommandLineScript(string $command) /** * @dataProvider provideDevModes - * - * @param bool $devMode */ public function testDispatcherPassDevModeToAutoloadGeneratorForScriptEvents(bool $devMode): void { @@ -97,7 +93,7 @@ public function testDispatcherPassDevModeToAutoloadGeneratorForScriptEvents(bool $composer->setAutoloadGenerator($generator); $package = $this->getMockBuilder('Composer\Package\RootPackageInterface')->getMock(); - $package->method('getScripts')->will($this->returnValue(array('scriptName' => array('scriptName')))); + $package->method('getScripts')->will($this->returnValue(['scriptName' => ['scriptName']])); $composer->setPackage($package); $composer->setRepositoryManager($this->getRepositoryManagerMockForDevModePassingTest()); @@ -122,10 +118,10 @@ public function testDispatcherPassDevModeToAutoloadGeneratorForScriptEvents(bool public function provideDevModes(): array { - return array( - array(true), - array(false), - ); + return [ + [true], + [false], + ]; } /** @@ -135,19 +131,19 @@ private function getGeneratorMockForDevModePassingTest() { $generator = $this->getMockBuilder('Composer\Autoload\AutoloadGenerator') ->disableOriginalConstructor() - ->onlyMethods(array( + ->onlyMethods([ 'buildPackageMap', 'parseAutoloads', 'createLoader', 'setDevMode', - )) + ]) ->getMock(); $generator ->method('buildPackageMap') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $generator ->method('parseAutoloads') - ->will($this->returnValue(array('psr-0' => array(), 'psr-4' => array(), 'classmap' => array(), 'files' => array(), 'exclude-from-classmap' => array()))); + ->will($this->returnValue(['psr-0' => [], 'psr-4' => [], 'classmap' => [], 'files' => [], 'exclude-from-classmap' => []])); $generator ->method('createLoader') ->will($this->returnValue($this->getMockBuilder('Composer\Autoload\ClassLoader')->getMock())); @@ -162,13 +158,13 @@ private function getRepositoryManagerMockForDevModePassingTest() { $rm = $this->getMockBuilder('Composer\Repository\RepositoryManager') ->disableOriginalConstructor() - ->onlyMethods(array('getLocalRepository')) + ->onlyMethods(['getLocalRepository']) ->getMock(); $repo = $this->getMockBuilder('Composer\Repository\InstalledRepositoryInterface')->getMock(); $repo ->method('getCanonicalPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $rm ->method('getLocalRepository') @@ -190,8 +186,8 @@ public function testDispatcherRemoveListener(): void $this->getProcessExecutorMock() ); - $listener = array($this, 'someMethod'); - $listener2 = array($this, 'someMethod2'); + $listener = [$this, 'someMethod']; + $listener2 = [$this, 'someMethod2']; $listener3 = 'Composer\\Test\\EventDispatcher\\EventDispatcherTest::someMethod'; $dispatcher->addListener('ev1', $listener, 0); @@ -223,27 +219,27 @@ public function testDispatcherRemoveListener(): void public function testDispatcherCanExecuteCliAndPhpInSameEventScriptStack(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ 'echo -n foo', 'echo -n bar', - ), true); + ], true); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE), $process, - )) - ->onlyMethods(array( + ]) + ->onlyMethods([ 'getListeners', - )) + ]) ->getMock(); - $listeners = array( + $listeners = [ 'echo -n foo', 'Composer\\Test\\EventDispatcher\\EventDispatcherTest::someMethod', 'echo -n bar', - ); + ]; $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') @@ -260,20 +256,20 @@ public function testDispatcherCanExecuteCliAndPhpInSameEventScriptStack(): void public function testDispatcherCanPutEnv(): void { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE), $this->getProcessExecutorMock(), - )) - ->onlyMethods(array( + ]) + ->onlyMethods([ 'getListeners', - )) + ]) ->getMock(); - $listeners = array( + $listeners = [ '@putenv ABC=123', 'Composer\\Test\\EventDispatcher\\EventDispatcherTest::getTestEnv', - ); + ]; $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') @@ -293,18 +289,18 @@ public function testDispatcherAppendsDirBinOnPathForEveryListener(): void chdir(__DIR__); Platform::putEnv('COMPOSER_BIN_DIR', __DIR__ . '/vendor/bin'); - $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->setConstructorArgs(array( + $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->setConstructorArgs([ $this->createComposerInstance(), $io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE), $this->getProcessExecutorMock(), - ))->onlyMethods(array( + ])->onlyMethods([ 'getListeners', - ))->getMock(); + ])->getMock(); - $listeners = array( + $listeners = [ 'Composer\\Test\\EventDispatcher\\EventDispatcherTest::createsVendorBinFolderChecksEnvDoesNotContainsBin', 'Composer\\Test\\EventDispatcher\\EventDispatcherTest::createsVendorBinFolderChecksEnvContainsBin', - ); + ]; $dispatcher->expects($this->atLeastOnce())->method('getListeners')->will($this->returnValue($listeners)); @@ -320,9 +316,6 @@ public function testDispatcherAppendsDirBinOnPathForEveryListener(): void } } - /** - * @return void - */ public static function createsVendorBinFolderChecksEnvDoesNotContainsBin(): void { mkdir(__DIR__ . '/vendor/bin', 0700, true); @@ -335,9 +328,6 @@ public static function createsVendorBinFolderChecksEnvDoesNotContainsBin(): void self::assertStringNotContainsString(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'bin', $val); } - /** - * @return void - */ public static function createsVendorBinFolderChecksEnvContainsBin(): void { $val = getenv('PATH'); @@ -349,9 +339,6 @@ public static function createsVendorBinFolderChecksEnvContainsBin(): void self::assertStringContainsString(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'bin', $val); } - /** - * @return void - */ public static function getTestEnv(): void { $val = getenv('ABC'); @@ -363,39 +350,39 @@ public static function getTestEnv(): void public function testDispatcherCanExecuteComposerScriptGroups(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ 'echo -n foo', 'echo -n baz', 'echo -n bar', - ), true); + ], true); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $composer = $this->createComposerInstance(), $io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE), $process, - )) - ->onlyMethods(array( + ]) + ->onlyMethods([ 'getListeners', - )) + ]) ->getMock(); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') - ->will($this->returnCallback(function (Event $event): array { + ->will($this->returnCallback(static function (Event $event): array { if ($event->getName() === 'root') { - return array('@group'); + return ['@group']; } if ($event->getName() === 'group') { - return array('echo -n foo', '@subgroup', 'echo -n bar'); + return ['echo -n foo', '@subgroup', 'echo -n bar']; } if ($event->getName() === 'subgroup') { - return array('echo -n baz'); + return ['echo -n baz']; } - return array(); + return []; })); $dispatcher->dispatch('root', new ScriptEvent('root', $composer, $io)); @@ -410,33 +397,33 @@ public function testDispatcherCanExecuteComposerScriptGroups(): void public function testRecursionInScriptsNames(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( + $process->expects([ 'echo Hello '.ProcessExecutor::escape('World'), - ), true); + ], true); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $composer = $this->createComposerInstance(), $io = new BufferIO('', OutputInterface::VERBOSITY_VERBOSE), $process, - )) - ->onlyMethods(array( + ]) + ->onlyMethods([ 'getListeners', - )) + ]) ->getMock(); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') - ->will($this->returnCallback(function (Event $event): array { + ->will($this->returnCallback(static function (Event $event): array { if ($event->getName() === 'hello') { - return array('echo Hello'); + return ['echo Hello']; } if ($event->getName() === 'helloWorld') { - return array('@hello World'); + return ['@hello World']; } - return array(); + return []; })); $dispatcher->dispatch('helloWorld', new ScriptEvent('helloWorld', $composer, $io)); @@ -451,28 +438,28 @@ public function testDispatcherDetectInfiniteRecursion(): void self::expectException('RuntimeException'); $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $composer = $this->createComposerInstance(), $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->getProcessExecutorMock(), - )) - ->onlyMethods(array( + ]) + ->onlyMethods([ 'getListeners', - )) + ]) ->getMock(); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') - ->will($this->returnCallback(function (Event $event): array { + ->will($this->returnCallback(static function (Event $event): array { if ($event->getName() === 'root') { - return array('@recurse'); + return ['@recurse']; } if ($event->getName() === 'recurse') { - return array('@root'); + return ['@root']; } - return array(); + return []; })); $dispatcher->dispatch('root', new ScriptEvent('root', $composer, $io)); @@ -486,11 +473,11 @@ public function testDispatcherDetectInfiniteRecursion(): void private function getDispatcherStubForListenersTest(array $listeners, IOInterface $io) { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $io, - )) - ->onlyMethods(array('getListeners')) + ]) + ->onlyMethods(['getListeners']) ->getMock(); $dispatcher->expects($this->atLeastOnce()) @@ -502,25 +489,25 @@ private function getDispatcherStubForListenersTest(array $listeners, IOInterface public function provideValidCommands(): array { - return array( - array('phpunit'), - array('echo foo'), - array('echo -n foo'), - ); + return [ + ['phpunit'], + ['echo foo'], + ['echo -n foo'], + ]; } public function testDispatcherOutputsCommand(): void { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), new ProcessExecutor($io), - )) - ->onlyMethods(array('getListeners')) + ]) + ->onlyMethods(['getListeners']) ->getMock(); - $listener = array('echo foo'); + $listener = ['echo foo']; $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listener)); @@ -539,16 +526,16 @@ public function testDispatcherOutputsCommand(): void public function testDispatcherOutputsErrorOnFailedCommand(): void { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), new ProcessExecutor, - )) - ->onlyMethods(array('getListeners')) + ]) + ->onlyMethods(['getListeners']) ->getMock(); $code = 'exit 1'; - $listener = array($code); + $listener = [$code]; $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') ->will($this->returnValue($listener)); @@ -575,26 +562,23 @@ public function testDispatcherOutputsErrorOnFailedCommand(): void public function testDispatcherInstallerEvents(): void { $dispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->createComposerInstance(), $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), $this->getProcessExecutorMock(), - )) - ->onlyMethods(array('getListeners')) + ]) + ->onlyMethods(['getListeners']) ->getMock(); $dispatcher->expects($this->atLeastOnce()) ->method('getListeners') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $transaction = $this->getMockBuilder('Composer\DependencyResolver\LockTransaction')->disableOriginalConstructor()->getMock(); $dispatcher->dispatchInstallerEvent(InstallerEvents::PRE_OPERATIONS_EXEC, true, true, $transaction); } - /** - * @return void - */ public static function call(): void { throw new \RuntimeException(); @@ -616,9 +600,6 @@ public static function someMethod2(): bool return true; } - /** - * @return Composer - */ private function createComposerInstance(): Composer { $composer = new Composer; diff --git a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilterTest.php b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilterTest.php index 97a43bf80b90..3011434bfe22 100644 --- a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilterTest.php +++ b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreAllPlatformRequirementFilterTest.php @@ -19,9 +19,6 @@ final class IgnoreAllPlatformRequirementFilterTest extends TestCase { /** * @dataProvider dataIsIgnored - * - * @param string $req - * @param bool $expectIgnored */ public function testIsIgnored(string $req, bool $expectIgnored): void { @@ -35,9 +32,9 @@ public function testIsIgnored(string $req, bool $expectIgnored): void */ public function dataIsIgnored(): array { - return array( - 'php is ignored' => array('php', true), - 'monolog/monolog is not ignored' => array('monolog/monolog', false), - ); + return [ + 'php is ignored' => ['php', true], + 'monolog/monolog is not ignored' => ['monolog/monolog', false], + ]; } } diff --git a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilterTest.php b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilterTest.php index 6de438ff140b..9ee9a1da3ef2 100644 --- a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilterTest.php +++ b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreListPlatformRequirementFilterTest.php @@ -21,8 +21,6 @@ final class IgnoreListPlatformRequirementFilterTest extends TestCase * @dataProvider dataIsIgnored * * @param string[] $reqList - * @param string $req - * @param bool $expectIgnored */ public function testIsIgnored(array $reqList, string $req, bool $expectIgnored): void { @@ -36,18 +34,18 @@ public function testIsIgnored(array $reqList, string $req, bool $expectIgnored): */ public function dataIsIgnored(): array { - return array( - 'ext-json is ignored if listed' => array(array('ext-json', 'monolog/monolog'), 'ext-json', true), - 'php is not ignored if not listed' => array(array('ext-json', 'monolog/monolog'), 'php', false), - 'monolog/monolog is not ignored even if listed' => array(array('ext-json', 'monolog/monolog'), 'monolog/monolog', false), - 'ext-json is ignored if ext-* is listed' => array(array('ext-*'), 'ext-json', true), - 'php is ignored if php* is listed' => array(array('ext-*', 'php*'), 'php', true), - 'ext-json is ignored if * is listed' => array(array('foo', '*'), 'ext-json', true), - 'php is ignored if * is listed' => array(array('*', 'foo'), 'php', true), - 'monolog/monolog is not ignored even if * or monolog/* are listed' => array(array('*', 'monolog/*'), 'monolog/monolog', false), - 'empty list entry does not ignore' => array(array(''), 'ext-foo', false), - 'empty array does not ignore' => array(array(), 'ext-foo', false), - 'list entries are not completing each other' => array(array('ext-', 'foo'), 'ext-foo', false), - ); + return [ + 'ext-json is ignored if listed' => [['ext-json', 'monolog/monolog'], 'ext-json', true], + 'php is not ignored if not listed' => [['ext-json', 'monolog/monolog'], 'php', false], + 'monolog/monolog is not ignored even if listed' => [['ext-json', 'monolog/monolog'], 'monolog/monolog', false], + 'ext-json is ignored if ext-* is listed' => [['ext-*'], 'ext-json', true], + 'php is ignored if php* is listed' => [['ext-*', 'php*'], 'php', true], + 'ext-json is ignored if * is listed' => [['foo', '*'], 'ext-json', true], + 'php is ignored if * is listed' => [['*', 'foo'], 'php', true], + 'monolog/monolog is not ignored even if * or monolog/* are listed' => [['*', 'monolog/*'], 'monolog/monolog', false], + 'empty list entry does not ignore' => [[''], 'ext-foo', false], + 'empty array does not ignore' => [[], 'ext-foo', false], + 'list entries are not completing each other' => [['ext-', 'foo'], 'ext-foo', false], + ]; } } diff --git a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php index fa4f32fdff89..817ef328ad3d 100644 --- a/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php +++ b/tests/Composer/Test/Filter/PlatformRequirementFilter/IgnoreNothingPlatformRequirementFilterTest.php @@ -19,8 +19,6 @@ final class IgnoreNothingPlatformRequirementFilterTest extends TestCase { /** * @dataProvider dataIsIgnored - * - * @param string $req */ public function testIsIgnored(string $req): void { @@ -34,9 +32,9 @@ public function testIsIgnored(string $req): void */ public function dataIsIgnored(): array { - return array( - 'php is not ignored' => array('php'), - 'monolog/monolog is not ignored' => array('monolog/monolog'), - ); + return [ + 'php is not ignored' => ['php'], + 'monolog/monolog is not ignored' => ['monolog/monolog'], + ]; } } diff --git a/tests/Composer/Test/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactoryTest.php b/tests/Composer/Test/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactoryTest.php index ce2055e39d8c..65497cc0d771 100644 --- a/tests/Composer/Test/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactoryTest.php +++ b/tests/Composer/Test/Filter/PlatformRequirementFilter/PlatformRequirementFilterFactoryTest.php @@ -33,11 +33,11 @@ public function testFromBoolOrList($boolOrList, $expectedInstance): void */ public function dataFromBoolOrList(): array { - return array( - 'true creates IgnoreAllFilter' => array(true, 'Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter'), - 'false creates IgnoreNothingFilter' => array(false, 'Composer\Filter\PlatformRequirementFilter\IgnoreNothingPlatformRequirementFilter'), - 'list creates IgnoreListFilter' => array(array('php', 'ext-json'), 'Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter'), - ); + return [ + 'true creates IgnoreAllFilter' => [true, 'Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter'], + 'false creates IgnoreNothingFilter' => [false, 'Composer\Filter\PlatformRequirementFilter\IgnoreNothingPlatformRequirementFilter'], + 'list creates IgnoreListFilter' => [['php', 'ext-json'], 'Composer\Filter\PlatformRequirementFilter\IgnoreListPlatformRequirementFilter'], + ]; } public function testFromBoolThrowsExceptionIfTypeIsUnknown(): void diff --git a/tests/Composer/Test/IO/BufferIOTest.php b/tests/Composer/Test/IO/BufferIOTest.php index 0e2d11101d3b..0cf9796772f5 100644 --- a/tests/Composer/Test/IO/BufferIOTest.php +++ b/tests/Composer/Test/IO/BufferIOTest.php @@ -31,11 +31,11 @@ public function testSetUserInputs(): void self::expectExceptionMessage('Setting the user inputs requires at least the version 3.2 of the symfony/console component.'); } - $bufferIO->setUserInputs(array( + $bufferIO->setUserInputs([ 'yes', 'no', '', - )); + ]); $this->assertTrue($bufferIO->askConfirmation('Please say yes!', false)); $this->assertFalse($bufferIO->askConfirmation('Now please say no!', true)); diff --git a/tests/Composer/Test/IO/ConsoleIOTest.php b/tests/Composer/Test/IO/ConsoleIOTest.php index 8a0799acf863..04483e751ad3 100644 --- a/tests/Composer/Test/IO/ConsoleIOTest.php +++ b/tests/Composer/Test/IO/ConsoleIOTest.php @@ -83,7 +83,7 @@ public function testWriteWithMultipleLineStringWhenDebugging(): void $outputMock->expects($this->once()) ->method('write') ->with( - $this->callback(function ($messages): bool { + $this->callback(static function ($messages): bool { $result = Preg::isMatch("[(.*)/(.*) First line]", $messages[0]); $result = $result && Preg::isMatch("[(.*)/(.*) Second line]", $messages[1]); @@ -209,7 +209,7 @@ public function testAskAndValidate(): void ->will($this->returnValue($helperMock)) ; - $validator = function ($value): bool { + $validator = static function ($value): bool { return true; }; $consoleIO = new ConsoleIO($inputMock, $outputMock, $setMock); @@ -231,7 +231,7 @@ public function testSelect(): void $this->isInstanceOf('Symfony\Component\Console\Output\OutputInterface'), $this->isInstanceOf('Symfony\Component\Console\Question\Question') ) - ->will($this->returnValue(array('item2'))); + ->will($this->returnValue(['item2'])); $setMock ->expects($this->once()) @@ -241,8 +241,8 @@ public function testSelect(): void ; $consoleIO = new ConsoleIO($inputMock, $outputMock, $setMock); - $result = $consoleIO->select('Select item', array("item1", "item2"), 'item1', false, "Error message", true); - $this->assertEquals(array('1'), $result); + $result = $consoleIO->select('Select item', ["item1", "item2"], 'item1', false, "Error message", true); + $this->assertEquals(['1'], $result); } public function testSetAndgetAuthentication(): void @@ -255,7 +255,7 @@ public function testSetAndgetAuthentication(): void $consoleIO->setAuthentication('repoName', 'l3l0', 'passwd'); $this->assertEquals( - array('username' => 'l3l0', 'password' => 'passwd'), + ['username' => 'l3l0', 'password' => 'passwd'], $consoleIO->getAuthentication('repoName') ); } @@ -269,7 +269,7 @@ public function testGetAuthenticationWhenDidNotSet(): void $consoleIO = new ConsoleIO($inputMock, $outputMock, $helperMock); $this->assertEquals( - array('username' => null, 'password' => null), + ['username' => null, 'password' => null], $consoleIO->getAuthentication('repoName') ); } diff --git a/tests/Composer/Test/IO/NullIOTest.php b/tests/Composer/Test/IO/NullIOTest.php index c9e02af37123..9aa6bc6a91b2 100644 --- a/tests/Composer/Test/IO/NullIOTest.php +++ b/tests/Composer/Test/IO/NullIOTest.php @@ -44,7 +44,7 @@ public function testgetAuthentications(): void $this->assertIsArray($io->getAuthentications()); // @phpstan-ignore-line $this->assertEmpty($io->getAuthentications()); - $this->assertEquals(array('username' => null, 'password' => null), $io->getAuthentication('foo')); + $this->assertEquals(['username' => null, 'password' => null], $io->getAuthentication('foo')); } public function testAsk(): void @@ -65,7 +65,7 @@ public function testAskAndValidate(): void { $io = new NullIO(); - $this->assertEquals('foo', $io->askAndValidate('question', function ($x): bool { + $this->assertEquals('foo', $io->askAndValidate('question', static function ($x): bool { return true; }, null, 'foo')); } @@ -74,6 +74,6 @@ public function testSelect(): void { $io = new NullIO(); - $this->assertEquals('1', $io->select('question', array('item1', 'item2'), '1', 2, 'foo', true)); + $this->assertEquals('1', $io->select('question', ['item1', 'item2'], '1', 2, 'foo', true)); } } diff --git a/tests/Composer/Test/InstalledVersionsTest.php b/tests/Composer/Test/InstalledVersionsTest.php index 4eab8d028470..6edd91e04cea 100644 --- a/tests/Composer/Test/InstalledVersionsTest.php +++ b/tests/Composer/Test/InstalledVersionsTest.php @@ -33,7 +33,7 @@ public static function setUpBeforeClass(): void $prop = new \ReflectionProperty('Composer\Autoload\ClassLoader', 'registeredLoaders'); $prop->setAccessible(true); self::$previousRegisteredLoaders = $prop->getValue(); - $prop->setValue(array()); + $prop->setValue([]); } public static function tearDownAfterClass(): void @@ -54,7 +54,7 @@ public function setUp(): void public function testGetInstalledPackages(): void { - $names = array( + $names = [ '__root__', 'a/provider', 'a/provider2', @@ -64,15 +64,12 @@ public function testGetInstalledPackages(): void 'foo/impl2', 'foo/replaced', 'meta/package', - ); + ]; $this->assertSame($names, InstalledVersions::getInstalledPackages()); } /** * @dataProvider isInstalledProvider - * @param bool $expected - * @param string $name - * @param bool $includeDevRequirements */ public function testIsInstalled(bool $expected, string $name, bool $includeDevRequirements = true): void { @@ -81,23 +78,20 @@ public function testIsInstalled(bool $expected, string $name, bool $includeDevRe public static function isInstalledProvider(): array { - return array( - array(true, 'foo/impl'), - array(true, 'foo/replaced'), - array(true, 'c/c'), - array(false, 'c/c', false), - array(true, '__root__'), - array(true, 'b/replacer'), - array(false, 'not/there'), - array(true, 'meta/package'), - ); + return [ + [true, 'foo/impl'], + [true, 'foo/replaced'], + [true, 'c/c'], + [false, 'c/c', false], + [true, '__root__'], + [true, 'b/replacer'], + [false, 'not/there'], + [true, 'meta/package'], + ]; } /** * @dataProvider satisfiesProvider - * @param bool $expected - * @param string $name - * @param string $constraint */ public function testSatisfies(bool $expected, string $name, string $constraint): void { @@ -106,38 +100,36 @@ public function testSatisfies(bool $expected, string $name, string $constraint): public static function satisfiesProvider(): array { - return array( - array(true, 'foo/impl', '1.5'), - array(true, 'foo/impl', '1.2'), - array(true, 'foo/impl', '^1.0'), - array(true, 'foo/impl', '^3 || ^2'), - array(false, 'foo/impl', '^3'), - - array(true, 'foo/replaced', '3.5'), - array(true, 'foo/replaced', '^3.2'), - array(false, 'foo/replaced', '4.0'), - - array(true, 'c/c', '3.0.0'), - array(true, 'c/c', '^3'), - array(false, 'c/c', '^3.1'), - - array(true, '__root__', 'dev-master'), - array(true, '__root__', '^1.10'), - array(false, '__root__', '^2'), - - array(true, 'b/replacer', '^2.1'), - array(false, 'b/replacer', '^2.3'), - - array(true, 'a/provider2', '^1.2'), - array(true, 'a/provider2', '^1.4'), - array(false, 'a/provider2', '^1.5'), - ); + return [ + [true, 'foo/impl', '1.5'], + [true, 'foo/impl', '1.2'], + [true, 'foo/impl', '^1.0'], + [true, 'foo/impl', '^3 || ^2'], + [false, 'foo/impl', '^3'], + + [true, 'foo/replaced', '3.5'], + [true, 'foo/replaced', '^3.2'], + [false, 'foo/replaced', '4.0'], + + [true, 'c/c', '3.0.0'], + [true, 'c/c', '^3'], + [false, 'c/c', '^3.1'], + + [true, '__root__', 'dev-master'], + [true, '__root__', '^1.10'], + [false, '__root__', '^2'], + + [true, 'b/replacer', '^2.1'], + [false, 'b/replacer', '^2.3'], + + [true, 'a/provider2', '^1.2'], + [true, 'a/provider2', '^1.4'], + [false, 'a/provider2', '^1.5'], + ]; } /** * @dataProvider getVersionRangesProvider - * @param string $expected - * @param string $name */ public function testGetVersionRanges(string $expected, string $name): void { @@ -146,22 +138,20 @@ public function testGetVersionRanges(string $expected, string $name): void public static function getVersionRangesProvider(): array { - return array( - array('dev-master || 1.10.x-dev', '__root__'), - array('^1.1 || 1.2 || 1.4 || 2.0', 'foo/impl'), - array('2.2 || 2.0', 'foo/impl2'), - array('^3.0', 'foo/replaced'), - array('1.1', 'a/provider'), - array('1.2 || 1.4', 'a/provider2'), - array('2.2', 'b/replacer'), - array('3.0', 'c/c'), - ); + return [ + ['dev-master || 1.10.x-dev', '__root__'], + ['^1.1 || 1.2 || 1.4 || 2.0', 'foo/impl'], + ['2.2 || 2.0', 'foo/impl2'], + ['^3.0', 'foo/replaced'], + ['1.1', 'a/provider'], + ['1.2 || 1.4', 'a/provider2'], + ['2.2', 'b/replacer'], + ['3.0', 'c/c'], + ]; } /** * @dataProvider getVersionProvider - * @param null|string $expected - * @param string $name */ public function testGetVersion(?string $expected, string $name): void { @@ -170,22 +160,20 @@ public function testGetVersion(?string $expected, string $name): void public static function getVersionProvider(): array { - return array( - array('dev-master', '__root__'), - array(null, 'foo/impl'), - array(null, 'foo/impl2'), - array(null, 'foo/replaced'), - array('1.1.0.0', 'a/provider'), - array('1.2.0.0', 'a/provider2'), - array('2.2.0.0', 'b/replacer'), - array('3.0.0.0', 'c/c'), - ); + return [ + ['dev-master', '__root__'], + [null, 'foo/impl'], + [null, 'foo/impl2'], + [null, 'foo/replaced'], + ['1.1.0.0', 'a/provider'], + ['1.2.0.0', 'a/provider2'], + ['2.2.0.0', 'b/replacer'], + ['3.0.0.0', 'c/c'], + ]; } /** * @dataProvider getPrettyVersionProvider - * @param null|string $expected - * @param string $name */ public function testGetPrettyVersion(?string $expected, string $name): void { @@ -194,16 +182,16 @@ public function testGetPrettyVersion(?string $expected, string $name): void public static function getPrettyVersionProvider(): array { - return array( - array('dev-master', '__root__'), - array(null, 'foo/impl'), - array(null, 'foo/impl2'), - array(null, 'foo/replaced'), - array('1.1', 'a/provider'), - array('1.2', 'a/provider2'), - array('2.2', 'b/replacer'), - array('3.0', 'c/c'), - ); + return [ + ['dev-master', '__root__'], + [null, 'foo/impl'], + [null, 'foo/impl2'], + [null, 'foo/replaced'], + ['1.1', 'a/provider'], + ['1.2', 'a/provider2'], + ['2.2', 'b/replacer'], + ['3.0', 'c/c'], + ]; } public function testGetVersionOutOfBounds(): void @@ -214,18 +202,18 @@ public function testGetVersionOutOfBounds(): void public function testGetRootPackage(): void { - $this->assertSame(array( + $this->assertSame([ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'reference' => 'sourceref-by-default', 'type' => 'library', 'install_path' => $this->root . '/./', - 'aliases' => array( + 'aliases' => [ '1.10.x-dev', - ), + ], 'dev' => true, - ), InstalledVersions::getRootPackage()); + ], InstalledVersions::getRootPackage()); } /** @@ -239,8 +227,6 @@ public function testGetRawData(): void /** * @dataProvider getReferenceProvider - * @param null|string $expected - * @param string $name */ public function testGetReference(?string $expected, string $name): void { @@ -249,27 +235,27 @@ public function testGetReference(?string $expected, string $name): void public static function getReferenceProvider(): array { - return array( - array('sourceref-by-default', '__root__'), - array(null, 'foo/impl'), - array(null, 'foo/impl2'), - array(null, 'foo/replaced'), - array('distref-as-no-source', 'a/provider'), - array('distref-as-installed-from-dist', 'a/provider2'), - array(null, 'b/replacer'), - array(null, 'c/c'), - ); + return [ + ['sourceref-by-default', '__root__'], + [null, 'foo/impl'], + [null, 'foo/impl2'], + [null, 'foo/replaced'], + ['distref-as-no-source', 'a/provider'], + ['distref-as-installed-from-dist', 'a/provider2'], + [null, 'b/replacer'], + [null, 'c/c'], + ]; } public function testGetInstalledPackagesByType(): void { - $names = array( + $names = [ '__root__', 'a/provider', 'a/provider2', 'b/replacer', 'c/c', - ); + ]; $this->assertSame($names, \Composer\InstalledVersions::getInstalledPackagesByType('library')); } diff --git a/tests/Composer/Test/Installer/BinaryInstallerTest.php b/tests/Composer/Test/Installer/BinaryInstallerTest.php index 2bcc9b61052e..cedfd2027ced 100644 --- a/tests/Composer/Test/Installer/BinaryInstallerTest.php +++ b/tests/Composer/Test/Installer/BinaryInstallerTest.php @@ -66,14 +66,13 @@ protected function tearDown(): void /** * @dataProvider executableBinaryProvider - * @param string $contents */ public function testInstallAndExecBinaryWithFullCompat(string $contents): void { $package = $this->createPackageMock(); $package->expects($this->any()) ->method('getBinaries') - ->willReturn(array('binary')); + ->willReturn(['binary']); $this->ensureDirectoryExistsAndClear($this->vendorDir.'/foo/bar'); file_put_contents($this->vendorDir.'/foo/bar/binary', $contents); @@ -89,31 +88,31 @@ public function testInstallAndExecBinaryWithFullCompat(string $contents): void public function executableBinaryProvider(): array { - return array( - 'simple php file' => array(<<<'EOL' + return [ + 'simple php file' => [<<<'EOL' array(<<<'EOL' + ], + 'php file with shebang' => [<<<'EOL' #!/usr/bin/env php array( + ], + 'phar file' => [ base64_decode('IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCgpQaGFyOjptYXBQaGFyKCd0ZXN0LnBoYXInKTsKCnJlcXVpcmUgJ3BoYXI6Ly90ZXN0LnBoYXIvcnVuLnBocCc7CgpfX0hBTFRfQ09NUElMRVIoKTsgPz4NCj4AAAABAAAAEQAAAAEACQAAAHRlc3QucGhhcgAAAAAHAAAAcnVuLnBocCoAAADb9n9hKgAAAMUDDWGkAQAAAAAAADw/cGhwIGVjaG8gInN1Y2Nlc3MgIi4kX1NFUlZFUlsiYXJndiJdWzFdO1SOC0IE3+UN0yzrHIwyspp9slhmAgAAAEdCTUI='), - ), - 'shebang with strict types declare' => array(<<<'EOL' + ], + 'shebang with strict types declare' => [<<<'EOL' #!/usr/bin/env php getMockBuilder('Composer\Package\Package') - ->setConstructorArgs(array(md5((string) mt_rand()), '1.0.0.0', '1.0.0')) + ->setConstructorArgs([md5((string) mt_rand()), '1.0.0.0', '1.0.0']) ->getMock(); } } diff --git a/tests/Composer/Test/Installer/InstallationManagerTest.php b/tests/Composer/Test/Installer/InstallationManagerTest.php index 5b3d4b4283ec..d1c7746d0319 100644 --- a/tests/Composer/Test/Installer/InstallationManagerTest.php +++ b/tests/Composer/Test/Installer/InstallationManagerTest.php @@ -50,7 +50,7 @@ public function testAddGetInstaller(): void $installer ->expects($this->exactly(2)) ->method('supports') - ->will($this->returnCallback(function ($arg): bool { + ->will($this->returnCallback(static function ($arg): bool { return $arg === 'vendor'; })); @@ -70,7 +70,7 @@ public function testAddRemoveInstaller(): void $installer ->expects($this->exactly(2)) ->method('supports') - ->will($this->returnCallback(function ($arg): bool { + ->will($this->returnCallback(static function ($arg): bool { return $arg === 'vendor'; })); @@ -79,7 +79,7 @@ public function testAddRemoveInstaller(): void $installer2 ->expects($this->exactly(1)) ->method('supports') - ->will($this->returnCallback(function ($arg): bool { + ->will($this->returnCallback(static function ($arg): bool { return $arg === 'vendor'; })); @@ -96,8 +96,8 @@ public function testAddRemoveInstaller(): void public function testExecute(): void { $manager = $this->getMockBuilder('Composer\Installer\InstallationManager') - ->setConstructorArgs(array($this->loop, $this->io)) - ->onlyMethods(array('install', 'update', 'uninstall')) + ->setConstructorArgs([$this->loop, $this->io]) + ->onlyMethods(['install', 'update', 'uninstall']) ->getMock(); $installOperation = new InstallOperation($package = $this->createPackageMock()); @@ -125,7 +125,7 @@ public function testExecute(): void ->with($this->repository, $updateOperation); $manager->addInstaller(new NoopInstaller()); - $manager->execute($this->repository, array($installOperation, $removeOperation, $updateOperation)); + $manager->execute($this->repository, [$installOperation, $removeOperation, $updateOperation]); } public function testInstall(): void @@ -212,7 +212,7 @@ public function testUpdateWithNotEqualTypes(): void $bundleInstaller ->expects($this->exactly(2)) ->method('supports') - ->will($this->returnCallback(function ($arg): bool { + ->will($this->returnCallback(static function ($arg): bool { return $arg === 'bundles'; })); diff --git a/tests/Composer/Test/Installer/LibraryInstallerTest.php b/tests/Composer/Test/Installer/LibraryInstallerTest.php index 173ba361f45d..71e4b3c9dacc 100644 --- a/tests/Composer/Test/Installer/LibraryInstallerTest.php +++ b/tests/Composer/Test/Installer/LibraryInstallerTest.php @@ -81,12 +81,12 @@ protected function setUp(): void $this->binDir = $this->rootDir.DIRECTORY_SEPARATOR.'bin'; self::ensureDirectoryExistsAndClear($this->binDir); - $this->config->merge(array( - 'config' => array( + $this->config->merge([ + 'config' => [ 'vendor-dir' => $this->vendorDir, 'bin-dir' => $this->binDir, - ), - )); + ], + ]); $this->dm = $this->getMockBuilder('Composer\Downloader\DownloadManager') ->disableOriginalConstructor() diff --git a/tests/Composer/Test/Installer/MetapackageInstallerTest.php b/tests/Composer/Test/Installer/MetapackageInstallerTest.php index 114c3f95b44d..83bc2704feab 100644 --- a/tests/Composer/Test/Installer/MetapackageInstallerTest.php +++ b/tests/Composer/Test/Installer/MetapackageInstallerTest.php @@ -113,7 +113,7 @@ public function testUninstall(): void private function createPackageMock() { return $this->getMockBuilder('Composer\Package\Package') - ->setConstructorArgs(array(md5((string) mt_rand()), '1.0.0.0', '1.0.0')) + ->setConstructorArgs([md5((string) mt_rand()), '1.0.0.0', '1.0.0']) ->getMock(); } } diff --git a/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php b/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php index e7fada87bab9..64a961f0dc9a 100644 --- a/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php +++ b/tests/Composer/Test/Installer/SuggestedPackagesReporterTest.php @@ -72,7 +72,7 @@ public function testGetPackages(): void $suggestedPackage['reason'] ); $this->assertSame( - array($suggestedPackage), + [$suggestedPackage], $this->suggestedPackagesReporter->getPackages() ); } @@ -100,7 +100,7 @@ public function testAddPackageAppends(): void $suggestedPackageB['reason'] ); $this->assertSame( - array($suggestedPackageA, $suggestedPackageB), + [$suggestedPackageA, $suggestedPackageB], $this->suggestedPackagesReporter->getPackages() ); } @@ -113,27 +113,27 @@ public function testAddSuggestionsFromPackage(): void $package = $this->createPackageMock(); $package->expects($this->once()) ->method('getSuggests') - ->will($this->returnValue(array( + ->will($this->returnValue([ 'target-a' => 'reason-a', 'target-b' => 'reason-b', - ))); + ])); $package->expects($this->once()) ->method('getPrettyName') ->will($this->returnValue('package-pretty-name')); $this->suggestedPackagesReporter->addSuggestionsFromPackage($package); - $this->assertSame(array( - array( + $this->assertSame([ + [ 'source' => 'package-pretty-name', 'target' => 'target-a', 'reason' => 'reason-a', - ), - array( + ], + [ 'source' => 'package-pretty-name', 'target' => 'target-b', 'reason' => 'reason-b', - ), - ), $this->suggestedPackagesReporter->getPackages()); + ], + ], $this->suggestedPackagesReporter->getPackages()); } /** @@ -229,18 +229,18 @@ public function testOutputSkipInstalledPackages(): void $package1->expects($this->once()) ->method('getNames') - ->will($this->returnValue(array('x', 'y'))); + ->will($this->returnValue(['x', 'y'])); $package2->expects($this->once()) ->method('getNames') - ->will($this->returnValue(array('b'))); + ->will($this->returnValue(['b'])); $repository->expects($this->once()) ->method('getPackages') - ->will($this->returnValue(array( + ->will($this->returnValue([ $package1, $package2, - ))); + ])); $this->suggestedPackagesReporter->addPackage('a', 'b', 'c'); $this->suggestedPackagesReporter->addPackage('source package', 'target', 'because reasons'); @@ -273,11 +273,11 @@ public function testOutputNotGettingInstalledPackagesWhenNoSuggestions(): void */ private function getSuggestedPackageArray(): array { - return array( + return [ 'source' => 'a', 'target' => 'b', 'reason' => 'c', - ); + ]; } /** @@ -286,7 +286,7 @@ private function getSuggestedPackageArray(): array private function createPackageMock() { return $this->getMockBuilder('Composer\Package\Package') - ->setConstructorArgs(array(md5((string) mt_rand()), '1.0.0.0', '1.0.0')) + ->setConstructorArgs([md5((string) mt_rand()), '1.0.0.0', '1.0.0']) ->getMock(); } } diff --git a/tests/Composer/Test/InstallerTest.php b/tests/Composer/Test/InstallerTest.php index 33d97a199afe..6055fbef49aa 100644 --- a/tests/Composer/Test/InstallerTest.php +++ b/tests/Composer/Test/InstallerTest.php @@ -78,12 +78,12 @@ public function testInstaller(RootPackageInterface $rootPackage, array $reposito $io = new BufferIO('', OutputInterface::VERBOSITY_NORMAL, new OutputFormatter(false)); $downloadManager = $this->getMockBuilder('Composer\Downloader\DownloadManager') - ->setConstructorArgs(array($io)) + ->setConstructorArgs([$io]) ->getMock(); $config = $this->getMockBuilder('Composer\Config')->getMock(); $config->expects($this->any()) ->method('get') - ->will($this->returnCallback(function ($key) { + ->will($this->returnCallback(static function ($key) { switch ($key) { case 'vendor-dir': return 'foo'; @@ -91,7 +91,7 @@ public function testInstaller(RootPackageInterface $rootPackage, array $reposito case 'notify-on-install': return true; case 'platform': - return array(); + return []; } throw new \UnexpectedValueException('Unknown key '.$key); @@ -103,7 +103,7 @@ public function testInstaller(RootPackageInterface $rootPackage, array $reposito $repositoryManager->setLocalRepository(new InstalledArrayRepository()); if (!is_array($repositories)) { - $repositories = array($repositories); + $repositories = [$repositories]; } foreach ($repositories as $repository) { $repositoryManager->addRepository($repository); @@ -116,17 +116,17 @@ public function testInstaller(RootPackageInterface $rootPackage, array $reposito $lockJsonMock = $this->getMockBuilder('Composer\Json\JsonFile')->disableOriginalConstructor()->getMock(); $lockJsonMock->expects($this->any()) ->method('read') - ->will($this->returnCallback(function () use (&$lockData) { + ->will($this->returnCallback(static function () use (&$lockData) { return json_decode($lockData, true); })); $lockJsonMock->expects($this->any()) ->method('exists') - ->will($this->returnCallback(function () use (&$lockData): bool { + ->will($this->returnCallback(static function () use (&$lockData): bool { return $lockData !== null; })); $lockJsonMock->expects($this->any()) ->method('write') - ->will($this->returnCallback(function ($value, $options = 0) use (&$lockData): void { + ->will($this->returnCallback(static function ($value, $options = 0) use (&$lockData): void { $lockData = json_encode($value, JSON_PRETTY_PRINT); })); @@ -142,9 +142,9 @@ public function testInstaller(RootPackageInterface $rootPackage, array $reposito $output = str_replace("\r", '', $io->getOutput()); $this->assertEquals(0, $result, $output); - $expectedInstalled = $options['install'] ?? array(); - $expectedUpdated = $options['update'] ?? array(); - $expectedUninstalled = $options['uninstall'] ?? array(); + $expectedInstalled = $options['install'] ?? []; + $expectedUpdated = $options['update'] ?? []; + $expectedUninstalled = $options['uninstall'] ?? []; $installed = $installationManager->getInstalledPackages(); $this->assertEquals($this->makePackagesComparable($expectedInstalled), $this->makePackagesComparable($installed)); @@ -164,7 +164,7 @@ protected function makePackagesComparable(array $packages): array { $dumper = new ArrayDumper(); - $comparable = array(); + $comparable = []; foreach ($packages as $package) { $comparable[] = $dumper->dump($package); } @@ -174,47 +174,47 @@ protected function makePackagesComparable(array $packages): array public function provideInstaller(): array { - $cases = array(); + $cases = []; // when A requires B and B requires A, and A is a non-published root package // the install of B should succeed $a = $this->getPackage('A', '1.0.0', 'Composer\Package\RootPackage'); - $a->setRequires(array( + $a->setRequires([ 'b' => new Link('A', 'B', $v = $this->getVersionConstraint('=', '1.0.0'), Link::TYPE_REQUIRE, $v->getPrettyString()), - )); + ]); $b = $this->getPackage('B', '1.0.0'); - $b->setRequires(array( + $b->setRequires([ 'a' => new Link('B', 'A', $v = $this->getVersionConstraint('=', '1.0.0'), Link::TYPE_REQUIRE, $v->getPrettyString()), - )); + ]); - $cases[] = array( + $cases[] = [ $a, - [new ArrayRepository(array($b))], - array( - 'install' => array($b), - ), - ); + [new ArrayRepository([$b])], + [ + 'install' => [$b], + ], + ]; // #480: when A requires B and B requires A, and A is a published root package // only B should be installed, as A is the root $a = $this->getPackage('A', '1.0.0', 'Composer\Package\RootPackage'); - $a->setRequires(array( + $a->setRequires([ 'b' => new Link('A', 'B', $v = $this->getVersionConstraint('=', '1.0.0'), Link::TYPE_REQUIRE, $v->getPrettyString()), - )); + ]); $b = $this->getPackage('B', '1.0.0'); - $b->setRequires(array( + $b->setRequires([ 'a' => new Link('B', 'A', $v = $this->getVersionConstraint('=', '1.0.0'), Link::TYPE_REQUIRE, $v->getPrettyString()), - )); + ]); - $cases[] = array( + $cases[] = [ $a, - [new ArrayRepository(array($a, $b))], - array( - 'install' => array($b), - ), - ); + [new ArrayRepository([$a, $b])], + [ + 'install' => [$b], + ], + ]; // TODO why are there not more cases with uninstall/update? return $cases; @@ -223,18 +223,11 @@ public function provideInstaller(): array /** * @group slow * @dataProvider provideSlowIntegrationTests - * @param string $file - * @param string $message - * @param null|string $condition * @param mixed[] $composerConfig * @param ?array $lock * @param ?array $installed - * @param string $run * @param mixed[]|false $expectLock * @param ?array $expectInstalled - * @param null|string $expectOutput - * @param null|string $expectOutputOptimized - * @param string $expect * @param int|class-string<\Throwable> $expectResult */ public function testSlowIntegration(string $file, string $message, ?string $condition, array $composerConfig, ?array $lock, ?array $installed, string $run, $expectLock, ?array $expectInstalled, ?string $expectOutput, ?string $expectOutputOptimized, string $expect, $expectResult): void @@ -246,18 +239,11 @@ public function testSlowIntegration(string $file, string $message, ?string $cond /** * @dataProvider provideIntegrationTests - * @param string $file - * @param string $message - * @param null|string $condition * @param mixed[] $composerConfig * @param ?array $lock * @param ?array $installed - * @param string $run * @param mixed[]|false $expectLock * @param ?array $expectInstalled - * @param null|string $expectOutput - * @param null|string $expectOutputOptimized - * @param string $expect * @param int|class-string<\Throwable> $expectResult */ public function testIntegrationWithPoolOptimizer(string $file, string $message, ?string $condition, array $composerConfig, ?array $lock, ?array $installed, string $run, $expectLock, ?array $expectInstalled, ?string $expectOutput, ?string $expectOutputOptimized, string $expect, $expectResult): void @@ -269,18 +255,11 @@ public function testIntegrationWithPoolOptimizer(string $file, string $message, /** * @dataProvider provideIntegrationTests - * @param string $file - * @param string $message - * @param null|string $condition * @param mixed[] $composerConfig * @param ?array $lock * @param ?array $installed - * @param string $run * @param mixed[]|false $expectLock * @param ?array $expectInstalled - * @param null|string $expectOutput - * @param null|string $expectOutputOptimized - * @param string $expect * @param int|class-string<\Throwable> $expectResult */ public function testIntegrationWithRawPool(string $file, string $message, ?string $condition, array $composerConfig, ?array $lock, ?array $installed, string $run, $expectLock, ?array $expectInstalled, ?string $expectOutput, ?string $expectOutputOptimized, string $expect, $expectResult): void @@ -291,19 +270,12 @@ public function testIntegrationWithRawPool(string $file, string $message, ?strin } /** - * @param string $file - * @param string $message - * @param null|string $condition * @param mixed[] $composerConfig * @param ?array $lock * @param ?array $installed - * @param string $run * @param mixed[]|false $expectLock * @param ?array $expectInstalled - * @param null|string $expectOutput - * @param string $expect * @param int|class-string<\Throwable> $expectResult - * @return void */ private function doTestIntegration(string $file, string $message, ?string $condition, array $composerConfig, ?array $lock, ?array $installed, string $run, $expectLock, ?array $expectInstalled, ?string $expectOutput, string $expect, $expectResult): void { @@ -343,25 +315,25 @@ private function doTestIntegration(string $file, string $message, ?string $condi $lockJsonMock = $this->getMockBuilder('Composer\Json\JsonFile')->disableOriginalConstructor()->getMock(); $lockJsonMock->expects($this->any()) ->method('read') - ->will($this->returnCallback(function () use (&$lockData) { + ->will($this->returnCallback(static function () use (&$lockData) { return json_decode($lockData, true); })); $lockJsonMock->expects($this->any()) ->method('exists') - ->will($this->returnCallback(function () use (&$lockData): bool { + ->will($this->returnCallback(static function () use (&$lockData): bool { return $lockData !== null; })); $lockJsonMock->expects($this->any()) ->method('write') - ->will($this->returnCallback(function ($value, $options = 0) use (&$lockData): void { + ->will($this->returnCallback(static function ($value, $options = 0) use (&$lockData): void { $lockData = json_encode($value, JSON_PRETTY_PRINT); })); if ($expectLock) { - $actualLock = array(); + $actualLock = []; $lockJsonMock->expects($this->atLeastOnce()) ->method('write') - ->will($this->returnCallback(function ($hash, $options) use (&$actualLock): void { + ->will($this->returnCallback(static function ($hash, $options) use (&$actualLock): void { // need to do assertion outside of mock for nice phpunit output // so store value temporarily in reference for later assetion $actualLock = $hash; @@ -377,7 +349,7 @@ private function doTestIntegration(string $file, string $message, ?string $condi $eventDispatcher = $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(); $autoloadGenerator = $this->getMockBuilder('Composer\Autoload\AutoloadGenerator') - ->setConstructorArgs(array($eventDispatcher)) + ->setConstructorArgs([$eventDispatcher]) ->getMock(); $composer->setAutoloadGenerator($autoloadGenerator); $composer->setEventDispatcher($eventDispatcher); @@ -390,7 +362,7 @@ private function doTestIntegration(string $file, string $message, ?string $condi $install->addOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY); $install->addOption('no-dev', null, InputOption::VALUE_NONE); $install->addOption('dry-run', null, InputOption::VALUE_NONE); - $install->setCode(function ($input, $output) use ($installer): int { + $install->setCode(static function ($input, $output) use ($installer): int { $ignorePlatformReqs = $input->getOption('ignore-platform-reqs') ?: ($input->getOption('ignore-platform-req') ?: false); $installer @@ -415,10 +387,10 @@ private function doTestIntegration(string $file, string $message, ?string $condi $update->addOption('prefer-stable', null, InputOption::VALUE_NONE); $update->addOption('prefer-lowest', null, InputOption::VALUE_NONE); $update->addArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL); - $update->setCode(function ($input, $output) use ($installer): int { + $update->setCode(static function ($input, $output) use ($installer): int { $packages = $input->getArgument('packages'); - $filteredPackages = array_filter($packages, function ($package): bool { - return !in_array($package, array('lock', 'nothing', 'mirrors'), true); + $filteredPackages = array_filter($packages, static function ($package): bool { + return !in_array($package, ['lock', 'nothing', 'mirrors'], true); }); $updateMirrors = $input->getOption('lock') || count($filteredPackages) !== count($packages); $packages = $filteredPackages; @@ -476,7 +448,7 @@ private function doTestIntegration(string $file, string $message, ?string $condi } if ($expectInstalled !== null) { - $actualInstalled = array(); + $actualInstalled = []; $dumper = new ArrayDumper(); foreach ($repositoryManager->getLocalRepository()->getCanonicalPackages() as $package) { @@ -485,7 +457,7 @@ private function doTestIntegration(string $file, string $message, ?string $condi $actualInstalled[] = $package; } - usort($actualInstalled, function ($a, $b): int { + usort($actualInstalled, static function ($a, $b): int { return strcmp($a['name'], $b['name']); }); @@ -515,13 +487,12 @@ public function provideIntegrationTests(): array } /** - * @param string $path * @return mixed[] */ public function loadIntegrationTests(string $path): array { $fixturesDir = realpath(__DIR__.'/Fixtures/'.$path); - $tests = array(); + $tests = []; foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($fixturesDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) { $file = (string) $file; @@ -533,10 +504,10 @@ public function loadIntegrationTests(string $path): array try { $testData = $this->readTestFile($file, $fixturesDir); - $installed = array(); - $installedDev = array(); - $lock = array(); - $expectLock = array(); + $installed = []; + $installedDev = []; + $lock = []; + $expectLock = []; $expectInstalled = null; $expectResult = 0; @@ -596,7 +567,7 @@ public function loadIntegrationTests(string $path): array die(sprintf('Test "%s" is not valid: '.$e->getMessage(), str_replace($fixturesDir.'/', '', $file))); } - $tests[basename($file)] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $composer, $lock, $installed, $run, $expectLock, $expectInstalled, $expectOutput, $expectOutputOptimized, $expect, $expectResult); + $tests[basename($file)] = [str_replace($fixturesDir.'/', '', $file), $message, $condition, $composer, $lock, $installed, $run, $expectLock, $expectInstalled, $expectOutput, $expectOutputOptimized, $expect, $expectResult]; } return $tests; @@ -609,7 +580,7 @@ protected function readTestFile(string $file, string $fixturesDir): array { $tokens = Preg::split('#(?:^|\n*)--([A-Z-]+)--\n#', file_get_contents($file), -1, PREG_SPLIT_DELIM_CAPTURE); - $sectionInfo = array( + $sectionInfo = [ 'TEST' => true, 'CONDITION' => false, 'COMPOSER' => true, @@ -623,10 +594,10 @@ protected function readTestFile(string $file, string $fixturesDir): array 'EXPECT-EXIT-CODE' => false, 'EXPECT-EXCEPTION' => false, 'EXPECT' => true, - ); + ]; $section = null; - $data = array(); + $data = []; foreach ($tokens as $i => $token) { if (null === $section && empty($token)) { continue; // skip leading blank diff --git a/tests/Composer/Test/Json/ComposerSchemaTest.php b/tests/Composer/Test/Json/ComposerSchemaTest.php index 6567dc08de58..c964a170c627 100644 --- a/tests/Composer/Test/Json/ComposerSchemaTest.php +++ b/tests/Composer/Test/Json/ComposerSchemaTest.php @@ -22,14 +22,14 @@ class ComposerSchemaTest extends TestCase { public function testNamePattern(): void { - $expectedError = array( - array( + $expectedError = [ + [ 'property' => 'name', 'message' => 'Does not match the regex pattern ^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$', 'constraint' => 'pattern', 'pattern' => '^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]|-{1,2})?[a-z0-9]+)*$', - ), - ); + ], + ]; $json = '{"name": "vendor/-pack__age", "description": "description"}'; $this->assertEquals($expectedError, $this->check($json)); @@ -46,21 +46,21 @@ public function testOptionalAbandonedProperty(): void public function testRequireTypes(): void { $json = '{"name": "vendor/package", "description": "description", "require": {"a": ["b"]} }'; - $this->assertEquals(array( - array('property' => 'require.a', 'message' => 'Array value found, but a string is required', 'constraint' => 'type'), - ), $this->check($json)); + $this->assertEquals([ + ['property' => 'require.a', 'message' => 'Array value found, but a string is required', 'constraint' => 'type'], + ], $this->check($json)); } public function testMinimumStabilityValues(): void { - $expectedError = array( - array( + $expectedError = [ + [ 'property' => 'minimum-stability', 'message' => 'Does not have a value in the enumeration ["dev","alpha","beta","rc","RC","stable"]', 'constraint' => 'enum', - 'enum' => array('dev', 'alpha', 'beta', 'rc', 'RC', 'stable'), - ), - ); + 'enum' => ['dev', 'alpha', 'beta', 'rc', 'RC', 'stable'], + ], + ]; $json = '{ "name": "vendor/package", "description": "generic description", "minimum-stability": "" }'; $this->assertEquals($expectedError, $this->check($json), 'empty string'); @@ -91,13 +91,12 @@ public function testMinimumStabilityValues(): void } /** - * @param string $json * @return mixed */ private function check(string $json) { $validator = new Validator(); - $validator->check(json_decode($json), (object) array('$ref' => 'file://' . __DIR__ . '/../../../../res/composer-schema.json')); + $validator->check(json_decode($json), (object) ['$ref' => 'file://' . __DIR__ . '/../../../../res/composer-schema.json']); if (!$validator->isValid()) { $errors = $validator->getErrors(); diff --git a/tests/Composer/Test/Json/JsonFileTest.php b/tests/Composer/Test/Json/JsonFileTest.php index 8f07eee57551..6f0ad2e74c68 100644 --- a/tests/Composer/Test/Json/JsonFileTest.php +++ b/tests/Composer/Test/Json/JsonFileTest.php @@ -133,7 +133,7 @@ public function testSchemaValidationLaxAdditionalProperties(): void $this->fail('Expected exception to be thrown (strict)'); } catch (JsonValidationException $e) { $this->assertEquals(sprintf('"%s" does not match the expected JSON schema', $file), $e->getMessage()); - $this->assertEquals(array('The property foo is not defined and the definition does not allow additional properties'), $e->getErrors()); + $this->assertEquals(['The property foo is not defined and the definition does not allow additional properties'], $e->getErrors()); } $json->validateSchema(JsonFile::LAX_SCHEMA); unlink($file); @@ -164,7 +164,7 @@ public function testSchemaValidationLaxRequired(): void $this->fail('Expected exception to be thrown (strict)'); } catch (JsonValidationException $e) { $this->assertEquals($expectedMessage, $e->getMessage()); - $this->assertEquals(array('description : The property description is required'), $e->getErrors()); + $this->assertEquals(['description : The property description is required'], $e->getErrors()); } $json->validateSchema(JsonFile::LAX_SCHEMA); @@ -174,7 +174,7 @@ public function testSchemaValidationLaxRequired(): void $this->fail('Expected exception to be thrown (strict)'); } catch (JsonValidationException $e) { $this->assertEquals($expectedMessage, $e->getMessage()); - $this->assertEquals(array('name : The property name is required'), $e->getErrors()); + $this->assertEquals(['name : The property name is required'], $e->getErrors()); } $json->validateSchema(JsonFile::LAX_SCHEMA); @@ -278,7 +278,7 @@ public function testParseErrorDetectMissingColon(): void public function testSimpleJsonString(): void { - $data = array('name' => 'composer/composer'); + $data = ['name' => 'composer/composer']; $json = '{ "name": "composer/composer" }'; @@ -287,7 +287,7 @@ public function testSimpleJsonString(): void public function testTrailingBackslash(): void { - $data = array('Metadata\\' => 'src/'); + $data = ['Metadata\\' => 'src/']; $json = '{ "Metadata\\\\": "src/" }'; @@ -296,7 +296,7 @@ public function testTrailingBackslash(): void public function testFormatEmptyArray(): void { - $data = array('test' => array(), 'test2' => new \stdClass); + $data = ['test' => [], 'test2' => new \stdClass]; $json = '{ "test": [], "test2": {} @@ -306,7 +306,7 @@ public function testFormatEmptyArray(): void public function testEscape(): void { - $data = array("Metadata\\\"" => 'src/'); + $data = ["Metadata\\\"" => 'src/']; $json = '{ "Metadata\\\\\\"": "src/" }'; @@ -316,7 +316,7 @@ public function testEscape(): void public function testUnicode(): void { - $data = array("ŽluÅ¥ouÄký \" kůň" => "úpÄ›l Äábelské ódy za €"); + $data = ["ŽluÅ¥ouÄký \" kůň" => "úpÄ›l Äábelské ódy za €"]; $json = '{ "ŽluÅ¥ouÄký \" kůň": "úpÄ›l Äábelské ódy za €" }'; @@ -355,20 +355,15 @@ public function testEscapedUnicode(): void public function testDoubleEscapedUnicode(): void { $jsonFile = new JsonFile('composer.json'); - $data = array("ZdjÄ™cia","hjkjhl\\u0119kkjk"); + $data = ["ZdjÄ™cia","hjkjhl\\u0119kkjk"]; $encodedData = $jsonFile->encode($data); - $doubleEncodedData = $jsonFile->encode(array('t' => $encodedData)); + $doubleEncodedData = $jsonFile->encode(['t' => $encodedData]); $decodedData = json_decode($doubleEncodedData, true); $doubleData = json_decode($decodedData['t'], true); $this->assertEquals($data, $doubleData); } - /** - * @param string $text - * @param string $json - * @return void - */ private function expectParseException(string $text, string $json): void { try { @@ -380,10 +375,7 @@ private function expectParseException(string $text, string $json): void } /** - * @param string $json * @param mixed $data - * @param int|null $options - * @return void */ private function assertJsonFormat(string $json, $data, ?int $options = null): void { diff --git a/tests/Composer/Test/Json/JsonManipulatorTest.php b/tests/Composer/Test/Json/JsonManipulatorTest.php index 0e32be3bc0cf..5bfb9f3dde4d 100644 --- a/tests/Composer/Test/Json/JsonManipulatorTest.php +++ b/tests/Composer/Test/Json/JsonManipulatorTest.php @@ -19,11 +19,6 @@ class JsonManipulatorTest extends TestCase { /** * @dataProvider linkProvider - * @param string $json - * @param string $type - * @param string $package - * @param string $constraint - * @param string $expected */ public function testAddLink(string $json, string $type, string $package, string $constraint, string $expected): void { @@ -34,8 +29,8 @@ public function testAddLink(string $json, string $type, string $package, string public function linkProvider(): array { - return array( - array( + return [ + [ '{}', 'require', 'vendor/baz', @@ -45,8 +40,8 @@ public function linkProvider(): array " \"vendor/baz\": \"qux\"\n". " }\n". "}\n", - ), - array( + ], + [ '{ "foo": "bar" }', @@ -60,8 +55,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { } @@ -75,8 +70,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "empty": "", "require": { @@ -94,8 +89,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { @@ -114,9 +109,9 @@ public function linkProvider(): array } } ', - ), + ], - array( + [ '{ "require": { @@ -135,8 +130,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { @@ -155,8 +150,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { @@ -175,8 +170,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { "foo": "bar" @@ -207,8 +202,8 @@ public function linkProvider(): array }] } ', - ), - array( + ], + [ '{ "repositories": [{ "type": "package", @@ -236,8 +231,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { "php": "5.*" @@ -255,8 +250,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "require": { "php": "5.*" @@ -277,8 +272,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "repositories": [{ "type": "package", @@ -325,8 +320,8 @@ public function linkProvider(): array } } ', - ), - array( + ], + [ '{ "config": { "cache-files-ttl": 0, @@ -1288,18 +1283,12 @@ public function linkProvider(): array } } ', - ), - ); + ], + ]; } /** * @dataProvider providerAddLinkAndSortPackages - * @param string $json - * @param string $type - * @param string $package - * @param string $constraint - * @param bool $sortPackages - * @param string $expected */ public function testAddLinkAndSortPackages(string $json, string $type, string $package, string $constraint, bool $sortPackages, string $expected): void { @@ -1310,8 +1299,8 @@ public function testAddLinkAndSortPackages(string $json, string $type, string $p public function providerAddLinkAndSortPackages(): array { - return array( - array( + return [ + [ '{ "require": { "vendor/baz": "qux" @@ -1328,8 +1317,8 @@ public function providerAddLinkAndSortPackages(): array } } ', - ), - array( + ], + [ '{ "require": { "vendor/baz": "qux" @@ -1346,8 +1335,8 @@ public function providerAddLinkAndSortPackages(): array } } ', - ), - array( + ], + [ '{ "require": { "foo": "baz", @@ -1374,16 +1363,12 @@ public function providerAddLinkAndSortPackages(): array } } ', - ), - ); + ], + ]; } /** * @dataProvider removeSubNodeProvider - * @param string $json - * @param string $name - * @param bool $expected - * @param null|string $expectedContent */ public function testRemoveSubNode(string $json, string $name, bool $expected, ?string $expectedContent = null): void { @@ -1397,8 +1382,8 @@ public function testRemoveSubNode(string $json, string $name, bool $expected, ?s public function removeSubNodeProvider(): array { - return array( - 'works on simple ones first' => array( + return [ + 'works on simple ones first' => [ '{ "repositories": { "foo": { @@ -1422,8 +1407,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on simple ones last' => array( + ], + 'works on simple ones last' => [ '{ "repositories": { "foo": { @@ -1447,8 +1432,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on simple ones unique' => array( + ], + 'works on simple ones unique' => [ '{ "repositories": { "foo": { @@ -1464,8 +1449,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on simple ones escaped slash' => array( + ], + 'works on simple ones escaped slash' => [ '{ "repositories": { "foo\/bar": { @@ -1480,8 +1465,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on simple ones middle' => array( + ], + 'works on simple ones middle' => [ '{ "repositories": { "foo": { @@ -1513,8 +1498,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on undefined ones' => array( + ], + 'works on undefined ones' => [ '{ "repositories": { "main": { @@ -1534,8 +1519,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on child having unmatched name' => array( + ], + 'works on child having unmatched name' => [ '{ "repositories": { "baz": { @@ -1555,8 +1540,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on child having duplicate name' => array( + ], + 'works on child having duplicate name' => [ '{ "repositories": { "foo": { @@ -1578,28 +1563,28 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on empty repos' => array( + ], + 'works on empty repos' => [ '{ "repositories": { } }', 'bar', true, - ), - 'works on empty repos2' => array( + ], + 'works on empty repos2' => [ '{ "repositories": {} }', 'bar', true, - ), - 'works on missing repos' => array( + ], + 'works on missing repos' => [ "{\n}", 'bar', true, - ), - 'works on deep repos' => array( + ], + 'works on deep repos' => [ '{ "repositories": { "foo": { @@ -1614,8 +1599,8 @@ public function removeSubNodeProvider(): array } } ', - ), - 'works on deep repos with borked texts' => array( + ], + 'works on deep repos with borked texts' => [ '{ "repositories": { "foo": { @@ -1637,8 +1622,8 @@ public function removeSubNodeProvider(): array '{ } ', - ), - 'works on deep repos with borked texts2' => array( + ], + 'works on deep repos with borked texts2' => [ '{ "repositories": { "foo": { @@ -1660,8 +1645,8 @@ public function removeSubNodeProvider(): array '{ } ', - ), - 'fails on deep arrays with borked texts' => array( + ], + 'fails on deep arrays with borked texts' => [ '{ "repositories": [ { @@ -1671,8 +1656,8 @@ public function removeSubNodeProvider(): array }', 'bar', false, - ), - 'fails on deep arrays with borked texts2' => array( + ], + 'fails on deep arrays with borked texts2' => [ '{ "repositories": [ { @@ -1682,8 +1667,8 @@ public function removeSubNodeProvider(): array }', 'bar', false, - ), - ); + ], + ]; } public function testRemoveSubNodeFromRequire(): void @@ -1922,7 +1907,7 @@ public function testAddRepositoryCanInitializeEmptyRepositories(): void } }'); - $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer'))); + $this->assertTrue($manipulator->addRepository('bar', ['type' => 'composer'])); $this->assertEquals('{ "repositories": { "bar": { @@ -1939,7 +1924,7 @@ public function testAddRepositoryCanInitializeFromScratch(): void \t\"a\": \"b\" }"); - $this->assertTrue($manipulator->addRepository('bar2', array('type' => 'composer'))); + $this->assertTrue($manipulator->addRepository('bar2', ['type' => 'composer'])); $this->assertEquals("{ \t\"a\": \"b\", \t\"repositories\": { @@ -1962,7 +1947,7 @@ public function testAddRepositoryCanAppend(): void } }'); - $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer'), true)); + $this->assertTrue($manipulator->addRepository('bar', ['type' => 'composer'], true)); $this->assertEquals('{ "repositories": { "foo": { @@ -1988,7 +1973,7 @@ public function testAddRepositoryCanPrepend(): void } }'); - $this->assertTrue($manipulator->addRepository('bar', array('type' => 'composer'), false)); + $this->assertTrue($manipulator->addRepository('bar', ['type' => 'composer'], false)); $this->assertEquals('{ "repositories": { "bar": { @@ -2014,7 +1999,7 @@ public function testAddRepositoryCanOverrideDeepRepos(): void } }'); - $this->assertTrue($manipulator->addRepository('baz', array('type' => 'composer'))); + $this->assertTrue($manipulator->addRepository('baz', ['type' => 'composer'])); $this->assertEquals('{ "repositories": { "baz": { @@ -2124,7 +2109,7 @@ public function testAddConfigSettingCanOverwriteArrays(): void } }'); - $this->assertTrue($manipulator->addConfigSetting('github-protocols', array('https', 'http'))); + $this->assertTrue($manipulator->addConfigSetting('github-protocols', ['https', 'http'])); $this->assertEquals('{ "config": { "github-oauth": { @@ -2135,7 +2120,7 @@ public function testAddConfigSettingCanOverwriteArrays(): void } ', $manipulator->getContents()); - $this->assertTrue($manipulator->addConfigSetting('github-oauth', array('github.com' => 'bar', 'alt.example.org' => 'baz'))); + $this->assertTrue($manipulator->addConfigSetting('github-oauth', ['github.com' => 'bar', 'alt.example.org' => 'baz'])); $this->assertEquals('{ "config": { "github-oauth": { @@ -2368,7 +2353,7 @@ public function testUpdateMainKey3(): void } }'); - $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux'))); + $this->assertTrue($manipulator->addMainKey('require-dev', ['foo' => 'qux'])); $this->assertEquals('{ "require": { "php": "5.*" @@ -2497,16 +2482,16 @@ public function testRemoveMainKeyIfEmpty(): void public function testRemoveMainKeyRemovesKeyWhereValueIsNull(): void { - $manipulator = new JsonManipulator(json_encode(array( + $manipulator = new JsonManipulator(json_encode([ 'foo' => 9000, 'bar' => null, - ))); + ])); $manipulator->removeMainKey('bar'); - $expected = json_encode(array( + $expected = json_encode([ 'foo' => 9000, - )); + ]); $this->assertJsonStringEqualsJsonString($expected, $manipulator->getContents()); } @@ -2520,7 +2505,7 @@ public function testIndentDetection(): void } }'); - $this->assertTrue($manipulator->addMainKey('require-dev', array('foo' => 'qux'))); + $this->assertTrue($manipulator->addMainKey('require-dev', ['foo' => 'qux'])); $this->assertEquals('{ "require": { diff --git a/tests/Composer/Test/Json/JsonValidationExceptionTest.php b/tests/Composer/Test/Json/JsonValidationExceptionTest.php index f11dfca8808f..01f4bcbc93a2 100644 --- a/tests/Composer/Test/Json/JsonValidationExceptionTest.php +++ b/tests/Composer/Test/Json/JsonValidationExceptionTest.php @@ -32,14 +32,14 @@ public function testGetErrors(string $message, array $errors, string $expectedMe public function testGetErrorsWhenNoErrorsProvided(): void { $object = new JsonValidationException('test message'); - $this->assertEquals(array(), $object->getErrors()); + $this->assertEquals([], $object->getErrors()); } public function errorProvider(): array { - return array( - array('test message', array(), 'test message', []), - array('', ['foo'], '', ['foo']), - ); + return [ + ['test message', [], 'test message', []], + ['', ['foo'], '', ['foo']], + ]; } } diff --git a/tests/Composer/Test/Mock/FactoryMock.php b/tests/Composer/Test/Mock/FactoryMock.php index a4cbe3f7745d..613e745dffe5 100644 --- a/tests/Composer/Test/Mock/FactoryMock.php +++ b/tests/Composer/Test/Mock/FactoryMock.php @@ -31,14 +31,14 @@ class FactoryMock extends Factory { - public static function createConfig(IOInterface $io = null, ?string $cwd = null): Config + public static function createConfig(?IOInterface $io = null, ?string $cwd = null): Config { $config = new Config(true, $cwd); - $config->merge(array( - 'config' => array('home' => TestCase::getUniqueTmpDirectory()), - 'repositories' => array('packagist' => false), - )); + $config->merge([ + 'config' => ['home' => TestCase::getUniqueTmpDirectory()], + 'repositories' => ['packagist' => false], + ]); return $config; } @@ -48,17 +48,17 @@ protected function loadRootPackage(RepositoryManager $rm, Config $config, Versio return new \Composer\Package\Loader\RootPackageLoader($rm, $config, $parser, new VersionGuesserMock(), $io); } - protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, $vendorDir, RootPackageInterface $rootPackage, ProcessExecutor $process = null): void + protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, string $vendorDir, RootPackageInterface $rootPackage, ?ProcessExecutor $process = null): void { $rm->setLocalRepository(new InstalledArrayRepository); } - public function createInstallationManager(Loop $loop = null, IOInterface $io = null, EventDispatcher $dispatcher = null): InstallationManager + public function createInstallationManager(?Loop $loop = null, ?IOInterface $io = null, ?EventDispatcher $dispatcher = null): InstallationManager { return new InstallationManagerMock(); } - protected function createDefaultInstallers(InstallationManager $im, PartialComposer $composer, IOInterface $io, ProcessExecutor $process = null): void + protected function createDefaultInstallers(InstallationManager $im, PartialComposer $composer, IOInterface $io, ?ProcessExecutor $process = null): void { } diff --git a/tests/Composer/Test/Mock/HttpDownloaderMock.php b/tests/Composer/Test/Mock/HttpDownloaderMock.php index beb12ecc8fcc..32168c3f0769 100644 --- a/tests/Composer/Test/Mock/HttpDownloaderMock.php +++ b/tests/Composer/Test/Mock/HttpDownloaderMock.php @@ -34,13 +34,13 @@ class HttpDownloaderMock extends HttpDownloader /** * @var array{status: int, body: string, headers: array} */ - private $defaultHandler = array('status' => 200, 'body' => '', 'headers' => []); + private $defaultHandler = ['status' => 200, 'body' => '', 'headers' => []]; /** * @var string[] */ - private $log = array(); + private $log = []; - public function __construct(IOInterface $io = null, Config $config = null) + public function __construct(?IOInterface $io = null, ?Config $config = null) { if ($io === null) { $io = new BufferIO(); @@ -56,10 +56,10 @@ public function __construct(IOInterface $io = null, Config $config = null) * @param bool $strict set to true if you want to provide *all* expected http requests, and not just a subset you are interested in testing * @param array{status?: int, body?: string, headers?: array} $defaultHandler default URL handler for undefined requests if not in strict mode */ - public function expects(array $expectations, bool $strict = false, array $defaultHandler = array('status' => 200, 'body' => '', 'headers' => [])): void + public function expects(array $expectations, bool $strict = false, array $defaultHandler = ['status' => 200, 'body' => '', 'headers' => []]): void { $default = ['url' => '', 'options' => null, 'status' => 200, 'body' => '', 'headers' => ['']]; - $this->expectations = array_map(function (array $expect) use ($default): array { + $this->expectations = array_map(static function (array $expect) use ($default): array { if (count($diff = array_diff_key(array_merge($default, $expect), $default)) > 0) { throw new \UnexpectedValueException('Unexpected keys in process execution step: '.implode(', ', array_keys($diff))); } @@ -91,7 +91,7 @@ public function assertComplete(): void } if (count($this->expectations) > 0) { - $expectations = array_map(function ($expect): string { + $expectations = array_map(static function ($expect): string { return $expect['url']; }, $this->expectations); throw new AssertionFailedError( @@ -105,7 +105,7 @@ public function assertComplete(): void Assert::assertTrue(true); // @phpstan-ignore-line } - public function get($fileUrl, $options = array()): Response + public function get($fileUrl, $options = []): Response { $this->log[] = $fileUrl; @@ -132,7 +132,7 @@ public function get($fileUrl, $options = array()): Response private function respond(string $url, int $status, array $headers, string $body): Response { if ($status < 400) { - return new Response(array('url' => $url), $status, $headers, $body); + return new Response(['url' => $url], $status, $headers, $body); } $e = new TransportException('The "'.$url.'" file could not be downloaded', $status); diff --git a/tests/Composer/Test/Mock/InstallationManagerMock.php b/tests/Composer/Test/Mock/InstallationManagerMock.php index 31062f73620e..bfdc580e451f 100644 --- a/tests/Composer/Test/Mock/InstallationManagerMock.php +++ b/tests/Composer/Test/Mock/InstallationManagerMock.php @@ -28,19 +28,19 @@ class InstallationManagerMock extends InstallationManager /** * @var PackageInterface[] */ - private $installed = array(); + private $installed = []; /** * @var PackageInterface[][] */ - private $updated = array(); + private $updated = []; /** * @var PackageInterface[] */ - private $uninstalled = array(); + private $uninstalled = []; /** * @var string[] */ - private $trace = array(); + private $trace = []; public function __construct() { @@ -51,7 +51,7 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, $ foreach ($operations as $operation) { $method = $operation->getOperationType(); // skipping download() step here for tests - $this->$method($repo, $operation); + $this->{$method}($repo, $operation); } } @@ -82,7 +82,7 @@ public function install(InstalledRepositoryInterface $repo, InstallOperation $op */ public function update(InstalledRepositoryInterface $repo, UpdateOperation $operation): ?PromiseInterface { - $this->updated[] = array($operation->getInitialPackage(), $operation->getTargetPackage()); + $this->updated[] = [$operation->getInitialPackage(), $operation->getTargetPackage()]; $this->trace[] = strip_tags((string) $operation); $repo->removePackage($operation->getInitialPackage()); if (!$repo->hasPackage($operation->getTargetPackage())) { diff --git a/tests/Composer/Test/Mock/ProcessExecutorMock.php b/tests/Composer/Test/Mock/ProcessExecutorMock.php index 2f5c2ff23a7b..713fab82c527 100644 --- a/tests/Composer/Test/Mock/ProcessExecutorMock.php +++ b/tests/Composer/Test/Mock/ProcessExecutorMock.php @@ -12,7 +12,6 @@ namespace Composer\Test\Mock; -use Composer\Test\TestCase; use PHPUnit\Framework\MockObject\MockBuilder; use React\Promise\PromiseInterface; use Composer\Util\ProcessExecutor; @@ -38,11 +37,11 @@ class ProcessExecutorMock extends ProcessExecutor /** * @var array{return: int, stdout: string, stderr: string} */ - private $defaultHandler = array('return' => 0, 'stdout' => '', 'stderr' => ''); + private $defaultHandler = ['return' => 0, 'stdout' => '', 'stderr' => '']; /** * @var string[] */ - private $log = array(); + private $log = []; /** * @var MockBuilder */ @@ -61,14 +60,12 @@ public function __construct(MockBuilder $processMockBuilder) * @param array, return?: int, stdout?: string, stderr?: string, callback?: callable}> $expectations * @param bool $strict set to true if you want to provide *all* expected commands, and not just a subset you are interested in testing * @param array{return: int, stdout?: string, stderr?: string} $defaultHandler default command handler for undefined commands if not in strict mode - * - * @return void */ - public function expects(array $expectations, bool $strict = false, array $defaultHandler = array('return' => 0, 'stdout' => '', 'stderr' => '')): void + public function expects(array $expectations, bool $strict = false, array $defaultHandler = ['return' => 0, 'stdout' => '', 'stderr' => '']): void { /** @var array{cmd: string|list, return: int, stdout: string, stderr: string, callback: callable} $default */ - $default = array('cmd' => '', 'return' => 0, 'stdout' => '', 'stderr' => '', 'callback' => null); - $this->expectations = array_map(function ($expect) use ($default): array { + $default = ['cmd' => '', 'return' => 0, 'stdout' => '', 'stderr' => '', 'callback' => null]; + $this->expectations = array_map(static function ($expect) use ($default): array { if (is_string($expect)) { $command = $expect; $expect = $default; @@ -104,7 +101,7 @@ public function assertComplete(): void } if (count($this->expectations) > 0) { - $expectations = array_map(function ($expect): string { + $expectations = array_map(static function ($expect): string { return is_array($expect['cmd']) ? implode(' ', $expect['cmd']) : $expect['cmd']; }, $this->expectations); throw new AssertionFailedError( @@ -140,8 +137,6 @@ public function executeTty($command, ?string $cwd = null): int /** * @param string|list $command - * @param string $cwd - * @param bool $tty * @param callable|string|null $output * @return mixed */ @@ -163,7 +158,7 @@ private function doExecute($command, string $cwd, bool $tty, &$output = null) $stderr = $expect['stderr']; $return = $expect['return']; if (isset($expect['callback'])) { - call_user_func($expect['callback']); + $expect['callback'](); } } elseif (!$this->strict) { $stdout = $this->defaultHandler['stdout']; @@ -178,10 +173,10 @@ private function doExecute($command, string $cwd, bool $tty, &$output = null) } if ($stdout) { - call_user_func($callback, Process::OUT, $stdout); + $callback(Process::OUT, $stdout); } if ($stderr) { - call_user_func($callback, Process::ERR, $stderr); + $callback(Process::ERR, $stderr); } if ($this->captureOutput && !is_callable($output)) { @@ -207,7 +202,7 @@ public function executeAsync($command, ?string $cwd = null): PromiseInterface $resolve($procMock); }; - $canceler = function (): void { + $canceler = static function (): void { throw new \RuntimeException('Aborted process'); }; diff --git a/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php b/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php index 3f5a488c88b8..ad5cb98af9d5 100644 --- a/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php +++ b/tests/Composer/Test/Package/Archiver/ArchivableFilesFinderTest.php @@ -42,7 +42,7 @@ protected function setUp(): void self::getUniqueTmpDirectory() ); - $fileTree = array( + $fileTree = [ '.foo', 'A/prefixA.foo', 'A/prefixB.foo', @@ -87,7 +87,7 @@ protected function setUp(): void '!important!.txt', '!important_too!.txt', '#weirdfile', - ); + ]; foreach ($fileTree as $relativePath) { $path = $this->sources.'/'.$relativePath; @@ -105,18 +105,18 @@ protected function tearDown(): void public function testManualExcludes(): void { - $excludes = array( + $excludes = [ 'prefixB.foo', '!/prefixB.foo', '/prefixA.foo', 'prefixC.*', '!*/*/*/prefixC.foo', '.*', - ); + ]; $this->finder = new ArchivableFilesFinder($this->sources, $excludes); - $this->assertArchivableFiles(array( + $this->assertArchivableFiles([ '/!important!.txt', '/!important_too!.txt', '/#weirdfile', @@ -153,14 +153,14 @@ public function testManualExcludes(): void '/prefixF.foo', '/toplevelA.foo', '/toplevelB.foo', - )); + ]); } public function testGitExcludes(): void { $this->skipIfNotExecutable('git'); - file_put_contents($this->sources.'/.gitattributes', implode("\n", array( + file_put_contents($this->sources.'/.gitattributes', implode("\n", [ '', '# gitattributes rules with comments and blank lines', 'prefixB.foo export-ignore', @@ -187,9 +187,9 @@ public function testGitExcludes(): void 'parameters.yml export-ignore', '\!important!.txt export-ignore', '\#* export-ignore', - ))); + ])); - $this->finder = new ArchivableFilesFinder($this->sources, array()); + $this->finder = new ArchivableFilesFinder($this->sources, []); $this->assertArchivableFiles($this->getArchivedFiles( 'git init && '. @@ -206,13 +206,13 @@ public function testGitExcludes(): void public function testSkipExcludes(): void { - $excludes = array( + $excludes = [ 'prefixB.foo', - ); + ]; $this->finder = new ArchivableFilesFinder($this->sources, $excludes, true); - $this->assertArchivableFiles(array( + $this->assertArchivableFiles([ '/!important!.txt', '/!important_too!.txt', '/#weirdfile', @@ -257,7 +257,7 @@ public function testSkipExcludes(): void '/prefixF.foo', '/toplevelA.foo', '/toplevelB.foo', - )); + ]); } /** @@ -265,7 +265,7 @@ public function testSkipExcludes(): void */ protected function getArchivableFiles(): array { - $files = array(); + $files = []; foreach ($this->finder as $file) { if (!$file->isDir()) { $files[] = Preg::replace('#^'.preg_quote($this->sources, '#').'#', '', $this->fs->normalizePath($file->getRealPath())); @@ -278,8 +278,6 @@ protected function getArchivableFiles(): array } /** - * @param string $command - * * @return string[] */ protected function getArchivedFiles(string $command): array @@ -290,7 +288,7 @@ protected function getArchivedFiles(string $command): array $archive = new \PharData($this->sources.'/archive.zip'); $iterator = new \RecursiveIteratorIterator($archive); - $files = array(); + $files = []; foreach ($iterator as $file) { $files[] = Preg::replace('#^phar://'.preg_quote($this->sources, '#').'/archive\.zip/archive#', '', $this->fs->normalizePath((string) $file)); } @@ -303,8 +301,6 @@ protected function getArchivedFiles(string $command): array /** * @param string[] $expectedFiles - * - * @return void */ protected function assertArchivableFiles(array $expectedFiles): void { diff --git a/tests/Composer/Test/Package/Archiver/ArchiveManagerTest.php b/tests/Composer/Test/Package/Archiver/ArchiveManagerTest.php index 5a898694b0ff..ea66a1f3edd6 100644 --- a/tests/Composer/Test/Package/Archiver/ArchiveManagerTest.php +++ b/tests/Composer/Test/Package/Archiver/ArchiveManagerTest.php @@ -99,12 +99,6 @@ public function testArchiveCustomFileName(): void unlink($target); } - /** - * @param string $format - * @param string|null $fileName - * - * @return string - */ protected function getTargetName(CompletePackage $package, string $format, ?string $fileName = null): string { if (null === $fileName) { @@ -118,8 +112,6 @@ protected function getTargetName(CompletePackage $package, string $format, ?stri /** * Create local git repository to run tests against! - * - * @return void */ protected function setupGitRepo(): void { diff --git a/tests/Composer/Test/Package/Archiver/ArchiverTest.php b/tests/Composer/Test/Package/Archiver/ArchiverTest.php index e94ffa8ae7f4..867bf11e742f 100644 --- a/tests/Composer/Test/Package/Archiver/ArchiverTest.php +++ b/tests/Composer/Test/Package/Archiver/ArchiverTest.php @@ -49,8 +49,6 @@ protected function tearDown(): void /** * Util method to quickly setup a package using the source path built. - * - * @return CompletePackage */ protected function setupPackage(): CompletePackage { diff --git a/tests/Composer/Test/Package/Archiver/GitExcludeFilterTest.php b/tests/Composer/Test/Package/Archiver/GitExcludeFilterTest.php index 79c57f0d0b07..967a3d6d0654 100644 --- a/tests/Composer/Test/Package/Archiver/GitExcludeFilterTest.php +++ b/tests/Composer/Test/Package/Archiver/GitExcludeFilterTest.php @@ -20,7 +20,6 @@ class GitExcludeFilterTest extends TestCase /** * @dataProvider providePatterns * - * @param string $ignore * @param mixed[] $expected */ public function testPatternEscape(string $ignore, array $expected): void @@ -32,9 +31,9 @@ public function testPatternEscape(string $ignore, array $expected): void public function providePatterns(): array { - return array( - array('app/config/parameters.yml export-ignore', array('{(?=[^\.])app/(?=[^\.])config/(?=[^\.])parameters\.yml(?=$|/)}', false, false)), - array('app/config/parameters.yml -export-ignore', array('{(?=[^\.])app/(?=[^\.])config/(?=[^\.])parameters\.yml(?=$|/)}', true, false)), - ); + return [ + ['app/config/parameters.yml export-ignore', ['{(?=[^\.])app/(?=[^\.])config/(?=[^\.])parameters\.yml(?=$|/)}', false, false]], + ['app/config/parameters.yml -export-ignore', ['{(?=[^\.])app/(?=[^\.])config/(?=[^\.])parameters\.yml(?=$|/)}', true, false]], + ]; } } diff --git a/tests/Composer/Test/Package/Archiver/PharArchiverTest.php b/tests/Composer/Test/Package/Archiver/PharArchiverTest.php index 4b81b2b210e9..02f779b464e0 100644 --- a/tests/Composer/Test/Package/Archiver/PharArchiverTest.php +++ b/tests/Composer/Test/Package/Archiver/PharArchiverTest.php @@ -26,7 +26,7 @@ public function testTarArchive(): void // Test archive $archiver = new PharArchiver(); - $archiver->archive($package->getSourceUrl(), $target, 'tar', array('foo/bar', 'baz', '!/foo/bar/baz')); + $archiver->archive($package->getSourceUrl(), $target, 'tar', ['foo/bar', 'baz', '!/foo/bar/baz']); $this->assertFileExists($target); $this->filesystem->removeDirectory(dirname($target)); @@ -49,8 +49,6 @@ public function testZipArchive(): void /** * Create a local dummy repository to run tests against! - * - * @return void */ protected function setupDummyRepo(): void { @@ -66,13 +64,6 @@ protected function setupDummyRepo(): void chdir($currentWorkDir); } - /** - * @param string $path - * @param string $content - * @param string $currentWorkDir - * - * @return void - */ protected function writeFile(string $path, string $content, string $currentWorkDir): void { if (!file_exists(dirname($path))) { diff --git a/tests/Composer/Test/Package/Archiver/ZipArchiverTest.php b/tests/Composer/Test/Package/Archiver/ZipArchiverTest.php index e216fe0a6883..da9fe536f542 100644 --- a/tests/Composer/Test/Package/Archiver/ZipArchiverTest.php +++ b/tests/Composer/Test/Package/Archiver/ZipArchiverTest.php @@ -19,42 +19,40 @@ class ZipArchiverTest extends ArchiverTest { /** - * @param string $include - * * @dataProvider provideGitignoreExcludeNegationTestCases */ public function testGitignoreExcludeNegation(string $include): void { - $this->testZipArchive(array( + $this->testZipArchive([ 'docs/README.md' => '# The doc', '.gitignore' => "/*\n.*\n!.git*\n$include", - )); + ]); } public function provideGitignoreExcludeNegationTestCases(): array { - return array( - array('!/docs'), - array('!/docs/'), - ); + return [ + ['!/docs'], + ['!/docs/'], + ]; } /** * @param array $files */ - public function testZipArchive(array $files = array()): void + public function testZipArchive(array $files = []): void { if (!class_exists('ZipArchive')) { $this->markTestSkipped('Cannot run ZipArchiverTest, missing class "ZipArchive".'); } if (empty($files)) { - $files = array( + $files = [ 'file.txt' => null, 'foo/bar/baz' => null, 'x/baz' => null, 'x/includeme' => null, - ); + ]; if (!Platform::isWindows()) { $files['foo' . Platform::getCwd() . '/file.txt'] = null; @@ -84,8 +82,6 @@ public function testZipArchive(array $files = array()): void * Create a local dummy repository to run tests against! * * @param array $files - * - * @return void */ protected function setupDummyRepo(array &$files): void { @@ -101,13 +97,6 @@ protected function setupDummyRepo(array &$files): void chdir($currentWorkDir); } - /** - * @param string $path - * @param string $content - * @param string $currentWorkDir - * - * @return void - */ protected function writeFile(string $path, string $content, string $currentWorkDir): void { if (!file_exists(dirname($path))) { diff --git a/tests/Composer/Test/Package/BasePackageTest.php b/tests/Composer/Test/Package/BasePackageTest.php index acc8f4de37ae..8c08c276801d 100644 --- a/tests/Composer/Test/Package/BasePackageTest.php +++ b/tests/Composer/Test/Package/BasePackageTest.php @@ -22,7 +22,7 @@ class BasePackageTest extends TestCase */ public function testSetSameRepository(): void { - $package = $this->getMockForAbstractClass('Composer\Package\BasePackage', array('foo')); + $package = $this->getMockForAbstractClass('Composer\Package\BasePackage', ['foo']); $repository = $this->getMockBuilder('Composer\Repository\RepositoryInterface')->getMock(); $package->setRepository($repository); @@ -37,7 +37,7 @@ public function testSetAnotherRepository(): void { self::expectException('LogicException'); - $package = $this->getMockForAbstractClass('Composer\Package\BasePackage', array('foo')); + $package = $this->getMockForAbstractClass('Composer\Package\BasePackage', ['foo']); $package->setRepository($this->getMockBuilder('Composer\Repository\RepositoryInterface')->getMock()); $package->setRepository($this->getMockBuilder('Composer\Repository\RepositoryInterface')->getMock()); @@ -45,9 +45,6 @@ public function testSetAnotherRepository(): void /** * @dataProvider provideFormattedVersions - * - * @param bool $truncate - * @param string $expected */ public function testFormatVersionForDevPackage(BasePackage $package, bool $truncate, string $expected): void { @@ -56,37 +53,37 @@ public function testFormatVersionForDevPackage(BasePackage $package, bool $trunc public function provideFormattedVersions(): array { - $data = array( - array( + $data = [ + [ 'sourceReference' => 'v2.1.0-RC2', 'truncate' => true, 'expected' => 'PrettyVersion v2.1.0-RC2', - ), - array( + ], + [ 'sourceReference' => 'bbf527a27356414bfa9bf520f018c5cb7af67c77', 'truncate' => true, 'expected' => 'PrettyVersion bbf527a', - ), - array( + ], + [ 'sourceReference' => 'v1.0.0', 'truncate' => false, 'expected' => 'PrettyVersion v1.0.0', - ), - array( + ], + [ 'sourceReference' => 'bbf527a27356414bfa9bf520f018c5cb7af67c77', 'truncate' => false, 'expected' => 'PrettyVersion bbf527a27356414bfa9bf520f018c5cb7af67c77', - ), - ); + ], + ]; $createPackage = function ($arr): array { - $package = $this->getMockForAbstractClass('\Composer\Package\BasePackage', array(), '', false); + $package = $this->getMockForAbstractClass('\Composer\Package\BasePackage', [], '', false); $package->expects($this->once())->method('isDev')->will($this->returnValue(true)); $package->expects($this->any())->method('getSourceType')->will($this->returnValue('git')); $package->expects($this->once())->method('getPrettyVersion')->will($this->returnValue('PrettyVersion')); $package->expects($this->any())->method('getSourceReference')->will($this->returnValue($arr['sourceReference'])); - return array($package, $arr['truncate'], $arr['expected']); + return [$package, $arr['truncate'], $arr['expected']]; }; return array_map($createPackage, $data); @@ -95,7 +92,6 @@ public function provideFormattedVersions(): array /** * @param string[] $packageNames * @param non-empty-string $wrap - * @param string $expectedRegexp * * @dataProvider dataPackageNamesToRegexp */ @@ -111,13 +107,13 @@ public function testPackageNamesToRegexp(array $packageNames, $wrap, string $exp */ public function dataPackageNamesToRegexp(): array { - return array( - array( - array('ext-*', 'monolog/monolog'), '{^%s$}i', '{^ext\-.*|monolog/monolog$}i', - array('php'), '{^%s$}i', '{^php$}i', - array('*'), '{^%s$}i', '{^.*$}i', - array('foo', 'bar'), '§%s§', '§foo|bar§', - ), - ); + return [ + [ + ['ext-*', 'monolog/monolog'], '{^%s$}i', '{^ext\-.*|monolog/monolog$}i', + ['php'], '{^%s$}i', '{^php$}i', + ['*'], '{^%s$}i', '{^.*$}i', + ['foo', 'bar'], '§%s§', '§foo|bar§', + ], + ]; } } diff --git a/tests/Composer/Test/Package/CompletePackageTest.php b/tests/Composer/Test/Package/CompletePackageTest.php index a1edd1560ebb..56ec8b1560e1 100644 --- a/tests/Composer/Test/Package/CompletePackageTest.php +++ b/tests/Composer/Test/Package/CompletePackageTest.php @@ -25,20 +25,17 @@ class CompletePackageTest extends TestCase */ public function providerVersioningSchemes(): array { - $provider[] = array('foo', '1-beta'); - $provider[] = array('node', '0.5.6'); - $provider[] = array('li3', '0.10'); - $provider[] = array('mongodb_odm', '1.0.0BETA3'); - $provider[] = array('DoctrineCommon', '2.2.0-DEV'); + $provider[] = ['foo', '1-beta']; + $provider[] = ['node', '0.5.6']; + $provider[] = ['li3', '0.10']; + $provider[] = ['mongodb_odm', '1.0.0BETA3']; + $provider[] = ['DoctrineCommon', '2.2.0-DEV']; return $provider; } /** * @dataProvider providerVersioningSchemes - * - * @param string $name - * @param string $version */ public function testPackageHasExpectedNamingSemantics(string $name, string $version): void { @@ -50,9 +47,6 @@ public function testPackageHasExpectedNamingSemantics(string $name, string $vers /** * @dataProvider providerVersioningSchemes - * - * @param string $name - * @param string $version */ public function testPackageHasExpectedVersioningSemantics(string $name, string $version): void { @@ -65,9 +59,6 @@ public function testPackageHasExpectedVersioningSemantics(string $name, string $ /** * @dataProvider providerVersioningSchemes - * - * @param string $name - * @param string $version */ public function testPackageHasExpectedMarshallingSemantics(string $name, string $version): void { diff --git a/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php b/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php index a4b3fc0d2c2c..df5342c5da65 100644 --- a/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php +++ b/tests/Composer/Test/Package/Dumper/ArrayDumperTest.php @@ -33,12 +33,12 @@ public function testRequiredInformation(): void { $config = $this->dumper->dump($this->getPackage()); $this->assertEquals( - array( + [ 'name' => 'dummy/pkg', 'version' => '1.0.0', 'version_normalized' => '1.0.0.0', 'type' => 'library', - ), + ], $config ); } @@ -73,12 +73,11 @@ public function testDumpAbandonedReplacement(): void /** * @dataProvider provideKeys * - * @param string $key * @param mixed $value * @param string $method * @param mixed $expectedValue */ - public function testKeys(string $key, $value, string $method = null, $expectedValue = null): void + public function testKeys(string $key, $value, ?string $method = null, $expectedValue = null): void { $package = $this->getRootPackage(); @@ -92,149 +91,149 @@ public function testKeys(string $key, $value, string $method = null, $expectedVa public function provideKeys(): array { - return array( - array( + return [ + [ 'type', 'library', - ), - array( + ], + [ 'time', $datetime = new \DateTime('2012-02-01'), 'ReleaseDate', $datetime->format(DATE_RFC3339), - ), - array( + ], + [ 'authors', - array('Nils Adermann ', 'Jordi Boggiano '), - ), - array( + ['Nils Adermann ', 'Jordi Boggiano '], + ], + [ 'homepage', 'https://getcomposer.org', - ), - array( + ], + [ 'description', 'Dependency Manager', - ), - array( + ], + [ 'keywords', - array('package', 'dependency', 'autoload'), + ['package', 'dependency', 'autoload'], null, - array('autoload', 'dependency', 'package'), - ), - array( + ['autoload', 'dependency', 'package'], + ], + [ 'bin', - array('bin/composer'), + ['bin/composer'], 'binaries', - ), - array( + ], + [ 'license', - array('MIT'), - ), - array( + ['MIT'], + ], + [ 'autoload', - array('psr-0' => array('Composer' => 'src/')), - ), - array( + ['psr-0' => ['Composer' => 'src/']], + ], + [ 'repositories', - array('packagist' => false), - ), - array( + ['packagist' => false], + ], + [ 'scripts', - array('post-update-cmd' => 'MyVendor\\MyClass::postUpdate'), - ), - array( + ['post-update-cmd' => 'MyVendor\\MyClass::postUpdate'], + ], + [ 'extra', - array('class' => 'MyVendor\\Installer'), - ), - array( + ['class' => 'MyVendor\\Installer'], + ], + [ 'archive', - array('/foo/bar', 'baz', '!/foo/bar/baz'), + ['/foo/bar', 'baz', '!/foo/bar/baz'], 'archiveExcludes', - array( - 'exclude' => array('/foo/bar', 'baz', '!/foo/bar/baz'), - ), - ), - array( + [ + 'exclude' => ['/foo/bar', 'baz', '!/foo/bar/baz'], + ], + ], + [ 'require', - array('foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0')), + ['foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0')], 'requires', - array('foo/bar' => '1.0.0'), - ), - array( + ['foo/bar' => '1.0.0'], + ], + [ 'require-dev', - array('foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_DEV_REQUIRE, '1.0.0')), + ['foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_DEV_REQUIRE, '1.0.0')], 'devRequires', - array('foo/bar' => '1.0.0'), - ), - array( + ['foo/bar' => '1.0.0'], + ], + [ 'suggest', - array('foo/bar' => 'very useful package'), + ['foo/bar' => 'very useful package'], 'suggests', - ), - array( + ], + [ 'support', - array('foo' => 'bar'), - ), - array( + ['foo' => 'bar'], + ], + [ 'funding', - array('type' => 'foo', 'url' => 'https://example.com'), - ), - array( + ['type' => 'foo', 'url' => 'https://example.com'], + ], + [ 'require', - array( + [ 'foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), 'bar/baz' => new Link('dummy/pkg', 'bar/baz', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), - ), + ], 'requires', - array('bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'), - ), - array( + ['bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'], + ], + [ 'require-dev', - array( + [ 'foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), 'bar/baz' => new Link('dummy/pkg', 'bar/baz', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), - ), + ], 'devRequires', - array('bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'), - ), - array( + ['bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'], + ], + [ 'suggest', - array('foo/bar' => 'very useful package', 'bar/baz' => 'another useful package'), + ['foo/bar' => 'very useful package', 'bar/baz' => 'another useful package'], 'suggests', - array('bar/baz' => 'another useful package', 'foo/bar' => 'very useful package'), - ), - array( + ['bar/baz' => 'another useful package', 'foo/bar' => 'very useful package'], + ], + [ 'provide', - array( + [ 'foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), 'bar/baz' => new Link('dummy/pkg', 'bar/baz', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), - ), + ], 'provides', - array('bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'), - ), - array( + ['bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'], + ], + [ 'replace', - array( + [ 'foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), 'bar/baz' => new Link('dummy/pkg', 'bar/baz', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), - ), + ], 'replaces', - array('bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'), - ), - array( + ['bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'], + ], + [ 'conflict', - array( + [ 'foo/bar' => new Link('dummy/pkg', 'foo/bar', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), 'bar/baz' => new Link('dummy/pkg', 'bar/baz', new Constraint('=', '1.0.0.0'), Link::TYPE_REQUIRE, '1.0.0'), - ), + ], 'conflicts', - array('bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'), - ), - array( + ['bar/baz' => '1.0.0', 'foo/bar' => '1.0.0'], + ], + [ 'transport-options', - array('ssl' => array('local_cert' => '/opt/certs/test.pem')), + ['ssl' => ['local_cert' => '/opt/certs/test.pem']], 'transportOptions', - ), - ); + ], + ]; } } diff --git a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php index eab43a3c630a..4f73b3728ed6 100644 --- a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php @@ -31,13 +31,13 @@ public function setUp(): void public function testSelfVersion(): void { - $config = array( + $config = [ 'name' => 'A', 'version' => '1.2.3.4', - 'replace' => array( + 'replace' => [ 'foo' => 'self.version', - ), - ); + ], + ]; $package = $this->loader->load($config); $replaces = $package->getReplaces(); @@ -46,19 +46,19 @@ public function testSelfVersion(): void public function testTypeDefault(): void { - $config = array( + $config = [ 'name' => 'A', 'version' => '1.0', - ); + ]; $package = $this->loader->load($config); $this->assertEquals('library', $package->getType()); - $config = array( + $config = [ 'name' => 'A', 'version' => '1.0', 'type' => 'foo', - ); + ]; $package = $this->loader->load($config); $this->assertEquals('foo', $package->getType()); @@ -66,19 +66,19 @@ public function testTypeDefault(): void public function testNormalizedVersionOptimization(): void { - $config = array( + $config = [ 'name' => 'A', 'version' => '1.2.3', - ); + ]; $package = $this->loader->load($config); $this->assertEquals('1.2.3.0', $package->getVersion()); - $config = array( + $config = [ 'name' => 'A', 'version' => '1.2.3', 'version_normalized' => '1.2.3.4', - ); + ]; $package = $this->loader->load($config); $this->assertEquals('1.2.3.4', $package->getVersion()); @@ -86,52 +86,52 @@ public function testNormalizedVersionOptimization(): void public function parseDumpProvider(): array { - $validConfig = array( + $validConfig = [ 'name' => 'A/B', 'version' => '1.2.3', 'version_normalized' => '1.2.3.0', 'description' => 'Foo bar', 'type' => 'library', - 'keywords' => array('a', 'b', 'c'), + 'keywords' => ['a', 'b', 'c'], 'homepage' => 'http://example.com', - 'license' => array('MIT', 'GPLv3'), - 'authors' => array( - array('name' => 'Bob', 'email' => 'bob@example.org', 'homepage' => 'example.org', 'role' => 'Developer'), - ), - 'funding' => array( - array('type' => 'example', 'url' => 'https://example.org/fund'), - ), - 'require' => array( + 'license' => ['MIT', 'GPLv3'], + 'authors' => [ + ['name' => 'Bob', 'email' => 'bob@example.org', 'homepage' => 'example.org', 'role' => 'Developer'], + ], + 'funding' => [ + ['type' => 'example', 'url' => 'https://example.org/fund'], + ], + 'require' => [ 'foo/bar' => '1.0', - ), - 'require-dev' => array( + ], + 'require-dev' => [ 'foo/baz' => '1.0', - ), - 'replace' => array( + ], + 'replace' => [ 'foo/qux' => '1.0', - ), - 'conflict' => array( + ], + 'conflict' => [ 'foo/quux' => '1.0', - ), - 'provide' => array( + ], + 'provide' => [ 'foo/quuux' => '1.0', - ), - 'autoload' => array( - 'psr-0' => array('Ns\Prefix' => 'path'), - 'classmap' => array('path', 'path2'), - ), - 'include-path' => array('path3', 'path4'), + ], + 'autoload' => [ + 'psr-0' => ['Ns\Prefix' => 'path'], + 'classmap' => ['path', 'path2'], + ], + 'include-path' => ['path3', 'path4'], 'target-dir' => 'some/prefix', - 'extra' => array('random' => array('things' => 'of', 'any' => 'shape')), - 'bin' => array('bin1', 'bin/foo'), - 'archive' => array( - 'exclude' => array('/foo/bar', 'baz', '!/foo/bar/baz'), - ), - 'transport-options' => array('ssl' => array('local_cert' => '/opt/certs/test.pem')), + 'extra' => ['random' => ['things' => 'of', 'any' => 'shape']], + 'bin' => ['bin1', 'bin/foo'], + 'archive' => [ + 'exclude' => ['/foo/bar', 'baz', '!/foo/bar/baz'], + ], + 'transport-options' => ['ssl' => ['local_cert' => '/opt/certs/test.pem']], 'abandoned' => 'foo/bar', - ); + ]; - return array(array($validConfig)); + return [[$validConfig]]; } /** @@ -193,55 +193,55 @@ public function testParseDumpFalseLoadConfig(array $config): void public function testPackageWithBranchAlias(): void { - $config = array( + $config = [ 'name' => 'A', 'version' => 'dev-master', - 'extra' => array('branch-alias' => array('dev-master' => '1.0.x-dev')), - ); + 'extra' => ['branch-alias' => ['dev-master' => '1.0.x-dev']], + ]; $package = $this->loader->load($config); $this->assertInstanceOf('Composer\Package\AliasPackage', $package); $this->assertEquals('1.0.x-dev', $package->getPrettyVersion()); - $config = array( + $config = [ 'name' => 'A', 'version' => 'dev-master', - 'extra' => array('branch-alias' => array('dev-master' => '1.0-dev')), - ); + 'extra' => ['branch-alias' => ['dev-master' => '1.0-dev']], + ]; $package = $this->loader->load($config); $this->assertInstanceOf('Composer\Package\AliasPackage', $package); $this->assertEquals('1.0.x-dev', $package->getPrettyVersion()); - $config = array( + $config = [ 'name' => 'B', 'version' => '4.x-dev', - 'extra' => array('branch-alias' => array('4.x-dev' => '4.0.x-dev')), - ); + 'extra' => ['branch-alias' => ['4.x-dev' => '4.0.x-dev']], + ]; $package = $this->loader->load($config); $this->assertInstanceOf('Composer\Package\AliasPackage', $package); $this->assertEquals('4.0.x-dev', $package->getPrettyVersion()); - $config = array( + $config = [ 'name' => 'B', 'version' => '4.x-dev', - 'extra' => array('branch-alias' => array('4.x-dev' => '4.0-dev')), - ); + 'extra' => ['branch-alias' => ['4.x-dev' => '4.0-dev']], + ]; $package = $this->loader->load($config); $this->assertInstanceOf('Composer\Package\AliasPackage', $package); $this->assertEquals('4.0.x-dev', $package->getPrettyVersion()); - $config = array( + $config = [ 'name' => 'C', 'version' => '4.x-dev', - 'extra' => array('branch-alias' => array('4.x-dev' => '3.4.x-dev')), - ); + 'extra' => ['branch-alias' => ['4.x-dev' => '3.4.x-dev']], + ]; $package = $this->loader->load($config); @@ -251,11 +251,11 @@ public function testPackageWithBranchAlias(): void public function testAbandoned(): void { - $config = array( + $config = [ 'name' => 'A', 'version' => '1.2.3.4', 'abandoned' => 'foo/bar', - ); + ]; $package = $this->loader->load($config); $this->assertTrue($package->isAbandoned()); @@ -264,10 +264,10 @@ public function testAbandoned(): void public function testNotAbandoned(): void { - $config = array( + $config = [ 'name' => 'A', 'version' => '1.2.3.4', - ); + ]; $package = $this->loader->load($config); $this->assertFalse($package->isAbandoned()); @@ -275,33 +275,31 @@ public function testNotAbandoned(): void public function providePluginApiVersions(): array { - return array( - array('1.0'), - array('1.0.0'), - array('1.0.0.0'), - array('1'), - array('=1.0.0'), - array('==1.0'), - array('~1.0.0'), - array('*'), - array('3.0.*'), - array('@stable'), - array('1.0.0@stable'), - array('^5.1'), - array('>=1.0.0 <2.5'), - array('x'), - array('1.0.0-dev'), - ); + return [ + ['1.0'], + ['1.0.0'], + ['1.0.0.0'], + ['1'], + ['=1.0.0'], + ['==1.0'], + ['~1.0.0'], + ['*'], + ['3.0.*'], + ['@stable'], + ['1.0.0@stable'], + ['^5.1'], + ['>=1.0.0 <2.5'], + ['x'], + ['1.0.0-dev'], + ]; } /** * @dataProvider providePluginApiVersions - * - * @param string $apiVersion */ public function testPluginApiVersionAreKeptAsDeclared(string $apiVersion): void { - $links = $this->loader->parseLinks('Plugin', '9.9.9', Link::TYPE_REQUIRE, array('composer-plugin-api' => $apiVersion)); + $links = $this->loader->parseLinks('Plugin', '9.9.9', Link::TYPE_REQUIRE, ['composer-plugin-api' => $apiVersion]); $this->assertArrayHasKey('composer-plugin-api', $links); $this->assertSame($apiVersion, $links['composer-plugin-api']->getConstraint()->getPrettyString()); @@ -309,7 +307,7 @@ public function testPluginApiVersionAreKeptAsDeclared(string $apiVersion): void public function testPluginApiVersionDoesSupportSelfVersion(): void { - $links = $this->loader->parseLinks('Plugin', '6.6.6', Link::TYPE_REQUIRE, array('composer-plugin-api' => 'self.version')); + $links = $this->loader->parseLinks('Plugin', '6.6.6', Link::TYPE_REQUIRE, ['composer-plugin-api' => 'self.version']); $this->assertArrayHasKey('composer-plugin-api', $links); $this->assertSame('6.6.6', $links['composer-plugin-api']->getConstraint()->getPrettyString()); @@ -317,17 +315,17 @@ public function testPluginApiVersionDoesSupportSelfVersion(): void public function testParseLinksIntegerTarget(): void { - $links = $this->loader->parseLinks('Plugin', '9.9.9', Link::TYPE_REQUIRE, array('1' => 'dev-main')); + $links = $this->loader->parseLinks('Plugin', '9.9.9', Link::TYPE_REQUIRE, ['1' => 'dev-main']); $this->assertArrayHasKey('1', $links); } public function testNoneStringVersion(): void { - $config = array( + $config = [ 'name' => 'acme/package', 'version' => 1, - ); + ]; $package = $this->loader->load($config); $this->assertSame('1', $package->getPrettyVersion()); @@ -335,7 +333,7 @@ public function testNoneStringVersion(): void public function testNoneStringSourceDistReference(): void { - $config = array( + $config = [ 'name' => 'acme/package', 'version' => 'dev-main', 'source' => [ @@ -348,7 +346,7 @@ public function testNoneStringSourceDistReference(): void 'url' => 'https://example.org/', 'reference' => 2019, ], - ); + ]; $package = $this->loader->load($config); $this->assertSame('2019', $package->getSourceReference()); @@ -357,7 +355,7 @@ public function testNoneStringSourceDistReference(): void public function testBranchAliasIntegerIndex(): void { - $config = array( + $config = [ 'name' => 'acme/package', 'version' => 'dev-1', 'extra' => [ @@ -369,7 +367,7 @@ public function testBranchAliasIntegerIndex(): void 'type' => 'zip', 'url' => 'https://example.org/', ], - ); + ]; $this->assertNull($this->loader->getBranchAlias($config)); } diff --git a/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php b/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php index 6d0cc3d34cdd..28684e56ea8e 100644 --- a/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/RootPackageLoaderTest.php @@ -36,7 +36,7 @@ protected function loadPackage(array $data): \Composer\Package\PackageInterface ->getMock(); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $processExecutor = new ProcessExecutor(); $processExecutor->enableAsync(); $guesser = new VersionGuesser($config, $processExecutor, new VersionParser()); @@ -48,8 +48,8 @@ protected function loadPackage(array $data): \Composer\Package\PackageInterface public function testStabilityFlagsParsing(): void { - $package = $this->loadPackage(array( - 'require' => array( + $package = $this->loadPackage([ + 'require' => [ 'foo/bar' => '~2.1.0-beta2', 'bar/baz' => '1.0.x-dev as 1.2.0', 'qux/quux' => '1.0.*@rc', @@ -58,12 +58,12 @@ public function testStabilityFlagsParsing(): void 'multi/lowest-wins' => '^2.0@rc || >=3.0@dev , ~3.5@alpha', 'or/op-without-flags' => 'dev-master || 2.0 , ~3.5-alpha', 'or/op-without-flags2' => '3.0-beta || 2.0 , ~3.5-alpha', - ), + ], 'minimum-stability' => 'alpha', - )); + ]); $this->assertEquals('alpha', $package->getMinimumStability()); - $this->assertEquals(array( + $this->assertEquals([ 'bar/baz' => BasePackage::STABILITY_DEV, 'qux/quux' => BasePackage::STABILITY_RC, 'zux/complex' => BasePackage::STABILITY_DEV, @@ -71,7 +71,7 @@ public function testStabilityFlagsParsing(): void 'multi/lowest-wins' => BasePackage::STABILITY_DEV, 'or/op-without-flags' => BasePackage::STABILITY_DEV, 'or/op-without-flags2' => BasePackage::STABILITY_ALPHA, - ), $package->getStabilityFlags()); + ], $package->getStabilityFlags()); } public function testNoVersionIsVisibleInPrettyVersion(): void @@ -82,11 +82,11 @@ public function testNoVersionIsVisibleInPrettyVersion(): void ; $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $loader = new RootPackageLoader($manager, $config, null, new VersionGuesser($config, $process = $this->getProcessExecutorMock(), new VersionParser())); - $process->expects(array(), false, array('return' => 1)); + $process->expects([], false, ['return' => 1]); - $package = $loader->load(array()); + $package = $loader->load([]); $this->assertEquals("1.0.0.0", $package->getVersion()); $this->assertEquals(RootPackage::DEFAULT_PRETTY_VERSION, $package->getPrettyVersion()); @@ -99,16 +99,16 @@ public function testPrettyVersionForRootPackageInVersionBranch(): void $versionGuesser = $this->getMockBuilder('Composer\\Package\\Version\\VersionGuesser')->disableOriginalConstructor()->getMock(); $versionGuesser->expects($this->atLeastOnce()) ->method('guessVersion') - ->willReturn(array( + ->willReturn([ 'name' => 'A', 'version' => '3.0.9999999.9999999-dev', 'pretty_version' => '3.0-dev', 'commit' => 'aabbccddee', - )); + ]); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $loader = new RootPackageLoader($manager, $config, null, $versionGuesser); - $package = $loader->load(array()); + $package = $loader->load([]); $this->assertEquals('3.0-dev', $package->getPrettyVersion()); } @@ -125,18 +125,18 @@ public function testFeatureBranchPrettyVersion(): void ; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* latest-production 38137d2f6c70e775e137b2d8a7a7d3eaebf7c7e5 Commit message\n master 4f6ed96b0bc363d2aa4404c3412de1c011f67c66 Commit message\n", - ), + ], 'git rev-list master..latest-production', - ), true); + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $loader = new RootPackageLoader($manager, $config, null, new VersionGuesser($config, $process, new VersionParser())); - $package = $loader->load(array('require' => array('foo/bar' => 'self.version'))); + $package = $loader->load(['require' => ['foo/bar' => 'self.version']]); $this->assertEquals("dev-master", $package->getPrettyVersion()); } @@ -153,17 +153,17 @@ public function testNonFeatureBranchPrettyVersion(): void ; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* latest-production 38137d2f6c70e775e137b2d8a7a7d3eaebf7c7e5 Commit message\n master 4f6ed96b0bc363d2aa4404c3412de1c011f67c66 Commit message\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $loader = new RootPackageLoader($manager, $config, null, new VersionGuesser($config, $process, new VersionParser())); - $package = $loader->load(array('require' => array('foo/bar' => 'self.version'), "non-feature-branches" => array("latest-.*"))); + $package = $loader->load(['require' => ['foo/bar' => 'self.version'], "non-feature-branches" => ["latest-.*"]]); $this->assertEquals("dev-latest-production", $package->getPrettyVersion()); } diff --git a/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php index 4562a2702ae7..fc78a441149e 100644 --- a/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ValidatingArrayLoaderTest.php @@ -37,35 +37,35 @@ public function testLoadSuccess(array $config): void public function successProvider(): array { - return array( - array( // minimal - array( + return [ + [ // minimal + [ 'name' => 'foo/bar', - ), - ), - array( // complete - array( + ], + ], + [ // complete + [ 'name' => 'foo/bar', 'description' => 'Foo bar', 'version' => '1.0.0', 'type' => 'library', - 'keywords' => array('a', 'b_c', 'D E', 'éîüø', '微信'), + 'keywords' => ['a', 'b_c', 'D E', 'éîüø', '微信'], 'homepage' => 'https://foo.com', 'time' => '2010-10-10T10:10:10+00:00', 'license' => 'MIT', - 'authors' => array( - array( + 'authors' => [ + [ 'name' => 'Alice', 'email' => 'alice@example.org', 'role' => 'Lead', 'homepage' => 'http://example.org', - ), - array( + ], + [ 'name' => 'Bob', 'homepage' => '', - ), - ), - 'support' => array( + ], + ], + 'support' => [ 'email' => 'mail@example.org', 'issues' => 'http://example.org/', 'forum' => 'http://example.org/', @@ -74,136 +74,136 @@ public function successProvider(): array 'irc' => 'irc://example.org/example', 'rss' => 'http://example.org/rss', 'chat' => 'http://example.org/chat', - ), - 'funding' => array( - array( + ], + 'funding' => [ + [ 'type' => 'example', 'url' => 'https://example.org/fund', - ), - array( + ], + [ 'url' => 'https://example.org/fund', - ), - ), - 'require' => array( + ], + ], + 'require' => [ 'a/b' => '1.*', 'b/c' => '~2', 'example/pkg' => '>2.0-dev,<2.4-dev', 'composer-runtime-api' => '*', - ), - 'require-dev' => array( + ], + 'require-dev' => [ 'a/b' => '1.*', 'b/c' => '*', 'example/pkg' => '>2.0-dev,<2.4-dev', - ), - 'conflict' => array( + ], + 'conflict' => [ 'a/bx' => '1.*', 'b/cx' => '>2.7', 'example/pkgx' => '>2.0-dev,<2.4-dev', - ), - 'replace' => array( + ], + 'replace' => [ 'a/b' => '1.*', 'example/pkg' => '>2.0-dev,<2.4-dev', - ), - 'provide' => array( + ], + 'provide' => [ 'a/b' => '1.*', 'example/pkg' => '>2.0-dev,<2.4-dev', - ), - 'suggest' => array( + ], + 'suggest' => [ 'foo/bar' => 'Foo bar is very useful', - ), - 'autoload' => array( - 'psr-0' => array( + ], + 'autoload' => [ + 'psr-0' => [ 'Foo\\Bar' => 'src/', '' => 'fallback/libs/', - ), - 'classmap' => array( + ], + 'classmap' => [ 'dir/', 'dir2/file.php', - ), - 'files' => array( + ], + 'files' => [ 'functions.php', - ), - ), - 'include-path' => array( + ], + ], + 'include-path' => [ 'lib/', - ), + ], 'target-dir' => 'Foo/Bar', 'minimum-stability' => 'dev', - 'repositories' => array( - array( + 'repositories' => [ + [ 'type' => 'composer', 'url' => 'https://repo.packagist.org/', - ), - ), - 'config' => array( + ], + ], + 'config' => [ 'bin-dir' => 'bin', 'vendor-dir' => 'vendor', 'process-timeout' => 10000, - ), - 'archive' => array( - 'exclude' => array('/foo/bar', 'baz', '!/foo/bar/baz'), - ), - 'scripts' => array( + ], + 'archive' => [ + 'exclude' => ['/foo/bar', 'baz', '!/foo/bar/baz'], + ], + 'scripts' => [ 'post-update-cmd' => 'Foo\\Bar\\Baz::doSomething', - 'post-install-cmd' => array( + 'post-install-cmd' => [ 'Foo\\Bar\\Baz::doSomething', - ), - ), - 'extra' => array( - 'random' => array('stuff' => array('deeply' => 'nested')), - 'branch-alias' => array( + ], + ], + 'extra' => [ + 'random' => ['stuff' => ['deeply' => 'nested']], + 'branch-alias' => [ 'dev-master' => '2.0-dev', 'dev-old' => '1.0.x-dev', '3.x-dev' => '3.1.x-dev', - ), - ), - 'bin' => array( + ], + ], + 'bin' => [ 'bin/foo', 'bin/bar', - ), - 'transport-options' => array('ssl' => array('local_cert' => '/opt/certs/test.pem')), - ), - ), - array( // test licenses as array - array( + ], + 'transport-options' => ['ssl' => ['local_cert' => '/opt/certs/test.pem']], + ], + ], + [ // test licenses as array + [ 'name' => 'foo/bar', - 'license' => array('MIT', 'WTFPL'), - ), - ), - array( // test bin as string - array( + 'license' => ['MIT', 'WTFPL'], + ], + ], + [ // test bin as string + [ 'name' => 'foo/bar', 'bin' => 'bin1', - ), - ), - array( // package name with dashes - array( + ], + ], + [ // package name with dashes + [ 'name' => 'foo/bar-baz', - ), - ), - array( // package name with dashes - array( + ], + ], + [ // package name with dashes + [ 'name' => 'foo/bar--baz', - ), - ), - array( // package name with dashes - array( + ], + ], + [ // package name with dashes + [ 'name' => 'foo/b-ar--ba-z', - ), - ), - array( // package name with dashes - array( + ], + ], + [ // package name with dashes + [ 'name' => 'npm-asset/angular--core', - ), - ), - array( // refs as int or string - array( + ], + ], + [ // refs as int or string + [ 'name' => 'foo/bar', - 'source' => array('url' => 'https://example.org', 'reference' => 1234, 'type' => 'baz'), - 'dist' => array('url' => 'https://example.org', 'reference' => 'foobar', 'type' => 'baz'), - ), - ), - ); + 'source' => ['url' => 'https://example.org', 'reference' => 1234, 'type' => 'baz'], + 'dist' => ['url' => 'https://example.org', 'reference' => 'foobar', 'type' => 'baz'], + ], + ], + ]; } /** @@ -250,7 +250,6 @@ public function testLoadWarnings(array $config, array $expectedWarnings): void * * @param array $config * @param string[] $expectedWarnings - * @param bool $mustCheck */ public function testLoadSkipsWarningDataWhenIgnoringErrors(array $config, array $expectedWarnings, bool $mustCheck = true): void { @@ -263,7 +262,7 @@ public function testLoadSkipsWarningDataWhenIgnoringErrors(array $config, array $internalLoader ->expects($this->once()) ->method('load') - ->with(array('name' => 'a/b')); + ->with(['name' => 'a/b']); $loader = new ValidatingArrayLoader($internalLoader, true, null, ValidatingArrayLoader::CHECK_ALL); $config['name'] = 'a/b'; @@ -272,264 +271,264 @@ public function testLoadSkipsWarningDataWhenIgnoringErrors(array $config, array public function errorProvider(): array { - $invalidNames = array( + $invalidNames = [ 'foo', 'foo/-bar-', 'foo/-bar', - ); - $invalidNaming = array(); + ]; + $invalidNaming = []; foreach ($invalidNames as $invalidName) { - $invalidNaming[] = array( - array( + $invalidNaming[] = [ + [ 'name' => $invalidName, - ), - array( + ], + [ "name : $invalidName is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match \"^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$\".", - ), - ); + ], + ]; } - $invalidNames = array( + $invalidNames = [ 'fo--oo/bar', 'fo-oo/bar__baz', 'fo-oo/bar_.baz', 'foo/bar---baz', - ); + ]; foreach ($invalidNames as $invalidName) { - $invalidNaming[] = array( - array( + $invalidNaming[] = [ + [ 'name' => $invalidName, - ), - array( + ], + [ "name : $invalidName is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match \"^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$\".", - ), + ], false, - ); + ]; } - return array_merge($invalidNaming, array( - array( - array( + return array_merge($invalidNaming, [ + [ + [ 'name' => 'foo/bar', 'homepage' => 43, - ), - array( + ], + [ 'homepage : should be a string, integer given', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'support' => array( - 'source' => array(), - ), - ), - array( + 'support' => [ + 'source' => [], + ], + ], + [ 'support.source : invalid value, must be a string', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar.json', - ), - array( + ], + [ 'name : foo/bar.json is invalid, package names can not end in .json, consider renaming it or perhaps using a -json suffix instead.', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'com1/foo', - ), - array( + ], + [ 'name : com1/foo is reserved, package and vendor names can not match any of: nul, con, prn, aux, com1, com2, com3, com4, com5, com6, com7, com8, com9, lpt1, lpt2, lpt3, lpt4, lpt5, lpt6, lpt7, lpt8, lpt9.', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'Foo/Bar', - ), - array( + ], + [ 'name : Foo/Bar is invalid, it should not contain uppercase characters. We suggest using foo/bar instead.', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', 'autoload' => 'strings', - ), - array( + ], + [ 'autoload : should be an array, string given', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'autoload' => array( - 'psr0' => array( + 'autoload' => [ + 'psr0' => [ 'foo' => 'src', - ), - ), - ), - array( + ], + ], + ], + [ 'autoload : invalid value (psr0), must be one of psr-0, psr-4, classmap, files, exclude-from-classmap', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', 'transport-options' => 'test', - ), - array( + ], + [ 'transport-options : should be an array, string given', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'source' => array('url' => '--foo', 'reference' => ' --bar', 'type' => 'baz'), - 'dist' => array('url' => ' --foox', 'reference' => '--barx', 'type' => 'baz'), - ), - array( + 'source' => ['url' => '--foo', 'reference' => ' --bar', 'type' => 'baz'], + 'dist' => ['url' => ' --foox', 'reference' => '--barx', 'type' => 'baz'], + ], + [ 'dist.reference : must not start with a "-", "--barx" given', 'dist.url : must not start with a "-", " --foox" given', 'source.reference : must not start with a "-", " --bar" given', 'source.url : must not start with a "-", "--foo" given', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'require' => array('foo/Bar' => '1.*'), - ), - array( + 'require' => ['foo/Bar' => '1.*'], + ], + [ 'require.foo/Bar : a package cannot set a require on itself', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'source' => array('url' => 1), - 'dist' => array('url' => null), - ), - array( + 'source' => ['url' => 1], + 'dist' => ['url' => null], + ], + [ 'source.type : must be present', 'source.url : should be a string, integer given', 'source.reference : must be present', 'dist.type : must be present', 'dist.url : must be present', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'replace' => array('acme/bar'), - ), - array('replace.0 : invalid version constraint (Could not parse version constraint acme/bar: Invalid version string "acme/bar")') - ), - )); + 'replace' => ['acme/bar'], + ], + ['replace.0 : invalid version constraint (Could not parse version constraint acme/bar: Invalid version string "acme/bar")'], + ], + ]); } public function warningProvider(): array { - return array( - array( - array( + return [ + [ + [ 'name' => 'foo/bar', 'homepage' => 'foo:bar', - ), - array( + ], + [ 'homepage : invalid value (foo:bar), must be an http/https URL', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'support' => array( + 'support' => [ 'source' => 'foo:bar', 'forum' => 'foo:bar', 'issues' => 'foo:bar', 'wiki' => 'foo:bar', 'chat' => 'foo:bar', - ), - ), - array( + ], + ], + [ 'support.source : invalid value (foo:bar), must be an http/https URL', 'support.forum : invalid value (foo:bar), must be an http/https URL', 'support.issues : invalid value (foo:bar), must be an http/https URL', 'support.wiki : invalid value (foo:bar), must be an http/https URL', 'support.chat : invalid value (foo:bar), must be an http/https URL', - ), - ), - array( - array( + ], + ], + [ + [ 'name' => 'foo/bar', - 'require' => array( + 'require' => [ 'foo/baz' => '*', 'bar/baz' => '>=1.0', 'bar/hacked' => '@stable', 'bar/woo' => '1.0.0', - ), - ), - array( + ], + ], + [ 'require.foo/baz : unbound version constraints (*) should be avoided', 'require.bar/baz : unbound version constraints (>=1.0) should be avoided', 'require.bar/hacked : unbound version constraints (@stable) should be avoided', 'require.bar/woo : exact version constraints (1.0.0) should be avoided if the package follows semantic versioning', - ), + ], false, - ), - array( - array( + ], + [ + [ 'name' => 'foo/bar', - 'require' => array( + 'require' => [ 'bar/unstable' => '0.3.0', - ), - ), - array( + ], + ], + [ // using an exact version constraint for an unstable version should not trigger a warning - ), + ], false, - ), - array( - array( + ], + [ + [ 'name' => 'foo/bar', - 'extra' => array( - 'branch-alias' => array( + 'extra' => [ + 'branch-alias' => [ '5.x-dev' => '3.1.x-dev', - ), - ), - ), - array( + ], + ], + ], + [ 'extra.branch-alias.5.x-dev : the target branch (3.1.x-dev) is not a valid numeric alias for this version', - ), + ], false, - ), - array( - array( + ], + [ + [ 'name' => 'foo/bar', - 'extra' => array( - 'branch-alias' => array( + 'extra' => [ + 'branch-alias' => [ '5.x-dev' => '3.1-dev', - ), - ), - ), - array( + ], + ], + ], + [ 'extra.branch-alias.5.x-dev : the target branch (3.1-dev) is not a valid numeric alias for this version', - ), + ], false, - ), - array( - array( + ], + [ + [ 'name' => 'foo/bar', - 'require' => array( + 'require' => [ 'Foo/Baz' => '^1.0', - ), - ), - array( + ], + ], + [ 'require.Foo/Baz is invalid, it should not contain uppercase characters. Please use foo/baz instead.', - ), + ], false, - ), - ); + ], + ]; } } diff --git a/tests/Composer/Test/Package/LockerTest.php b/tests/Composer/Test/Package/LockerTest.php index 34e8be360d9f..5684e85ecb8e 100644 --- a/tests/Composer/Test/Package/LockerTest.php +++ b/tests/Composer/Test/Package/LockerTest.php @@ -37,7 +37,7 @@ public function testIsLocked(): void $json ->expects($this->any()) ->method('read') - ->will($this->returnValue(array('packages' => array()))); + ->will($this->returnValue(['packages' => []])); $this->assertTrue($locker->isLocked()); } @@ -73,12 +73,12 @@ public function testGetLockedPackages(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array( - 'packages' => array( - array('name' => 'pkg1', 'version' => '1.0.0-beta'), - array('name' => 'pkg2', 'version' => '0.1.10'), - ), - ))); + ->will($this->returnValue([ + 'packages' => [ + ['name' => 'pkg1', 'version' => '1.0.0-beta'], + ['name' => 'pkg2', 'version' => '0.1.10'], + ], + ])); $repo = $locker->getLockedRepository(); $this->assertNotNull($repo->findPackage('pkg1', '1.0.0-beta')); @@ -101,28 +101,28 @@ public function testSetLockData(): void $json ->expects($this->once()) ->method('write') - ->with(array( - '_readme' => array('This file locks the dependencies of your project to a known state', + ->with([ + '_readme' => ['This file locks the dependencies of your project to a known state', 'Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies', - 'This file is @gener'.'ated automatically', ), + 'This file is @gener'.'ated automatically', ], 'content-hash' => $contentHash, - 'packages' => array( - array('name' => 'pkg1', 'version' => '1.0.0-beta', 'type' => 'library'), - array('name' => 'pkg2', 'version' => '0.1.10', 'type' => 'library'), - ), - 'packages-dev' => array(), - 'aliases' => array(), + 'packages' => [ + ['name' => 'pkg1', 'version' => '1.0.0-beta', 'type' => 'library'], + ['name' => 'pkg2', 'version' => '0.1.10', 'type' => 'library'], + ], + 'packages-dev' => [], + 'aliases' => [], 'minimum-stability' => 'dev', - 'stability-flags' => array(), - 'platform' => array(), - 'platform-dev' => array(), - 'platform-overrides' => array('foo/bar' => '1.0'), + 'stability-flags' => [], + 'platform' => [], + 'platform-dev' => [], + 'platform-overrides' => ['foo/bar' => '1.0'], 'prefer-stable' => false, 'prefer-lowest' => false, 'plugin-api-version' => PluginInterface::PLUGIN_API_VERSION, - )); + ]); - $locker->setLockData(array($package1, $package2), array(), array(), array(), array(), 'dev', array(), false, false, array('foo/bar' => '1.0')); + $locker->setLockData([$package1, $package2], [], [], [], [], 'dev', [], false, false, ['foo/bar' => '1.0']); } public function testLockBadPackages(): void @@ -140,7 +140,7 @@ public function testLockBadPackages(): void self::expectException('LogicException'); - $locker->setLockData(array($package1), array(), array(), array(), array(), 'dev', array(), false, false, array()); + $locker->setLockData([$package1], [], [], [], [], 'dev', [], false, false, []); } public function testIsFresh(): void @@ -154,7 +154,7 @@ public function testIsFresh(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array('hash' => md5($jsonContent)))); + ->will($this->returnValue(['hash' => md5($jsonContent)])); $this->assertTrue($locker->isFresh()); } @@ -169,7 +169,7 @@ public function testIsFreshFalse(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array('hash' => $this->getJsonContent(array('name' => 'test2'))))); + ->will($this->returnValue(['hash' => $this->getJsonContent(['name' => 'test2'])])); $this->assertFalse($locker->isFresh()); } @@ -185,7 +185,7 @@ public function testIsFreshWithContentHash(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array('hash' => md5($jsonContent . ' '), 'content-hash' => md5($jsonContent)))); + ->will($this->returnValue(['hash' => md5($jsonContent . ' '), 'content-hash' => md5($jsonContent)])); $this->assertTrue($locker->isFresh()); } @@ -201,7 +201,7 @@ public function testIsFreshWithContentHashAndNoHash(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array('content-hash' => md5($jsonContent)))); + ->will($this->returnValue(['content-hash' => md5($jsonContent)])); $this->assertTrue($locker->isFresh()); } @@ -213,12 +213,12 @@ public function testIsFreshFalseWithContentHash(): void $locker = new Locker(new NullIO, $json, $inst, $this->getJsonContent()); - $differentHash = md5($this->getJsonContent(array('name' => 'test2'))); + $differentHash = md5($this->getJsonContent(['name' => 'test2'])); $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array('hash' => $differentHash, 'content-hash' => $differentHash))); + ->will($this->returnValue(['hash' => $differentHash, 'content-hash' => $differentHash])); $this->assertFalse($locker->isFresh()); } @@ -256,12 +256,12 @@ private function createPackageMock() /** * @param array $customData */ - private function getJsonContent(array $customData = array()): string + private function getJsonContent(array $customData = []): string { - $data = array_merge(array( + $data = array_merge([ 'minimum-stability' => 'beta', 'name' => 'test', - ), $customData); + ], $customData); ksort($data); diff --git a/tests/Composer/Test/Package/RootAliasPackageTest.php b/tests/Composer/Test/Package/RootAliasPackageTest.php index c871cd1f5191..8f71a3bd0998 100644 --- a/tests/Composer/Test/Package/RootAliasPackageTest.php +++ b/tests/Composer/Test/Package/RootAliasPackageTest.php @@ -23,7 +23,7 @@ class RootAliasPackageTest extends TestCase { public function testUpdateRequires(): void { - $links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REQUIRE, 'self.version')); + $links = [new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REQUIRE, 'self.version')]; $root = $this->getMockRootPackage(); $root->expects($this->once()) @@ -38,7 +38,7 @@ public function testUpdateRequires(): void public function testUpdateDevRequires(): void { - $links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_DEV_REQUIRE, 'self.version')); + $links = [new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_DEV_REQUIRE, 'self.version')]; $root = $this->getMockRootPackage(); $root->expects($this->once()) @@ -53,7 +53,7 @@ public function testUpdateDevRequires(): void public function testUpdateConflicts(): void { - $links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_CONFLICT, 'self.version')); + $links = [new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_CONFLICT, 'self.version')]; $root = $this->getMockRootPackage(); $root->expects($this->once()) @@ -68,7 +68,7 @@ public function testUpdateConflicts(): void public function testUpdateProvides(): void { - $links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_PROVIDE, 'self.version')); + $links = [new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_PROVIDE, 'self.version')]; $root = $this->getMockRootPackage(); $root->expects($this->once()) @@ -83,7 +83,7 @@ public function testUpdateProvides(): void public function testUpdateReplaces(): void { - $links = array(new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REPLACE, 'self.version')); + $links = [new Link('a', 'b', new MatchAllConstraint(), Link::TYPE_REPLACE, 'self.version')]; $root = $this->getMockRootPackage(); $root->expects($this->once()) @@ -107,19 +107,19 @@ protected function getMockRootPackage() ->willReturn('something/something'); $root->expects($this->atLeastOnce()) ->method('getRequires') - ->willReturn(array()); + ->willReturn([]); $root->expects($this->atLeastOnce()) ->method('getDevRequires') - ->willReturn(array()); + ->willReturn([]); $root->expects($this->atLeastOnce()) ->method('getConflicts') - ->willReturn(array()); + ->willReturn([]); $root->expects($this->atLeastOnce()) ->method('getProvides') - ->willReturn(array()); + ->willReturn([]); $root->expects($this->atLeastOnce()) ->method('getReplaces') - ->willReturn(array()); + ->willReturn([]); return $root; } diff --git a/tests/Composer/Test/Package/Version/VersionBumperTest.php b/tests/Composer/Test/Package/Version/VersionBumperTest.php index 648ffa314ed4..e08ac701a78e 100644 --- a/tests/Composer/Test/Package/Version/VersionBumperTest.php +++ b/tests/Composer/Test/Package/Version/VersionBumperTest.php @@ -12,13 +12,8 @@ namespace Composer\Test\Package\Version; -use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\Package\Version\VersionBumper; -use Composer\Package\Version\VersionSelector; use Composer\Package\Package; -use Composer\Package\Link; -use Composer\Package\AliasPackage; -use Composer\Repository\PlatformRepository; use Composer\Package\Version\VersionParser; use Composer\Test\TestCase; use Generator; @@ -36,7 +31,7 @@ public function testBumpRequirement(string $requirement, string $prettyVersion, $package = new Package('foo/bar', $versionParser->normalize($prettyVersion), $prettyVersion); if ($branchAlias !== null) { - $package->setExtra(array('branch-alias' => array($prettyVersion => $branchAlias))); + $package->setExtra(['branch-alias' => [$prettyVersion => $branchAlias]]); } $newConstraint = $versionBumper->bumpRequirement($versionParser->parseConstraints($requirement), $package); diff --git a/tests/Composer/Test/Package/Version/VersionGuesserTest.php b/tests/Composer/Test/Package/Version/VersionGuesserTest.php index e5076862a512..6bc7f03a0cd4 100644 --- a/tests/Composer/Test/Package/Version/VersionGuesserTest.php +++ b/tests/Composer/Test/Package/Version/VersionGuesserTest.php @@ -33,21 +33,21 @@ public function testHgGuessVersionReturnsData(): void $branch = 'default'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array('cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'return' => 128), - array('cmd' => 'git describe --exact-match --tags', 'return' => 128), - array('cmd' => 'git log --pretty="%H" -n1 HEAD'.GitUtil::getNoShowSignatureFlag($process), 'return' => 128), - array('cmd' => 'hg branch', 'return' => 0, 'stdout' => $branch), - array('cmd' => 'hg branches', 'return' => 0), - array('cmd' => 'hg bookmarks', 'return' => 0), - ), true); + $process->expects([ + ['cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'return' => 128], + ['cmd' => 'git describe --exact-match --tags', 'return' => 128], + ['cmd' => 'git log --pretty="%H" -n1 HEAD'.GitUtil::getNoShowSignatureFlag($process), 'return' => 128], + ['cmd' => 'hg branch', 'return' => 0, 'stdout' => $branch], + ['cmd' => 'hg branches', 'return' => 0], + ['cmd' => 'hg bookmarks', 'return' => 0], + ], true); GitUtil::getVersion(new ProcessExecutor); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionArray = $guesser->guessVersion(array(), 'dummy/path'); + $versionArray = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-".$branch, $versionArray['version']); $this->assertEquals("dev-".$branch, $versionArray['pretty_version']); @@ -60,17 +60,17 @@ public function testGuessVersionReturnsData(): void $anotherCommitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* master $commitHash Commit message\n(no branch) $anotherCommitHash Commit message\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionArray = $guesser->guessVersion(array(), 'dummy/path'); + $versionArray = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-master", $versionArray['version']); $this->assertEquals("dev-master", $versionArray['pretty_version']); @@ -85,18 +85,18 @@ public function testGuessVersionDoesNotSeeCustomDefaultBranchAsNonFeatureBranch( $anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], // Assumption here is that arbitrary would be the default branch 'stdout' => " arbitrary $commitHash Commit message\n* current $anotherCommitHash Another message\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionArray = $guesser->guessVersion(array('version' => 'self.version'), 'dummy/path'); + $versionArray = $guesser->guessVersion(['version' => 'self.version'], 'dummy/path'); $this->assertEquals("dev-current", $versionArray['version']); $this->assertEquals($anotherCommitHash, $versionArray['commit']); @@ -108,21 +108,21 @@ public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationF $anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => " arbitrary $commitHash Commit message\n* feature $anotherCommitHash Another message\n", - ), - array( + ], + [ 'cmd' => 'git rev-list arbitrary..feature', 'stdout' => "$anotherCommitHash\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionArray = $guesser->guessVersion(array('version' => 'self.version', 'non-feature-branches' => array('arbitrary')), 'dummy/path'); + $versionArray = $guesser->guessVersion(['version' => 'self.version', 'non-feature-branches' => ['arbitrary']], 'dummy/path'); $this->assertEquals("dev-arbitrary", $versionArray['version']); $this->assertEquals($anotherCommitHash, $versionArray['commit']); @@ -136,21 +136,21 @@ public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationF $anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => " latest-testing $commitHash Commit message\n* feature $anotherCommitHash Another message\n", - ), - array( + ], + [ 'cmd' => 'git rev-list latest-testing..feature', 'stdout' => "$anotherCommitHash\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionArray = $guesser->guessVersion(array('version' => 'self.version', 'non-feature-branches' => array('latest-.*')), 'dummy/path'); + $versionArray = $guesser->guessVersion(['version' => 'self.version', 'non-feature-branches' => ['latest-.*']], 'dummy/path'); $this->assertEquals("dev-latest-testing", $versionArray['version']); $this->assertEquals($anotherCommitHash, $versionArray['commit']); @@ -164,17 +164,17 @@ public function testGuessVersionReadsAndRespectsNonFeatureBranchesConfigurationF $anotherCommitHash = '13a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* latest-testing $commitHash Commit message\n current $anotherCommitHash Another message\n master $anotherCommitHash Another message\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionArray = $guesser->guessVersion(array('version' => 'self.version', 'non-feature-branches' => array('latest-.*')), 'dummy/path'); + $versionArray = $guesser->guessVersion(['version' => 'self.version', 'non-feature-branches' => ['latest-.*']], 'dummy/path'); $this->assertEquals("dev-latest-testing", $versionArray['version']); $this->assertEquals($commitHash, $versionArray['commit']); @@ -187,18 +187,18 @@ public function testDetachedHeadBecomesDevHash(): void $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* (no branch) $commitHash Commit message\n", - ), + ], 'git describe --exact-match --tags', - ), true); + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-$commitHash", $versionData['version']); } @@ -208,18 +208,18 @@ public function testDetachedFetchHeadBecomesDevHashGit2(): void $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* (HEAD detached at FETCH_HEAD) $commitHash Commit message\n", - ), + ], 'git describe --exact-match --tags', - ), true); + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-$commitHash", $versionData['version']); } @@ -229,18 +229,18 @@ public function testDetachedCommitHeadBecomesDevHashGit2(): void $commitHash = '03a15d220da53c52eddd5f32ffca64a7b3801bea'; $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* (HEAD detached at 03a15d220) $commitHash Commit message\n", - ), + ], 'git describe --exact-match --tags', - ), true); + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-$commitHash", $versionData['version']); } @@ -248,21 +248,21 @@ public function testDetachedCommitHeadBecomesDevHashGit2(): void public function testTagBecomesVersion(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* (HEAD detached at v2.0.5-alpha2) 433b98d4218c181bae01865901aac045585e8a1a Commit message\n", - ), - array( + ], + [ 'cmd' => 'git describe --exact-match --tags', 'stdout' => "v2.0.5-alpha2", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("2.0.5.0-alpha2", $versionData['version']); } @@ -270,21 +270,21 @@ public function testTagBecomesVersion(): void public function testTagBecomesPrettyVersion(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* (HEAD detached at 1.0.0) c006f0c12bbbf197b5c071ffb1c0e9812bb14a4d Commit message\n", - ), - array( + ], + [ 'cmd' => 'git describe --exact-match --tags', 'stdout' => '1.0.0', - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals('1.0.0.0', $versionData['version']); $this->assertEquals('1.0.0', $versionData['pretty_version']); @@ -293,17 +293,17 @@ public function testTagBecomesPrettyVersion(): void public function testInvalidTagBecomesVersion(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* foo 03a15d220da53c52eddd5f32ffca64a7b3801bea Commit message\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("dev-foo", $versionData['version']); } @@ -311,17 +311,17 @@ public function testInvalidTagBecomesVersion(): void public function testNumericBranchesShowNicely(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* 1.5 03a15d220da53c52eddd5f32ffca64a7b3801bea Commit message\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array(), 'dummy/path'); + $versionData = $guesser->guessVersion([], 'dummy/path'); $this->assertEquals("1.5.x-dev", $versionData['pretty_version']); $this->assertEquals("1.5.9999999.9999999-dev", $versionData['version']); @@ -330,22 +330,22 @@ public function testNumericBranchesShowNicely(): void public function testRemoteBranchesAreSelected(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array( - array( + $process->expects([ + [ 'cmd' => ['git', 'branch', '-a', '--no-color', '--no-abbrev', '-v'], 'stdout' => "* feature-branch 03a15d220da53c52eddd5f32ffca64a7b3801bea Commit message\n". "remotes/origin/1.5 03a15d220da53c52eddd5f32ffca64a7b3801bea Commit message\n", - ), - array( + ], + [ 'cmd' => 'git rev-list remotes/origin/1.5..feature-branch', 'stdout' => "\n", - ), - ), true); + ], + ], true); $config = new Config; - $config->merge(array('repositories' => array('packagist' => false))); + $config->merge(['repositories' => ['packagist' => false]]); $guesser = new VersionGuesser($config, $process, new VersionParser()); - $versionData = $guesser->guessVersion(array('version' => 'self.version'), 'dummy/path'); + $versionData = $guesser->guessVersion(['version' => 'self.version'], 'dummy/path'); $this->assertEquals("1.5.x-dev", $versionData['pretty_version']); $this->assertEquals("1.5.9999999.9999999-dev", $versionData['version']); } diff --git a/tests/Composer/Test/Package/Version/VersionParserTest.php b/tests/Composer/Test/Package/Version/VersionParserTest.php index 5f2109e8ead2..9ce9ad58b10e 100644 --- a/tests/Composer/Test/Package/Version/VersionParserTest.php +++ b/tests/Composer/Test/Package/Version/VersionParserTest.php @@ -32,21 +32,17 @@ public function testParseNameVersionPairs(array $pairs, array $result): void public function provideParseNameVersionPairsData(): array { - return array( - array(array('php:^7.0'), array(array('name' => 'php', 'version' => '^7.0'))), - array(array('php', '^7.0'), array(array('name' => 'php', 'version' => '^7.0'))), - array(array('php', 'ext-apcu'), array(array('name' => 'php'), array('name' => 'ext-apcu'))), - array(array('foo/*', 'bar*', 'acme/baz', '*@dev'), array(array('name' => 'foo/*'), array('name' => 'bar*'), array('name' => 'acme/baz', 'version' => '*@dev'))), - array(array('php', '*'), array(array('name' => 'php', 'version' => '*'))), - ); + return [ + [['php:^7.0'], [['name' => 'php', 'version' => '^7.0']]], + [['php', '^7.0'], [['name' => 'php', 'version' => '^7.0']]], + [['php', 'ext-apcu'], [['name' => 'php'], ['name' => 'ext-apcu']]], + [['foo/*', 'bar*', 'acme/baz', '*@dev'], [['name' => 'foo/*'], ['name' => 'bar*'], ['name' => 'acme/baz', 'version' => '*@dev']]], + [['php', '*'], [['name' => 'php', 'version' => '*']]], + ]; } /** * @dataProvider provideIsUpgradeTests - * - * @param string $from - * @param string $to - * @param bool $expected */ public function testIsUpgrade(string $from, string $to, bool $expected): void { @@ -55,15 +51,15 @@ public function testIsUpgrade(string $from, string $to, bool $expected): void public function provideIsUpgradeTests(): array { - return array( - array('0.9.0.0', '1.0.0.0', true), - array('1.0.0.0', '0.9.0.0', false), - array('1.0.0.0', VersionParser::DEFAULT_BRANCH_ALIAS, true), - array(VersionParser::DEFAULT_BRANCH_ALIAS, VersionParser::DEFAULT_BRANCH_ALIAS, true), - array(VersionParser::DEFAULT_BRANCH_ALIAS, '1.0.0.0', false), - array('1.0.0.0', 'dev-foo', true), - array('dev-foo', 'dev-foo', true), - array('dev-foo', '1.0.0.0', true), - ); + return [ + ['0.9.0.0', '1.0.0.0', true], + ['1.0.0.0', '0.9.0.0', false], + ['1.0.0.0', VersionParser::DEFAULT_BRANCH_ALIAS, true], + [VersionParser::DEFAULT_BRANCH_ALIAS, VersionParser::DEFAULT_BRANCH_ALIAS, true], + [VersionParser::DEFAULT_BRANCH_ALIAS, '1.0.0.0', false], + ['1.0.0.0', 'dev-foo', true], + ['dev-foo', 'dev-foo', true], + ['dev-foo', '1.0.0.0', true], + ]; } } diff --git a/tests/Composer/Test/Package/Version/VersionSelectorTest.php b/tests/Composer/Test/Package/Version/VersionSelectorTest.php index e9204441d4d6..dd0a5a27e912 100644 --- a/tests/Composer/Test/Package/Version/VersionSelectorTest.php +++ b/tests/Composer/Test/Package/Version/VersionSelectorTest.php @@ -14,7 +14,6 @@ use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; use Composer\IO\BufferIO; -use Composer\IO\IOInterface; use Composer\Package\Version\VersionSelector; use Composer\Package\Package; use Composer\Package\Link; @@ -37,7 +36,7 @@ public function testLatestVersionIsReturned(): void $package1 = $this->getPackage('foo/bar', '1.2.1'); $package2 = $this->getPackage('foo/bar', '1.2.2'); $package3 = $this->getPackage('foo/bar', '1.2.0'); - $packages = array($package1, $package2, $package3); + $packages = [$package1, $package2, $package3]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) @@ -56,20 +55,20 @@ public function testLatestVersionIsReturnedThatMatchesPhpRequirements(): void { $packageName = 'foo/bar'; - $platform = new PlatformRepository(array(), array('php' => '5.5.0')); + $platform = new PlatformRepository([], ['php' => '5.5.0']); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; $package0 = $this->getPackage('foo/bar', '0.9.0'); - $package0->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); + $package0->setRequires(['php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6')]); $package1 = $this->getPackage('foo/bar', '1.0.0'); - $package1->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.4'), Link::TYPE_REQUIRE, '>=5.4'))); + $package1->setRequires(['php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.4'), Link::TYPE_REQUIRE, '>=5.4')]); $package2 = $this->getPackage('foo/bar', '2.0.0'); - $package2->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); + $package2->setRequires(['php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6')]); $package3 = $this->getPackage('foo/bar', '2.1.0'); - $package3->setRequires(array('php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6'))); - $packages = array($package0, $package1, $package2, $package3); + $package3->setRequires(['php' => new Link($packageName, 'php', $parser->parseConstraints('>=5.6'), Link::TYPE_REQUIRE, '>=5.6')]); + $packages = [$package0, $package1, $package2, $package3]; $repositorySet->expects($this->any()) ->method('findPackages') @@ -98,16 +97,16 @@ public function testLatestVersionIsReturnedThatMatchesExtRequirements(): void { $packageName = 'foo/bar'; - $platform = new PlatformRepository(array(), array('ext-zip' => '5.3.0')); + $platform = new PlatformRepository([], ['ext-zip' => '5.3.0']); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; $package1 = $this->getPackage('foo/bar', '1.0.0'); - $package1->setRequires(array('ext-zip' => new Link($packageName, 'ext-zip', $parser->parseConstraints('^5.2'), Link::TYPE_REQUIRE, '^5.2'))); + $package1->setRequires(['ext-zip' => new Link($packageName, 'ext-zip', $parser->parseConstraints('^5.2'), Link::TYPE_REQUIRE, '^5.2')]); $package2 = $this->getPackage('foo/bar', '2.0.0'); - $package2->setRequires(array('ext-zip' => new Link($packageName, 'ext-zip', $parser->parseConstraints('^5.4'), Link::TYPE_REQUIRE, '^5.4'))); - $packages = array($package1, $package2); + $package2->setRequires(['ext-zip' => new Link($packageName, 'ext-zip', $parser->parseConstraints('^5.4'), Link::TYPE_REQUIRE, '^5.4')]); + $packages = [$package1, $package2]; $repositorySet->expects($this->any()) ->method('findPackages') @@ -131,8 +130,8 @@ public function testLatestVersionIsReturnedThatMatchesPlatformExt(): void $parser = new VersionParser; $package1 = $this->getPackage('foo/bar', '1.0.0'); $package2 = $this->getPackage('foo/bar', '2.0.0'); - $package2->setRequires(array('ext-barfoo' => new Link($packageName, 'ext-barfoo', $parser->parseConstraints('*'), Link::TYPE_REQUIRE, '*'))); - $packages = array($package1, $package2); + $package2->setRequires(['ext-barfoo' => new Link($packageName, 'ext-barfoo', $parser->parseConstraints('*'), Link::TYPE_REQUIRE, '*')]); + $packages = [$package1, $package2]; $repositorySet->expects($this->any()) ->method('findPackages') @@ -149,16 +148,16 @@ public function testLatestVersionIsReturnedThatMatchesComposerRequirements(): vo { $packageName = 'foo/bar'; - $platform = new PlatformRepository(array(), array('composer-runtime-api' => '1.0.0')); + $platform = new PlatformRepository([], ['composer-runtime-api' => '1.0.0']); $repositorySet = $this->createMockRepositorySet(); $versionSelector = new VersionSelector($repositorySet, $platform); $parser = new VersionParser; $package1 = $this->getPackage('foo/bar', '1.0.0'); - $package1->setRequires(array('composer-runtime-api' => new Link($packageName, 'composer-runtime-api', $parser->parseConstraints('^1.0'), Link::TYPE_REQUIRE, '^1.0'))); + $package1->setRequires(['composer-runtime-api' => new Link($packageName, 'composer-runtime-api', $parser->parseConstraints('^1.0'), Link::TYPE_REQUIRE, '^1.0')]); $package2 = $this->getPackage('foo/bar', '1.1.0'); - $package2->setRequires(array('composer-runtime-api' => new Link($packageName, 'composer-runtime-api', $parser->parseConstraints('^2.0'), Link::TYPE_REQUIRE, '^2.0'))); - $packages = array($package1, $package2); + $package2->setRequires(['composer-runtime-api' => new Link($packageName, 'composer-runtime-api', $parser->parseConstraints('^2.0'), Link::TYPE_REQUIRE, '^2.0')]); + $packages = [$package1, $package2]; $repositorySet->expects($this->any()) ->method('findPackages') @@ -177,7 +176,7 @@ public function testMostStableVersionIsReturned(): void $package1 = $this->getPackage('foo/bar', '1.0.0'); $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); - $packages = array($package1, $package2); + $packages = [$package1, $package2]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) @@ -197,7 +196,7 @@ public function testMostStableVersionIsReturnedRegardlessOfOrder(): void $package1 = $this->getPackage('foo/bar', '2.x-dev'); $package2 = $this->getPackage('foo/bar', '2.0.0-beta3'); - $packages = array($package1, $package2); + $packages = [$package1, $package2]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->exactly(2)) @@ -222,7 +221,7 @@ public function testHighestVersionIsReturned(): void $package1 = $this->getPackage('foo/bar', '1.0.0'); $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); - $packages = array($package1, $package2); + $packages = [$package1, $package2]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) @@ -243,7 +242,7 @@ public function testHighestVersionMatchingStabilityIsReturned(): void $package1 = $this->getPackage('foo/bar', '1.0.0'); $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); $package3 = $this->getPackage('foo/bar', '1.2.0-alpha'); - $packages = array($package1, $package2, $package3); + $packages = [$package1, $package2, $package3]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) @@ -263,7 +262,7 @@ public function testMostStableUnstableVersionIsReturned(): void $package2 = $this->getPackage('foo/bar', '1.1.0-beta'); $package3 = $this->getPackage('foo/bar', '1.2.0-alpha'); - $packages = array($package2, $package3); + $packages = [$package2, $package3]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) @@ -284,7 +283,7 @@ public function testDefaultBranchAliasIsNeverReturned(): void $package = $this->getPackage('foo/bar', '1.1.0-beta'); $package2 = $this->getPackage('foo/bar', 'dev-main'); $package2Alias = new AliasPackage($package2, VersionParser::DEFAULT_BRANCH_ALIAS, VersionParser::DEFAULT_BRANCH_ALIAS); - $packages = array($package, $package2Alias); + $packages = [$package, $package2Alias]; $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) @@ -303,7 +302,7 @@ public function testFalseReturnedOnNoPackages(): void $repositorySet = $this->createMockRepositorySet(); $repositorySet->expects($this->once()) ->method('findPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $versionSelector = new VersionSelector($repositorySet); $best = $versionSelector->findBestCandidate('foobaz'); @@ -312,11 +311,6 @@ public function testFalseReturnedOnNoPackages(): void /** * @dataProvider provideRecommendedRequireVersionPackages - * - * @param string $prettyVersion - * @param string $expectedVersion - * @param string|null $branchAlias - * @param string $packageName */ public function testFindRecommendedRequireVersion(string $prettyVersion, string $expectedVersion, ?string $branchAlias = null, string $packageName = 'foo/bar'): void { @@ -327,7 +321,7 @@ public function testFindRecommendedRequireVersion(string $prettyVersion, string $package = new Package($packageName, $versionParser->normalize($prettyVersion), $prettyVersion); if ($branchAlias) { - $package->setExtra(array('branch-alias' => array($prettyVersion => $branchAlias))); + $package->setExtra(['branch-alias' => [$prettyVersion => $branchAlias]]); } $recommended = $versionSelector->findRecommendedRequireVersion($package); @@ -338,42 +332,42 @@ public function testFindRecommendedRequireVersion(string $prettyVersion, string public function provideRecommendedRequireVersionPackages(): array { - return array( + return [ // real version, expected recommendation, [branch-alias], [pkg name] - array('1.2.1', '^1.2'), - array('1.2', '^1.2'), - array('v1.2.1', '^1.2'), - array('3.1.2-pl2', '^3.1'), - array('3.1.2-patch', '^3.1'), - array('2.0-beta.1', '^2.0@beta'), - array('3.1.2-alpha5', '^3.1@alpha'), - array('3.0-RC2', '^3.0@RC'), - array('0.1.0', '^0.1.0'), - array('0.1.3', '^0.1.3'), - array('0.0.3', '^0.0.3'), - array('0.0.3-alpha', '^0.0.3@alpha'), + ['1.2.1', '^1.2'], + ['1.2', '^1.2'], + ['v1.2.1', '^1.2'], + ['3.1.2-pl2', '^3.1'], + ['3.1.2-patch', '^3.1'], + ['2.0-beta.1', '^2.0@beta'], + ['3.1.2-alpha5', '^3.1@alpha'], + ['3.0-RC2', '^3.0@RC'], + ['0.1.0', '^0.1.0'], + ['0.1.3', '^0.1.3'], + ['0.0.3', '^0.0.3'], + ['0.0.3-alpha', '^0.0.3@alpha'], // date-based versions are not touched at all - array('v20121020', 'v20121020'), - array('v20121020.2', 'v20121020.2'), + ['v20121020', 'v20121020'], + ['v20121020.2', 'v20121020.2'], // dev packages without alias are not touched at all - array('dev-master', 'dev-master'), - array('3.1.2-dev', '3.1.2-dev'), + ['dev-master', 'dev-master'], + ['3.1.2-dev', '3.1.2-dev'], // dev packages with alias inherit the alias - array('dev-master', '^2.1@dev', '2.1.x-dev'), - array('dev-master', '^2.1@dev', '2.1-dev'), - array('dev-master', '^2.1@dev', '2.1.3.x-dev'), - array('dev-master', '^2.0@dev', '2.x-dev'), - array('dev-master', '^0.3.0@dev', '0.3.x-dev'), - array('dev-master', '^0.0.3@dev', '0.0.3.x-dev'), - array('dev-master', 'dev-master', VersionParser::DEFAULT_BRANCH_ALIAS), + ['dev-master', '^2.1@dev', '2.1.x-dev'], + ['dev-master', '^2.1@dev', '2.1-dev'], + ['dev-master', '^2.1@dev', '2.1.3.x-dev'], + ['dev-master', '^2.0@dev', '2.x-dev'], + ['dev-master', '^0.3.0@dev', '0.3.x-dev'], + ['dev-master', '^0.0.3@dev', '0.0.3.x-dev'], + ['dev-master', 'dev-master', VersionParser::DEFAULT_BRANCH_ALIAS], // numeric alias - array('3.x-dev', '^3.0@dev', '3.0.x-dev'), - array('3.x-dev', '^3.0@dev', '3.0-dev'), + ['3.x-dev', '^3.0@dev', '3.0.x-dev'], + ['3.x-dev', '^3.0@dev', '3.0-dev'], // ext in sync with php - array(PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION, '*', null, 'ext-filter'), + [PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION, '*', null, 'ext-filter'], // ext versioned individually - array('3.0.5', '^3.0', null, 'ext-xdebug'), - ); + ['3.0.5', '^3.0', null, 'ext-xdebug'], + ]; } /** diff --git a/tests/Composer/Test/Platform/VersionTest.php b/tests/Composer/Test/Platform/VersionTest.php index d709bd1ab03d..39f89d0f7301 100644 --- a/tests/Composer/Test/Platform/VersionTest.php +++ b/tests/Composer/Test/Platform/VersionTest.php @@ -29,59 +29,55 @@ class VersionTest extends TestCase */ public static function provideOpenSslVersions(): array { - return array( + return [ // Generated - array('1.2.3', '1.2.3.0'), - array('1.2.3-beta3', '1.2.3.0-beta3'), - array('1.2.3-beta3-dev', '1.2.3.0-beta3-dev'), - array('1.2.3-beta3-fips', '1.2.3.0-beta3', true), - array('1.2.3-beta3-fips-dev', '1.2.3.0-beta3-dev', true), - array('1.2.3-dev', '1.2.3.0-dev'), - array('1.2.3-fips', '1.2.3.0', true), - array('1.2.3-fips-beta3', '1.2.3.0-beta3', true), - array('1.2.3-fips-beta3-dev', '1.2.3.0-beta3-dev', true), - array('1.2.3-fips-dev', '1.2.3.0-dev', true), - array('1.2.3-pre2', '1.2.3.0-alpha2'), - array('1.2.3-pre2-dev', '1.2.3.0-alpha2-dev'), - array('1.2.3-pre2-fips', '1.2.3.0-alpha2', true), - array('1.2.3-pre2-fips-dev', '1.2.3.0-alpha2-dev', true), - array('1.2.3a', '1.2.3.1'), - array('1.2.3a-beta3','1.2.3.1-beta3'), - array('1.2.3a-beta3-dev', '1.2.3.1-beta3-dev'), - array('1.2.3a-dev', '1.2.3.1-dev'), - array('1.2.3a-dev-fips', '1.2.3.1-dev', true), - array('1.2.3a-fips', '1.2.3.1', true), - array('1.2.3a-fips-beta3', '1.2.3.1-beta3', true), - array('1.2.3a-fips-dev', '1.2.3.1-dev', true), - array('1.2.3beta3', '1.2.3.0-beta3'), - array('1.2.3beta3-dev', '1.2.3.0-beta3-dev'), - array('1.2.3zh', '1.2.3.34'), - array('1.2.3zh-dev', '1.2.3.34-dev'), - array('1.2.3zh-fips', '1.2.3.34',true), - array('1.2.3zh-fips-dev', '1.2.3.34-dev', true), + ['1.2.3', '1.2.3.0'], + ['1.2.3-beta3', '1.2.3.0-beta3'], + ['1.2.3-beta3-dev', '1.2.3.0-beta3-dev'], + ['1.2.3-beta3-fips', '1.2.3.0-beta3', true], + ['1.2.3-beta3-fips-dev', '1.2.3.0-beta3-dev', true], + ['1.2.3-dev', '1.2.3.0-dev'], + ['1.2.3-fips', '1.2.3.0', true], + ['1.2.3-fips-beta3', '1.2.3.0-beta3', true], + ['1.2.3-fips-beta3-dev', '1.2.3.0-beta3-dev', true], + ['1.2.3-fips-dev', '1.2.3.0-dev', true], + ['1.2.3-pre2', '1.2.3.0-alpha2'], + ['1.2.3-pre2-dev', '1.2.3.0-alpha2-dev'], + ['1.2.3-pre2-fips', '1.2.3.0-alpha2', true], + ['1.2.3-pre2-fips-dev', '1.2.3.0-alpha2-dev', true], + ['1.2.3a', '1.2.3.1'], + ['1.2.3a-beta3','1.2.3.1-beta3'], + ['1.2.3a-beta3-dev', '1.2.3.1-beta3-dev'], + ['1.2.3a-dev', '1.2.3.1-dev'], + ['1.2.3a-dev-fips', '1.2.3.1-dev', true], + ['1.2.3a-fips', '1.2.3.1', true], + ['1.2.3a-fips-beta3', '1.2.3.1-beta3', true], + ['1.2.3a-fips-dev', '1.2.3.1-dev', true], + ['1.2.3beta3', '1.2.3.0-beta3'], + ['1.2.3beta3-dev', '1.2.3.0-beta3-dev'], + ['1.2.3zh', '1.2.3.34'], + ['1.2.3zh-dev', '1.2.3.34-dev'], + ['1.2.3zh-fips', '1.2.3.34',true], + ['1.2.3zh-fips-dev', '1.2.3.34-dev', true], // Additional cases - array('1.2.3zh-fips-rc3', '1.2.3.34-rc3', true, '1.2.3.34-RC3'), - array('1.2.3zh-alpha10-fips', '1.2.3.34-alpha10', true), - array('1.1.1l (Schannel)', '1.1.1.12'), + ['1.2.3zh-fips-rc3', '1.2.3.34-rc3', true, '1.2.3.34-RC3'], + ['1.2.3zh-alpha10-fips', '1.2.3.34-alpha10', true], + ['1.1.1l (Schannel)', '1.1.1.12'], // Check that alphabetical patch levels overflow correctly - array('1.2.3', '1.2.3.0'), - array('1.2.3a', '1.2.3.1'), - array('1.2.3z', '1.2.3.26'), - array('1.2.3za', '1.2.3.27'), - array('1.2.3zy', '1.2.3.51'), - array('1.2.3zz', '1.2.3.52'), + ['1.2.3', '1.2.3.0'], + ['1.2.3a', '1.2.3.1'], + ['1.2.3z', '1.2.3.26'], + ['1.2.3za', '1.2.3.27'], + ['1.2.3zy', '1.2.3.51'], + ['1.2.3zz', '1.2.3.52'], // 3.x - array('3.0.0', '3.0.0', false, '3.0.0.0'), - array('3.2.4-dev', '3.2.4-dev', false, '3.2.4.0-dev'), - ); + ['3.0.0', '3.0.0', false, '3.0.0.0'], + ['3.2.4-dev', '3.2.4-dev', false, '3.2.4.0-dev'], + ]; } /** * @dataProvider provideOpenSslVersions - * @param string $input - * @param string $parsedVersion - * @param bool $fipsExpected - * @param string|null $normalizedVersion */ public function testParseOpensslVersions(string $input, string $parsedVersion, bool $fipsExpected = false, ?string $normalizedVersion = null): void { @@ -94,19 +90,17 @@ public function testParseOpensslVersions(string $input, string $parsedVersion, b public function provideLibJpegVersions(): array { - return array( - array('9', '9.0'), - array('9a', '9.1'), - array('9b', '9.2'), + return [ + ['9', '9.0'], + ['9a', '9.1'], + ['9b', '9.2'], // Never seen in the wild, just for overflow correctness - array('9za', '9.27'), - ); + ['9za', '9.27'], + ]; } /** * @dataProvider provideLibJpegVersions - * @param string $input - * @param string $parsedVersion */ public function testParseLibjpegVersion(string $input, string $parsedVersion): void { @@ -115,18 +109,16 @@ public function testParseLibjpegVersion(string $input, string $parsedVersion): v public function provideZoneinfoVersions(): array { - return array( - array('2019c', '2019.3'), - array('2020a', '2020.1'), + return [ + ['2019c', '2019.3'], + ['2020a', '2020.1'], // Never happened so far but fixate overflow behavior - array('2020za', '2020.27'), - ); + ['2020za', '2020.27'], + ]; } /** * @dataProvider provideZoneinfoVersions - * @param string $input - * @param string $parsedVersion */ public function testParseZoneinfoVersion(string $input, string $parsedVersion): void { diff --git a/tests/Composer/Test/Plugin/PluginInstallerTest.php b/tests/Composer/Test/Plugin/PluginInstallerTest.php index 8215b97f17e4..0025794e2a46 100644 --- a/tests/Composer/Test/Plugin/PluginInstallerTest.php +++ b/tests/Composer/Test/Plugin/PluginInstallerTest.php @@ -75,7 +75,7 @@ class PluginInstallerTest extends TestCase protected function setUp(): void { $loader = new JsonLoader(new ArrayLoader()); - $this->packages = array(); + $this->packages = []; $this->directory = self::getUniqueTmpDirectory(); for ($i = 1; $i <= 8; $i++) { $filename = '/Fixtures/plugin-v'.$i.'/composer.json'; @@ -108,7 +108,7 @@ protected function setUp(): void $im = $this->getMockBuilder('Composer\Installer\InstallationManager')->disableOriginalConstructor()->getMock(); $im->expects($this->any()) ->method('getInstallPath') - ->will($this->returnCallback(function ($package): string { + ->will($this->returnCallback(static function ($package): string { return __DIR__.'/Fixtures/'.$package->getPrettyName(); })); @@ -128,14 +128,14 @@ protected function setUp(): void $this->composer->setPackage(new RootPackage('dummy/root', '1.0.0.0', '1.0.0')); $this->composer->setLocker(new Locker($this->io, new JsonFile(Platform::getDevNull()), $im, '{}')); - $config->merge(array( - 'config' => array( + $config->merge([ + 'config' => [ 'vendor-dir' => $this->directory.'/Fixtures/', 'home' => $this->directory.'/Fixtures', 'bin-dir' => $this->directory.'/Fixtures/bin', 'allow-plugins' => true, - ), - )); + ], + ]); $this->pm = new PluginManager($this->io, $this->composer); $this->composer->setPluginManager($this->pm); @@ -153,7 +153,7 @@ public function testInstallNewPlugin(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $installer = new PluginInstaller($this->io, $this->composer); $this->pm->loadInstalledPlugins(); @@ -172,13 +172,13 @@ public function testInstallPluginWithRootPackageHavingFilesAutoload(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $installer = new PluginInstaller($this->io, $this->composer); $this->pm->loadInstalledPlugins(); $this->autoloadGenerator->setDevMode(true); - $this->composer->getPackage()->setAutoload(array('files' => array(__DIR__ . '/Fixtures/files_autoload_which_should_not_run.php'))); - $this->composer->getPackage()->setDevAutoload(array('files' => array(__DIR__ . '/Fixtures/files_autoload_which_should_not_run.php'))); + $this->composer->getPackage()->setAutoload(['files' => [__DIR__ . '/Fixtures/files_autoload_which_should_not_run.php']]); + $this->composer->getPackage()->setDevAutoload(['files' => [__DIR__ . '/Fixtures/files_autoload_which_should_not_run.php']]); $installer->install($this->repository, $this->packages[0]); $plugins = $this->pm->getPlugins(); @@ -194,7 +194,7 @@ public function testInstallMultiplePlugins(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array($this->packages[3]))); + ->will($this->returnValue([$this->packages[3]])); $installer = new PluginInstaller($this->io, $this->composer); $this->pm->loadInstalledPlugins(); @@ -213,7 +213,7 @@ public function testUpgradeWithNewClassName(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array($this->packages[0]))); + ->will($this->returnValue([$this->packages[0]])); $this->repository ->expects($this->exactly(2)) ->method('hasPackage') @@ -234,7 +234,7 @@ public function testUninstall(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array($this->packages[0]))); + ->will($this->returnValue([$this->packages[0]])); $this->repository ->expects($this->exactly(1)) ->method('hasPackage') @@ -254,7 +254,7 @@ public function testUpgradeWithSameClassName(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array($this->packages[1]))); + ->will($this->returnValue([$this->packages[1]])); $this->repository ->expects($this->exactly(2)) ->method('hasPackage') @@ -274,7 +274,7 @@ public function testRegisterPluginOnlyOneTime(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $installer = new PluginInstaller($this->io, $this->composer); $this->pm->loadInstalledPlugins(); @@ -288,17 +288,14 @@ public function testRegisterPluginOnlyOneTime(): void } /** - * @param string $newPluginApiVersion * @param array $plugins - * - * @return void */ - private function setPluginApiVersionWithPlugins(string $newPluginApiVersion, array $plugins = array()): void + private function setPluginApiVersionWithPlugins(string $newPluginApiVersion, array $plugins = []): void { // reset the plugin manager's installed plugins $this->pm = $this->getMockBuilder('Composer\Plugin\PluginManager') - ->onlyMethods(array('getPluginApiVersion')) - ->setConstructorArgs(array($this->io, $this->composer)) + ->onlyMethods(['getPluginApiVersion']) + ->setConstructorArgs([$this->io, $this->composer]) ->getMock(); // mock the Plugin API version @@ -316,8 +313,8 @@ private function setPluginApiVersionWithPlugins(string $newPluginApiVersion, arr $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnCallback(function () use ($plugApiInternalPackage, $plugins): array { - return array_merge(array($plugApiInternalPackage), $plugins); + ->will($this->returnCallback(static function () use ($plugApiInternalPackage, $plugins): array { + return array_merge([$plugApiInternalPackage], $plugins); })); $this->pm->loadInstalledPlugins(); @@ -325,7 +322,7 @@ private function setPluginApiVersionWithPlugins(string $newPluginApiVersion, arr public function testStarPluginVersionWorksWithAnyAPIVersion(): void { - $starVersionPlugin = array($this->packages[4]); + $starVersionPlugin = [$this->packages[4]]; $this->setPluginApiVersionWithPlugins('1.0.0', $starVersionPlugin); $this->assertCount(1, $this->pm->getPlugins()); @@ -342,7 +339,7 @@ public function testStarPluginVersionWorksWithAnyAPIVersion(): void public function testPluginConstraintWorksOnlyWithCertainAPIVersion(): void { - $pluginWithApiConstraint = array($this->packages[5]); + $pluginWithApiConstraint = [$this->packages[5]]; $this->setPluginApiVersionWithPlugins('1.0.0', $pluginWithApiConstraint); $this->assertCount(0, $this->pm->getPlugins()); @@ -359,7 +356,7 @@ public function testPluginConstraintWorksOnlyWithCertainAPIVersion(): void public function testPluginRangeConstraintsWorkOnlyWithCertainAPIVersion(): void { - $pluginWithApiConstraint = array($this->packages[6]); + $pluginWithApiConstraint = [$this->packages[6]]; $this->setPluginApiVersionWithPlugins('1.0.0', $pluginWithApiConstraint); $this->assertCount(0, $this->pm->getPlugins()); @@ -376,12 +373,12 @@ public function testCommandProviderCapability(): void $this->repository ->expects($this->any()) ->method('getPackages') - ->will($this->returnValue(array($this->packages[7]))); + ->will($this->returnValue([$this->packages[7]])); $installer = new PluginInstaller($this->io, $this->composer); $this->pm->loadInstalledPlugins(); /** @var \Composer\Plugin\Capability\CommandProvider[] $caps */ - $caps = $this->pm->getPluginCapabilities('Composer\Plugin\Capability\CommandProvider', array('composer' => $this->composer, 'io' => $this->io)); + $caps = $this->pm->getPluginCapabilities('Composer\Plugin\Capability\CommandProvider', ['composer' => $this->composer, 'io' => $this->io]); $this->assertCount(1, $caps); $this->assertInstanceOf('Composer\Plugin\Capability\CommandProvider', $caps[0]); @@ -407,31 +404,31 @@ public function testCapabilityImplementsComposerPluginApiClassAndIsConstructedWi $plugin->expects($this->once()) ->method('getCapabilities') - ->will($this->returnCallback(function () use ($capabilityImplementation, $capabilityApi): array { - return array($capabilityApi => $capabilityImplementation); + ->will($this->returnCallback(static function () use ($capabilityImplementation, $capabilityApi): array { + return [$capabilityApi => $capabilityImplementation]; })); /** @var \Composer\Test\Plugin\Mock\Capability $capability */ - $capability = $this->pm->getPluginCapability($plugin, $capabilityApi, array('a' => 1, 'b' => 2)); + $capability = $this->pm->getPluginCapability($plugin, $capabilityApi, ['a' => 1, 'b' => 2]); $this->assertInstanceOf($capabilityApi, $capability); $this->assertInstanceOf($capabilityImplementation, $capability); - $this->assertSame(array('a' => 1, 'b' => 2, 'plugin' => $plugin), $capability->args); + $this->assertSame(['a' => 1, 'b' => 2, 'plugin' => $plugin], $capability->args); } /** @return mixed[] */ public function invalidImplementationClassNames(): array { - return array( - array(null), - array(""), - array(0), - array(1000), - array(" "), - array(array(1)), - array(array()), - array(new \stdClass()), - ); + return [ + [null], + [""], + [0], + [1000], + [" "], + [[1]], + [[]], + [new \stdClass()], + ]; } /** @@ -450,8 +447,8 @@ public function testQueryingWithInvalidCapabilityClassNameThrows($invalidImpleme $plugin->expects($this->once()) ->method('getCapabilities') - ->will($this->returnCallback(function () use ($invalidImplementationClassNames, $capabilityApi): array { - return array($capabilityApi => $invalidImplementationClassNames); + ->will($this->returnCallback(static function () use ($invalidImplementationClassNames, $capabilityApi): array { + return [$capabilityApi => $invalidImplementationClassNames]; })); $this->pm->getPluginCapability($plugin, $capabilityApi); @@ -466,8 +463,8 @@ public function testQueryingNonProvidedCapabilityReturnsNullSafely(): void $plugin->expects($this->once()) ->method('getCapabilities') - ->will($this->returnCallback(function (): array { - return array(); + ->will($this->returnCallback(static function (): array { + return []; })); $this->assertNull($this->pm->getPluginCapability($plugin, $capabilityApi)); @@ -476,10 +473,10 @@ public function testQueryingNonProvidedCapabilityReturnsNullSafely(): void /** @return mixed[] */ public function nonExistingOrInvalidImplementationClassTypes(): array { - return array( - array('\stdClass'), - array('NonExistentClassLikeMiddleClass'), - ); + return [ + ['\stdClass'], + ['NonExistentClassLikeMiddleClass'], + ]; } /** diff --git a/tests/Composer/Test/Question/StrictConfirmationQuestionTest.php b/tests/Composer/Test/Question/StrictConfirmationQuestionTest.php index c85f38cef754..d8f38fdebd4f 100644 --- a/tests/Composer/Test/Question/StrictConfirmationQuestionTest.php +++ b/tests/Composer/Test/Question/StrictConfirmationQuestionTest.php @@ -32,22 +32,20 @@ class StrictConfirmationQuestionTest extends TestCase */ public function getAskConfirmationBadData(): array { - return array( - array('not correct'), - array('no more'), - array('yes please'), - array('yellow'), - ); + return [ + ['not correct'], + ['no more'], + ['yes please'], + ['yellow'], + ]; } /** * @dataProvider getAskConfirmationBadData - * - * @param string $answer */ public function testAskConfirmationBadAnswer(string $answer): void { - list($input, $dialog) = $this->createInput($answer."\n"); + [$input, $dialog] = $this->createInput($answer."\n"); self::expectException('InvalidArgumentException'); self::expectExceptionMessage('Please answer yes, y, no, or n.'); @@ -59,14 +57,10 @@ public function testAskConfirmationBadAnswer(string $answer): void /** * @dataProvider getAskConfirmationData - * - * @param string $question - * @param bool $expected - * @param bool $default */ public function testAskConfirmation(string $question, bool $expected, bool $default = true): void { - list($input, $dialog) = $this->createInput($question."\n"); + [$input, $dialog] = $this->createInput($question."\n"); $question = new StrictConfirmationQuestion('Do you like French fries?', $default); $this->assertEquals($expected, $dialog->ask($input, $this->createOutputInterface(), $question), 'confirmation question should '.($expected ? 'pass' : 'cancel')); @@ -79,30 +73,28 @@ public function testAskConfirmation(string $question, bool $expected, bool $defa */ public function getAskConfirmationData(): array { - return array( - array('', true), - array('', false, false), - array('y', true), - array('yes', true), - array('n', false), - array('no', false), - ); + return [ + ['', true], + ['', false, false], + ['y', true], + ['yes', true], + ['n', false], + ['no', false], + ]; } public function testAskConfirmationWithCustomTrueAndFalseAnswer(): void { $question = new StrictConfirmationQuestion('Do you like French fries?', false, '/^ja$/i', '/^nein$/i'); - list($input, $dialog) = $this->createInput("ja\n"); + [$input, $dialog] = $this->createInput("ja\n"); $this->assertTrue($dialog->ask($input, $this->createOutputInterface(), $question)); - list($input, $dialog) = $this->createInput("nein\n"); + [$input, $dialog] = $this->createInput("nein\n"); $this->assertFalse($dialog->ask($input, $this->createOutputInterface(), $question)); } /** - * @param string $input - * * @return resource */ protected function getInputStream(string $input) @@ -116,28 +108,23 @@ protected function getInputStream(string $input) return $stream; } - /** - * @return StreamOutput - */ protected function createOutputInterface(): StreamOutput { return new StreamOutput(fopen('php://memory', 'r+', false)); } /** - * @param string $entry - * * @return object[] * * @phpstan-return array{ArrayInput, QuestionHelper} */ protected function createInput(string $entry): array { - $input = new ArrayInput(array('--no-interaction')); + $input = new ArrayInput(['--no-interaction']); $input->setStream($this->getInputStream($entry)); $dialog = new QuestionHelper(); - return array($input, $dialog); + return [$input, $dialog]; } } diff --git a/tests/Composer/Test/Repository/ArrayRepositoryTest.php b/tests/Composer/Test/Repository/ArrayRepositoryTest.php index 04c45959f1f3..2a9500058f7b 100644 --- a/tests/Composer/Test/Repository/ArrayRepositoryTest.php +++ b/tests/Composer/Test/Repository/ArrayRepositoryTest.php @@ -39,7 +39,7 @@ public function testRemovePackage(): void $repo->removePackage($this->getPackage('foo', '1')); $this->assertCount(1, $repo); - $this->assertEquals(array($package), $repo->getPackages()); + $this->assertEquals([$package], $repo->getPackages()); } public function testHasPackage(): void @@ -94,12 +94,12 @@ public function testSearch(): void $repo->addPackage($this->getPackage('bar', '1')); $this->assertSame( - array(array('name' => 'foo', 'description' => null)), + [['name' => 'foo', 'description' => null]], $repo->search('foo', RepositoryInterface::SEARCH_FULLTEXT) ); $this->assertSame( - array(array('name' => 'bar', 'description' => null)), + [['name' => 'bar', 'description' => null]], $repo->search('bar') ); @@ -120,14 +120,14 @@ public function testSearchWithPackageType(): void $repo->addPackage($package); $this->assertSame( - array(array('name' => 'foo', 'description' => null)), + [['name' => 'foo', 'description' => null]], $repo->search('foo', RepositoryInterface::SEARCH_FULLTEXT, 'library') ); $this->assertEmpty($repo->search('bar', RepositoryInterface::SEARCH_FULLTEXT, 'package')); $this->assertSame( - array(array('name' => 'foobar', 'description' => null)), + [['name' => 'foobar', 'description' => null]], $repo->search('foo', 0, 'composer-plugin') ); } @@ -144,10 +144,10 @@ public function testSearchWithAbandonedPackages(): void $repo->addPackage($package2); $this->assertSame( - array( - array('name' => 'foo1', 'description' => null, 'abandoned' => true), - array('name' => 'foo2', 'description' => null, 'abandoned' => 'bar'), - ), + [ + ['name' => 'foo1', 'description' => null, 'abandoned' => true], + ['name' => 'foo2', 'description' => null, 'abandoned' => 'bar'], + ], $repo->search('foo') ); } diff --git a/tests/Composer/Test/Repository/ArtifactRepositoryTest.php b/tests/Composer/Test/Repository/ArtifactRepositoryTest.php index c038dfc2facb..52b2b568c2b9 100644 --- a/tests/Composer/Test/Repository/ArtifactRepositoryTest.php +++ b/tests/Composer/Test/Repository/ArtifactRepositoryTest.php @@ -29,7 +29,7 @@ public function setUp(): void public function testExtractsConfigsFromZipArchives(): void { - $expectedPackages = array( + $expectedPackages = [ 'vendor0/package0-0.0.1', 'composer/composer-1.0.0-alpha6', 'vendor1/package2-4.3.2', @@ -39,12 +39,12 @@ public function testExtractsConfigsFromZipArchives(): void 'test/jsonInFirstLevel-1.0.0', //The files not-an-artifact.zip and jsonSecondLevel are not valid //artifacts and do not get detected. - ); + ]; - $coordinates = array('type' => 'artifact', 'url' => __DIR__ . '/Fixtures/artifacts'); + $coordinates = ['type' => 'artifact', 'url' => __DIR__ . '/Fixtures/artifacts']; $repo = new ArtifactRepository($coordinates, new NullIO()); - $foundPackages = array_map(function (BasePackage $package) { + $foundPackages = array_map(static function (BasePackage $package) { return "{$package->getPrettyName()}-{$package->getPrettyVersion()}"; }, $repo->getPackages()); @@ -53,7 +53,7 @@ public function testExtractsConfigsFromZipArchives(): void $this->assertSame($expectedPackages, $foundPackages); - $tarPackage = array_filter($repo->getPackages(), function (BasePackage $package): bool { + $tarPackage = array_filter($repo->getPackages(), static function (BasePackage $package): bool { return $package->getPrettyName() === 'test/jsonInRootTarFile'; }); $this->assertCount(1, $tarPackage); @@ -64,7 +64,7 @@ public function testExtractsConfigsFromZipArchives(): void public function testAbsoluteRepoUrlCreatesAbsoluteUrlPackages(): void { $absolutePath = __DIR__ . '/Fixtures/artifacts'; - $coordinates = array('type' => 'artifact', 'url' => $absolutePath); + $coordinates = ['type' => 'artifact', 'url' => $absolutePath]; $repo = new ArtifactRepository($coordinates, new NullIO()); foreach ($repo->getPackages() as $package) { @@ -75,7 +75,7 @@ public function testAbsoluteRepoUrlCreatesAbsoluteUrlPackages(): void public function testRelativeRepoUrlCreatesRelativeUrlPackages(): void { $relativePath = 'tests/Composer/Test/Repository/Fixtures/artifacts'; - $coordinates = array('type' => 'artifact', 'url' => $relativePath); + $coordinates = ['type' => 'artifact', 'url' => $relativePath]; $repo = new ArtifactRepository($coordinates, new NullIO()); foreach ($repo->getPackages() as $package) { diff --git a/tests/Composer/Test/Repository/ComposerRepositoryTest.php b/tests/Composer/Test/Repository/ComposerRepositoryTest.php index 854a388ec37a..52fd99cda776 100644 --- a/tests/Composer/Test/Repository/ComposerRepositoryTest.php +++ b/tests/Composer/Test/Repository/ComposerRepositoryTest.php @@ -30,19 +30,19 @@ class ComposerRepositoryTest extends TestCase */ public function testLoadData(array $expected, array $repoPackages): void { - $repoConfig = array( + $repoConfig = [ 'url' => 'http://example.org', - ); + ]; $repository = $this->getMockBuilder('Composer\Repository\ComposerRepository') - ->onlyMethods(array('loadRootServerFile')) - ->setConstructorArgs(array( + ->onlyMethods(['loadRootServerFile']) + ->setConstructorArgs([ $repoConfig, new NullIO, FactoryMock::createConfig(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(), - )) + ]) ->getMock(); $repository @@ -63,46 +63,46 @@ public function testLoadData(array $expected, array $repoPackages): void public function loadDataProvider(): array { - return array( + return [ // Old repository format - array( - array( - array('name' => 'foo/bar', 'version' => '1.0.0'), - ), - array('foo/bar' => array( + [ + [ + ['name' => 'foo/bar', 'version' => '1.0.0'], + ], + ['foo/bar' => [ 'name' => 'foo/bar', - 'versions' => array( - '1.0.0' => array('name' => 'foo/bar', 'version' => '1.0.0'), - ), - )), - ), + 'versions' => [ + '1.0.0' => ['name' => 'foo/bar', 'version' => '1.0.0'], + ], + ]], + ], // New repository format - array( - array( - array('name' => 'bar/foo', 'version' => '3.14'), - array('name' => 'bar/foo', 'version' => '3.145'), - ), - array('packages' => array( - 'bar/foo' => array( - '3.14' => array('name' => 'bar/foo', 'version' => '3.14'), - '3.145' => array('name' => 'bar/foo', 'version' => '3.145'), - ), - )), - ), - ); + [ + [ + ['name' => 'bar/foo', 'version' => '3.14'], + ['name' => 'bar/foo', 'version' => '3.145'], + ], + ['packages' => [ + 'bar/foo' => [ + '3.14' => ['name' => 'bar/foo', 'version' => '3.14'], + '3.145' => ['name' => 'bar/foo', 'version' => '3.145'], + ], + ]], + ], + ]; } public function testWhatProvides(): void { $repo = $this->getMockBuilder('Composer\Repository\ComposerRepository') - ->setConstructorArgs(array( - array('url' => 'https://dummy.test.link'), + ->setConstructorArgs([ + ['url' => 'https://dummy.test.link'], new NullIO, FactoryMock::createConfig(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock(), - )) - ->onlyMethods(array('fetchFile')) + ]) + ->onlyMethods(['fetchFile']) ->getMock(); $cache = $this->getMockBuilder('Composer\Cache')->disableOriginalConstructor()->getMock(); @@ -110,12 +110,12 @@ public function testWhatProvides(): void ->method('sha256') ->will($this->returnValue(false)); - $properties = array( + $properties = [ 'cache' => $cache, 'loader' => new ArrayLoader(), - 'providerListing' => array('a' => array('sha256' => 'xxx')), + 'providerListing' => ['a' => ['sha256' => 'xxx']], 'providersUrl' => 'https://dummy.test.link/to/%package%/file', - ); + ]; foreach ($properties as $property => $value) { $ref = new \ReflectionProperty($repo, $property); @@ -125,58 +125,58 @@ public function testWhatProvides(): void $repo->expects($this->any()) ->method('fetchFile') - ->will($this->returnValue(array( - 'packages' => array( - array(array( + ->will($this->returnValue([ + 'packages' => [ + [[ 'uid' => 1, 'name' => 'a', 'version' => 'dev-master', - 'extra' => array('branch-alias' => array('dev-master' => '1.0.x-dev')), - )), - array(array( + 'extra' => ['branch-alias' => ['dev-master' => '1.0.x-dev']], + ]], + [[ 'uid' => 2, 'name' => 'a', 'version' => 'dev-develop', - 'extra' => array('branch-alias' => array('dev-develop' => '1.1.x-dev')), - )), - array(array( + 'extra' => ['branch-alias' => ['dev-develop' => '1.1.x-dev']], + ]], + [[ 'uid' => 3, 'name' => 'a', 'version' => '0.6', - )), - ), - ))); + ]], + ], + ])); $reflMethod = new \ReflectionMethod($repo, 'whatProvides'); $reflMethod->setAccessible(true); $packages = $reflMethod->invoke($repo, 'a'); $this->assertCount(5, $packages); - $this->assertEquals(array('1', '1-alias', '2', '2-alias', '3'), array_keys($packages)); + $this->assertEquals(['1', '1-alias', '2', '2-alias', '3'], array_keys($packages)); $this->assertSame($packages['2'], $packages['2-alias']->getAliasOf()); } public function testSearchWithType(): void { - $repoConfig = array( + $repoConfig = [ 'url' => 'http://example.org', - ); + ]; - $result = array( - 'results' => array( - array( + $result = [ + 'results' => [ + [ 'name' => 'foo', 'description' => null, - ), - ), - ); + ], + ], + ]; $httpDownloader = $this->getHttpDownloaderMock(); $httpDownloader->expects( [ - ['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(array('search' => '/search.json?q=%query%&type=%type%'))], + ['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(['search' => '/search.json?q=%query%&type=%type%'])], ['url' => 'http://example.org/search.json?q=foo&type=composer-plugin', 'body' => JsonFile::encode($result)], - ['url' => 'http://example.org/search.json?q=foo&type=library', 'body' => JsonFile::encode(array())], + ['url' => 'http://example.org/search.json?q=foo&type=library', 'body' => JsonFile::encode([])], ], true ); @@ -189,7 +189,7 @@ public function testSearchWithType(): void $repository = new ComposerRepository($repoConfig, new NullIO, $config, $httpDownloader, $eventDispatcher); $this->assertSame( - array(array('name' => 'foo', 'description' => null)), + [['name' => 'foo', 'description' => null]], $repository->search('foo', RepositoryInterface::SEARCH_FULLTEXT, 'composer-plugin') ); @@ -200,15 +200,15 @@ public function testSearchWithType(): void public function testSearchWithSpecialChars(): void { - $repoConfig = array( + $repoConfig = [ 'url' => 'http://example.org', - ); + ]; $httpDownloader = $this->getHttpDownloaderMock(); $httpDownloader->expects( [ - ['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(array('search' => '/search.json?q=%query%&type=%type%'))], - ['url' => 'http://example.org/search.json?q=foo+bar&type=', 'body' => JsonFile::encode(array())], + ['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(['search' => '/search.json?q=%query%&type=%type%'])], + ['url' => 'http://example.org/search.json?q=foo+bar&type=', 'body' => JsonFile::encode([])], ], true ); @@ -227,29 +227,29 @@ public function testSearchWithSpecialChars(): void public function testSearchWithAbandonedPackages(): void { - $repoConfig = array( + $repoConfig = [ 'url' => 'http://example.org', - ); + ]; - $result = array( - 'results' => array( - array( + $result = [ + 'results' => [ + [ 'name' => 'foo1', 'description' => null, 'abandoned' => true, - ), - array( + ], + [ 'name' => 'foo2', 'description' => null, 'abandoned' => 'bar', - ), - ), - ); + ], + ], + ]; $httpDownloader = $this->getHttpDownloaderMock(); $httpDownloader->expects( [ - ['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(array('search' => '/search.json?q=%query%'))], + ['url' => 'http://example.org/packages.json', 'body' => JsonFile::encode(['search' => '/search.json?q=%query%'])], ['url' => 'http://example.org/search.json?q=foo', 'body' => JsonFile::encode($result)], ], true @@ -264,25 +264,21 @@ public function testSearchWithAbandonedPackages(): void $repository = new ComposerRepository($repoConfig, new NullIO, $config, $httpDownloader, $eventDispatcher); $this->assertSame( - array( - array('name' => 'foo1', 'description' => null, 'abandoned' => true), - array('name' => 'foo2', 'description' => null, 'abandoned' => 'bar'), - ), + [ + ['name' => 'foo1', 'description' => null, 'abandoned' => true], + ['name' => 'foo2', 'description' => null, 'abandoned' => 'bar'], + ], $repository->search('foo') ); } /** * @dataProvider provideCanonicalizeUrlTestCases - * - * @param string $expected - * @param string $url - * @param string $repositoryUrl */ public function testCanonicalizeUrl(string $expected, string $url, string $repositoryUrl): void { $repository = new ComposerRepository( - array('url' => $repositoryUrl), + ['url' => $repositoryUrl], new NullIO(), FactoryMock::createConfig(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), @@ -305,31 +301,31 @@ public function testCanonicalizeUrl(string $expected, string $url, string $repos public function provideCanonicalizeUrlTestCases(): array { - return array( - array( + return [ + [ 'https://example.org/path/to/file', '/path/to/file', 'https://example.org', - ), - array( + ], + [ 'https://example.org/canonic_url', 'https://example.org/canonic_url', 'https://should-not-see-me.test', - ), - array( + ], + [ 'file:///path/to/repository/file', '/path/to/repository/file', 'file:///path/to/repository', - ), - array( + ], + [ // Assert that the repository URL is returned unchanged if it is // not a URL. // (Backward compatibility test) 'invalid_repo_url', '/path/to/file', 'invalid_repo_url', - ), - array( + ], + [ // Assert that URLs can contain sequences resembling pattern // references as understood by preg_replace() without messing up // the result. @@ -337,8 +333,8 @@ public function provideCanonicalizeUrlTestCases(): array 'https://example.org/path/to/unusual_$0_filename', '/path/to/unusual_$0_filename', 'https://example.org', - ), - ); + ], + ]; } public function testGetProviderNamesWillReturnPartialPackageNames(): void @@ -348,25 +344,25 @@ public function testGetProviderNamesWillReturnPartialPackageNames(): void [ [ 'url' => 'http://example.org/packages.json', - 'body' => JsonFile::encode(array( + 'body' => JsonFile::encode([ 'providers-lazy-url' => '/foo/p/%package%.json', - 'packages' => array('foo/bar' => array( - 'dev-branch' => array('name' => 'foo/bar'), - 'v1.0.0' => array('name' => 'foo/bar'), - )), - )), + 'packages' => ['foo/bar' => [ + 'dev-branch' => ['name' => 'foo/bar'], + 'v1.0.0' => ['name' => 'foo/bar'], + ]], + ]), ], ], true ); $repository = new ComposerRepository( - array('url' => 'http://example.org/packages.json'), + ['url' => 'http://example.org/packages.json'], new NullIO(), FactoryMock::createConfig(), $httpDownloader ); - $this->assertEquals(array('foo/bar'), $repository->getPackageNames()); + $this->assertEquals(['foo/bar'], $repository->getPackageNames()); } } diff --git a/tests/Composer/Test/Repository/CompositeRepositoryTest.php b/tests/Composer/Test/Repository/CompositeRepositoryTest.php index 949a9234ea74..17d1d95b6dd4 100644 --- a/tests/Composer/Test/Repository/CompositeRepositoryTest.php +++ b/tests/Composer/Test/Repository/CompositeRepositoryTest.php @@ -26,7 +26,7 @@ public function testHasPackage(): void $arrayRepoTwo = new ArrayRepository; $arrayRepoTwo->addPackage($this->getPackage('bar', '1')); - $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); + $repo = new CompositeRepository([$arrayRepoOne, $arrayRepoTwo]); $this->assertTrue($repo->hasPackage($this->getPackage('foo', '1')), "Should have package 'foo/1'"); $this->assertTrue($repo->hasPackage($this->getPackage('bar', '1')), "Should have package 'bar/1'"); @@ -43,7 +43,7 @@ public function testFindPackage(): void $arrayRepoTwo = new ArrayRepository; $arrayRepoTwo->addPackage($this->getPackage('bar', '1')); - $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); + $repo = new CompositeRepository([$arrayRepoOne, $arrayRepoTwo]); $this->assertEquals('foo', $repo->findPackage('foo', '1')->getName(), "Should find package 'foo/1' and get name of 'foo'"); $this->assertEquals('1', $repo->findPackage('foo', '1')->getPrettyVersion(), "Should find package 'foo/1' and get pretty version of '1'"); @@ -64,7 +64,7 @@ public function testFindPackages(): void $arrayRepoTwo->addPackage($this->getPackage('bar', '2')); $arrayRepoTwo->addPackage($this->getPackage('foo', '3')); - $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); + $repo = new CompositeRepository([$arrayRepoOne, $arrayRepoTwo]); $bats = $repo->findPackages('bat'); $this->assertCount(1, $bats, "Should find one instance of 'bats' (defined in just one repository)"); @@ -87,7 +87,7 @@ public function testGetPackages(): void $arrayRepoTwo = new ArrayRepository; $arrayRepoTwo->addPackage($this->getPackage('bar', '1')); - $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); + $repo = new CompositeRepository([$arrayRepoOne, $arrayRepoTwo]); $packages = $repo->getPackages(); $this->assertCount(2, $packages, "Should get two packages"); @@ -107,7 +107,7 @@ public function testAddRepository(): void $arrayRepoTwo->addPackage($this->getPackage('bar', '2')); $arrayRepoTwo->addPackage($this->getPackage('bar', '3')); - $repo = new CompositeRepository(array($arrayRepoOne)); + $repo = new CompositeRepository([$arrayRepoOne]); $this->assertCount(1, $repo, "Composite repository should have just one package before addRepository() is called"); $repo->addRepository($arrayRepoTwo); $this->assertCount(4, $repo, "Composite repository should have four packages after addRepository() is called"); @@ -121,7 +121,7 @@ public function testCount(): void $arrayRepoTwo = new ArrayRepository; $arrayRepoTwo->addPackage($this->getPackage('bar', '1')); - $repo = new CompositeRepository(array($arrayRepoOne, $arrayRepoTwo)); + $repo = new CompositeRepository([$arrayRepoOne, $arrayRepoTwo]); $this->assertCount(2, $repo, "Should return '2' for count(\$repo)"); } @@ -129,21 +129,20 @@ public function testCount(): void /** * @dataProvider provideMethodCalls * - * @param string $method * @param mixed[] $args */ public function testNoRepositories(string $method, array $args): void { - $repo = new CompositeRepository(array()); - $this->assertEquals(array(), call_user_func_array(array($repo, $method), $args)); + $repo = new CompositeRepository([]); + $this->assertEquals([], call_user_func_array([$repo, $method], $args)); } public function provideMethodCalls(): array { - return array( - array('findPackages', array('foo')), - array('search', array('foo')), - array('getPackages', array()), - ); + return [ + ['findPackages', ['foo']], + ['search', ['foo']], + ['getPackages', []], + ]; } } diff --git a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php index 8d02e573c6bb..466dcd1c6029 100644 --- a/tests/Composer/Test/Repository/FilesystemRepositoryTest.php +++ b/tests/Composer/Test/Repository/FilesystemRepositoryTest.php @@ -13,7 +13,6 @@ namespace Composer\Test\Repository; use Composer\Package\RootPackageInterface; -use Composer\Package\RootAliasPackage; use Composer\Repository\FilesystemRepository; use Composer\Test\TestCase; use Composer\Json\JsonFile; @@ -30,9 +29,9 @@ public function testRepositoryRead(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array( - array('name' => 'package1', 'version' => '1.0.0-beta', 'type' => 'vendor'), - ))); + ->will($this->returnValue([ + ['name' => 'package1', 'version' => '1.0.0-beta', 'type' => 'vendor'], + ])); $json ->expects($this->once()) ->method('exists') @@ -76,7 +75,7 @@ public function testUnexistentRepositoryFile(): void ->method('exists') ->will($this->returnValue(false)); - $this->assertEquals(array(), $repository->getPackages()); + $this->assertEquals([], $repository->getPackages()); } public function testRepositoryWrite(): void @@ -98,7 +97,7 @@ public function testRepositoryWrite(): void $json ->expects($this->once()) ->method('read') - ->will($this->returnValue(array())); + ->will($this->returnValue([])); $json ->expects($this->once()) ->method('getPath') @@ -110,16 +109,16 @@ public function testRepositoryWrite(): void $json ->expects($this->once()) ->method('write') - ->with(array( - 'packages' => array( - array('name' => 'mypkg', 'type' => 'library', 'version' => '0.1.10', 'version_normalized' => '0.1.10.0', 'install-path' => '../woop/woop'), - array('name' => 'mypkg2', 'type' => 'library', 'version' => '1.2.3', 'version_normalized' => '1.2.3.0', 'install-path' => '../woop/woop'), - ), + ->with([ + 'packages' => [ + ['name' => 'mypkg', 'type' => 'library', 'version' => '0.1.10', 'version_normalized' => '0.1.10.0', 'install-path' => '../woop/woop'], + ['name' => 'mypkg2', 'type' => 'library', 'version' => '1.2.3', 'version_normalized' => '1.2.3.0', 'install-path' => '../woop/woop'], + ], 'dev' => true, - 'dev-package-names' => array('mypkg2'), - )); + 'dev-package-names' => ['mypkg2'], + ]); - $repository->setDevPackageNames(array('mypkg2')); + $repository->setDevPackageNames(['mypkg2']); $repository->addPackage($this->getPackage('mypkg2', '1.2.3')); $repository->addPackage($this->getPackage('mypkg', '0.1.10')); $repository->write(true, $im); @@ -135,18 +134,18 @@ public function testRepositoryWritesInstalledPhp(): void $rootPackage = $this->getRootPackage('__root__', 'dev-master'); $rootPackage->setSourceReference('sourceref-by-default'); $rootPackage->setDistReference('distref'); - $this->configureLinks($rootPackage, array('provide' => array('foo/impl' => '2.0'))); + $this->configureLinks($rootPackage, ['provide' => ['foo/impl' => '2.0']]); $rootPackage = $this->getAliasPackage($rootPackage, '1.10.x-dev'); $repository = new FilesystemRepository($json, true, $rootPackage); - $repository->setDevPackageNames(array('c/c')); + $repository->setDevPackageNames(['c/c']); $pkg = $this->getPackage('a/provider', '1.1'); - $this->configureLinks($pkg, array('provide' => array('foo/impl' => '^1.1', 'foo/impl2' => '2.0'))); + $this->configureLinks($pkg, ['provide' => ['foo/impl' => '^1.1', 'foo/impl2' => '2.0']]); $pkg->setDistReference('distref-as-no-source'); $repository->addPackage($pkg); $pkg = $this->getPackage('a/provider2', '1.2'); - $this->configureLinks($pkg, array('provide' => array('foo/impl' => 'self.version', 'foo/impl2' => '2.0'))); + $this->configureLinks($pkg, ['provide' => ['foo/impl' => 'self.version', 'foo/impl2' => '2.0']]); $pkg->setSourceReference('sourceref'); $pkg->setDistReference('distref-as-installed-from-dist'); $pkg->setInstallationSource('dist'); @@ -155,7 +154,7 @@ public function testRepositoryWritesInstalledPhp(): void $repository->addPackage($this->getAliasPackage($pkg, '1.4')); $pkg = $this->getPackage('b/replacer', '2.2'); - $this->configureLinks($pkg, array('replace' => array('foo/impl2' => 'self.version', 'foo/replaced' => '^3.0'))); + $this->configureLinks($pkg, ['replace' => ['foo/impl2' => 'self.version', 'foo/replaced' => '^3.0']]); $repository->addPackage($pkg); $pkg = $this->getPackage('c/c', '3.0'); @@ -170,7 +169,7 @@ public function testRepositoryWritesInstalledPhp(): void ->getMock(); $im->expects($this->any()) ->method('getInstallPath') - ->will($this->returnCallback(function ($package) use ($dir): string { + ->will($this->returnCallback(static function ($package) use ($dir): string { // check for empty paths handling if ($package->getType() === 'metapackage') { return ''; diff --git a/tests/Composer/Test/Repository/FilterRepositoryTest.php b/tests/Composer/Test/Repository/FilterRepositoryTest.php index 7fa24236a20d..1d5405fa7297 100644 --- a/tests/Composer/Test/Repository/FilterRepositoryTest.php +++ b/tests/Composer/Test/Repository/FilterRepositoryTest.php @@ -45,35 +45,35 @@ public function testRepoMatching(array $expected, $config): void $repo = new FilterRepository($this->arrayRepo, $config); $packages = $repo->getPackages(); - $this->assertSame($expected, array_map(function ($p): string { + $this->assertSame($expected, array_map(static function ($p): string { return $p->getName(); }, $packages)); } public static function provideRepoMatchingTestCases(): array { - return array( - array(array('foo/aaa', 'foo/bbb'), array('only' => array('foo/*'))), - array(array('foo/aaa', 'baz/yyy'), array('only' => array('foo/aaa', 'baz/yyy'))), - array(array('bar/xxx'), array('exclude' => array('foo/*', 'baz/yyy'))), + return [ + [['foo/aaa', 'foo/bbb'], ['only' => ['foo/*']]], + [['foo/aaa', 'baz/yyy'], ['only' => ['foo/aaa', 'baz/yyy']]], + [['bar/xxx'], ['exclude' => ['foo/*', 'baz/yyy']]], // make sure sub-patterns are not matched without wildcard - array(array('foo/aaa', 'foo/bbb', 'bar/xxx', 'baz/yyy'), array('exclude' => array('foo/aa', 'az/yyy'))), - array(array(), array('only' => array('foo/aa', 'az/yyy'))), - ); + [['foo/aaa', 'foo/bbb', 'bar/xxx', 'baz/yyy'], ['exclude' => ['foo/aa', 'az/yyy']]], + [[], ['only' => ['foo/aa', 'az/yyy']]], + ]; } public function testCanonicalDefaultTrue(): void { - $repo = new FilterRepository($this->arrayRepo, array()); - $result = $repo->loadPackages(array('foo/aaa' => new MatchAllConstraint), BasePackage::$stabilities, array()); + $repo = new FilterRepository($this->arrayRepo, []); + $result = $repo->loadPackages(['foo/aaa' => new MatchAllConstraint], BasePackage::$stabilities, []); $this->assertCount(1, $result['packages']); $this->assertCount(1, $result['namesFound']); } public function testNonCanonical(): void { - $repo = new FilterRepository($this->arrayRepo, array('canonical' => false)); - $result = $repo->loadPackages(array('foo/aaa' => new MatchAllConstraint), BasePackage::$stabilities, array()); + $repo = new FilterRepository($this->arrayRepo, ['canonical' => false]); + $result = $repo->loadPackages(['foo/aaa' => new MatchAllConstraint], BasePackage::$stabilities, []); $this->assertCount(1, $result['packages']); $this->assertCount(0, $result['namesFound']); } diff --git a/tests/Composer/Test/Repository/InstalledRepositoryTest.php b/tests/Composer/Test/Repository/InstalledRepositoryTest.php index e9efc04ffda4..5b9aebcca3d4 100644 --- a/tests/Composer/Test/Repository/InstalledRepositoryTest.php +++ b/tests/Composer/Test/Repository/InstalledRepositoryTest.php @@ -31,14 +31,14 @@ public function testFindPackagesWithReplacersAndProviders(): void $arrayRepoTwo->addPackage($bar = $this->getPackage('bar', '1')); $arrayRepoTwo->addPackage($bar2 = $this->getPackage('bar', '2')); - $foo->setReplaces(array('provided' => new Link('foo', 'provided', new MatchAllConstraint()))); - $bar2->setProvides(array('provided' => new Link('bar', 'provided', new MatchAllConstraint()))); + $foo->setReplaces(['provided' => new Link('foo', 'provided', new MatchAllConstraint())]); + $bar2->setProvides(['provided' => new Link('bar', 'provided', new MatchAllConstraint())]); - $repo = new InstalledRepository(array($arrayRepoOne, $arrayRepoTwo)); + $repo = new InstalledRepository([$arrayRepoOne, $arrayRepoTwo]); - $this->assertEquals(array($foo2), $repo->findPackagesWithReplacersAndProviders('foo', '2')); - $this->assertEquals(array($bar), $repo->findPackagesWithReplacersAndProviders('bar', '1')); - $this->assertEquals(array($foo, $bar2), $repo->findPackagesWithReplacersAndProviders('provided')); + $this->assertEquals([$foo2], $repo->findPackagesWithReplacersAndProviders('foo', '2')); + $this->assertEquals([$bar], $repo->findPackagesWithReplacersAndProviders('bar', '1')); + $this->assertEquals([$foo, $bar2], $repo->findPackagesWithReplacersAndProviders('provided')); } public function testAddRepository(): void @@ -47,6 +47,6 @@ public function testAddRepository(): void self::expectException('LogicException'); - new InstalledRepository(array($arrayRepoOne)); + new InstalledRepository([$arrayRepoOne]); } } diff --git a/tests/Composer/Test/Repository/PathRepositoryTest.php b/tests/Composer/Test/Repository/PathRepositoryTest.php index 5c30aa3393c7..2c98d37f2b00 100644 --- a/tests/Composer/Test/Repository/PathRepositoryTest.php +++ b/tests/Composer/Test/Repository/PathRepositoryTest.php @@ -25,15 +25,15 @@ public function testLoadPackageFromFileSystemWithIncorrectPath(): void { self::expectException('RuntimeException'); - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'missing')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl)); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', 'missing']); + $repository = $this->createPathRepo(['url' => $repositoryUrl]); $repository->getPackages(); } public function testLoadPackageFromFileSystemWithVersion(): void { - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'with-version')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl)); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', 'with-version']); + $repository = $this->createPathRepo(['url' => $repositoryUrl]); $repository->getPackages(); $this->assertSame(1, $repository->count()); @@ -42,8 +42,8 @@ public function testLoadPackageFromFileSystemWithVersion(): void public function testLoadPackageFromFileSystemWithoutVersion(): void { - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'without-version')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl)); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', 'without-version']); + $repository = $this->createPathRepo(['url' => $repositoryUrl]); $packages = $repository->getPackages(); $this->assertGreaterThanOrEqual(1, $repository->count()); @@ -57,10 +57,10 @@ public function testLoadPackageFromFileSystemWithoutVersion(): void public function testLoadPackageFromFileSystemWithWildcard(): void { - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl)); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', '*']); + $repository = $this->createPathRepo(['url' => $repositoryUrl]); $packages = $repository->getPackages(); - $names = array(); + $names = []; $this->assertGreaterThanOrEqual(2, $repository->count()); @@ -71,22 +71,22 @@ public function testLoadPackageFromFileSystemWithWildcard(): void $names[] = $package->getName(); sort($names); - $this->assertEquals(array('test/path-unversioned', 'test/path-versioned'), $names); + $this->assertEquals(['test/path-unversioned', 'test/path-versioned'], $names); } public function testLoadPackageWithExplicitVersions(): void { - $options = array( - 'versions' => array( + $options = [ + 'versions' => [ 'test/path-unversioned' => '4.3.2.1', 'test/path-versioned' => '3.2.1.0', - ), - ); - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl, 'options' => $options)); + ], + ]; + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', '*']); + $repository = $this->createPathRepo(['url' => $repositoryUrl, 'options' => $options]); $packages = $repository->getPackages(); - $versions = array(); + $versions = []; $this->assertEquals(2, $repository->count()); @@ -97,7 +97,7 @@ public function testLoadPackageWithExplicitVersions(): void $versions[$package->getName()] = $package->getVersion(); ksort($versions); - $this->assertSame(array('test/path-unversioned' => '4.3.2.1', 'test/path-versioned' => '3.2.1.0'), $versions); + $this->assertSame(['test/path-unversioned' => '4.3.2.1', 'test/path-versioned' => '3.2.1.0'], $versions); } /** @@ -107,12 +107,12 @@ public function testUrlRemainsRelative(): void { // realpath() does not fully expand the paths // PHP Bug https://bugs.php.net/bug.php?id=72642 - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(realpath(realpath(__DIR__)), 'Fixtures', 'path', 'with-version')); + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [realpath(realpath(__DIR__)), 'Fixtures', 'path', 'with-version']); // getcwd() not necessarily match __DIR__ // PHP Bug https://bugs.php.net/bug.php?id=73797 $relativeUrl = ltrim(substr($repositoryUrl, strlen(realpath(realpath(Platform::getCwd())))), DIRECTORY_SEPARATOR); - $repository = $this->createPathRepo(array('url' => $relativeUrl)); + $repository = $this->createPathRepo(['url' => $relativeUrl]); $packages = $repository->getPackages(); $this->assertSame(1, $repository->count()); @@ -127,11 +127,11 @@ public function testUrlRemainsRelative(): void public function testReferenceNone(): void { - $options = array( + $options = [ 'reference' => 'none', - ); - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl, 'options' => $options)); + ]; + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', '*']); + $repository = $this->createPathRepo(['url' => $repositoryUrl, 'options' => $options]); $packages = $repository->getPackages(); $this->assertGreaterThanOrEqual(2, $repository->count()); @@ -143,12 +143,12 @@ public function testReferenceNone(): void public function testReferenceConfig(): void { - $options = array( + $options = [ 'reference' => 'config', 'relative' => true, - ); - $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); - $repository = $this->createPathRepo(array('url' => $repositoryUrl, 'options' => $options)); + ]; + $repositoryUrl = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Fixtures', 'path', '*']); + $repository = $this->createPathRepo(['url' => $repositoryUrl, 'options' => $options]); $packages = $repository->getPackages(); $this->assertGreaterThanOrEqual(2, $repository->count()); @@ -172,7 +172,6 @@ private function createPathRepo(array $options): PathRepository $proc = new ProcessExecutor(); $loop = new Loop(new HttpDownloader($io, $config), $proc); - return new PathRepository($options, $io, $config, null, null, $proc); } } diff --git a/tests/Composer/Test/Repository/PlatformRepositoryTest.php b/tests/Composer/Test/Repository/PlatformRepositoryTest.php index 960ea25c8dcb..a33ccd931566 100644 --- a/tests/Composer/Test/Repository/PlatformRepositoryTest.php +++ b/tests/Composer/Test/Repository/PlatformRepositoryTest.php @@ -24,7 +24,7 @@ class PlatformRepositoryTest extends TestCase public function testHhvmPackage(): void { $hhvmDetector = $this->getMockBuilder('Composer\Platform\HhvmDetector')->getMock(); - $platformRepository = new PlatformRepository(array(), array(), null, $hhvmDetector); + $platformRepository = new PlatformRepository([], [], null, $hhvmDetector); $hhvmDetector ->method('getVersion') @@ -38,79 +38,79 @@ public function testHhvmPackage(): void public function providePhpFlavorTestCases(): array { - return array( - array( - array( + return [ + [ + [ 'PHP_VERSION' => '7.1.33', - ), - array( + ], + [ 'php' => '7.1.33', - ), - ), - array( - array( + ], + ], + [ + [ 'PHP_VERSION' => '7.2.31-1+ubuntu16.04.1+deb.sury.org+1', 'PHP_DEBUG' => true, - ), - array( + ], + [ 'php' => '7.2.31', 'php-debug' => '7.2.31', - ), - ), - array( - array( + ], + ], + [ + [ 'PHP_VERSION' => '7.2.31-1+ubuntu16.04.1+deb.sury.org+1', 'PHP_ZTS' => true, - ), - array( + ], + [ 'php' => '7.2.31', 'php-zts' => '7.2.31', - ), - ), - array( - array( + ], + ], + [ + [ 'PHP_VERSION' => '7.2.31-1+ubuntu16.04.1+deb.sury.org+1', 'PHP_INT_SIZE' => 8, - ), - array( + ], + [ 'php' => '7.2.31', 'php-64bit' => '7.2.31', - ), - ), - array( - array( + ], + ], + [ + [ 'PHP_VERSION' => '7.2.31-1+ubuntu16.04.1+deb.sury.org+1', 'AF_INET6' => 30, - ), - array( + ], + [ 'php' => '7.2.31', 'php-ipv6' => '7.2.31', - ), - ), - array( - array( + ], + ], + [ + [ 'PHP_VERSION' => '7.2.31-1+ubuntu16.04.1+deb.sury.org+1', - ), - array( + ], + [ 'php' => '7.2.31', 'php-ipv6' => '7.2.31', - ), - array( - array('inet_pton', array('::'), ''), - ), - ), - array( - array( + ], + [ + ['inet_pton', ['::'], ''], + ], + ], + [ + [ 'PHP_VERSION' => '7.2.31-1+ubuntu16.04.1+deb.sury.org+1', - ), - array( + ], + [ 'php' => '7.2.31', - ), - array( - array('inet_pton', array('::'), false), - ), - ), - ); + ], + [ + ['inet_pton', ['::'], false], + ], + ], + ]; } /** @@ -120,27 +120,27 @@ public function providePhpFlavorTestCases(): array * @param array $packages * @param list, string|bool}> $functions */ - public function testPhpVersion(array $constants, array $packages, array $functions = array()): void + public function testPhpVersion(array $constants, array $packages, array $functions = []): void { $runtime = $this->getMockBuilder('Composer\Platform\Runtime')->getMock(); $runtime ->method('getExtensions') - ->willReturn(array()); + ->willReturn([]); $runtime ->method('hasConstant') - ->willReturnCallback(function ($constant, $class = null) use ($constants): bool { + ->willReturnCallback(static function ($constant, $class = null) use ($constants): bool { return isset($constants[ltrim($class.'::'.$constant, ':')]); }); $runtime ->method('getConstant') - ->willReturnCallback(function ($constant, $class = null) use ($constants) { + ->willReturnCallback(static function ($constant, $class = null) use ($constants) { return $constants[ltrim($class.'::'.$constant, ':')] ?? null; }); $runtime ->method('invoke') ->willReturnMap($functions); - $repository = new PlatformRepository(array(), array(), $runtime); + $repository = new PlatformRepository([], [], $runtime); foreach ($packages as $packageName => $version) { $package = $repository->findPackage($packageName, '*'); self::assertNotNull($package, sprintf('Expected to find package "%s"', $packageName)); @@ -155,7 +155,7 @@ public function testInetPtonRegression(): void $runtime ->expects(self::once()) ->method('invoke') - ->with('inet_pton', array('::')) + ->with('inet_pton', ['::']) ->willReturn(false); $runtime ->method('hasConstant') @@ -167,21 +167,21 @@ public function testInetPtonRegression(): void ]; $runtime ->method('getConstant') - ->willReturnCallback(function ($constant, $class = null) use ($constants) { + ->willReturnCallback(static function ($constant, $class = null) use ($constants) { return $constants[ltrim($class.'::'.$constant, ':')] ?? null; }); $runtime ->method('getExtensions') - ->willReturn(array()); - $repository = new PlatformRepository(array(), array(), $runtime); + ->willReturn([]); + $repository = new PlatformRepository([], [], $runtime); $package = $repository->findPackage('php-ipv6', '*'); self::assertNull($package); } public static function provideLibraryTestCases(): array { - return array( - 'amqp' => array( + return [ + 'amqp' => [ 'amqp', ' @@ -195,12 +195,12 @@ public static function provideLibraryTestCases(): array Default max channels per connection => 256 Default max frame size => 131072 Default heartbeats interval => 0', - array( + [ 'lib-amqp-protocol' => '0.9.1', 'lib-amqp-librabbitmq' => '0.9.0', - ), - ), - 'bz2' => array( + ], + ], + 'bz2' => [ 'bz2', ' bz2 @@ -209,9 +209,9 @@ public static function provideLibraryTestCases(): array Stream Wrapper support => compress.bzip2:// Stream Filter support => bzip2.decompress, bzip2.compress BZip2 Version => 1.0.5, 6-Sept-2010', - array('lib-bz2' => '1.0.5'), - ), - 'curl' => array( + ['lib-bz2' => '1.0.5'], + ], + 'curl' => [ 'curl', ' curl @@ -245,16 +245,16 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value curl.cainfo => no value => no value', - array( + [ 'lib-curl' => '2.0.0', 'lib-curl-openssl' => '1.0.1.20', 'lib-curl-zlib' => '1.2.8', 'lib-curl-libssh2' => '1.4.3', - ), - array(array('curl_version', array(), array('version' => '2.0.0'))), - ), + ], + [['curl_version', [], ['version' => '2.0.0']]], + ], - 'curl: OpenSSL fips version' => array( + 'curl: OpenSSL fips version' => [ 'curl', ' curl @@ -288,15 +288,15 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value curl.cainfo => no value => no value', - array( + [ 'lib-curl' => '2.0.0', - 'lib-curl-openssl-fips' => array('1.0.1.20', array(), array('lib-curl-openssl')), + 'lib-curl-openssl-fips' => ['1.0.1.20', [], ['lib-curl-openssl']], 'lib-curl-zlib' => '1.2.8', 'lib-curl-libssh2' => '1.4.3', - ), - array(array('curl_version', array(), array('version' => '2.0.0'))), - ), - 'curl: gnutls' => array( + ], + [['curl_version', [], ['version' => '2.0.0']]], + ], + 'curl: gnutls' => [ 'curl', ' curl @@ -324,14 +324,14 @@ public static function provideLibraryTestCases(): array Host => x86_64-pc-linux-gnu SSL Version => GnuTLS/2.12.14 ZLib Version => 1.2.3.4', - array( + [ 'lib-curl' => '7.22.0', 'lib-curl-zlib' => '1.2.3.4', - 'lib-curl-gnutls' => array('2.12.14', array('lib-curl-openssl')), - ), - array(array('curl_version', array(), array('version' => '7.22.0'))), - ), - 'curl: NSS' => array( + 'lib-curl-gnutls' => ['2.12.14', ['lib-curl-openssl']], + ], + [['curl_version', [], ['version' => '7.22.0']]], + ], + 'curl: NSS' => [ 'curl', ' curl @@ -358,15 +358,15 @@ public static function provideLibraryTestCases(): array SSL Version => NSS/3.13.3.0 ZLib Version => 1.2.5 libSSH Version => libssh2/1.4.1', - array( + [ 'lib-curl' => '7.24.0', - 'lib-curl-nss' => array('3.13.3.0', array('lib-curl-openssl')), + 'lib-curl-nss' => ['3.13.3.0', ['lib-curl-openssl']], 'lib-curl-zlib' => '1.2.5', 'lib-curl-libssh2' => '1.4.1', - ), - array(array('curl_version', array(), array('version' => '7.24.0'))), - ), - 'curl: libssh not libssh2' => array( + ], + [['curl_version', [], ['version' => '7.24.0']]], + ], + 'curl: libssh not libssh2' => [ 'curl', ' @@ -404,15 +404,15 @@ public static function provideLibraryTestCases(): array SSL Version => OpenSSL/1.1.1g ZLib Version => 1.2.11 libSSH Version => libssh/0.9.3/openssl/zlib', - array( + [ 'lib-curl' => '7.68.0', 'lib-curl-openssl' => '1.1.1.7', 'lib-curl-zlib' => '1.2.11', 'lib-curl-libssh' => '0.9.3', - ), - array(array('curl_version', array(), array('version' => '7.68.0'))), - ), - 'date' => array( + ], + [['curl_version', [], ['version' => '7.68.0']]], + ], + 'date' => [ 'date', ' date @@ -422,12 +422,12 @@ public static function provideLibraryTestCases(): array "Olson" Timezone Database Version => 2020.1 Timezone Database => external Default timezone => Europe/Berlin', - array( + [ 'lib-date-timelib' => '2018.03', 'lib-date-zoneinfo' => '2020.1', - ), - ), - 'date: before timelib was extracted' => array( + ], + ], + 'date: before timelib was extracted' => [ 'date', ' date @@ -436,13 +436,13 @@ public static function provideLibraryTestCases(): array "Olson" Timezone Database Version => 2013.2 Timezone Database => internal Default timezone => Europe/Amsterdam', - array( + [ 'lib-date-zoneinfo' => '2013.2', 'lib-date-timelib' => false, - ), - ), - 'date: internal zoneinfo' => array( - array('date', 'timezonedb'), + ], + ], + 'date: internal zoneinfo' => [ + ['date', 'timezonedb'], ' date @@ -450,10 +450,10 @@ public static function provideLibraryTestCases(): array "Olson" Timezone Database Version => 2020.1 Timezone Database => internal Default timezone => UTC', - array('lib-date-zoneinfo' => '2020.1'), - ), - 'date: external zoneinfo' => array( - array('date', 'timezonedb'), + ['lib-date-zoneinfo' => '2020.1'], + ], + 'date: external zoneinfo' => [ + ['date', 'timezonedb'], ' date @@ -461,9 +461,9 @@ public static function provideLibraryTestCases(): array "Olson" Timezone Database Version => 2020.1 Timezone Database => external Default timezone => UTC', - array('lib-timezonedb-zoneinfo' => array('2020.1', array('lib-date-zoneinfo'))), - ), - 'date: zoneinfo 0.system' => array( + ['lib-timezonedb-zoneinfo' => ['2020.1', ['lib-date-zoneinfo']]], + ], + 'date: zoneinfo 0.system' => [ 'date', ' @@ -480,21 +480,21 @@ public static function provideLibraryTestCases(): array date.default_longitude => 35.2333 => 35.2333 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333', - array( + [ 'lib-date-zoneinfo' => '0', 'lib-date-timelib' => '2018.03', - ), - ), - 'fileinfo' => array( + ], + ], + 'fileinfo' => [ 'fileinfo', ' fileinfo fileinfo support => enabled libmagic => 537', - array('lib-fileinfo-libmagic' => '537'), - ), - 'gd' => array( + ['lib-fileinfo-libmagic' => '537'], + ], + 'gd' => [ 'gd', ' gd @@ -516,16 +516,16 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value gd.jpeg_ignore_warning => 1 => 1', - array( + [ 'lib-gd' => '1.2.3', 'lib-gd-freetype' => '2.10.0', 'lib-gd-libjpeg' => '9.0', 'lib-gd-libpng' => '1.6.34', - ), - array(), - array(array('GD_VERSION', null, '1.2.3')), - ), - 'gd: libjpeg version variation' => array( + ], + [], + [['GD_VERSION', null, '1.2.3']], + ], + 'gd: libjpeg version variation' => [ 'gd', ' gd @@ -547,16 +547,16 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value gd.jpeg_ignore_warning => 1 => 1', - array( + [ 'lib-gd' => '1.2.3', 'lib-gd-freetype' => '2.9.1', 'lib-gd-libjpeg' => '6.2', 'lib-gd-libpng' => '1.6.35', - ), - array(), - array(array('GD_VERSION', null, '1.2.3')), - ), - 'gd: libxpm' => array( + ], + [], + [['GD_VERSION', null, '1.2.3']], + ], + 'gd: libxpm' => [ 'gd', ' gd @@ -581,31 +581,31 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value gd.jpeg_ignore_warning => 1 => 1', - array( + [ 'lib-gd' => '2.2.5', 'lib-gd-freetype' => '2.6.3', 'lib-gd-libjpeg' => '6.2', 'lib-gd-libpng' => '1.6.28', 'lib-gd-libxpm' => '3.4.11', - ), - array(), - array(array('GD_VERSION', null, '2.2.5')), - ), - 'iconv' => array( + ], + [], + [['GD_VERSION', null, '2.2.5']], + ], + 'iconv' => [ 'iconv', null, - array('lib-iconv' => '1.2.4'), - array(), - array(array('ICONV_VERSION', null, '1.2.4')), - ), - 'gmp' => array( + ['lib-iconv' => '1.2.4'], + [], + [['ICONV_VERSION', null, '1.2.4']], + ], + 'gmp' => [ 'gmp', null, - array('lib-gmp' => '6.1.0'), - array(), - array(array('GMP_VERSION', null, '6.1.0')), - ), - 'intl' => array( + ['lib-gmp' => '6.1.0'], + [], + [['GMP_VERSION', null, '6.1.0']], + ], + 'intl' => [ 'intl', ' intl @@ -620,23 +620,23 @@ public static function provideLibraryTestCases(): array intl.default_locale => no value => no value intl.error_level => 0 => 0 intl.use_exceptions => 0 => 0', - array( + [ 'lib-icu' => '100', 'lib-icu-cldr' => ResourceBundleStub::STUB_VERSION, 'lib-icu-unicode' => '7.0.0', 'lib-icu-zoneinfo' => '2016.2', - ), - array( - array(array('ResourceBundle', 'create'), array('root', 'ICUDATA', false), new ResourceBundleStub()), - array(array('IntlChar', 'getUnicodeVersion'), array(), array(7, 0, 0, 0)), - ), - array(array('INTL_ICU_VERSION', null, '100')), - array( - array('ResourceBundle'), - array('IntlChar'), - ), - ), - 'intl: INTL_ICU_VERSION not defined' => array( + ], + [ + [['ResourceBundle', 'create'], ['root', 'ICUDATA', false], new ResourceBundleStub()], + [['IntlChar', 'getUnicodeVersion'], [], [7, 0, 0, 0]], + ], + [['INTL_ICU_VERSION', null, '100']], + [ + ['ResourceBundle'], + ['IntlChar'], + ], + ], + 'intl: INTL_ICU_VERSION not defined' => [ 'intl', ' intl @@ -645,25 +645,25 @@ public static function provideLibraryTestCases(): array version => 1.1.0 ICU version => 57.1 ICU Data version => 57.1', - array('lib-icu' => '57.1'), - ), - 'imagick: 6.x' => array( + ['lib-icu' => '57.1'], + ], + 'imagick: 6.x' => [ 'imagick', null, - array('lib-imagick-imagemagick' => array('6.2.9', array('lib-imagick'))), - array(), - array(), - array(array('Imagick', array(), new ImagickStub('ImageMagick 6.2.9 Q16 x86_64 2018-05-18 http://www.imagemagick.org'))), - ), - 'imagick: 7.x' => array( + ['lib-imagick-imagemagick' => ['6.2.9', ['lib-imagick']]], + [], + [], + [['Imagick', [], new ImagickStub('ImageMagick 6.2.9 Q16 x86_64 2018-05-18 http://www.imagemagick.org')]], + ], + 'imagick: 7.x' => [ 'imagick', null, - array('lib-imagick-imagemagick' => array('7.0.8.34', array('lib-imagick'))), - array(), - array(), - array(array('Imagick', array(), new ImagickStub('ImageMagick 7.0.8-34 Q16 x86_64 2019-03-23 https://imagemagick.org'))), - ), - 'ldap' => array( + ['lib-imagick-imagemagick' => ['7.0.8.34', ['lib-imagick']]], + [], + [], + [['Imagick', [], new ImagickStub('ImageMagick 7.0.8-34 Q16 x86_64 2019-03-23 https://imagemagick.org')]], + ], + 'ldap' => [ 'ldap', ' ldap @@ -678,23 +678,23 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value ldap.max_links => Unlimited => Unlimited', - array('lib-ldap-openldap' => '2.4.50'), - ), - 'libxml' => array( + ['lib-ldap-openldap' => '2.4.50'], + ], + 'libxml' => [ 'libxml', null, - array('lib-libxml' => '2.1.5'), - array(), - array(array('LIBXML_DOTTED_VERSION', null, '2.1.5')), - ), - 'libxml: related extensions' => array( - array('libxml', 'dom', 'simplexml', 'xml', 'xmlreader', 'xmlwriter'), + ['lib-libxml' => '2.1.5'], + [], + [['LIBXML_DOTTED_VERSION', null, '2.1.5']], + ], + 'libxml: related extensions' => [ + ['libxml', 'dom', 'simplexml', 'xml', 'xmlreader', 'xmlwriter'], null, - array('lib-libxml' => array('2.1.5', array(), array('lib-dom-libxml', 'lib-simplexml-libxml', 'lib-xml-libxml', 'lib-xmlreader-libxml', 'lib-xmlwriter-libxml'))), - array(), - array(array('LIBXML_DOTTED_VERSION', null, '2.1.5')), - ), - 'mbstring' => array( + ['lib-libxml' => ['2.1.5', [], ['lib-dom-libxml', 'lib-simplexml-libxml', 'lib-xml-libxml', 'lib-xmlreader-libxml', 'lib-xmlwriter-libxml']]], + [], + [['LIBXML_DOTTED_VERSION', null, '2.1.5']], + ], + 'mbstring' => [ 'mbstring', ' mbstring @@ -708,14 +708,14 @@ public static function provideLibraryTestCases(): array Multibyte (japanese) regex support => enabled Multibyte regex (oniguruma) version => 6.1.3', - array( + [ 'lib-mbstring-libmbfl' => '1.3.2', 'lib-mbstring-oniguruma' => '7.0.0', - ), - array(), - array(array('MB_ONIGURUMA_VERSION', null, '7.0.0')), - ), - 'mbstring: no MB_ONIGURUMA constant' => array( + ], + [], + [['MB_ONIGURUMA_VERSION', null, '7.0.0']], + ], + 'mbstring: no MB_ONIGURUMA constant' => [ 'mbstring', ' mbstring @@ -729,12 +729,12 @@ public static function provideLibraryTestCases(): array Multibyte (japanese) regex support => enabled Multibyte regex (oniguruma) version => 6.1.3', - array( + [ 'lib-mbstring-libmbfl' => '1.3.2', 'lib-mbstring-oniguruma' => '6.1.3', - ), - ), - 'mbstring: no MB_ONIGURUMA constant <7.40' => array( + ], + ], + 'mbstring: no MB_ONIGURUMA constant <7.40' => [ 'mbstring', ' mbstring @@ -749,12 +749,12 @@ public static function provideLibraryTestCases(): array Multibyte (japanese) regex support => enabled Multibyte regex (oniguruma) backtrack check => On', - array( + [ 'lib-mbstring-libmbfl' => '1.3.2', 'lib-mbstring-oniguruma' => '6.9.4', - ), - ), - 'memcached' => array( + ], + ], + 'memcached' => [ 'memcached', ' memcached @@ -767,72 +767,72 @@ public static function provideLibraryTestCases(): array igbinary support => yes json support => yes msgpack support => yes', - array('lib-memcached-libmemcached' => '1.0.18'), - ), - 'openssl' => array( + ['lib-memcached-libmemcached' => '1.0.18'], + ], + 'openssl' => [ 'openssl', null, - array('lib-openssl' => '1.1.1.7'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g 21 Apr 2020')), - ), - 'openssl: distro peculiarities' => array( + ['lib-openssl' => '1.1.1.7'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g 21 Apr 2020']], + ], + 'openssl: distro peculiarities' => [ 'openssl', null, - array('lib-openssl' => '1.1.1.7'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-freebsd 21 Apr 2020')), - ), - 'openssl: two letters suffix' => array( + ['lib-openssl' => '1.1.1.7'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-freebsd 21 Apr 2020']], + ], + 'openssl: two letters suffix' => [ 'openssl', null, - array('lib-openssl' => '0.9.8.33'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 0.9.8zg 21 Apr 2020')), - ), - 'openssl: pre release is treated as alpha' => array( + ['lib-openssl' => '0.9.8.33'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 0.9.8zg 21 Apr 2020']], + ], + 'openssl: pre release is treated as alpha' => [ 'openssl', null, - array('lib-openssl' => '1.1.1.7-alpha1'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-pre1 21 Apr 2020')), - ), - 'openssl: beta release' => array( + ['lib-openssl' => '1.1.1.7-alpha1'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-pre1 21 Apr 2020']], + ], + 'openssl: beta release' => [ 'openssl', null, - array('lib-openssl' => '1.1.1.7-beta2'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-beta2 21 Apr 2020')), - ), - 'openssl: alpha release' => array( + ['lib-openssl' => '1.1.1.7-beta2'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-beta2 21 Apr 2020']], + ], + 'openssl: alpha release' => [ 'openssl', null, - array('lib-openssl' => '1.1.1.7-alpha4'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-alpha4 21 Apr 2020')), - ), - 'openssl: rc release' => array( + ['lib-openssl' => '1.1.1.7-alpha4'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-alpha4 21 Apr 2020']], + ], + 'openssl: rc release' => [ 'openssl', null, - array('lib-openssl' => '1.1.1.7-rc2'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-rc2 21 Apr 2020')), - ), - 'openssl: fips' => array( + ['lib-openssl' => '1.1.1.7-rc2'], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-rc2 21 Apr 2020']], + ], + 'openssl: fips' => [ 'openssl', null, - array('lib-openssl-fips' => array('1.1.1.7', array(), array('lib-openssl'))), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-fips 21 Apr 2020')), - ), - 'openssl: LibreSSL' => array( + ['lib-openssl-fips' => ['1.1.1.7', [], ['lib-openssl']]], + [], + [['OPENSSL_VERSION_TEXT', null, 'OpenSSL 1.1.1g-fips 21 Apr 2020']], + ], + 'openssl: LibreSSL' => [ 'openssl', null, - array('lib-openssl' => '2.0.1.0'), - array(), - array(array('OPENSSL_VERSION_TEXT', null, 'LibreSSL 2.0.1')), - ), - 'mysqlnd' => array( + ['lib-openssl' => '2.0.1.0'], + [], + [['OPENSSL_VERSION_TEXT', null, 'LibreSSL 2.0.1']], + ], + 'mysqlnd' => [ 'mysqlnd', ' mysqlnd @@ -850,9 +850,9 @@ public static function provideLibraryTestCases(): array Tracing => n/a Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password API Extensions => pdo_mysql,mysqli', - array('lib-mysqlnd-mysqlnd' => '5.0.11-dev'), - ), - 'pdo_mysql' => array( + ['lib-mysqlnd-mysqlnd' => '5.0.11-dev'], + ], + 'pdo_mysql' => [ 'pdo_mysql', ' pdo_mysql @@ -862,9 +862,9 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock', - array('lib-pdo_mysql-mysqlnd' => '5.0.10-dev'), - ), - 'mongodb' => array( + ['lib-pdo_mysql-mysqlnd' => '5.0.10-dev'], + ], + 'mongodb' => [ 'mongodb', ' mongodb @@ -887,12 +887,12 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value mongodb.debug => no value => no value', - array( + [ 'lib-mongodb-libmongoc' => '1.15.2', 'lib-mongodb-libbson' => '1.15.2', - ), - ), - 'pcre' => array( + ], + ], + 'pcre' => [ 'pcre', ' pcre @@ -902,14 +902,14 @@ public static function provideLibraryTestCases(): array PCRE Unicode Version => 11.0.0 PCRE JIT Support => enabled PCRE JIT Target => x86 64bit (little endian + unaligned)', - array( + [ 'lib-pcre' => '10.33', 'lib-pcre-unicode' => '11.0.0', - ), - array(), - array(array('PCRE_VERSION', null, '10.33 2019-04-16')), - ), - 'pcre: no unicode version included' => array( + ], + [], + [['PCRE_VERSION', null, '10.33 2019-04-16']], + ], + 'pcre: no unicode version included' => [ 'pcre', ' pcre @@ -921,13 +921,13 @@ public static function provideLibraryTestCases(): array pcre.backtrack_limit => 1000000 => 1000000 pcre.recursion_limit => 100000 => 100000 ', - array( + [ 'lib-pcre' => '8.38', - ), - array(), - array(array('PCRE_VERSION', null, '8.38 2015-11-23')), - ), - 'pgsql' => array( + ], + [], + [['PCRE_VERSION', null, '8.38 2015-11-23']], + ], + 'pgsql' => [ 'pgsql', ' pgsql @@ -947,9 +947,9 @@ public static function provideLibraryTestCases(): array pgsql.auto_reset_persistent => Off => Off pgsql.ignore_notice => Off => Off pgsql.log_notice => Off => Off', - array('lib-pgsql-libpq' => '12.2'), - ), - 'pdo_pgsql' => array( + ['lib-pgsql-libpq' => '12.2'], + ], + 'pdo_pgsql' => [ 'pdo_pgsql', ' pdo_pgsql @@ -958,23 +958,23 @@ public static function provideLibraryTestCases(): array PostgreSQL(libpq) Version => 12.1 Module version => 7.1.33 Revision => $Id: 9c5f356c77143981d2e905e276e439501fe0f419 $', - array('lib-pdo_pgsql-libpq' => '12.1'), - ), - 'libsodium' => array( + ['lib-pdo_pgsql-libpq' => '12.1'], + ], + 'libsodium' => [ 'libsodium', null, - array('lib-libsodium' => '1.0.17'), - array(), - array(array('SODIUM_LIBRARY_VERSION', null, '1.0.17')), - ), - 'libsodium: different extension name' => array( + ['lib-libsodium' => '1.0.17'], + [], + [['SODIUM_LIBRARY_VERSION', null, '1.0.17']], + ], + 'libsodium: different extension name' => [ 'sodium', null, - array('lib-libsodium' => '1.0.15'), - array(), - array(array('SODIUM_LIBRARY_VERSION', null, '1.0.15')), - ), - 'pdo_sqlite' => array( + ['lib-libsodium' => '1.0.15'], + [], + [['SODIUM_LIBRARY_VERSION', null, '1.0.15']], + ], + 'pdo_sqlite' => [ 'pdo_sqlite', ' pdo_sqlite @@ -982,9 +982,9 @@ public static function provideLibraryTestCases(): array PDO Driver for SQLite 3.x => enabled SQLite Library => 3.32.3 ', - array('lib-pdo_sqlite-sqlite' => '3.32.3'), - ), - 'sqlite3' => array( + ['lib-pdo_sqlite-sqlite' => '3.32.3'], + ], + 'sqlite3' => [ 'sqlite3', ' sqlite3 @@ -996,9 +996,9 @@ public static function provideLibraryTestCases(): array Directive => Local Value => Master Value sqlite3.extension_dir => no value => no value sqlite3.defensive => 1 => 1', - array('lib-sqlite3-sqlite' => '3.31.0'), - ), - 'ssh2' => array( + ['lib-sqlite3-sqlite' => '3.31.0'], + ], + 'ssh2' => [ 'ssh2', ' ssh2 @@ -1007,9 +1007,9 @@ public static function provideLibraryTestCases(): array extension version => 1.2 libssh2 version => 1.8.0 banner => SSH-2.0-libssh2_1.8.0', - array('lib-ssh2-libssh2' => '1.8.0'), - ), - 'yaml' => array( + ['lib-ssh2-libssh2' => '1.8.0'], + ], + 'yaml' => [ 'yaml', ' yaml @@ -1025,9 +1025,9 @@ public static function provideLibraryTestCases(): array yaml.output_canonical => 0 => 0 yaml.output_indent => 2 => 2 yaml.output_width => 80 => 80', - array('lib-yaml-libyaml' => '0.2.2'), - ), - 'xsl' => array( + ['lib-yaml-libyaml' => '0.2.2'], + ], + 'xsl' => [ 'xsl', ' xsl @@ -1037,28 +1037,28 @@ public static function provideLibraryTestCases(): array libxslt compiled against libxml Version => 2.9.8 EXSLT => enabled libexslt Version => 1.1.29', - array( - 'lib-libxslt' => array('1.1.29', array('lib-xsl')), + [ + 'lib-libxslt' => ['1.1.29', ['lib-xsl']], 'lib-libxslt-libxml' => '2.9.8', - ), - array(), - array(array('LIBXSLT_DOTTED_VERSION', null, '1.1.29')), - ), - 'zip' => array( + ], + [], + [['LIBXSLT_DOTTED_VERSION', null, '1.1.29']], + ], + 'zip' => [ 'zip', null, - array('lib-zip-libzip' => array('1.5.0', array('lib-zip'))), - array(), - array(array('LIBZIP_VERSION', 'ZipArchive', '1.5.0')), - ), - 'zlib' => array( + ['lib-zip-libzip' => ['1.5.0', ['lib-zip']]], + [], + [['LIBZIP_VERSION', 'ZipArchive', '1.5.0']], + ], + 'zlib' => [ 'zlib', null, - array('lib-zlib' => '1.2.10'), - array(), - array(array('ZLIB_VERSION', null, '1.2.10')), - ), - 'zlib: no constant present' => array( + ['lib-zlib' => '1.2.10'], + [], + [['ZLIB_VERSION', null, '1.2.10']], + ], + 'zlib: no constant present' => [ 'zlib', ' zlib @@ -1068,16 +1068,15 @@ public static function provideLibraryTestCases(): array Stream Filter => zlib.inflate, zlib.deflate Compiled Version => 1.2.8 Linked Version => 1.2.11', - array('lib-zlib' => '1.2.11'), - ), - ); + ['lib-zlib' => '1.2.11'], + ], + ]; } /** * @dataProvider provideLibraryTestCases * * @param string|string[] $extensions - * @param string|null $info * @param array $expectations array of packageName => expected version (or false if expected to be msising), or packageName => array(expected version, expected replaced names, expected provided names) * @param list $functions * @param list $constants @@ -1087,9 +1086,9 @@ public function testLibraryInformation( $extensions, ?string $info, array $expectations, - array $functions = array(), - array $constants = array(), - array $classDefinitions = array() + array $functions = [], + array $constants = [], + array $classDefinitions = [] ): void { $extensions = (array) $extensions; @@ -1103,16 +1102,16 @@ public function testLibraryInformation( $runtime ->method('getExtensionVersion') ->willReturnMap( - array_map(function ($extension) use ($extensionVersion): array { - return array($extension, $extensionVersion); + array_map(static function ($extension) use ($extensionVersion): array { + return [$extension, $extensionVersion]; }, $extensions) ); $runtime ->method('getExtensionInfo') ->willReturnMap( - array_map(function ($extension) use ($info): array { - return array($extension, $info); + array_map(static function ($extension) use ($info): array { + return [$extension, $info]; }, $extensions) ); @@ -1120,10 +1119,10 @@ public function testLibraryInformation( ->method('invoke') ->willReturnMap($functions); - $constants[] = array('PHP_VERSION', null, '7.1.0'); + $constants[] = ['PHP_VERSION', null, '7.1.0']; $runtime ->method('hasConstant') - ->willReturnCallback(function ($constant, $class = null) use ($constants): bool { + ->willReturnCallback(static function ($constant, $class = null) use ($constants): bool { foreach ($constants as $definition) { if ($definition[0] === $constant && $definition[1] === $class) { return true; @@ -1138,7 +1137,7 @@ public function testLibraryInformation( $runtime ->method('hasClass') - ->willReturnCallback(function ($class) use ($classDefinitions): bool { + ->willReturnCallback(static function ($class) use ($classDefinitions): bool { foreach ($classDefinitions as $definition) { if ($definition[0] === $class) { return true; @@ -1151,20 +1150,20 @@ public function testLibraryInformation( ->method('construct') ->willReturnMap($classDefinitions); - $platformRepository = new PlatformRepository(array(), array(), $runtime); + $platformRepository = new PlatformRepository([], [], $runtime); $libraries = array_map( - function ($package): string { + static function ($package): string { return $package['name']; }, array_filter( $platformRepository->search('lib', PlatformRepository::SEARCH_NAME), - function ($package): bool { + static function ($package): bool { return strpos($package['name'], 'lib-') === 0; } ) ); - $expectedLibraries = array_keys(array_filter($expectations, function ($expectation): bool { + $expectedLibraries = array_keys(array_filter($expectations, static function ($expectation): bool { return $expectation !== false; })); self::assertCount(count(array_filter($expectedLibraries)), $libraries, sprintf('Expected: %s, got %s', var_export($expectedLibraries, true), var_export($libraries, true))); @@ -1178,7 +1177,7 @@ function ($package): bool { if (!is_array($expectation)) { $expectation = [$expectation, [], []]; } - list($expectedVersion, $expectedReplaces, $expectedProvides) = array_pad($expectation, 3, []); + [$expectedVersion, $expectedReplaces, $expectedProvides] = array_pad($expectation, 3, []); $package = $platformRepository->findPackage($packageName, '*'); if ($expectedVersion === false) { @@ -1193,11 +1192,8 @@ function ($package): bool { } /** - * @param string $context * @param string[] $expectedLinks * @param Link[] $links - * - * @return void */ private function assertPackageLinks(string $context, array $expectedLinks, PackageInterface $sourcePackage, array $links): void { @@ -1215,17 +1211,17 @@ public function testComposerPlatformVersion(): void $runtime = $this->getMockBuilder('Composer\Platform\Runtime')->getMock(); $runtime ->method('getExtensions') - ->willReturn(array()); + ->willReturn([]); $runtime ->method('getConstant') ->willReturnMap( - array( - array('PHP_VERSION', null, '7.0.0'), - array('PHP_DEBUG', null, false), - ) + [ + ['PHP_VERSION', null, '7.0.0'], + ['PHP_DEBUG', null, false], + ] ); - $platformRepository = new PlatformRepository(array(), array(), $runtime); + $platformRepository = new PlatformRepository([], [], $runtime); $package = $platformRepository->findPackage('composer', '='.Composer::getVersion()); self::assertNotNull($package, 'Composer package exists'); @@ -1233,34 +1229,32 @@ public function testComposerPlatformVersion(): void public static function providePlatformPackages(): array { - return array( - array('php', true), - array('php-debug', true), - array('php-ipv6', true), - array('php-64bit', true), - array('php-zts', true), - array('hhvm', true), - array('hhvm-foo', false), - array('ext-foo', true), - array('ext-123', true), - array('extfoo', false), - array('ext', false), - array('lib-foo', true), - array('lib-123', true), - array('libfoo', false), - array('lib', false), - array('composer', true), - array('composer-foo', false), - array('composer-plugin-api', true), - array('composer-plugin', false), - array('composer-runtime-api', true), - array('composer-runtime', false), - ); + return [ + ['php', true], + ['php-debug', true], + ['php-ipv6', true], + ['php-64bit', true], + ['php-zts', true], + ['hhvm', true], + ['hhvm-foo', false], + ['ext-foo', true], + ['ext-123', true], + ['extfoo', false], + ['ext', false], + ['lib-foo', true], + ['lib-123', true], + ['libfoo', false], + ['lib', false], + ['composer', true], + ['composer-foo', false], + ['composer-plugin-api', true], + ['composer-plugin', false], + ['composer-runtime-api', true], + ['composer-runtime', false], + ]; } /** - * @param string $packageName - * @param bool $expectation * @dataProvider providePlatformPackages */ public function testValidPlatformPackages(string $packageName, bool $expectation): void @@ -1273,13 +1267,6 @@ class ResourceBundleStub { public const STUB_VERSION = '32.0.1'; - /** - * @param string $locale - * @param string $bundleName - * @param bool $fallback - * - * @return ResourceBundleStub - */ public static function create(string $locale, string $bundleName, bool $fallback): ResourceBundleStub { Assert::assertSame(3, func_num_args()); @@ -1292,8 +1279,6 @@ public static function create(string $locale, string $bundleName, bool $fallback /** * @param string|int $field - * - * @return string */ public function get($field): string { @@ -1311,9 +1296,6 @@ class ImagickStub */ private $versionString; - /** - * @param string $versionString - */ public function __construct(string $versionString) { $this->versionString = $versionString; @@ -1327,6 +1309,6 @@ public function getVersion(): array { Assert::assertSame(0, func_num_args()); - return array('versionString' => $this->versionString); + return ['versionString' => $this->versionString]; } } diff --git a/tests/Composer/Test/Repository/RepositoryFactoryTest.php b/tests/Composer/Test/Repository/RepositoryFactoryTest.php index beb8be4832d8..635784639c6c 100644 --- a/tests/Composer/Test/Repository/RepositoryFactoryTest.php +++ b/tests/Composer/Test/Repository/RepositoryFactoryTest.php @@ -30,7 +30,7 @@ public function testManagerWithAllRepositoryTypes(): void $ref->setAccessible(true); $repositoryClasses = $ref->getValue($manager); - $this->assertEquals(array( + $this->assertEquals([ 'composer', 'vcs', 'package', @@ -46,7 +46,7 @@ public function testManagerWithAllRepositoryTypes(): void 'hg', 'artifact', 'path', - ), array_keys($repositoryClasses)); + ], array_keys($repositoryClasses)); } /** @@ -65,13 +65,13 @@ public function testGenerateRepositoryName($index, array $config, array $existin public function generateRepositoryNameProvider(): array { - return array( - array(0, array(), array(), '0'), - array(0, array(), array(array()), '02'), - array(0, array('url' => 'https://example.org'), array(), 'example.org'), - array(0, array('url' => 'https://example.org'), array('example.org' => array()), 'example.org2'), - array('example.org', array('url' => 'https://example.org/repository'), array(), 'example.org'), - array('example.org', array('url' => 'https://example.org/repository'), array('example.org' => array()), 'example.org2'), - ); + return [ + [0, [], [], '0'], + [0, [], [[]], '02'], + [0, ['url' => 'https://example.org'], [], 'example.org'], + [0, ['url' => 'https://example.org'], ['example.org' => []], 'example.org2'], + ['example.org', ['url' => 'https://example.org/repository'], [], 'example.org'], + ['example.org', ['url' => 'https://example.org/repository'], ['example.org' => []], 'example.org2'], + ]; } } diff --git a/tests/Composer/Test/Repository/RepositoryManagerTest.php b/tests/Composer/Test/Repository/RepositoryManagerTest.php index 898540775edb..7722469b006a 100644 --- a/tests/Composer/Test/Repository/RepositoryManagerTest.php +++ b/tests/Composer/Test/Repository/RepositoryManagerTest.php @@ -50,13 +50,12 @@ public function testPrepend(): void $rm->addRepository($repository1); $rm->prependRepository($repository2); - $this->assertEquals(array($repository2, $repository1), $rm->getRepositories()); + $this->assertEquals([$repository2, $repository1], $rm->getRepositories()); } /** * @dataProvider provideRepoCreationTestCases * - * @param string $type * @param array $options * @param class-string<\Throwable>|null $exception */ @@ -86,25 +85,25 @@ public function testRepoCreation(string $type, array $options, ?string $exceptio $rm->setRepositoryClass('hg', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('artifact', 'Composer\Repository\ArtifactRepository'); - $rm->createRepository('composer', array('url' => 'http://example.org')); + $rm->createRepository('composer', ['url' => 'http://example.org']); $this->assertInstanceOf('Composer\Repository\RepositoryInterface', $rm->createRepository($type, $options)); } public function provideRepoCreationTestCases(): array { - $cases = array( - array('composer', array('url' => 'http://example.org')), - array('vcs', array('url' => 'http://github.com/foo/bar')), - array('git', array('url' => 'http://github.com/foo/bar')), - array('git', array('url' => 'git@example.org:foo/bar.git')), - array('svn', array('url' => 'svn://example.org/foo/bar')), - array('pear', array('url' => 'http://pear.example.org/foo'), 'InvalidArgumentException'), - array('package', array('package' => array())), - array('invalid', array(), 'InvalidArgumentException'), - ); + $cases = [ + ['composer', ['url' => 'http://example.org']], + ['vcs', ['url' => 'http://github.com/foo/bar']], + ['git', ['url' => 'http://github.com/foo/bar']], + ['git', ['url' => 'git@example.org:foo/bar.git']], + ['svn', ['url' => 'svn://example.org/foo/bar']], + ['pear', ['url' => 'http://pear.example.org/foo'], 'InvalidArgumentException'], + ['package', ['package' => []]], + ['invalid', [], 'InvalidArgumentException'], + ]; if (class_exists('ZipArchive')) { - $cases[] = array('artifact', array('url' => '/path/to/zips')); + $cases[] = ['artifact', ['url' => '/path/to/zips']]; } return $cases; @@ -114,14 +113,14 @@ public function testFilterRepoWrapping(): void { $rm = new RepositoryManager( $this->getMockBuilder('Composer\IO\IOInterface')->getMock(), - $config = $this->getMockBuilder('Composer\Config')->onlyMethods(array('get'))->getMock(), + $config = $this->getMockBuilder('Composer\Config')->onlyMethods(['get'])->getMock(), $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $this->getMockBuilder('Composer\EventDispatcher\EventDispatcher')->disableOriginalConstructor()->getMock() ); $rm->setRepositoryClass('path', 'Composer\Repository\PathRepository'); /** @var \Composer\Repository\FilterRepository $repo */ - $repo = $rm->createRepository('path', array('type' => 'path', 'url' => __DIR__, 'only' => array('foo/bar'))); + $repo = $rm->createRepository('path', ['type' => 'path', 'url' => __DIR__, 'only' => ['foo/bar']]); $this->assertInstanceOf('Composer\Repository\FilterRepository', $repo); $this->assertInstanceOf('Composer\Repository\PathRepository', $repo->getRepository()); diff --git a/tests/Composer/Test/Repository/RepositoryUtilsTest.php b/tests/Composer/Test/Repository/RepositoryUtilsTest.php index 03532065031c..c57b4fa04ac0 100644 --- a/tests/Composer/Test/Repository/RepositoryUtilsTest.php +++ b/tests/Composer/Test/Repository/RepositoryUtilsTest.php @@ -22,7 +22,6 @@ class RepositoryUtilsTest extends TestCase /** * @dataProvider provideFilterRequireTests * @param PackageInterface[] $pkgs - * @param PackageInterface $requirer * @param string[] $expected */ public function testFilterRequiredPackages(array $pkgs, PackageInterface $requirer, array $expected): void diff --git a/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php b/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php index ba15e30900ea..06ec3d177062 100644 --- a/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/FossilDriverTest.php @@ -32,11 +32,11 @@ public function setUp(): void { $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); - $this->config->merge(array( - 'config' => array( + $this->config->merge([ + 'config' => [ 'home' => $this->home, - ), - )); + ], + ]); } protected function tearDown(): void @@ -48,18 +48,15 @@ protected function tearDown(): void public static function supportProvider(): array { - return array( - array('http://fossil.kd2.org/kd2fw/', true), - array('https://chiselapp.com/user/rkeene/repository/flint/index', true), - array('ssh://fossil.kd2.org/kd2fw.fossil', true), - ); + return [ + ['http://fossil.kd2.org/kd2fw/', true], + ['https://chiselapp.com/user/rkeene/repository/flint/index', true], + ['ssh://fossil.kd2.org/kd2fw.fossil', true], + ]; } /** * @dataProvider supportProvider - * - * @param string $url - * @param bool $assertion */ public function testSupport(string $url, bool $assertion): void { diff --git a/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php index ff55e90a04ec..3a35cd28ee53 100644 --- a/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitBitbucketDriverTest.php @@ -40,11 +40,11 @@ protected function setUp(): void $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); - $this->config->merge(array( - 'config' => array( + $this->config->merge([ + 'config' => [ 'home' => $this->home, - ), - )); + ], + ]); $this->httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader') ->disableOriginalConstructor() @@ -60,7 +60,6 @@ protected function tearDown(): void /** * @param array $repoConfig - * @return GitBitbucketDriver * * @phpstan-param array{url: string}&array $repoConfig */ @@ -88,53 +87,53 @@ public function testGetRootIdentifierWrongScmType(): void ->method('get') ->with( $url = 'https://api.bitbucket.org/2.0/repositories/user/repo?fields=-project%2C-owner', - array() + [] ) ->willReturn( - new Response(array('url' => $url), 200, array(), '{"scm":"hg","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/user\/repo","name":"https"},{"href":"ssh:\/\/hg@bitbucket.org\/user\/repo","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/user\/repo"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}') + new Response(['url' => $url], 200, [], '{"scm":"hg","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/user\/repo","name":"https"},{"href":"ssh:\/\/hg@bitbucket.org\/user\/repo","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/user\/repo"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}') ); - $driver = $this->getDriver(array('url' => 'https://bitbucket.org/user/repo.git')); + $driver = $this->getDriver(['url' => 'https://bitbucket.org/user/repo.git']); $driver->getRootIdentifier(); } public function testDriver(): GitBitbucketDriver { - $driver = $this->getDriver(array('url' => 'https://bitbucket.org/user/repo.git')); + $driver = $this->getDriver(['url' => 'https://bitbucket.org/user/repo.git']); - $urls = array( + $urls = [ 'https://api.bitbucket.org/2.0/repositories/user/repo?fields=-project%2C-owner', 'https://api.bitbucket.org/2.0/repositories/user/repo/refs/tags?pagelen=100&fields=values.name%2Cvalues.target.hash%2Cnext&sort=-target.date', 'https://api.bitbucket.org/2.0/repositories/user/repo/refs/branches?pagelen=100&fields=values.name%2Cvalues.target.hash%2Cvalues.heads%2Cnext&sort=-target.date', 'https://api.bitbucket.org/2.0/repositories/user/repo/src/main/composer.json', 'https://api.bitbucket.org/2.0/repositories/user/repo/commit/main?fields=date', - ); + ]; $this->httpDownloader->expects($this->any()) ->method('get') ->withConsecutive( - array( - $urls[0], array(), - ), - array( - $urls[1], array(), - ), - array( - $urls[2], array(), - ), - array( - $urls[3], array(), - ), - array( - $urls[4], array(), - ) + [ + $urls[0], [], + ], + [ + $urls[1], [], + ], + [ + $urls[2], [], + ], + [ + $urls[3], [], + ], + [ + $urls[4], [], + ] ) ->willReturnOnConsecutiveCalls( - new Response(array('url' => $urls[0]), 200, array(), '{"mainbranch": {"name": "main"}, "scm":"git","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/user\/repo.git","name":"https"},{"href":"ssh:\/\/git@bitbucket.org\/user\/repo.git","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/user\/repo"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}'), - new Response(array('url' => $urls[1]), 200, array(), '{"values":[{"name":"1.0.1","target":{"hash":"9b78a3932143497c519e49b8241083838c8ff8a1"}},{"name":"1.0.0","target":{"hash":"d3393d514318a9267d2f8ebbf463a9aaa389f8eb"}}]}'), - new Response(array('url' => $urls[2]), 200, array(), '{"values":[{"name":"main","target":{"hash":"937992d19d72b5116c3e8c4a04f960e5fa270b22"}}]}'), - new Response(array('url' => $urls[3]), 200, array(), '{"name": "user/repo","description": "test repo","license": "GPL","authors": [{"name": "Name","email": "local@domain.tld"}],"require": {"creator/package": "^1.0"},"require-dev": {"phpunit/phpunit": "~4.8"}}'), - new Response(array('url' => $urls[4]), 200, array(), '{"date": "2016-05-17T13:19:52+00:00"}') + new Response(['url' => $urls[0]], 200, [], '{"mainbranch": {"name": "main"}, "scm":"git","website":"","has_wiki":false,"name":"repo","links":{"branches":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/branches"},"tags":{"href":"https:\/\/api.bitbucket.org\/2.0\/repositories\/user\/repo\/refs\/tags"},"clone":[{"href":"https:\/\/user@bitbucket.org\/user\/repo.git","name":"https"},{"href":"ssh:\/\/git@bitbucket.org\/user\/repo.git","name":"ssh"}],"html":{"href":"https:\/\/bitbucket.org\/user\/repo"}},"language":"php","created_on":"2015-02-18T16:22:24.688+00:00","updated_on":"2016-05-17T13:20:21.993+00:00","is_private":true,"has_issues":false}'), + new Response(['url' => $urls[1]], 200, [], '{"values":[{"name":"1.0.1","target":{"hash":"9b78a3932143497c519e49b8241083838c8ff8a1"}},{"name":"1.0.0","target":{"hash":"d3393d514318a9267d2f8ebbf463a9aaa389f8eb"}}]}'), + new Response(['url' => $urls[2]], 200, [], '{"values":[{"name":"main","target":{"hash":"937992d19d72b5116c3e8c4a04f960e5fa270b22"}}]}'), + new Response(['url' => $urls[3]], 200, [], '{"name": "user/repo","description": "test repo","license": "GPL","authors": [{"name": "Name","email": "local@domain.tld"}],"require": {"creator/package": "^1.0"},"require-dev": {"phpunit/phpunit": "~4.8"}}'), + new Response(['url' => $urls[4]], 200, [], '{"date": "2016-05-17T13:19:52+00:00"}') ); $this->assertEquals( @@ -143,43 +142,43 @@ public function testDriver(): GitBitbucketDriver ); $this->assertEquals( - array( + [ '1.0.1' => '9b78a3932143497c519e49b8241083838c8ff8a1', '1.0.0' => 'd3393d514318a9267d2f8ebbf463a9aaa389f8eb', - ), + ], $driver->getTags() ); $this->assertEquals( - array( + [ 'main' => '937992d19d72b5116c3e8c4a04f960e5fa270b22', - ), + ], $driver->getBranches() ); $this->assertEquals( - array( + [ 'name' => 'user/repo', 'description' => 'test repo', 'license' => 'GPL', - 'authors' => array( - array( + 'authors' => [ + [ 'name' => 'Name', 'email' => 'local@domain.tld', - ), - ), - 'require' => array( + ], + ], + 'require' => [ 'creator/package' => '^1.0', - ), - 'require-dev' => array( + ], + 'require-dev' => [ 'phpunit/phpunit' => '~4.8', - ), + ], 'time' => '2016-05-17T13:19:52+00:00', - 'support' => array( + 'support' => [ 'source' => 'https://bitbucket.org/user/repo/src/937992d19d72b5116c3e8c4a04f960e5fa270b22/?at=main', - ), + ], 'homepage' => 'https://bitbucket.org/user/repo', - ), + ], $driver->getComposerInformation('main') ); @@ -188,7 +187,6 @@ public function testDriver(): GitBitbucketDriver /** * @depends testDriver - * @param \Composer\Repository\Vcs\VcsDriverInterface $driver */ public function testGetParams(\Composer\Repository\Vcs\VcsDriverInterface $driver): void { @@ -197,17 +195,17 @@ public function testGetParams(\Composer\Repository\Vcs\VcsDriverInterface $drive $this->assertEquals($url, $driver->getUrl()); $this->assertEquals( - array( + [ 'type' => 'zip', 'url' => 'https://bitbucket.org/user/repo/get/reference.zip', 'reference' => 'reference', 'shasum' => '', - ), + ], $driver->getDist('reference') ); $this->assertEquals( - array('type' => 'git', 'url' => $url, 'reference' => 'reference'), + ['type' => 'git', 'url' => $url, 'reference' => 'reference'], $driver->getSource('reference') ); } @@ -216,7 +214,7 @@ public function testInitializeInvalidRepositoryUrl(): void { $this->expectException('\InvalidArgumentException'); - $driver = $this->getDriver(array('url' => 'https://bitbucket.org/acme')); + $driver = $this->getDriver(['url' => 'https://bitbucket.org/acme']); $driver->initialize(); } diff --git a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php index 229ef130d76d..5dd57dead7cf 100644 --- a/tests/Composer/Test/Repository/Vcs/GitDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitDriverTest.php @@ -1,5 +1,15 @@ + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + namespace Composer\Test\Repository\Vcs; use Composer\Config; @@ -8,7 +18,6 @@ use Composer\Test\TestCase; use Composer\Util\Filesystem; use Composer\Util\Platform; -use Composer\Test\Mock\ProcessExecutorMock; class GitDriverTest extends TestCase { @@ -135,7 +144,7 @@ public function testGetBranchesFilterInvalidBranchNames(): void $process = $this->getProcessExecutorMock(); $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $driver = new GitDriver(array('url' => 'https://example.org/acme.git'), $io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); + $driver = new GitDriver(['url' => 'https://example.org/acme.git'], $io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); $this->setRepoDir($driver, $this->home); // Branches starting with a - character are not valid git branches names @@ -147,16 +156,16 @@ public function testGetBranchesFilterInvalidBranchNames(): void GIT; $process - ->expects(array(array( + ->expects([[ 'cmd' => 'git branch --no-color --no-abbrev -v', 'stdout' => $stdout, - ))); + ]]); $branches = $driver->getBranches(); - $this->assertSame(array( + $this->assertSame([ 'main' => '089681446ba44d6d9004350192486f2ceb4eaa06', '2.2' => '12681446ba44d6d9004350192486f2ceb4eaa06', - ), $branches); + ], $branches); } public function testFileGetContentInvalidIdentifier(): void @@ -165,7 +174,7 @@ public function testFileGetContentInvalidIdentifier(): void $process = $this->getProcessExecutorMock(); $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); - $driver = new GitDriver(array('url' => 'https://example.org/acme.git'), $io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); + $driver = new GitDriver(['url' => 'https://example.org/acme.git'], $io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); $this->assertNull($driver->getFileContent('file.txt', 'h')); diff --git a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php index d8efcc24c9ee..707ae7e5eb0b 100644 --- a/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitHubDriverTest.php @@ -13,7 +13,6 @@ namespace Composer\Test\Repository\Vcs; use Composer\Repository\Vcs\GitHubDriver; -use Composer\Test\Mock\ProcessExecutorMock; use Composer\Test\TestCase; use Composer\Util\Filesystem; use Composer\Config; @@ -30,11 +29,11 @@ public function setUp(): void { $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); - $this->config->merge(array( - 'config' => array( + $this->config->merge([ + 'config' => [ 'home' => $this->home, - ), - )); + ], + ]); } protected function tearDown(): void @@ -68,7 +67,7 @@ public function testPrivateRepository(): void ); $process = $this->getProcessExecutorMock(); - $process->expects(array(), false, array('return' => 1)); + $process->expects([], false, ['return' => 1]); $io->expects($this->once()) ->method('askAndHideAnswer') @@ -84,13 +83,13 @@ public function testPrivateRepository(): void $this->config->setConfigSource($configSource); $this->config->setAuthConfigSource($authConfigSource); - $repoConfig = array( + $repoConfig = [ 'url' => $repoUrl, - ); + ]; $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $process); $gitHubDriver->initialize(); - $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); + $this->setAttribute($gitHubDriver, 'tags', [$identifier => $sha]); $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier()); @@ -125,14 +124,14 @@ public function testPublicRepository(): void true ); - $repoConfig = array( + $repoConfig = [ 'url' => $repoUrl, - ); + ]; $repoUrl = 'https://github.com/composer/packagist.git'; $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $this->getProcessExecutorMock()); $gitHubDriver->initialize(); - $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); + $this->setAttribute($gitHubDriver, 'tags', [$identifier => $sha]); $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier()); @@ -170,14 +169,14 @@ public function testPublicRepository2(): void true ); - $repoConfig = array( + $repoConfig = [ 'url' => $repoUrl, - ); + ]; $repoUrl = 'https://github.com/composer/packagist.git'; $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $this->getProcessExecutorMock()); $gitHubDriver->initialize(); - $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); + $this->setAttribute($gitHubDriver, 'tags', [$identifier => $sha]); $this->assertEquals('test_master', $gitHubDriver->getRootIdentifier()); @@ -221,13 +220,13 @@ public function testPublicRepositoryArchived(): void true ); - $repoConfig = array( + $repoConfig = [ 'url' => $repoUrl, - ); + ]; $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $this->getProcessExecutorMock()); $gitHubDriver->initialize(); - $this->setAttribute($gitHubDriver, 'tags', array($identifier => $sha)); + $this->setAttribute($gitHubDriver, 'tags', [$identifier => $sha]); $data = $gitHubDriver->getComposerInformation($sha); @@ -262,26 +261,26 @@ public function testPrivateRepositoryNoInteraction(): void $this->config->merge(['config' => ['cache-vcs-dir' => sys_get_temp_dir() . '/composer-test/cache']]); $process = $this->getProcessExecutorMock(); - $process->expects(array( - array('cmd' => 'git config github.accesstoken', 'return' => 1), + $process->expects([ + ['cmd' => 'git config github.accesstoken', 'return' => 1], 'git clone --mirror -- '.ProcessExecutor::escape($repoSshUrl).' '.ProcessExecutor::escape($this->config->get('cache-vcs-dir').'/git-github.com-composer-packagist.git/'), - array( + [ 'cmd' => 'git show-ref --tags --dereference', 'stdout' => $sha.' refs/tags/'.$identifier, - ), - array( + ], + [ 'cmd' => 'git branch --no-color --no-abbrev -v', 'stdout' => ' test_master edf93f1fccaebd8764383dc12016d0a1a9672d89 Fix test & behavior', - ), - array( + ], + [ 'cmd' => 'git branch --no-color', 'stdout' => '* test_master', - ), - ), true); + ], + ], true); - $repoConfig = array( + $repoConfig = [ 'url' => $repoUrl, - ); + ]; $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $process); $gitHubDriver->initialize(); @@ -306,20 +305,18 @@ public function testPrivateRepositoryNoInteraction(): void /** * @dataProvider invalidUrlProvider - * @param string $url - * @return void */ - public function testInitializeInvalidRepoUrl($url): void + public function testInitializeInvalidRepoUrl(string $url): void { $this->expectException('\InvalidArgumentException'); - $repoConfig = array( + $repoConfig = [ 'url' => $url, - ); + ]; $io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader') - ->setConstructorArgs(array($io, $this->config)) + ->setConstructorArgs([$io, $this->config]) ->getMock(); $gitHubDriver = new GitHubDriver($repoConfig, $io, $this->config, $httpDownloader, $this->getProcessExecutorMock()); @@ -331,17 +328,15 @@ public function testInitializeInvalidRepoUrl($url): void */ public function invalidUrlProvider() { - return array( - array('https://github.com/acme'), - array('https://github.com/acme/repository/releases'), - array('https://github.com/acme/repository/pulls'), - ); + return [ + ['https://github.com/acme'], + ['https://github.com/acme/repository/releases'], + ['https://github.com/acme/repository/pulls'], + ]; } /** * @dataProvider supportsProvider - * @param bool $expected - * @param string $repoUrl */ public function testSupports(bool $expected, string $repoUrl): void { @@ -355,21 +350,18 @@ public function testSupports(bool $expected, string $repoUrl): void */ public function supportsProvider(): array { - return array( - array(false, 'https://github.com/acme'), - array(true, 'https://github.com/acme/repository'), - array(true, 'git@github.com:acme/repository.git'), - array(false, 'https://github.com/acme/repository/releases'), - array(false, 'https://github.com/acme/repository/pulls'), - ); + return [ + [false, 'https://github.com/acme'], + [true, 'https://github.com/acme/repository'], + [true, 'git@github.com:acme/repository.git'], + [false, 'https://github.com/acme/repository/releases'], + [false, 'https://github.com/acme/repository/pulls'], + ]; } /** * @param string|object $object - * @param string $attribute * @param mixed $value - * - * @return void */ protected function setAttribute($object, string $attribute, $value): void { diff --git a/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php b/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php index c38ef15566cb..4f5f0d637c89 100644 --- a/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/GitLabDriverTest.php @@ -54,13 +54,13 @@ public function setUp(): void $this->home = self::getUniqueTmpDirectory(); $this->config = $this->getConfig([ 'home' => $this->home, - 'gitlab-domains' => array( + 'gitlab-domains' => [ 'mycompany.com/gitlab', 'gitlab.mycompany.com', 'othercompany.com/nested/gitlab', 'gitlab.com', 'gitlab.mycompany.local', - ), + ], ]); $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->disableOriginalConstructor()->getMock(); @@ -77,18 +77,15 @@ protected function tearDown(): void public function provideInitializeUrls(): array { - return array( - array('https://gitlab.com/mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'), - array('http://gitlab.com/mygroup/myproject', 'http://gitlab.com/api/v4/projects/mygroup%2Fmyproject'), - array('git@gitlab.com:mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'), - ); + return [ + ['https://gitlab.com/mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'], + ['http://gitlab.com/mygroup/myproject', 'http://gitlab.com/api/v4/projects/mygroup%2Fmyproject'], + ['git@gitlab.com:mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'], + ]; } /** * @dataProvider provideInitializeUrls - * - * @param string $url - * @param string $apiUrl */ public function testInitialize(string $url, string $apiUrl): GitLabDriver { @@ -116,7 +113,7 @@ public function testInitialize(string $url, string $apiUrl): GitLabDriver true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -129,9 +126,6 @@ public function testInitialize(string $url, string $apiUrl): GitLabDriver /** * @dataProvider provideInitializeUrls - * - * @param string $url - * @param string $apiUrl */ public function testInitializePublicProject(string $url, string $apiUrl): GitLabDriver { @@ -157,7 +151,7 @@ public function testInitializePublicProject(string $url, string $apiUrl): GitLab true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -170,9 +164,6 @@ public function testInitializePublicProject(string $url, string $apiUrl): GitLab /** * @dataProvider provideInitializeUrls - * - * @param string $url - * @param string $apiUrl */ public function testInitializePublicProjectAsAnonymous(string $url, string $apiUrl): GitLabDriver { @@ -197,7 +188,7 @@ public function testInitializePublicProjectAsAnonymous(string $url, string $apiU true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -238,7 +229,7 @@ public function testInitializeWithPortNumber(): void true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -252,12 +243,12 @@ public function testGetDist(): void $driver = $this->testInitialize('https://gitlab.com/mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'); $reference = 'c3ebdbf9cceddb82cd2089aaef8c7b992e536363'; - $expected = array( + $expected = [ 'type' => 'zip', 'url' => 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject/repository/archive.zip?sha='.$reference, 'reference' => $reference, 'shasum' => '', - ); + ]; $this->assertEquals($expected, $driver->getDist($reference)); } @@ -267,11 +258,11 @@ public function testGetSource(): void $driver = $this->testInitialize('https://gitlab.com/mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'); $reference = 'c3ebdbf9cceddb82cd2089aaef8c7b992e536363'; - $expected = array( + $expected = [ 'type' => 'git', 'url' => 'git@gitlab.com:mygroup/myproject.git', 'reference' => $reference, - ); + ]; $this->assertEquals($expected, $driver->getSource($reference)); } @@ -281,11 +272,11 @@ public function testGetSource_GivenPublicProject(): void $driver = $this->testInitializePublicProject('https://gitlab.com/mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'); $reference = 'c3ebdbf9cceddb82cd2089aaef8c7b992e536363'; - $expected = array( + $expected = [ 'type' => 'git', 'url' => 'https://gitlab.com/mygroup/myproject.git', 'reference' => $reference, - ); + ]; $this->assertEquals($expected, $driver->getSource($reference)); } @@ -322,10 +313,10 @@ public function testGetTags(): void ); $driver->setHttpDownloader($this->httpDownloader); - $expected = array( + $expected = [ 'v1.0.0' => '092ed2c762bbae331e3f51d4a17f67310bf99a81', 'v2.0.0' => '8e8f60b3ec86d63733db3bd6371117a758027ec6', - ); + ]; $this->assertEquals($expected, $driver->getTags()); $this->assertEquals($expected, $driver->getTags(), 'Tags are cached'); @@ -336,31 +327,31 @@ public function testGetPaginatedRefs(): void $driver = $this->testInitialize('https://gitlab.com/mygroup/myproject', 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject'); // @link http://doc.gitlab.com/ce/api/repositories.html#list-project-repository-branches - $branchData = array( - array( + $branchData = [ + [ "name" => "mymaster", - "commit" => array( + "commit" => [ "id" => "97eda36b5c1dd953a3792865c222d4e85e5f302e", "committed_date" => "2013-01-03T21:04:07.000+01:00", - ), - ), - array( + ], + ], + [ "name" => "staging", - "commit" => array( + "commit" => [ "id" => "502cffe49f136443f2059803f2e7192d1ac066cd", "committed_date" => "2013-03-09T16:35:23.000+01:00", - ), - ), - ); + ], + ], + ]; for ($i = 0; $i < 98; $i++) { - $branchData[] = array( + $branchData[] = [ "name" => "stagingdupe", - "commit" => array( + "commit" => [ "id" => "502cffe49f136443f2059803f2e7192d1ac066cd", "committed_date" => "2013-03-09T16:35:23.000+01:00", - ), - ); + ], + ]; } $branchData = JsonFile::encode($branchData); @@ -370,12 +361,12 @@ public function testGetPaginatedRefs(): void [ 'url' => 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject/repository/branches?per_page=100', 'body' => $branchData, - 'headers' => array('Link: ; rel="next", ; rel="first", ; rel="last"'), + 'headers' => ['Link: ; rel="next", ; rel="first", ; rel="last"'], ], [ 'url' => "http://gitlab.com/api/v4/projects/mygroup%2Fmyproject/repository/tags?id=mygroup%2Fmyproject&page=2&per_page=20", 'body' => $branchData, - 'headers' => array('Link: ; rel="prev", ; rel="first", ; rel="last"'), + 'headers' => ['Link: ; rel="prev", ; rel="first", ; rel="last"'], ], ], true @@ -383,11 +374,11 @@ public function testGetPaginatedRefs(): void $driver->setHttpDownloader($this->httpDownloader); - $expected = array( + $expected = [ 'mymaster' => '97eda36b5c1dd953a3792865c222d4e85e5f302e', 'staging' => '502cffe49f136443f2059803f2e7192d1ac066cd', 'stagingdupe' => '502cffe49f136443f2059803f2e7192d1ac066cd', - ); + ]; $this->assertEquals($expected, $driver->getBranches()); $this->assertEquals($expected, $driver->getBranches(), 'Branches are cached'); @@ -426,10 +417,10 @@ public function testGetBranches(): void $driver->setHttpDownloader($this->httpDownloader); - $expected = array( + $expected = [ 'mymaster' => '97eda36b5c1dd953a3792865c222d4e85e5f302e', 'staging' => '502cffe49f136443f2059803f2e7192d1ac066cd', - ); + ]; $this->assertEquals($expected, $driver->getBranches()); $this->assertEquals($expected, $driver->getBranches(), 'Branches are cached'); @@ -438,9 +429,6 @@ public function testGetBranches(): void /** * @group gitlabHttpPort * @dataProvider dataForTestSupports - * - * @param string $url - * @param bool $expected */ public function testSupports(string $url, bool $expected): void { @@ -449,26 +437,26 @@ public function testSupports(string $url, bool $expected): void public function dataForTestSupports(): array { - return array( - array('http://gitlab.com/foo/bar', true), - array('http://gitlab.mycompany.com:5443/foo/bar', true), - array('http://gitlab.com/foo/bar/', true), - array('http://gitlab.com/foo/bar/', true), - array('http://gitlab.com/foo/bar.git', true), - array('http://gitlab.com/foo/bar.git', true), - array('http://gitlab.com/foo/bar.baz.git', true), - array('https://gitlab.com/foo/bar', extension_loaded('openssl')), // Platform requirement - array('https://gitlab.mycompany.com:5443/foo/bar', extension_loaded('openssl')), // Platform requirement - array('git@gitlab.com:foo/bar.git', extension_loaded('openssl')), - array('git@example.com:foo/bar.git', false), - array('http://example.com/foo/bar', false), - array('http://mycompany.com/gitlab/mygroup/myproject', true), - array('https://mycompany.com/gitlab/mygroup/myproject', extension_loaded('openssl')), - array('http://othercompany.com/nested/gitlab/mygroup/myproject', true), - array('https://othercompany.com/nested/gitlab/mygroup/myproject', extension_loaded('openssl')), - array('http://gitlab.com/mygroup/mysubgroup/mysubsubgroup/myproject', true), - array('https://gitlab.com/mygroup/mysubgroup/mysubsubgroup/myproject', extension_loaded('openssl')), - ); + return [ + ['http://gitlab.com/foo/bar', true], + ['http://gitlab.mycompany.com:5443/foo/bar', true], + ['http://gitlab.com/foo/bar/', true], + ['http://gitlab.com/foo/bar/', true], + ['http://gitlab.com/foo/bar.git', true], + ['http://gitlab.com/foo/bar.git', true], + ['http://gitlab.com/foo/bar.baz.git', true], + ['https://gitlab.com/foo/bar', extension_loaded('openssl')], // Platform requirement + ['https://gitlab.mycompany.com:5443/foo/bar', extension_loaded('openssl')], // Platform requirement + ['git@gitlab.com:foo/bar.git', extension_loaded('openssl')], + ['git@example.com:foo/bar.git', false], + ['http://example.com/foo/bar', false], + ['http://mycompany.com/gitlab/mygroup/myproject', true], + ['https://mycompany.com/gitlab/mygroup/myproject', extension_loaded('openssl')], + ['http://othercompany.com/nested/gitlab/mygroup/myproject', true], + ['https://othercompany.com/nested/gitlab/mygroup/myproject', extension_loaded('openssl')], + ['http://gitlab.com/mygroup/mysubgroup/mysubsubgroup/myproject', true], + ['https://gitlab.com/mygroup/mysubgroup/mysubsubgroup/myproject', extension_loaded('openssl')], + ]; } public function testGitlabSubDirectory(): void @@ -497,7 +485,7 @@ public function testGitlabSubDirectory(): void true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -529,7 +517,7 @@ public function testGitlabSubGroup(): void true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -561,7 +549,7 @@ public function testGitlabSubDirectorySubGroup(): void true ); - $driver = new GitLabDriver(array('url' => $url), $this->io, $this->config, $this->httpDownloader, $this->process); + $driver = new GitLabDriver(['url' => $url], $this->io, $this->config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals($apiUrl, $driver->getApiUrl(), 'API URL is derived from the repository URL'); @@ -569,11 +557,11 @@ public function testGitlabSubDirectorySubGroup(): void public function testForwardsOptions(): void { - $options = array( - 'ssl' => array( + $options = [ + 'ssl' => [ 'verify_peer' => false, - ), - ); + ], + ]; $projectData = << 'https://gitlab.mycompany.local/mygroup/myproject', 'options' => $options), + ['url' => 'https://gitlab.mycompany.local/mygroup/myproject', 'options' => $options], $this->io, $this->config, $this->httpDownloader, @@ -632,8 +620,8 @@ public function testProtocolOverrideRepositoryUrlGeneration(): void ); $config = clone $this->config; - $config->merge(array('config' => array('gitlab-protocol' => 'http'))); - $driver = new GitLabDriver(array('url' => $url), $this->io, $config, $this->httpDownloader, $this->process); + $config->merge(['config' => ['gitlab-protocol' => 'http']]); + $driver = new GitLabDriver(['url' => $url], $this->io, $config, $this->httpDownloader, $this->process); $driver->initialize(); $this->assertEquals('https://gitlab.com/mygroup/myproject.git', $driver->getRepositoryUrl(), 'Repository URL matches config request for http not git'); } diff --git a/tests/Composer/Test/Repository/Vcs/HgDriverTest.php b/tests/Composer/Test/Repository/Vcs/HgDriverTest.php index 57c1677cfd4c..6ab3848720f5 100644 --- a/tests/Composer/Test/Repository/Vcs/HgDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/HgDriverTest.php @@ -13,7 +13,6 @@ namespace Composer\Test\Repository\Vcs; use Composer\Repository\Vcs\HgDriver; -use Composer\Test\Mock\ProcessExecutorMock; use Composer\Test\TestCase; use Composer\Util\Filesystem; use Composer\Config; @@ -32,11 +31,11 @@ public function setUp(): void $this->io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); - $this->config->merge(array( - 'config' => array( + $this->config->merge([ + 'config' => [ 'home' => $this->home, - ), - )); + ], + ]); } protected function tearDown(): void @@ -48,8 +47,6 @@ protected function tearDown(): void /** * @dataProvider supportsDataProvider - * - * @param string $repositoryUrl */ public function testSupports(string $repositoryUrl): void { @@ -60,20 +57,20 @@ public function testSupports(string $repositoryUrl): void public function supportsDataProvider(): array { - return array( - array('ssh://bitbucket.org/user/repo'), - array('ssh://hg@bitbucket.org/user/repo'), - array('ssh://user@bitbucket.org/user/repo'), - array('https://bitbucket.org/user/repo'), - array('https://user@bitbucket.org/user/repo'), - ); + return [ + ['ssh://bitbucket.org/user/repo'], + ['ssh://hg@bitbucket.org/user/repo'], + ['ssh://user@bitbucket.org/user/repo'], + ['https://bitbucket.org/user/repo'], + ['https://user@bitbucket.org/user/repo'], + ]; } public function testGetBranchesFilterInvalidBranchNames(): void { $process = $this->getProcessExecutorMock(); - $driver = new HgDriver(array('url' => 'https://example.org/acme.git'), $this->io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); + $driver = new HgDriver(['url' => 'https://example.org/acme.git'], $this->io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); $stdout = <<expects(array(array( + ->expects([[ 'cmd' => 'hg branches', 'stdout' => $stdout, - ), array( + ], [ 'cmd' => 'hg bookmarks', 'stdout' => $stdout1, - ))); + ]]); $branches = $driver->getBranches(); - $this->assertSame(array( + $this->assertSame([ 'help' => 'dbf6c8acb641', 'default' => 'dbf6c8acb640', - ), $branches); + ], $branches); } public function testFileGetContentInvalidIdentifier(): void @@ -107,7 +104,7 @@ public function testFileGetContentInvalidIdentifier(): void self::expectException('\RuntimeException'); $process = $this->getProcessExecutorMock(); - $driver = new HgDriver(array('url' => 'https://example.org/acme.git'), $this->io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); + $driver = new HgDriver(['url' => 'https://example.org/acme.git'], $this->io, $this->config, $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(), $process); $this->assertNull($driver->getFileContent('file.txt', 'h')); diff --git a/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php b/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php index fef713a773fe..b6165ebab155 100644 --- a/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/PerforceDriverTest.php @@ -65,11 +65,11 @@ protected function setUp(): void { $this->testPath = self::getUniqueTmpDirectory(); $this->config = $this->getTestConfig($this->testPath); - $this->repoConfig = array( + $this->repoConfig = [ 'url' => self::TEST_URL, 'depot' => self::TEST_DEPOT, 'branch' => self::TEST_BRANCH, - ); + ]; $this->io = $this->getMockIOInterface(); $this->process = $this->getProcessExecutorMock(); $this->httpDownloader = $this->getMockHttpDownloader(); @@ -86,9 +86,6 @@ protected function tearDown(): void $fs->removeDirectory($this->testPath); } - /** - * @return void - */ protected function overrideDriverInternalPerforce(Perforce $perforce): void { $reflectionClass = new \ReflectionClass($this->driver); @@ -97,15 +94,10 @@ protected function overrideDriverInternalPerforce(Perforce $perforce): void $property->setValue($this->driver, $perforce); } - /** - * @param string $testPath - * - * @return Config - */ protected function getTestConfig(string $testPath): Config { $config = new Config(); - $config->merge(array('config' => array('home' => $testPath))); + $config->merge(['config' => ['home' => $testPath]]); return $config; } @@ -131,7 +123,7 @@ protected function getMockHttpDownloader() */ protected function getMockPerforce() { - $methods = array('p4login', 'checkStream', 'writeP4ClientSpec', 'connectClient', 'getComposerInformation', 'cleanupClientSpec'); + $methods = ['p4login', 'checkStream', 'writeP4ClientSpec', 'connectClient', 'getComposerInformation', 'cleanupClientSpec']; return $this->getMockBuilder('Composer\Util\Perforce')->disableOriginalConstructor()->getMock(); } @@ -162,7 +154,7 @@ public function testHasComposerFileReturnsFalseOnNoComposerFile(): void { $identifier = 'TEST_IDENTIFIER'; $formatted_depot_path = '//' . self::TEST_DEPOT . '/' . $identifier; - $this->perforce->expects($this->any())->method('getComposerInformation')->with($this->equalTo($formatted_depot_path))->will($this->returnValue(array())); + $this->perforce->expects($this->any())->method('getComposerInformation')->with($this->equalTo($formatted_depot_path))->will($this->returnValue([])); $this->driver->initialize(); $result = $this->driver->hasComposerFile($identifier); $this->assertFalse($result); @@ -176,7 +168,7 @@ public function testHasComposerFileReturnsTrueWithOneOrMoreComposerFiles(): void { $identifier = 'TEST_IDENTIFIER'; $formatted_depot_path = '//' . self::TEST_DEPOT . '/' . $identifier; - $this->perforce->expects($this->any())->method('getComposerInformation')->with($this->equalTo($formatted_depot_path))->will($this->returnValue(array(''))); + $this->perforce->expects($this->any())->method('getComposerInformation')->with($this->equalTo($formatted_depot_path))->will($this->returnValue([''])); $this->driver->initialize(); $result = $this->driver->hasComposerFile($identifier); $this->assertTrue($result); @@ -186,8 +178,6 @@ public function testHasComposerFileReturnsTrueWithOneOrMoreComposerFiles(): void * Test that supports() simply return false. * * @covers \Composer\Repository\Vcs\PerforceDriver::supports - * - * @return void */ public function testSupportsReturnsFalseNoDeepCheck(): void { diff --git a/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php b/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php index 8edb3266cd65..3232f2d4e8c1 100644 --- a/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php +++ b/tests/Composer/Test/Repository/Vcs/SvnDriverTest.php @@ -33,11 +33,11 @@ public function setUp(): void { $this->home = self::getUniqueTmpDirectory(); $this->config = new Config(); - $this->config->merge(array( - 'config' => array( + $this->config->merge([ + 'config' => [ 'home' => $this->home, - ), - )); + ], + ]); } protected function tearDown(): void @@ -66,19 +66,19 @@ public function testWrongCredentialsInUrl(): void ProcessExecutor::escape('secret'), ProcessExecutor::escape('https://till:secret@corp.svn.local/repo/trunk') ); - $process->expects(array( - array('cmd' => $authedCommand, 'return' => 1, 'stderr' => $output), - array('cmd' => $authedCommand, 'return' => 1, 'stderr' => $output), - array('cmd' => $authedCommand, 'return' => 1, 'stderr' => $output), - array('cmd' => $authedCommand, 'return' => 1, 'stderr' => $output), - array('cmd' => $authedCommand, 'return' => 1, 'stderr' => $output), - array('cmd' => $authedCommand, 'return' => 1, 'stderr' => $output), - array('cmd' => 'svn --version', 'return' => 0, 'stdout' => '1.2.3'), - ), true); + $process->expects([ + ['cmd' => $authedCommand, 'return' => 1, 'stderr' => $output], + ['cmd' => $authedCommand, 'return' => 1, 'stderr' => $output], + ['cmd' => $authedCommand, 'return' => 1, 'stderr' => $output], + ['cmd' => $authedCommand, 'return' => 1, 'stderr' => $output], + ['cmd' => $authedCommand, 'return' => 1, 'stderr' => $output], + ['cmd' => $authedCommand, 'return' => 1, 'stderr' => $output], + ['cmd' => 'svn --version', 'return' => 0, 'stdout' => '1.2.3'], + ], true); - $repoConfig = array( + $repoConfig = [ 'url' => 'https://till:secret@corp.svn.local/repo', - ); + ]; $svn = new SvnDriver($repoConfig, $console, $this->config, $httpDownloader, $process); $svn->initialize(); @@ -86,19 +86,16 @@ public function testWrongCredentialsInUrl(): void public static function supportProvider(): array { - return array( - array('http://svn.apache.org', true), - array('https://svn.sf.net', true), - array('svn://example.org', true), - array('svn+ssh://example.org', true), - ); + return [ + ['http://svn.apache.org', true], + ['https://svn.sf.net', true], + ['svn://example.org', true], + ['svn+ssh://example.org', true], + ]; } /** * @dataProvider supportProvider - * - * @param string $url - * @param bool $assertion */ public function testSupport(string $url, bool $assertion): void { diff --git a/tests/Composer/Test/Repository/VcsRepositoryTest.php b/tests/Composer/Test/Repository/VcsRepositoryTest.php index 71a40e42cb56..dc219371c513 100644 --- a/tests/Composer/Test/Repository/VcsRepositoryTest.php +++ b/tests/Composer/Test/Repository/VcsRepositoryTest.php @@ -40,9 +40,6 @@ class VcsRepositoryTest extends TestCase */ private $skipped = null; - /** - * @return void - */ protected function initialize(): void { $locator = new ExecutableFinder(); @@ -64,7 +61,7 @@ protected function initialize(): void // init $process = new ProcessExecutor; - $exec = function ($command) use ($process): void { + $exec = static function ($command) use ($process): void { $cwd = Platform::getCwd(); if ($process->execute($command, $output, $cwd) !== 0) { throw new \RuntimeException('Failed to execute '.$command.': '.$process->getErrorOutput()); @@ -85,7 +82,7 @@ protected function initialize(): void $exec('git branch oldbranch'); // add composed tag & master branch - $composer = array('name' => 'a/b'); + $composer = ['name' => 'a/b']; file_put_contents('composer.json', json_encode($composer)); $exec('git add composer.json'); $exec('git commit -m addcomposer'); @@ -150,7 +147,7 @@ public static function tearDownAfterClass(): void public function testLoadVersions(): void { - $expected = array( + $expected = [ '0.6.0' => true, '1.0.0' => true, '1.0.x-dev' => true, @@ -159,16 +156,16 @@ public function testLoadVersions(): void 'dev-feature/a-1.0-B' => true, 'dev-master' => true, '9999999-dev' => true, // alias of dev-master - ); + ]; $config = new Config(); - $config->merge(array( - 'config' => array( + $config->merge([ + 'config' => [ 'home' => self::$composerHome, - ), - )); + ], + ]); $httpDownloader = $this->getMockBuilder('Composer\Util\HttpDownloader')->disableOriginalConstructor()->getMock(); - $repo = new VcsRepository(array('url' => self::$gitRepo, 'type' => 'vcs'), new NullIO, $config, $httpDownloader); + $repo = new VcsRepository(['url' => self::$gitRepo, 'type' => 'vcs'], new NullIO, $config, $httpDownloader); $packages = $repo->getPackages(); $dumper = new ArrayDumper(); diff --git a/tests/Composer/Test/Script/EventTest.php b/tests/Composer/Test/Script/EventTest.php index 102d6e5f5e80..c085ad110fec 100644 --- a/tests/Composer/Test/Script/EventTest.php +++ b/tests/Composer/Test/Script/EventTest.php @@ -68,9 +68,6 @@ public function testEventCalculatesNestedOriginatingEvent(): void ); } - /** - * @return Composer - */ private function createComposerInstance(): Composer { $composer = new Composer; diff --git a/tests/Composer/Test/TestCase.php b/tests/Composer/Test/TestCase.php index 567a725960f8..0b21211143a4 100644 --- a/tests/Composer/Test/TestCase.php +++ b/tests/Composer/Test/TestCase.php @@ -49,7 +49,7 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase /** * @var array */ - private static $executableCache = array(); + private static $executableCache = []; /** * @var list @@ -88,9 +88,6 @@ protected function tearDown(): void } } - /** - * @return string - */ public static function getUniqueTmpDirectory(): string { $attempts = 5; @@ -158,7 +155,9 @@ protected function createInstalledJson(array $packages = [], array $devPackages { mkdir('vendor/composer', 0777, true); $repo = new InstalledFilesystemRepository(new JsonFile('vendor/composer/installed.json')); - $repo->setDevPackageNames(array_map(function (PackageInterface $pkg) { return $pkg->getPrettyName(); }, $devPackages)); + $repo->setDevPackageNames(array_map(static function (PackageInterface $pkg) { + return $pkg->getPrettyName(); + }, $devPackages)); foreach ($packages as $pkg) { $repo->addPackage($pkg); mkdir('vendor/'.$pkg->getName(), 0777, true); @@ -195,9 +194,6 @@ public function getApplicationTester(): ApplicationTester return new ApplicationTester($application); } - /** - * @return VersionParser - */ protected static function getVersionParser(): VersionParser { if (!self::$parser) { @@ -209,8 +205,6 @@ protected static function getVersionParser(): VersionParser /** * @param Constraint::STR_OP_* $operator - * @param string $version - * @return Constraint */ protected function getVersionConstraint($operator, string $version): Constraint { @@ -228,8 +222,6 @@ protected function getVersionConstraint($operator, string $version): Constraint * @template PackageClass of CompletePackage|CompleteAliasPackage * * @param string $class FQCN to be instantiated - * @param string $name - * @param string $version * * @return CompletePackage|CompleteAliasPackage|RootPackage|RootAliasPackage * @@ -251,7 +243,6 @@ protected function getRootPackage(string $name = '__root__', string $version = ' } /** - * @param string $version * @return ($package is RootPackage ? RootAliasPackage : ($package is CompletePackage ? CompleteAliasPackage : AliasPackage)) */ protected function getAliasPackage(Package $package, string $version): AliasPackage @@ -270,7 +261,6 @@ protected function getAliasPackage(Package $package, string $version): AliasPack /** * @param array> $config - * @return void */ protected function configureLinks(PackageInterface $package, array $config): void { @@ -302,10 +292,6 @@ protected function getConfig(array $configOptions = [], bool $useEnvironment = f return $config; } - /** - * @param string $directory - * @return void - */ protected static function ensureDirectoryExistsAndClear(string $directory): void { $fs = new Filesystem(); @@ -322,7 +308,6 @@ protected static function ensureDirectoryExistsAndClear(string $directory): void * * @param string $executableName The name of the binary to test. * - * @return void * * @throws \PHPUnit\Framework\SkippedTestError */ @@ -341,14 +326,13 @@ protected function skipIfNotExecutable(string $executableName): void /** * Transforms an escaped non-Windows command to match Windows escaping. * - * @param string $cmd * * @return string The transformed command */ protected function getCmd(string $cmd): string { if (Platform::isWindows()) { - $cmd = Preg::replaceCallback("/('[^']*')/", function ($m) { + $cmd = Preg::replaceCallback("/('[^']*')/", static function ($m) { // Double-quotes are used only when needed $char = (strpbrk($m[1], " \t^&|<>()") !== false || $m[1] === "''") ? '"' : ''; @@ -359,7 +343,7 @@ protected function getCmd(string $cmd): string return $cmd; } - protected function getHttpDownloaderMock(IOInterface $io = null, Config $config = null): HttpDownloaderMock + protected function getHttpDownloaderMock(?IOInterface $io = null, ?Config $config = null): HttpDownloaderMock { $this->httpDownloaderMocks[] = $mock = new HttpDownloaderMock($io, $config); diff --git a/tests/Composer/Test/Util/AuthHelperTest.php b/tests/Composer/Test/Util/AuthHelperTest.php index f80ae65ea582..a23e985a8938 100644 --- a/tests/Composer/Test/Util/AuthHelperTest.php +++ b/tests/Composer/Test/Util/AuthHelperTest.php @@ -12,7 +12,6 @@ namespace Composer\Test\Util; -use Composer\Downloader\TransportException; use Composer\IO\IOInterface; use Composer\Test\TestCase; use Composer\Util\AuthHelper; @@ -46,10 +45,10 @@ protected function setUp(): void public function testAddAuthenticationHeaderWithoutAuthCredentials(): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'http://example.org'; $url = 'file://' . __FILE__; @@ -66,20 +65,20 @@ public function testAddAuthenticationHeaderWithoutAuthCredentials(): void public function testAddAuthenticationHeaderWithBearerPassword(): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'http://example.org'; $url = 'file://' . __FILE__; - $auth = array( + $auth = [ 'username' => 'my_username', 'password' => 'bearer', - ); + ]; $this->expectsAuthentication($origin, $auth); - $expectedHeaders = array_merge($headers, array('Authorization: Bearer ' . $auth['username'])); + $expectedHeaders = array_merge($headers, ['Authorization: Bearer ' . $auth['username']]); $this->assertSame( $expectedHeaders, @@ -89,16 +88,16 @@ public function testAddAuthenticationHeaderWithBearerPassword(): void public function testAddAuthenticationHeaderWithGithubToken(): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'github.com'; $url = 'https://api.github.com/'; - $auth = array( + $auth = [ 'username' => 'my_username', 'password' => 'x-oauth-basic', - ); + ]; $this->expectsAuthentication($origin, $auth); @@ -106,7 +105,7 @@ public function testAddAuthenticationHeaderWithGithubToken(): void ->method('writeError') ->with('Using GitHub token authentication', true, IOInterface::DEBUG); - $expectedHeaders = array_merge($headers, array('Authorization: token ' . $auth['username'])); + $expectedHeaders = array_merge($headers, ['Authorization: token ' . $auth['username']]); $this->assertSame( $expectedHeaders, @@ -116,29 +115,29 @@ public function testAddAuthenticationHeaderWithGithubToken(): void public function testAddAuthenticationHeaderWithGitlabOathToken(): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'gitlab.com'; $url = 'https://api.gitlab.com/'; - $auth = array( + $auth = [ 'username' => 'my_username', 'password' => 'oauth2', - ); + ]; $this->expectsAuthentication($origin, $auth); $this->config->expects($this->once()) ->method('get') ->with('gitlab-domains') - ->willReturn(array($origin)); + ->willReturn([$origin]); $this->io->expects($this->once()) ->method('writeError') ->with('Using GitLab OAuth token authentication', true, IOInterface::DEBUG); - $expectedHeaders = array_merge($headers, array('Authorization: Bearer ' . $auth['username'])); + $expectedHeaders = array_merge($headers, ['Authorization: Bearer ' . $auth['username']]); $this->assertSame( $expectedHeaders, @@ -148,42 +147,40 @@ public function testAddAuthenticationHeaderWithGitlabOathToken(): void public function gitlabPrivateTokenProvider(): array { - return array( - array('private-token'), - array('gitlab-ci-token'), - ); + return [ + ['private-token'], + ['gitlab-ci-token'], + ]; } /** * @dataProvider gitlabPrivateTokenProvider - * - * @param string $password */ public function testAddAuthenticationHeaderWithGitlabPrivateToken(string $password): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'gitlab.com'; $url = 'https://api.gitlab.com/'; - $auth = array( + $auth = [ 'username' => 'my_username', 'password' => $password, - ); + ]; $this->expectsAuthentication($origin, $auth); $this->config->expects($this->once()) ->method('get') ->with('gitlab-domains') - ->willReturn(array($origin)); + ->willReturn([$origin]); $this->io->expects($this->once()) ->method('writeError') ->with('Using GitLab private token authentication', true, IOInterface::DEBUG); - $expectedHeaders = array_merge($headers, array('PRIVATE-TOKEN: ' . $auth['username'])); + $expectedHeaders = array_merge($headers, ['PRIVATE-TOKEN: ' . $auth['username']]); $this->assertSame( $expectedHeaders, @@ -193,29 +190,29 @@ public function testAddAuthenticationHeaderWithGitlabPrivateToken(string $passwo public function testAddAuthenticationHeaderWithBitbucketOathToken(): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'bitbucket.org'; $url = 'https://bitbucket.org/site/oauth2/authorize'; - $auth = array( + $auth = [ 'username' => 'x-token-auth', 'password' => 'my_password', - ); + ]; $this->expectsAuthentication($origin, $auth); $this->config->expects($this->once()) ->method('get') ->with('gitlab-domains') - ->willReturn(array()); + ->willReturn([]); $this->io->expects($this->once()) ->method('writeError') ->with('Using Bitbucket OAuth token authentication', true, IOInterface::DEBUG); - $expectedHeaders = array_merge($headers, array('Authorization: Bearer ' . $auth['password'])); + $expectedHeaders = array_merge($headers, ['Authorization: Bearer ' . $auth['password']]); $this->assertSame( $expectedHeaders, @@ -225,35 +222,33 @@ public function testAddAuthenticationHeaderWithBitbucketOathToken(): void public function bitbucketPublicUrlProvider(): array { - return array( - array('https://bitbucket.org/user/repo/downloads/whatever'), - array('https://bbuseruploads.s3.amazonaws.com/9421ee72-638e-43a9-82ea-39cfaae2bfaa/downloads/b87c59d9-54f3-4922-b711-d89059ec3bcf'), - ); + return [ + ['https://bitbucket.org/user/repo/downloads/whatever'], + ['https://bbuseruploads.s3.amazonaws.com/9421ee72-638e-43a9-82ea-39cfaae2bfaa/downloads/b87c59d9-54f3-4922-b711-d89059ec3bcf'], + ]; } /** * @dataProvider bitbucketPublicUrlProvider - * - * @param string $url */ public function testAddAuthenticationHeaderWithBitbucketPublicUrl(string $url): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $origin = 'bitbucket.org'; - $auth = array( + $auth = [ 'username' => 'x-token-auth', 'password' => 'my_password', - ); + ]; $this->expectsAuthentication($origin, $auth); $this->config->expects($this->once()) ->method('get') ->with('gitlab-domains') - ->willReturn(array()); + ->willReturn([]); $this->assertSame( $headers, @@ -263,56 +258,54 @@ public function testAddAuthenticationHeaderWithBitbucketPublicUrl(string $url): public function basicHttpAuthenticationProvider(): array { - return array( - array( + return [ + [ Bitbucket::OAUTH2_ACCESS_TOKEN_URL, 'bitbucket.org', - array( + [ 'username' => 'x-token-auth', 'password' => 'my_password', - ), - ), - array( + ], + ], + [ 'https://some-api.url.com', 'some-api.url.com', - array( + [ 'username' => 'my_username', 'password' => 'my_password', - ), - ), - array( + ], + ], + [ 'https://gitlab.com', 'gitlab.com', - array( + [ 'username' => 'my_username', 'password' => 'my_password', - ), - ), - ); + ], + ], + ]; } /** * @dataProvider basicHttpAuthenticationProvider * - * @param string $url - * @param string $origin * @param array $auth * * @phpstan-param array{username: string|null, password: string|null} $auth */ public function testAddAuthenticationHeaderWithBasicHttpAuthentication(string $url, string $origin, array $auth): void { - $headers = array( + $headers = [ 'Accept-Encoding: gzip', 'Connection: close', - ); + ]; $this->expectsAuthentication($origin, $auth); $this->config->expects($this->once()) ->method('get') ->with('gitlab-domains') - ->willReturn(array($origin)); + ->willReturn([$origin]); $this->io->expects($this->once()) ->method('writeError') @@ -324,7 +317,7 @@ public function testAddAuthenticationHeaderWithBasicHttpAuthentication(string $u $expectedHeaders = array_merge( $headers, - array('Authorization: Basic ' . base64_encode($auth['username'] . ':' . $auth['password'])) + ['Authorization: Basic ' . base64_encode($auth['username'] . ':' . $auth['password'])] ); $this->assertSame( @@ -335,8 +328,6 @@ public function testAddAuthenticationHeaderWithBasicHttpAuthentication(string $u /** * @dataProvider bitbucketPublicUrlProvider - * - * @param string $url */ public function testIsPublicBitBucketDownloadWithBitbucketPublicUrl(string $url): void { @@ -356,10 +347,10 @@ public function testStoreAuthAutomatically(): void { $origin = 'github.com'; $storeAuth = true; - $auth = array( + $auth = [ 'username' => 'my_username', 'password' => 'my_password', - ); + ]; /** @var \Composer\Config\ConfigSourceInterface&\PHPUnit\Framework\MockObject\MockObject $configSource */ $configSource = $this @@ -387,10 +378,10 @@ public function testStoreAuthWithPromptYesAnswer(): void { $origin = 'github.com'; $storeAuth = 'prompt'; - $auth = array( + $auth = [ 'username' => 'my_username', 'password' => 'my_password', - ); + ]; $answer = 'y'; $configSourceName = 'https://api.gitlab.com/source'; @@ -416,7 +407,7 @@ public function testStoreAuthWithPromptYesAnswer(): void null, 'y' ) - ->willReturnCallback(function ($question, $validator, $attempts, $default) use ($answer): string { + ->willReturnCallback(static function ($question, $validator, $attempts, $default) use ($answer): string { $validator($answer); return $answer; @@ -463,7 +454,7 @@ public function testStoreAuthWithPromptNoAnswer(): void null, 'y' ) - ->willReturnCallback(function ($question, $validator, $attempts, $default) use ($answer): string { + ->willReturnCallback(static function ($question, $validator, $attempts, $default) use ($answer): string { $validator($answer); return $answer; @@ -503,7 +494,7 @@ public function testStoreAuthWithPromptInvalidAnswer(): void null, 'y' ) - ->willReturnCallback(function ($question, $validator, $attempts, $default) use ($answer): string { + ->willReturnCallback(static function ($question, $validator, $attempts, $default) use ($answer): string { $validator($answer); return $answer; @@ -526,10 +517,10 @@ public function testPromptAuthIfNeededGitLabNoAuthChange(): void $this->io ->method('getAuthentication') ->with($origin) - ->willReturn(array( + ->willReturn([ 'username' => 'gitlab-user', 'password' => 'gitlab-password', - )); + ]); $this->io ->expects($this->once()) @@ -538,20 +529,18 @@ public function testPromptAuthIfNeededGitLabNoAuthChange(): void $this->config ->method('get') - ->willReturnMap(array( - array('github-domains', 0, array()), - array('gitlab-domains', 0, array('gitlab.com')), - array('gitlab-token', 0, array('gitlab.com' => array('username' => 'gitlab-user', 'token' => 'gitlab-password'))), - )); + ->willReturnMap([ + ['github-domains', 0, []], + ['gitlab-domains', 0, ['gitlab.com']], + ['gitlab-token', 0, ['gitlab.com' => ['username' => 'gitlab-user', 'token' => 'gitlab-password']]], + ]); $this->authHelper->promptAuthIfNeeded('https://gitlab.com/acme/archive.zip', $origin, 404, 'GitLab requires authentication and it was not provided'); } /** - * @param string $origin * @param array $auth * - * @return void * * @phpstan-param array{username: string|null, password: string|null} $auth */ diff --git a/tests/Composer/Test/Util/BitbucketTest.php b/tests/Composer/Test/Util/BitbucketTest.php index 9a1b39cf64cd..bd380b87bd3b 100644 --- a/tests/Composer/Test/Util/BitbucketTest.php +++ b/tests/Composer/Test/Util/BitbucketTest.php @@ -78,19 +78,19 @@ public function testRequestAccessTokenWithValidOAuthConsumer(): void ->method('get') ->with( Bitbucket::OAUTH2_ACCESS_TOKEN_URL, - array( + [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'content' => 'grant_type=client_credentials', - ), - ) + ], + ] ) ->willReturn( new Response( - array('url' => Bitbucket::OAUTH2_ACCESS_TOKEN_URL), + ['url' => Bitbucket::OAUTH2_ACCESS_TOKEN_URL], 200, - array(), + [], sprintf( '{"access_token": "%s", "scopes": "repository", "expires_in": 3600, "refresh_token": "refreshtoken", "token_type": "bearer"}', $this->token @@ -117,14 +117,14 @@ public function testRequestAccessTokenWithValidOAuthConsumerAndValidStoredAccess ->method('get') ->with('bitbucket-oauth') ->willReturn( - array( - $this->origin => array( + [ + $this->origin => [ 'access-token' => $this->token, 'access-token-expiration' => $this->time + 1800, 'consumer-key' => $this->consumer_key, 'consumer-secret' => $this->consumer_secret, - ), - ) + ], + ] ); $this->assertEquals( @@ -141,14 +141,14 @@ public function testRequestAccessTokenWithValidOAuthConsumerAndExpiredAccessToke ->method('get') ->with('bitbucket-oauth') ->willReturn( - array( - $this->origin => array( + [ + $this->origin => [ 'access-token' => 'randomExpiredToken', 'access-token-expiration' => $this->time - 400, 'consumer-key' => $this->consumer_key, 'consumer-secret' => $this->consumer_secret, - ), - ) + ], + ] ); $this->io->expects($this->once()) @@ -159,19 +159,19 @@ public function testRequestAccessTokenWithValidOAuthConsumerAndExpiredAccessToke ->method('get') ->with( Bitbucket::OAUTH2_ACCESS_TOKEN_URL, - array( + [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'content' => 'grant_type=client_credentials', - ), - ) + ], + ] ) ->willReturn( new Response( - array('url' => Bitbucket::OAUTH2_ACCESS_TOKEN_URL), + ['url' => Bitbucket::OAUTH2_ACCESS_TOKEN_URL], 200, - array(), + [], sprintf( '{"access_token": "%s", "scopes": "repository", "expires_in": 3600, "refresh_token": "refreshtoken", "token_type": "bearer"}', $this->token @@ -196,24 +196,24 @@ public function testRequestAccessTokenWithUsernameAndPassword(): void $this->io->expects($this->any()) ->method('writeError') ->withConsecutive( - array('Invalid OAuth consumer provided.'), - array('This can have three reasons:'), - array('1. You are authenticating with a bitbucket username/password combination'), - array('2. You are using an OAuth consumer, but didn\'t configure a (dummy) callback url'), - array('3. You are using an OAuth consumer, but didn\'t configure it as private consumer') + ['Invalid OAuth consumer provided.'], + ['This can have three reasons:'], + ['1. You are authenticating with a bitbucket username/password combination'], + ['2. You are using an OAuth consumer, but didn\'t configure a (dummy) callback url'], + ['3. You are using an OAuth consumer, but didn\'t configure it as private consumer'] ); $this->httpDownloader->expects($this->once()) ->method('get') ->with( Bitbucket::OAUTH2_ACCESS_TOKEN_URL, - array( + [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'content' => 'grant_type=client_credentials', - ), - ) + ], + ] ) ->willThrowException( new \Composer\Downloader\TransportException( @@ -247,21 +247,21 @@ public function testRequestAccessTokenWithUsernameAndPasswordWithUnauthorizedRes $this->io->expects($this->any()) ->method('writeError') ->withConsecutive( - array('Invalid OAuth consumer provided.'), - array('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org "') + ['Invalid OAuth consumer provided.'], + ['You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org "'] ); $this->httpDownloader->expects($this->once()) ->method('get') ->with( Bitbucket::OAUTH2_ACCESS_TOKEN_URL, - array( + [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'content' => 'grant_type=client_credentials', - ), - ) + ], + ] ) ->willThrowException(new \Composer\Downloader\TransportException('HTTP/1.1 401 UNAUTHORIZED', 401)); @@ -285,13 +285,13 @@ public function testRequestAccessTokenWithUsernameAndPasswordWithNotFoundRespons ->method('get') ->with( Bitbucket::OAUTH2_ACCESS_TOKEN_URL, - array( + [ 'retry-auth-failure' => false, - 'http' => array( + 'http' => [ 'method' => 'POST', 'content' => 'grant_type=client_credentials', - ), - ) + ], + ] ) ->willThrowException($exception); @@ -309,8 +309,8 @@ public function testUsernamePasswordAuthenticationFlow(): void $this->io->expects($this->exactly(2)) ->method('askAndHideAnswer') ->withConsecutive( - array('Consumer Key (hidden): '), - array('Consumer Secret (hidden): ') + ['Consumer Key (hidden): '], + ['Consumer Secret (hidden): '] ) ->willReturnOnConsecutiveCalls($this->consumer_key, $this->consumer_secret); @@ -323,9 +323,9 @@ public function testUsernamePasswordAuthenticationFlow(): void ) ->willReturn( new Response( - array('url' => $url), + ['url' => $url], 200, - array(), + [], sprintf( '{"access_token": "%s", "scopes": "repository", "expires_in": 3600, "refresh_token": "refresh_token", "token_type": "bearer"}', $this->token @@ -364,8 +364,8 @@ public function testAuthorizeOAuthInteractivelyWithEmptyPassword(): void $this->io->expects($this->exactly(2)) ->method('askAndHideAnswer') ->withConsecutive( - array('Consumer Key (hidden): '), - array('Consumer Secret (hidden): ') + ['Consumer Key (hidden): '], + ['Consumer Secret (hidden): '] ) ->willReturnOnConsecutiveCalls($this->consumer_key, null); @@ -382,8 +382,8 @@ public function testAuthorizeOAuthInteractivelyWithRequestAccessTokenFailure(): $this->io->expects($this->exactly(2)) ->method('askAndHideAnswer') ->withConsecutive( - array('Consumer Key (hidden): '), - array('Consumer Secret (hidden): ') + ['Consumer Key (hidden): '], + ['Consumer Secret (hidden): '] ) ->willReturnOnConsecutiveCalls($this->consumer_key, $this->consumer_secret); @@ -407,11 +407,6 @@ public function testAuthorizeOAuthInteractivelyWithRequestAccessTokenFailure(): $this->assertFalse($this->bitbucket->authorizeOAuthInteractively($this->origin, $this->message)); } - /** - * @param bool $removeBasicAuth - * - * @return void - */ private function setExpectationsForStoringAccessToken(bool $removeBasicAuth = false): void { $configSourceMock = $this->getMockBuilder('Composer\Config\ConfigSourceInterface')->getMock(); @@ -432,12 +427,12 @@ private function setExpectationsForStoringAccessToken(bool $removeBasicAuth = fa ->method('addConfigSetting') ->with( 'bitbucket-oauth.' . $this->origin, - array( + [ "consumer-key" => $this->consumer_key, "consumer-secret" => $this->consumer_secret, "access-token" => $this->token, "access-token-expiration" => $this->time + 3600, - ) + ] ); if ($removeBasicAuth) { @@ -454,8 +449,6 @@ public function testGetTokenWithoutAccessToken(): void /** * @depends testRequestAccessTokenWithValidOAuthConsumerAndValidStoredAccessToken - * - * @param Bitbucket $bitbucket */ public function testGetTokenWithAccessToken(Bitbucket $bitbucket): void { @@ -470,7 +463,7 @@ public function testAuthorizeOAuthWithWrongOriginUrl(): void public function testAuthorizeOAuthWithoutAvailableGitConfigToken(): void { $process = $this->getProcessExecutorMock(); - $process->expects(array(), false, array('return' => -1)); + $process->expects([], false, ['return' => -1]); $bitbucket = new Bitbucket($this->io, $this->config, $process, $this->httpDownloader, $this->time); diff --git a/tests/Composer/Test/Util/ConfigValidatorTest.php b/tests/Composer/Test/Util/ConfigValidatorTest.php index cdbb8785109f..a43fc6358b82 100644 --- a/tests/Composer/Test/Util/ConfigValidatorTest.php +++ b/tests/Composer/Test/Util/ConfigValidatorTest.php @@ -27,7 +27,7 @@ class ConfigValidatorTest extends TestCase public function testConfigValidatorCommitRefWarning(): void { $configValidator = new ConfigValidator(new NullIO()); - list(, , $warnings) = $configValidator->validate(__DIR__ . '/Fixtures/composer_commit-ref.json'); + [, , $warnings] = $configValidator->validate(__DIR__ . '/Fixtures/composer_commit-ref.json'); $this->assertContains( 'The package "some/package" is pointing to a commit-ref, this is bad practice and can cause unforeseen issues.', @@ -38,7 +38,7 @@ public function testConfigValidatorCommitRefWarning(): void public function testConfigValidatorWarnsOnScriptDescriptionForNonexistentScript(): void { $configValidator = new ConfigValidator(new NullIO()); - list(, , $warnings) = $configValidator->validate(__DIR__ . '/Fixtures/composer_scripts-descriptions.json'); + [, , $warnings] = $configValidator->validate(__DIR__ . '/Fixtures/composer_scripts-descriptions.json'); $this->assertContains( 'Description for non-existent script "phpcsxxx" found in "scripts-descriptions"', @@ -49,7 +49,7 @@ public function testConfigValidatorWarnsOnScriptDescriptionForNonexistentScript( public function testConfigValidatorWarnsOnUnnecessaryProvideReplace(): void { $configValidator = new ConfigValidator(new NullIO()); - list(, , $warnings) = $configValidator->validate(__DIR__ . '/Fixtures/composer_provide-replace-requirements.json'); + [, , $warnings] = $configValidator->validate(__DIR__ . '/Fixtures/composer_provide-replace-requirements.json'); $this->assertContains( 'The package a/a in require is also listed in provide which satisfies the requirement. Remove it from provide if you wish to install it.', diff --git a/tests/Composer/Test/Util/ErrorHandlerTest.php b/tests/Composer/Test/Util/ErrorHandlerTest.php index 7d48d8963ed2..a177f6fe0e9d 100644 --- a/tests/Composer/Test/Util/ErrorHandlerTest.php +++ b/tests/Composer/Test/Util/ErrorHandlerTest.php @@ -44,7 +44,7 @@ public function testErrorHandlerCaptureNotice(): void self::expectExceptionMessage('Undefined index: baz'); } - $array = array('foo' => 'bar'); + $array = ['foo' => 'bar']; // @phpstan-ignore-next-line $array['baz']; } @@ -63,7 +63,7 @@ public function testErrorHandlerCaptureWarning(): void } // @phpstan-ignore-next-line - array_merge(array(), 'string'); + array_merge([], 'string'); } /** diff --git a/tests/Composer/Test/Util/FilesystemTest.php b/tests/Composer/Test/Util/FilesystemTest.php index dc34eccae58c..c738c8e68c3d 100644 --- a/tests/Composer/Test/Util/FilesystemTest.php +++ b/tests/Composer/Test/Util/FilesystemTest.php @@ -52,12 +52,6 @@ protected function tearDown(): void /** * @dataProvider providePathCouplesAsCode - * - * @param string $a - * @param string $b - * @param bool $directory - * @param string $expected - * @param bool $static */ public function testFindShortestPathCode(string $a, string $b, bool $directory, string $expected, bool $static = false): void { @@ -67,60 +61,55 @@ public function testFindShortestPathCode(string $a, string $b, bool $directory, public function providePathCouplesAsCode(): array { - return array( - array('/foo/bar', '/foo/bar', false, "__FILE__"), - array('/foo/bar', '/foo/baz', false, "__DIR__.'/baz'"), - array('/foo/bin/run', '/foo/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"), - array('/foo/bin/run', '/bar/bin/run', false, "'/bar/bin/run'"), - array('c:/bin/run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"), - array('c:\\bin\\run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"), - array('c:/bin/run', 'D:/vendor/acme/bin/run', false, "'D:/vendor/acme/bin/run'"), - array('c:\\bin\\run', 'd:/vendor/acme/bin/run', false, "'D:/vendor/acme/bin/run'"), - array('/foo/bar', '/foo/bar', true, "__DIR__"), - array('/foo/bar/', '/foo/bar', true, "__DIR__"), - array('/foo/bar', '/foo/baz', true, "dirname(__DIR__).'/baz'"), - array('/foo/bin/run', '/foo/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"), - array('/foo/bin/run', '/bar/bin/run', true, "'/bar/bin/run'"), - array('/bin/run', '/bin/run', true, "__DIR__"), - array('c:/bin/run', 'C:\\bin/run', true, "__DIR__"), - array('c:/bin/run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"), - array('c:\\bin\\run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"), - array('c:/bin/run', 'd:/vendor/acme/bin/run', true, "'D:/vendor/acme/bin/run'"), - array('c:\\bin\\run', 'd:/vendor/acme/bin/run', true, "'D:/vendor/acme/bin/run'"), - array('C:/Temp/test', 'C:\Temp', true, "dirname(__DIR__)"), - array('C:/Temp', 'C:\Temp\test', true, "__DIR__ . '/test'"), - array('/tmp/test', '/tmp', true, "dirname(__DIR__)"), - array('/tmp', '/tmp/test', true, "__DIR__ . '/test'"), - array('C:/Temp', 'c:\Temp\test', true, "__DIR__ . '/test'"), - array('/tmp/test/./', '/tmp/test/', true, '__DIR__'), - array('/tmp/test/../vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"), - array('/tmp/test/.././vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"), - array('C:/Temp', 'c:\Temp\..\..\test', true, "dirname(__DIR__).'/test'"), - array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'D:/test'"), - array('/foo/bar', '/foo/bar_vendor', true, "dirname(__DIR__).'/bar_vendor'"), - array('/foo/bar_vendor', '/foo/bar', true, "dirname(__DIR__).'/bar'"), - array('/foo/bar_vendor', '/foo/bar/src', true, "dirname(__DIR__).'/bar/src'"), - array('/foo/bar_vendor/src2', '/foo/bar/src/lib', true, "dirname(dirname(__DIR__)).'/bar/src/lib'"), + return [ + ['/foo/bar', '/foo/bar', false, "__FILE__"], + ['/foo/bar', '/foo/baz', false, "__DIR__.'/baz'"], + ['/foo/bin/run', '/foo/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"], + ['/foo/bin/run', '/bar/bin/run', false, "'/bar/bin/run'"], + ['c:/bin/run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"], + ['c:\\bin\\run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"], + ['c:/bin/run', 'D:/vendor/acme/bin/run', false, "'D:/vendor/acme/bin/run'"], + ['c:\\bin\\run', 'd:/vendor/acme/bin/run', false, "'D:/vendor/acme/bin/run'"], + ['/foo/bar', '/foo/bar', true, "__DIR__"], + ['/foo/bar/', '/foo/bar', true, "__DIR__"], + ['/foo/bar', '/foo/baz', true, "dirname(__DIR__).'/baz'"], + ['/foo/bin/run', '/foo/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"], + ['/foo/bin/run', '/bar/bin/run', true, "'/bar/bin/run'"], + ['/bin/run', '/bin/run', true, "__DIR__"], + ['c:/bin/run', 'C:\\bin/run', true, "__DIR__"], + ['c:/bin/run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"], + ['c:\\bin\\run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"], + ['c:/bin/run', 'd:/vendor/acme/bin/run', true, "'D:/vendor/acme/bin/run'"], + ['c:\\bin\\run', 'd:/vendor/acme/bin/run', true, "'D:/vendor/acme/bin/run'"], + ['C:/Temp/test', 'C:\Temp', true, "dirname(__DIR__)"], + ['C:/Temp', 'C:\Temp\test', true, "__DIR__ . '/test'"], + ['/tmp/test', '/tmp', true, "dirname(__DIR__)"], + ['/tmp', '/tmp/test', true, "__DIR__ . '/test'"], + ['C:/Temp', 'c:\Temp\test', true, "__DIR__ . '/test'"], + ['/tmp/test/./', '/tmp/test/', true, '__DIR__'], + ['/tmp/test/../vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"], + ['/tmp/test/.././vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"], + ['C:/Temp', 'c:\Temp\..\..\test', true, "dirname(__DIR__).'/test'"], + ['C:/Temp/../..', 'd:\Temp\..\..\test', true, "'D:/test'"], + ['/foo/bar', '/foo/bar_vendor', true, "dirname(__DIR__).'/bar_vendor'"], + ['/foo/bar_vendor', '/foo/bar', true, "dirname(__DIR__).'/bar'"], + ['/foo/bar_vendor', '/foo/bar/src', true, "dirname(__DIR__).'/bar/src'"], + ['/foo/bar_vendor/src2', '/foo/bar/src/lib', true, "dirname(dirname(__DIR__)).'/bar/src/lib'"], // static use case - array('/tmp/test/../vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true), - array('/tmp/test/.././vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true), - array('C:/Temp', 'c:\Temp\..\..\test', true, "__DIR__ . '/..'.'/test'", true), - array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'D:/test'", true), - array('/foo/bar', '/foo/bar_vendor', true, "__DIR__ . '/..'.'/bar_vendor'", true), - array('/foo/bar_vendor', '/foo/bar', true, "__DIR__ . '/..'.'/bar'", true), - array('/foo/bar_vendor', '/foo/bar/src', true, "__DIR__ . '/..'.'/bar/src'", true), - array('/foo/bar_vendor/src2', '/foo/bar/src/lib', true, "__DIR__ . '/../..'.'/bar/src/lib'", true), - ); + ['/tmp/test/../vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true], + ['/tmp/test/.././vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true], + ['C:/Temp', 'c:\Temp\..\..\test', true, "__DIR__ . '/..'.'/test'", true], + ['C:/Temp/../..', 'd:\Temp\..\..\test', true, "'D:/test'", true], + ['/foo/bar', '/foo/bar_vendor', true, "__DIR__ . '/..'.'/bar_vendor'", true], + ['/foo/bar_vendor', '/foo/bar', true, "__DIR__ . '/..'.'/bar'", true], + ['/foo/bar_vendor', '/foo/bar/src', true, "__DIR__ . '/..'.'/bar/src'", true], + ['/foo/bar_vendor/src2', '/foo/bar/src/lib', true, "__DIR__ . '/../..'.'/bar/src/lib'", true], + ]; } /** * @dataProvider providePathCouples - * - * @param string $a - * @param string $b - * @param string $expected - * @param bool $directory */ public function testFindShortestPath(string $a, string $b, string $expected, bool $directory = false): void { @@ -130,44 +119,44 @@ public function testFindShortestPath(string $a, string $b, string $expected, boo public function providePathCouples(): array { - return array( - array('/foo/bar', '/foo/bar', "./bar"), - array('/foo/bar', '/foo/baz', "./baz"), - array('/foo/bar/', '/foo/baz', "./baz"), - array('/foo/bar', '/foo/bar', "./", true), - array('/foo/bar', '/foo/baz', "../baz", true), - array('/foo/bar/', '/foo/baz', "../baz", true), - array('C:/foo/bar/', 'c:/foo/baz', "../baz", true), - array('/foo/bin/run', '/foo/vendor/acme/bin/run', "../vendor/acme/bin/run"), - array('/foo/bin/run', '/bar/bin/run', "/bar/bin/run"), - array('/foo/bin/run', '/bar/bin/run', "/bar/bin/run", true), - array('c:/foo/bin/run', 'd:/bar/bin/run', "D:/bar/bin/run", true), - array('c:/bin/run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"), - array('c:\\bin\\run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"), - array('c:/bin/run', 'd:/vendor/acme/bin/run', "D:/vendor/acme/bin/run"), - array('c:\\bin\\run', 'd:/vendor/acme/bin/run', "D:/vendor/acme/bin/run"), - array('C:/Temp/test', 'C:\Temp', "./"), - array('/tmp/test', '/tmp', "./"), - array('C:/Temp/test/sub', 'C:\Temp', "../"), - array('/tmp/test/sub', '/tmp', "../"), - array('/tmp/test/sub', '/tmp', "../../", true), - array('c:/tmp/test/sub', 'c:/tmp', "../../", true), - array('/tmp', '/tmp/test', "test"), - array('C:/Temp', 'C:\Temp\test', "test"), - array('C:/Temp', 'c:\Temp\test', "test"), - array('/tmp/test/./', '/tmp/test', './', true), - array('/tmp/test/../vendor', '/tmp/test', '../test', true), - array('/tmp/test/.././vendor', '/tmp/test', '../test', true), - array('C:/Temp', 'c:\Temp\..\..\test', "../test", true), - array('C:/Temp/../..', 'c:\Temp\..\..\test', "./test", true), - array('C:/Temp/../..', 'D:\Temp\..\..\test', "D:/test", true), - array('/tmp', '/tmp/../../test', '/test', true), - array('/foo/bar', '/foo/bar_vendor', '../bar_vendor', true), - array('/foo/bar_vendor', '/foo/bar', '../bar', true), - array('/foo/bar_vendor', '/foo/bar/src', '../bar/src', true), - array('/foo/bar_vendor/src2', '/foo/bar/src/lib', '../../bar/src/lib', true), - array('C:/', 'C:/foo/bar/', "foo/bar", true), - ); + return [ + ['/foo/bar', '/foo/bar', "./bar"], + ['/foo/bar', '/foo/baz', "./baz"], + ['/foo/bar/', '/foo/baz', "./baz"], + ['/foo/bar', '/foo/bar', "./", true], + ['/foo/bar', '/foo/baz', "../baz", true], + ['/foo/bar/', '/foo/baz', "../baz", true], + ['C:/foo/bar/', 'c:/foo/baz', "../baz", true], + ['/foo/bin/run', '/foo/vendor/acme/bin/run', "../vendor/acme/bin/run"], + ['/foo/bin/run', '/bar/bin/run', "/bar/bin/run"], + ['/foo/bin/run', '/bar/bin/run', "/bar/bin/run", true], + ['c:/foo/bin/run', 'd:/bar/bin/run', "D:/bar/bin/run", true], + ['c:/bin/run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"], + ['c:\\bin\\run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"], + ['c:/bin/run', 'd:/vendor/acme/bin/run', "D:/vendor/acme/bin/run"], + ['c:\\bin\\run', 'd:/vendor/acme/bin/run', "D:/vendor/acme/bin/run"], + ['C:/Temp/test', 'C:\Temp', "./"], + ['/tmp/test', '/tmp', "./"], + ['C:/Temp/test/sub', 'C:\Temp', "../"], + ['/tmp/test/sub', '/tmp', "../"], + ['/tmp/test/sub', '/tmp', "../../", true], + ['c:/tmp/test/sub', 'c:/tmp', "../../", true], + ['/tmp', '/tmp/test', "test"], + ['C:/Temp', 'C:\Temp\test', "test"], + ['C:/Temp', 'c:\Temp\test', "test"], + ['/tmp/test/./', '/tmp/test', './', true], + ['/tmp/test/../vendor', '/tmp/test', '../test', true], + ['/tmp/test/.././vendor', '/tmp/test', '../test', true], + ['C:/Temp', 'c:\Temp\..\..\test', "../test", true], + ['C:/Temp/../..', 'c:\Temp\..\..\test', "./test", true], + ['C:/Temp/../..', 'D:\Temp\..\..\test', "D:/test", true], + ['/tmp', '/tmp/../../test', '/test', true], + ['/foo/bar', '/foo/bar_vendor', '../bar_vendor', true], + ['/foo/bar_vendor', '/foo/bar', '../bar', true], + ['/foo/bar_vendor', '/foo/bar/src', '../bar/src', true], + ['/foo/bar_vendor/src2', '/foo/bar/src/lib', '../../bar/src/lib', true], + ['C:/', 'C:/foo/bar/', "foo/bar", true], + ]; } /** @@ -203,9 +192,6 @@ public function testDirectorySize(): void /** * @dataProvider provideNormalizedPaths - * - * @param string $expected - * @param string $actual */ public function testNormalizePath(string $expected, string $actual): void { @@ -215,28 +201,28 @@ public function testNormalizePath(string $expected, string $actual): void public function provideNormalizedPaths(): array { - return array( - array('../foo', '../foo'), - array('C:/foo/bar', 'c:/foo//bar'), - array('C:/foo/bar', 'C:/foo/./bar'), - array('C:/foo/bar', 'C://foo//bar'), - array('C:/foo/bar', 'C:///foo//bar'), - array('C:/bar', 'C:/foo/../bar'), - array('/bar', '/foo/../bar/'), - array('phar://C:/Foo', 'phar://c:/Foo/Bar/..'), - array('phar://C:/Foo', 'phar://c:///Foo/Bar/..'), - array('phar://C:/', 'phar://c:/Foo/Bar/../../../..'), - array('/', '/Foo/Bar/../../../..'), - array('/', '/'), - array('/', '//'), - array('/', '///'), - array('/Foo', '///Foo'), - array('C:/', 'c:\\'), - array('../src', 'Foo/Bar/../../../src'), - array('C:../b', 'c:.\\..\\a\\..\\b'), - array('phar://C:../Foo', 'phar://c:../Foo'), - array('//foo/bar', '\\\\foo\\bar'), - ); + return [ + ['../foo', '../foo'], + ['C:/foo/bar', 'c:/foo//bar'], + ['C:/foo/bar', 'C:/foo/./bar'], + ['C:/foo/bar', 'C://foo//bar'], + ['C:/foo/bar', 'C:///foo//bar'], + ['C:/bar', 'C:/foo/../bar'], + ['/bar', '/foo/../bar/'], + ['phar://C:/Foo', 'phar://c:/Foo/Bar/..'], + ['phar://C:/Foo', 'phar://c:///Foo/Bar/..'], + ['phar://C:/', 'phar://c:/Foo/Bar/../../../..'], + ['/', '/Foo/Bar/../../../..'], + ['/', '/'], + ['/', '//'], + ['/', '///'], + ['/Foo', '///Foo'], + ['C:/', 'c:\\'], + ['../src', 'Foo/Bar/../../../src'], + ['C:../b', 'c:.\\..\\a\\..\\b'], + ['phar://C:../Foo', 'phar://c:../Foo'], + ['//foo/bar', '\\\\foo\\bar'], + ]; } /** diff --git a/tests/Composer/Test/Util/GitTest.php b/tests/Composer/Test/Util/GitTest.php index 41602aa0b8b8..f066ac1ccb75 100644 --- a/tests/Composer/Test/Util/GitTest.php +++ b/tests/Composer/Test/Util/GitTest.php @@ -43,9 +43,6 @@ protected function setUp(): void /** * @dataProvider publicGithubNoCredentialsProvider - * - * @param string $protocol - * @param string $expectedUrl */ public function testRunCommandPublicGitHubRepositoryNotInitialClone(string $protocol, string $expectedUrl): void { @@ -57,17 +54,17 @@ public function testRunCommandPublicGitHubRepositoryNotInitialClone(string $prot $this->mockConfig($protocol); - $this->process->expects(array('git command'), true); + $this->process->expects(['git command'], true); $this->git->runCommand($commandCallable, 'https://github.com/acme/repo', null, true); } public function publicGithubNoCredentialsProvider(): array { - return array( - array('ssh', 'git@github.com:acme/repo'), - array('https', 'https://github.com/acme/repo'), - ); + return [ + ['ssh', 'git@github.com:acme/repo'], + ['https', 'https://github.com/acme/repo'], + ]; } public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteractiveWithoutAuthentication(): void @@ -82,26 +79,20 @@ public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteracti $this->mockConfig('https'); - $this->process->expects(array( - array('cmd' => 'git command', 'return' => 1), - array('cmd' => 'git --version', 'return' => 0), - ), true); + $this->process->expects([ + ['cmd' => 'git command', 'return' => 1], + ['cmd' => 'git --version', 'return' => 0], + ], true); $this->git->runCommand($commandCallable, 'https://github.com/acme/repo', null, true); } /** * @dataProvider privateGithubWithCredentialsProvider - * - * @param string $gitUrl - * @param string $protocol - * @param string $gitHubToken - * @param string $expectedUrl - * @param int $expectedFailuresBeforeSuccess */ public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteractiveWithAuthentication(string $gitUrl, string $protocol, string $gitHubToken, string $expectedUrl, int $expectedFailuresBeforeSuccess): void { - $commandCallable = function ($url) use ($expectedUrl): string { + $commandCallable = static function ($url) use ($expectedUrl): string { if ($url !== $expectedUrl) { return 'git command failing'; } @@ -111,8 +102,8 @@ public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteracti $this->mockConfig($protocol); - $expectedCalls = array_fill(0, $expectedFailuresBeforeSuccess, array('cmd' => 'git command failing', 'return' => 1)); - $expectedCalls[] = array('cmd' => 'git command ok', 'return' => 0); + $expectedCalls = array_fill(0, $expectedFailuresBeforeSuccess, ['cmd' => 'git command failing', 'return' => 1]); + $expectedCalls[] = ['cmd' => 'git command ok', 'return' => 0]; $this->process->expects($expectedCalls, true); @@ -130,31 +121,26 @@ public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteracti ->expects($this->atLeastOnce()) ->method('getAuthentication') ->with($this->equalTo('github.com')) - ->willReturn(array('username' => 'token', 'password' => $gitHubToken)); + ->willReturn(['username' => 'token', 'password' => $gitHubToken]); $this->git->runCommand($commandCallable, $gitUrl, null, true); } public function privateGithubWithCredentialsProvider(): array { - return array( - array('git@github.com:acme/repo.git', 'ssh', 'MY_GITHUB_TOKEN', 'https://token:MY_GITHUB_TOKEN@github.com/acme/repo.git', 1), - array('https://github.com/acme/repo', 'https', 'MY_GITHUB_TOKEN', 'https://token:MY_GITHUB_TOKEN@github.com/acme/repo.git', 2), - ); + return [ + ['git@github.com:acme/repo.git', 'ssh', 'MY_GITHUB_TOKEN', 'https://token:MY_GITHUB_TOKEN@github.com/acme/repo.git', 1], + ['https://github.com/acme/repo', 'https', 'MY_GITHUB_TOKEN', 'https://token:MY_GITHUB_TOKEN@github.com/acme/repo.git', 2], + ]; } - /** - * @param string $protocol - * - * @return void - */ private function mockConfig(string $protocol): void { $this->config ->method('get') - ->willReturnMap(array( - array('github-domains', 0, array('github.com')), - array('github-protocols', 0, array($protocol)), - )); + ->willReturnMap([ + ['github-domains', 0, ['github.com']], + ['github-protocols', 0, [$protocol]], + ]); } } diff --git a/tests/Composer/Test/Util/Http/ProxyHelperTest.php b/tests/Composer/Test/Util/Http/ProxyHelperTest.php index c70dd746d83e..0ff8374d8981 100644 --- a/tests/Composer/Test/Util/Http/ProxyHelperTest.php +++ b/tests/Composer/Test/Util/Http/ProxyHelperTest.php @@ -46,8 +46,6 @@ protected function tearDown(): void /** * @dataProvider dataMalformed - * - * @param string $url */ public function testThrowsOnMalformedUrl(string $url): void { @@ -59,42 +57,37 @@ public function testThrowsOnMalformedUrl(string $url): void public function dataMalformed(): array { - return array( - 'no-host' => array('localhost'), - 'no-port' => array('scheme://localhost'), - ); + return [ + 'no-host' => ['localhost'], + 'no-port' => ['scheme://localhost'], + ]; } /** * @dataProvider dataFormatting - * - * @param string $url - * @param string $expected */ public function testUrlFormatting(string $url, string $expected): void { $_SERVER['http_proxy'] = $url; - list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData(); + [$httpProxy, $httpsProxy, $noProxy] = ProxyHelper::getProxyData(); $this->assertSame($expected, $httpProxy); } public function dataFormatting(): array { // url, expected - return array( - 'lowercases-scheme' => array('HTTP://proxy.com:8888', 'http://proxy.com:8888'), - 'adds-http-port' => array('http://proxy.com', 'http://proxy.com:80'), - 'adds-https-port' => array('https://proxy.com', 'https://proxy.com:443'), - ); + return [ + 'lowercases-scheme' => ['HTTP://proxy.com:8888', 'http://proxy.com:8888'], + 'adds-http-port' => ['http://proxy.com', 'http://proxy.com:80'], + 'adds-https-port' => ['https://proxy.com', 'https://proxy.com:443'], + ]; } /** * @dataProvider dataCaseOverrides * * @param array $server - * @param string $expected - * @param int $index */ public function testLowercaseOverridesUppercase(array $server, string $expected, int $index): void { @@ -107,19 +100,17 @@ public function testLowercaseOverridesUppercase(array $server, string $expected, public function dataCaseOverrides(): array { // server, expected, list index - return array( - array(array('HTTP_PROXY' => 'http://upper.com', 'http_proxy' => 'http://lower.com'), 'http://lower.com:80', 0), - array(array('HTTPS_PROXY' => 'http://upper.com', 'https_proxy' => 'http://lower.com'), 'http://lower.com:80', 1), - array(array('NO_PROXY' => 'upper.com', 'no_proxy' => 'lower.com'), 'lower.com', 2), - ); + return [ + [['HTTP_PROXY' => 'http://upper.com', 'http_proxy' => 'http://lower.com'], 'http://lower.com:80', 0], + [['HTTPS_PROXY' => 'http://upper.com', 'https_proxy' => 'http://lower.com'], 'http://lower.com:80', 1], + [['NO_PROXY' => 'upper.com', 'no_proxy' => 'lower.com'], 'lower.com', 2], + ]; } /** * @dataProvider dataCGIOverrides * * @param array $server - * @param string $expected - * @param int $index */ public function testCGIUpperCaseOverridesHttp(array $server, string $expected, int $index): void { @@ -132,17 +123,17 @@ public function testCGIUpperCaseOverridesHttp(array $server, string $expected, i public function dataCGIOverrides(): array { // server, expected, list index - return array( - array(array('http_proxy' => 'http://http.com', 'CGI_HTTP_PROXY' => 'http://cgi.com'), 'http://cgi.com:80', 0), - array(array('http_proxy' => 'http://http.com', 'cgi_http_proxy' => 'http://cgi.com'), 'http://http.com:80', 0), - ); + return [ + [['http_proxy' => 'http://http.com', 'CGI_HTTP_PROXY' => 'http://cgi.com'], 'http://cgi.com:80', 0], + [['http_proxy' => 'http://http.com', 'cgi_http_proxy' => 'http://cgi.com'], 'http://http.com:80', 0], + ]; } public function testNoHttpsProxyUsesHttpProxy(): void { $_SERVER['http_proxy'] = 'http://http.com'; - list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData(); + [$httpProxy, $httpsProxy, $noProxy] = ProxyHelper::getProxyData(); $this->assertSame('http://http.com:80', $httpsProxy); } @@ -150,14 +141,13 @@ public function testNoHttpProxyDoesNotUseHttpsProxy(): void { $_SERVER['https_proxy'] = 'http://https.com'; - list($httpProxy, $httpsProxy, $noProxy) = ProxyHelper::getProxyData(); + [$httpProxy, $httpsProxy, $noProxy] = ProxyHelper::getProxyData(); $this->assertSame(null, $httpProxy); } /** * @dataProvider dataContextOptions * - * @param string $url * @param array $expected * * @phpstan-param array{http: array{proxy: string, header?: string}} $expected @@ -170,29 +160,28 @@ public function testGetContextOptions(string $url, array $expected): void public function dataContextOptions(): array { // url, expected - return array( - array('http://proxy.com', array('http' => array( + return [ + ['http://proxy.com', ['http' => [ 'proxy' => 'tcp://proxy.com:80', - ))), - array('https://proxy.com', array('http' => array( + ]]], + ['https://proxy.com', ['http' => [ 'proxy' => 'ssl://proxy.com:443', - ))), - array('http://user:p%40ss@proxy.com', array('http' => array( + ]]], + ['http://user:p%40ss@proxy.com', ['http' => [ 'proxy' => 'tcp://proxy.com:80', 'header' => 'Proxy-Authorization: Basic dXNlcjpwQHNz', - ))), - ); + ]]], + ]; } /** * @dataProvider dataRequestFullUri * - * @param string $requestUrl * @param mixed[] $expected */ public function testSetRequestFullUri(string $requestUrl, array $expected): void { - $options = array(); + $options = []; ProxyHelper::setRequestFullUri($requestUrl, $options); $this->assertEquals($expected, $options); @@ -200,13 +189,13 @@ public function testSetRequestFullUri(string $requestUrl, array $expected): void public function dataRequestFullUri(): array { - $options = array('http' => array('request_fulluri' => true)); + $options = ['http' => ['request_fulluri' => true]]; // $requestUrl, expected - return array( - 'http' => array('http://repo.org', $options), - 'https' => array('https://repo.org', array()), - 'no-scheme' => array('repo.org', array()), - ); + return [ + 'http' => ['http://repo.org', $options], + 'https' => ['https://repo.org', []], + 'no-scheme' => ['repo.org', []], + ]; } } diff --git a/tests/Composer/Test/Util/Http/ProxyManagerTest.php b/tests/Composer/Test/Util/Http/ProxyManagerTest.php index ebdc4d290d86..8602ab0c09f4 100644 --- a/tests/Composer/Test/Util/Http/ProxyManagerTest.php +++ b/tests/Composer/Test/Util/Http/ProxyManagerTest.php @@ -71,11 +71,7 @@ public function testGetProxyForRequestThrowsOnBadProxyUrl(): void * @dataProvider dataRequest * * @param array $server - * @param string $url - * @param string $expectedUrl * @param mixed[] $expectedOptions - * @param bool $expectedSecure - * @param string $expectedMessage */ public function testGetProxyForRequest(array $server, string $url, string $expectedUrl, array $expectedOptions, bool $expectedSecure, string $expectedMessage): void { @@ -102,34 +98,34 @@ public function testGetProxyForRequest(array $server, string $url, string $expec public function dataRequest(): array { - $server = array( + $server = [ 'http_proxy' => 'http://user:p%40ss@proxy.com', 'https_proxy' => 'https://proxy.com:443', 'no_proxy' => 'other.repo.org', - ); + ]; // server, url, expectedUrl, expectedOptions, expectedSecure, expectedMessage - return array( - array(array(), 'http://repo.org', '', array(), false, ''), - array($server, 'http://repo.org', 'http://user:p%40ss@proxy.com:80', - array('http' => array( + return [ + [[], 'http://repo.org', '', [], false, ''], + [$server, 'http://repo.org', 'http://user:p%40ss@proxy.com:80', + ['http' => [ 'proxy' => 'tcp://proxy.com:80', 'header' => 'Proxy-Authorization: Basic dXNlcjpwQHNz', 'request_fulluri' => true, - )), + ]], false, 'http://user:***@proxy.com:80', - ), - array( + ], + [ $server, 'https://repo.org', 'https://proxy.com:443', - array('http' => array( + ['http' => [ 'proxy' => 'ssl://proxy.com:443', - )), + ]], true, 'https://proxy.com:443', - ), - array($server, 'https://other.repo.org', '', array(), false, 'no_proxy'), - ); + ], + [$server, 'https://other.repo.org', '', [], false, 'no_proxy'], + ]; } /** @@ -157,19 +153,19 @@ public function testGetStatus(array $server, bool $expectedStatus, ?string $expe public function dataStatus(): array { // server, expectedStatus, expectedMessage - return array( - array(array(), false, null), - array(array('http_proxy' => 'localhost'), false, 'malformed'), - array( - array('http_proxy' => 'http://user:p%40ss@proxy.com:80'), + return [ + [[], false, null], + [['http_proxy' => 'localhost'], false, 'malformed'], + [ + ['http_proxy' => 'http://user:p%40ss@proxy.com:80'], true, 'http=http://user:***@proxy.com:80', - ), - array( - array('http_proxy' => 'proxy.com:80', 'https_proxy' => 'proxy.com:80'), + ], + [ + ['http_proxy' => 'proxy.com:80', 'https_proxy' => 'proxy.com:80'], true, 'http=proxy.com:80, https=proxy.com:80', - ), - ); + ], + ]; } } diff --git a/tests/Composer/Test/Util/Http/RequestProxyTest.php b/tests/Composer/Test/Util/Http/RequestProxyTest.php index 2073d70bf75c..24cf881e0031 100644 --- a/tests/Composer/Test/Util/Http/RequestProxyTest.php +++ b/tests/Composer/Test/Util/Http/RequestProxyTest.php @@ -19,13 +19,10 @@ class RequestProxyTest extends TestCase { /** * @dataProvider dataSecure - * - * @param string $url - * @param bool $expectedSecure */ public function testIsSecure(string $url, bool $expectedSecure): void { - $proxy = new RequestProxy($url, array(), ''); + $proxy = new RequestProxy($url, [], ''); $this->assertSame($expectedSecure, $proxy->isSecure()); } @@ -33,23 +30,19 @@ public function testIsSecure(string $url, bool $expectedSecure): void public function dataSecure(): array { // url, secure - return array( - 'basic' => array('http://proxy.com:80', false), - 'secure' => array('https://proxy.com:443', true), - 'none' => array('', false), - ); + return [ + 'basic' => ['http://proxy.com:80', false], + 'secure' => ['https://proxy.com:443', true], + 'none' => ['', false], + ]; } /** * @dataProvider dataProxyUrl - * - * @param string $url - * @param string $format - * @param string $expected */ public function testGetFormattedUrlFormat(string $url, string $format, string $expected): void { - $proxy = new RequestProxy($url, array(), $url); + $proxy = new RequestProxy($url, [], $url); $message = $proxy->getFormattedUrl($format); $this->assertSame($expected, $message); @@ -60,9 +53,9 @@ public function dataProxyUrl(): array $format = 'proxy (%s)'; // url, format, expected - return array( - array('', $format, ''), - array('http://proxy.com:80', $format, 'proxy (http://proxy.com:80)'), - ); + return [ + ['', $format, ''], + ['http://proxy.com:80', $format, 'proxy (http://proxy.com:80)'], + ]; } } diff --git a/tests/Composer/Test/Util/HttpDownloaderTest.php b/tests/Composer/Test/Util/HttpDownloaderTest.php index 26e77876440d..294063902a1e 100644 --- a/tests/Composer/Test/Util/HttpDownloaderTest.php +++ b/tests/Composer/Test/Util/HttpDownloaderTest.php @@ -26,9 +26,9 @@ private function getConfigMock() $config = $this->getMockBuilder('Composer\Config')->getMock(); $config->expects($this->any()) ->method('get') - ->will($this->returnCallback(function ($key) { + ->will($this->returnCallback(static function ($key) { if ($key === 'github-domains' || $key === 'gitlab-domains') { - return array(); + return []; } })); @@ -56,22 +56,22 @@ public function testCaptureAuthenticationParamsFromUrl(): void public function testOutputWarnings(): void { $io = new BufferIO(); - HttpDownloader::outputWarnings($io, '$URL', array()); + HttpDownloader::outputWarnings($io, '$URL', []); $this->assertSame('', $io->getOutput()); - HttpDownloader::outputWarnings($io, '$URL', array( + HttpDownloader::outputWarnings($io, '$URL', [ 'warning' => 'old warning msg', 'warning-versions' => '>=2.0', 'info' => 'old info msg', 'info-versions' => '>=2.0', - 'warnings' => array( - array('message' => 'should not appear', 'versions' => '<2.2'), - array('message' => 'visible warning', 'versions' => '>=2.2-dev'), - ), - 'infos' => array( - array('message' => 'should not appear', 'versions' => '<2.2'), - array('message' => 'visible info', 'versions' => '>=2.2-dev'), - ), - )); + 'warnings' => [ + ['message' => 'should not appear', 'versions' => '<2.2'], + ['message' => 'visible warning', 'versions' => '>=2.2-dev'], + ], + 'infos' => [ + ['message' => 'should not appear', 'versions' => '<2.2'], + ['message' => 'visible info', 'versions' => '>=2.2-dev'], + ], + ]); // the tag are consumed by the OutputFormatter, but not as that is not a default output format $this->assertSame( diff --git a/tests/Composer/Test/Util/IniHelperTest.php b/tests/Composer/Test/Util/IniHelperTest.php index 753efcee0462..fbfde3a3d46a 100644 --- a/tests/Composer/Test/Util/IniHelperTest.php +++ b/tests/Composer/Test/Util/IniHelperTest.php @@ -28,9 +28,9 @@ class IniHelperTest extends TestCase public function testWithNoIni(): void { - $paths = array( + $paths = [ '', - ); + ]; $this->setEnv($paths); $this->assertStringContainsString('does not exist', IniHelper::getMessage()); @@ -39,9 +39,9 @@ public function testWithNoIni(): void public function testWithLoadedIniOnly(): void { - $paths = array( + $paths = [ 'loaded.ini', - ); + ]; $this->setEnv($paths); $this->assertStringContainsString('loaded.ini', IniHelper::getMessage()); @@ -49,11 +49,11 @@ public function testWithLoadedIniOnly(): void public function testWithLoadedIniAndAdditional(): void { - $paths = array( + $paths = [ 'loaded.ini', 'one.ini', 'two.ini', - ); + ]; $this->setEnv($paths); $this->assertStringContainsString('multiple ini files', IniHelper::getMessage()); @@ -62,11 +62,11 @@ public function testWithLoadedIniAndAdditional(): void public function testWithoutLoadedIniAndAdditional(): void { - $paths = array( + $paths = [ '', 'one.ini', 'two.ini', - ); + ]; $this->setEnv($paths); $this->assertStringContainsString('multiple ini files', IniHelper::getMessage()); @@ -93,8 +93,6 @@ public static function tearDownAfterClass(): void /** * @param string[] $paths - * - * @return void */ protected function setEnv(array $paths): void { diff --git a/tests/Composer/Test/Util/MetadataMinifierTest.php b/tests/Composer/Test/Util/MetadataMinifierTest.php index 99f61c0b6fe6..d0961d5fde50 100644 --- a/tests/Composer/Test/Util/MetadataMinifierTest.php +++ b/tests/Composer/Test/Util/MetadataMinifierTest.php @@ -22,22 +22,22 @@ class MetadataMinifierTest extends TestCase public function testMinifyExpand(): void { $package1 = new CompletePackage('foo/bar', '2.0.0.0', '2.0.0'); - $package1->setScripts(array('foo' => array('bar'))); - $package1->setLicense(array('MIT')); + $package1->setScripts(['foo' => ['bar']]); + $package1->setLicense(['MIT']); $package2 = new CompletePackage('foo/bar', '1.2.0.0', '1.2.0'); - $package2->setLicense(array('GPL')); + $package2->setLicense(['GPL']); $package2->setHomepage('https://example.org'); $package3 = new CompletePackage('foo/bar', '1.0.0.0', '1.0.0'); - $package3->setLicense(array('GPL')); + $package3->setLicense(['GPL']); $dumper = new ArrayDumper(); - $minified = array( - array('name' => 'foo/bar', 'version' => '2.0.0', 'version_normalized' => '2.0.0.0', 'type' => 'library', 'scripts' => array('foo' => array('bar')), 'license' => array('MIT')), - array('version' => '1.2.0', 'version_normalized' => '1.2.0.0', 'license' => array('GPL'), 'homepage' => 'https://example.org', 'scripts' => '__unset'), - array('version' => '1.0.0', 'version_normalized' => '1.0.0.0', 'homepage' => '__unset'), - ); + $minified = [ + ['name' => 'foo/bar', 'version' => '2.0.0', 'version_normalized' => '2.0.0.0', 'type' => 'library', 'scripts' => ['foo' => ['bar']], 'license' => ['MIT']], + ['version' => '1.2.0', 'version_normalized' => '1.2.0.0', 'license' => ['GPL'], 'homepage' => 'https://example.org', 'scripts' => '__unset'], + ['version' => '1.0.0', 'version_normalized' => '1.0.0.0', 'homepage' => '__unset'], + ]; - $source = array($dumper->dump($package1), $dumper->dump($package2), $dumper->dump($package3)); + $source = [$dumper->dump($package1), $dumper->dump($package2), $dumper->dump($package3)]; $this->assertSame($minified, MetadataMinifier::minify($source)); $this->assertSame($source, MetadataMinifier::expand($minified)); diff --git a/tests/Composer/Test/Util/NoProxyPatternTest.php b/tests/Composer/Test/Util/NoProxyPatternTest.php index 559875375384..627956683487 100644 --- a/tests/Composer/Test/Util/NoProxyPatternTest.php +++ b/tests/Composer/Test/Util/NoProxyPatternTest.php @@ -19,10 +19,6 @@ class NoProxyPatternTest extends TestCase { /** * @dataProvider dataHostName - * - * @param string $noproxy - * @param string $url - * @param bool $expected */ public function testHostName(string $noproxy, string $url, bool $expected): void { @@ -36,24 +32,20 @@ public function dataHostName(): array $noproxy = 'foobar.com, .barbaz.net'; // noproxy, url, expected - return array( - 'match as foobar.com' => array($noproxy, 'foobar.com', true), - 'match foobar.com' => array($noproxy, 'www.foobar.com', true), - 'no match foobar.com' => array($noproxy, 'foofoobar.com', false), - 'match .barbaz.net 1' => array($noproxy, 'barbaz.net', true), - 'match .barbaz.net 2' => array($noproxy, 'www.barbaz.net', true), - 'no match .barbaz.net' => array($noproxy, 'barbarbaz.net', false), - 'no match wrong domain' => array($noproxy, 'barbaz.com', false), - 'no match FQDN' => array($noproxy, 'foobar.com.', false), - ); + return [ + 'match as foobar.com' => [$noproxy, 'foobar.com', true], + 'match foobar.com' => [$noproxy, 'www.foobar.com', true], + 'no match foobar.com' => [$noproxy, 'foofoobar.com', false], + 'match .barbaz.net 1' => [$noproxy, 'barbaz.net', true], + 'match .barbaz.net 2' => [$noproxy, 'www.barbaz.net', true], + 'no match .barbaz.net' => [$noproxy, 'barbarbaz.net', false], + 'no match wrong domain' => [$noproxy, 'barbaz.com', false], + 'no match FQDN' => [$noproxy, 'foobar.com.', false], + ]; } /** * @dataProvider dataIpAddress - * - * @param string $noproxy - * @param string $url - * @param bool $expected */ public function testIpAddress(string $noproxy, string $url, bool $expected): void { @@ -67,22 +59,18 @@ public function dataIpAddress(): array $noproxy = '192.168.1.1, 2001:db8::52:0:1'; // noproxy, url, expected - return array( - 'match exact IPv4' => array($noproxy, '192.168.1.1', true), - 'no match IPv4' => array($noproxy, '192.168.1.4', false), - 'match exact IPv6' => array($noproxy, '[2001:db8:0:0:0:52:0:1]', true), - 'no match IPv6' => array($noproxy, '[2001:db8:0:0:0:52:0:2]', false), - 'match mapped IPv4' => array($noproxy, '[::FFFF:C0A8:0101]', true), - 'no match mapped IPv4' => array($noproxy, '[::FFFF:C0A8:0104]', false), - ); + return [ + 'match exact IPv4' => [$noproxy, '192.168.1.1', true], + 'no match IPv4' => [$noproxy, '192.168.1.4', false], + 'match exact IPv6' => [$noproxy, '[2001:db8:0:0:0:52:0:1]', true], + 'no match IPv6' => [$noproxy, '[2001:db8:0:0:0:52:0:2]', false], + 'match mapped IPv4' => [$noproxy, '[::FFFF:C0A8:0101]', true], + 'no match mapped IPv4' => [$noproxy, '[::FFFF:C0A8:0104]', false], + ]; } /** * @dataProvider dataIpRange - * - * @param string $noproxy - * @param string $url - * @param bool $expected */ public function testIpRange(string $noproxy, string $url, bool $expected): void { @@ -96,22 +84,18 @@ public function dataIpRange(): array $noproxy = '10.0.0.0/30, 2002:db8:a::45/121'; // noproxy, url, expected - return array( - 'match IPv4/CIDR' => array($noproxy, '10.0.0.2', true), - 'no match IPv4/CIDR' => array($noproxy, '10.0.0.4', false), - 'match IPv6/CIDR' => array($noproxy, '[2002:db8:a:0:0:0:0:7f]', true), - 'no match IPv6' => array($noproxy, '[2002:db8:a:0:0:0:0:ff]', false), - 'match mapped IPv4' => array($noproxy, '[::FFFF:0A00:0002]', true), - 'no match mapped IPv4' => array($noproxy, '[::FFFF:0A00:0004]', false), - ); + return [ + 'match IPv4/CIDR' => [$noproxy, '10.0.0.2', true], + 'no match IPv4/CIDR' => [$noproxy, '10.0.0.4', false], + 'match IPv6/CIDR' => [$noproxy, '[2002:db8:a:0:0:0:0:7f]', true], + 'no match IPv6' => [$noproxy, '[2002:db8:a:0:0:0:0:ff]', false], + 'match mapped IPv4' => [$noproxy, '[::FFFF:0A00:0002]', true], + 'no match mapped IPv4' => [$noproxy, '[::FFFF:0A00:0004]', false], + ]; } /** * @dataProvider dataPort - * - * @param string $noproxy - * @param string $url - * @param bool $expected */ public function testPort(string $noproxy, string $url, bool $expected): void { @@ -125,20 +109,16 @@ public function dataPort(): array $noproxy = '192.168.1.2:81, 192.168.1.3:80, [2001:db8::52:0:2]:443, [2001:db8::52:0:3]:80'; // noproxy, url, expected - return array( - 'match IPv4 port' => array($noproxy, '192.168.1.3', true), - 'no match IPv4 port' => array($noproxy, '192.168.1.2', false), - 'match IPv6 port' => array($noproxy, '[2001:db8::52:0:3]', true), - 'no match IPv6 port' => array($noproxy, '[2001:db8::52:0:2]', false), - ); + return [ + 'match IPv4 port' => [$noproxy, '192.168.1.3', true], + 'no match IPv4 port' => [$noproxy, '192.168.1.2', false], + 'match IPv6 port' => [$noproxy, '[2001:db8::52:0:3]', true], + 'no match IPv6 port' => [$noproxy, '[2001:db8::52:0:2]', false], + ]; } /** * Appends a scheme to the test url if it is missing - * - * @param string $url - * - * @return string */ private function getUrl(string $url): string { @@ -149,7 +129,7 @@ private function getUrl(string $url): string $scheme = 'http'; if (strpos($url, '[') !== 0 && strrpos($url, ':') !== false) { - list(, $port) = explode(':', $url); + [, $port] = explode(':', $url); if ($port === '443') { $scheme = 'https'; diff --git a/tests/Composer/Test/Util/PackageSorterTest.php b/tests/Composer/Test/Util/PackageSorterTest.php index 0a2563854ee7..ea826721112e 100644 --- a/tests/Composer/Test/Util/PackageSorterTest.php +++ b/tests/Composer/Test/Util/PackageSorterTest.php @@ -22,10 +22,10 @@ class PackageSorterTest extends TestCase { public function testSortingDoesNothingWithNoDependencies(): void { - $packages[] = $this->createPackage('foo/bar1', array()); - $packages[] = $this->createPackage('foo/bar2', array()); - $packages[] = $this->createPackage('foo/bar3', array()); - $packages[] = $this->createPackage('foo/bar4', array()); + $packages[] = $this->createPackage('foo/bar1', []); + $packages[] = $this->createPackage('foo/bar2', []); + $packages[] = $this->createPackage('foo/bar3', []); + $packages[] = $this->createPackage('foo/bar4', []); $sortedPackages = PackageSorter::sortPackages($packages); @@ -34,117 +34,117 @@ public function testSortingDoesNothingWithNoDependencies(): void public function sortingOrdersDependenciesHigherThanPackageDataProvider(): array { - return array( - 'one package is dep' => array( - array( - $this->createPackage('foo/bar1', array('foo/bar4')), - $this->createPackage('foo/bar2', array('foo/bar4')), - $this->createPackage('foo/bar3', array('foo/bar4')), - $this->createPackage('foo/bar4', array()), - ), - array( + return [ + 'one package is dep' => [ + [ + $this->createPackage('foo/bar1', ['foo/bar4']), + $this->createPackage('foo/bar2', ['foo/bar4']), + $this->createPackage('foo/bar3', ['foo/bar4']), + $this->createPackage('foo/bar4', []), + ], + [ 'foo/bar4', 'foo/bar1', 'foo/bar2', 'foo/bar3', - ), - ), - 'one package has more deps' => array( - array( - $this->createPackage('foo/bar1', array('foo/bar2')), - $this->createPackage('foo/bar2', array('foo/bar4')), - $this->createPackage('foo/bar3', array('foo/bar4')), - $this->createPackage('foo/bar4', array()), - ), - array( + ], + ], + 'one package has more deps' => [ + [ + $this->createPackage('foo/bar1', ['foo/bar2']), + $this->createPackage('foo/bar2', ['foo/bar4']), + $this->createPackage('foo/bar3', ['foo/bar4']), + $this->createPackage('foo/bar4', []), + ], + [ 'foo/bar4', 'foo/bar2', 'foo/bar1', 'foo/bar3', - ), - ), - 'package is required by many, but requires one other' => array( - array( - $this->createPackage('foo/bar1', array('foo/bar3')), - $this->createPackage('foo/bar2', array('foo/bar3')), - $this->createPackage('foo/bar3', array('foo/bar4')), - $this->createPackage('foo/bar4', array()), - $this->createPackage('foo/bar5', array('foo/bar3')), - $this->createPackage('foo/bar6', array('foo/bar3')), - ), - array( + ], + ], + 'package is required by many, but requires one other' => [ + [ + $this->createPackage('foo/bar1', ['foo/bar3']), + $this->createPackage('foo/bar2', ['foo/bar3']), + $this->createPackage('foo/bar3', ['foo/bar4']), + $this->createPackage('foo/bar4', []), + $this->createPackage('foo/bar5', ['foo/bar3']), + $this->createPackage('foo/bar6', ['foo/bar3']), + ], + [ 'foo/bar4', 'foo/bar3', 'foo/bar1', 'foo/bar2', 'foo/bar5', 'foo/bar6', - ), - ), - 'one package has many requires' => array( - array( - $this->createPackage('foo/bar1', array('foo/bar2')), - $this->createPackage('foo/bar2', array()), - $this->createPackage('foo/bar3', array('foo/bar4')), - $this->createPackage('foo/bar4', array()), - $this->createPackage('foo/bar5', array('foo/bar2')), - $this->createPackage('foo/bar6', array('foo/bar2')), - ), - array( + ], + ], + 'one package has many requires' => [ + [ + $this->createPackage('foo/bar1', ['foo/bar2']), + $this->createPackage('foo/bar2', []), + $this->createPackage('foo/bar3', ['foo/bar4']), + $this->createPackage('foo/bar4', []), + $this->createPackage('foo/bar5', ['foo/bar2']), + $this->createPackage('foo/bar6', ['foo/bar2']), + ], + [ 'foo/bar2', 'foo/bar4', 'foo/bar1', 'foo/bar3', 'foo/bar5', 'foo/bar6', - ), - ), - 'circular deps sorted alphabetically if weighted equally' => array( - array( - $this->createPackage('foo/bar1', array('circular/part1')), - $this->createPackage('foo/bar2', array('circular/part2')), - $this->createPackage('circular/part1', array('circular/part2')), - $this->createPackage('circular/part2', array('circular/part1')), - ), - array( + ], + ], + 'circular deps sorted alphabetically if weighted equally' => [ + [ + $this->createPackage('foo/bar1', ['circular/part1']), + $this->createPackage('foo/bar2', ['circular/part2']), + $this->createPackage('circular/part1', ['circular/part2']), + $this->createPackage('circular/part2', ['circular/part1']), + ], + [ 'circular/part1', 'circular/part2', 'foo/bar1', 'foo/bar2', - ), - ), - 'equal weight sorted alphabetically' => array( - array( - $this->createPackage('foo/bar10', array('foo/dep')), - $this->createPackage('foo/bar2', array('foo/dep')), - $this->createPackage('foo/baz', array('foo/dep')), - $this->createPackage('foo/dep', array()), - ), - array( + ], + ], + 'equal weight sorted alphabetically' => [ + [ + $this->createPackage('foo/bar10', ['foo/dep']), + $this->createPackage('foo/bar2', ['foo/dep']), + $this->createPackage('foo/baz', ['foo/dep']), + $this->createPackage('foo/dep', []), + ], + [ 'foo/dep', 'foo/bar2', 'foo/bar10', 'foo/baz', - ), - ), - 'pre-weighted packages bumped to top incl their deps' => array( - array( - $this->createPackage('foo/bar', array('foo/dep')), - $this->createPackage('foo/bar2', array('foo/dep2')), - $this->createPackage('foo/dep', array()), - $this->createPackage('foo/dep2', array()), - ), - array( + ], + ], + 'pre-weighted packages bumped to top incl their deps' => [ + [ + $this->createPackage('foo/bar', ['foo/dep']), + $this->createPackage('foo/bar2', ['foo/dep2']), + $this->createPackage('foo/dep', []), + $this->createPackage('foo/dep2', []), + ], + [ 'foo/dep', 'foo/bar', 'foo/dep2', 'foo/bar2', - ), - array( - 'foo/bar' => -1000 - ) - ), - ); + ], + [ + 'foo/bar' => -1000, + ], + ], + ]; } /** @@ -157,7 +157,7 @@ public function sortingOrdersDependenciesHigherThanPackageDataProvider(): array public function testSortingOrdersDependenciesHigherThanPackage(array $packages, array $expectedOrderedList, array $weights = []): void { $sortedPackages = PackageSorter::sortPackages($packages, $weights); - $sortedPackageNames = array_map(function ($package): string { + $sortedPackageNames = array_map(static function ($package): string { return $package->getName(); }, $sortedPackages); @@ -165,16 +165,13 @@ public function testSortingOrdersDependenciesHigherThanPackage(array $packages, } /** - * @param string $name * @param string[] $requires - * - * @return Package */ private function createPackage(string $name, array $requires): Package { $package = new Package($name, '1.0.0.0', '1.0.0'); - $links = array(); + $links = []; foreach ($requires as $requireName) { $links[$requireName] = new Link($package->getName(), $requireName, new MatchAllConstraint); } diff --git a/tests/Composer/Test/Util/PerforceTest.php b/tests/Composer/Test/Util/PerforceTest.php index 44617633abd4..6fd37e559d84 100644 --- a/tests/Composer/Test/Util/PerforceTest.php +++ b/tests/Composer/Test/Util/PerforceTest.php @@ -52,12 +52,12 @@ protected function setUp(): void */ public function getTestRepoConfig(): array { - return array( + return [ 'depot' => self::TEST_DEPOT, 'branch' => self::TEST_BRANCH, 'p4user' => self::TEST_P4USER, 'unique_perforce_client_name' => self::TEST_CLIENT_NAME, - ); + ]; } /** @@ -68,11 +68,6 @@ public function getMockIOInterface() return $this->getMockBuilder('Composer\IO\IOInterface')->getMock(); } - /** - * @param bool $flag - * - * @return void - */ protected function createNewPerforceWithWindowsFlag(bool $flag): void { $this->perforce = new Perforce($this->repoConfig, self::TEST_PORT, self::TEST_PATH, $this->processExecutor, $flag, $this->io); @@ -225,12 +220,12 @@ public function testQueryP4UserStoresResponseToQueryForUserWithoutWindows(): voi public function testQueryP4PasswordWithPasswordAlreadySet(): void { - $repoConfig = array( + $repoConfig = [ 'depot' => 'depot', 'branch' => 'branch', 'p4user' => 'user', 'p4password' => 'TEST_PASSWORD', - ); + ]; $this->perforce = new Perforce($repoConfig, 'port', 'path', $this->processExecutor, false, $this->getMockIOInterface()); $password = $this->perforce->queryP4Password(); $this->assertEquals('TEST_PASSWORD', $password); @@ -451,12 +446,12 @@ public function testGetComposerInformationWithoutLabelWithoutStream(): void ); $result = $this->perforce->getComposerInformation('//depot'); - $expected = array( + $expected = [ 'name' => 'test/perforce', 'description' => 'Basic project for testing', 'minimum-stability' => 'dev', - 'autoload' => array('psr-0' => array()), - ); + 'autoload' => ['psr-0' => []], + ]; $this->assertEquals($expected, $result); } @@ -478,12 +473,12 @@ public function testGetComposerInformationWithLabelWithoutStream(): void $result = $this->perforce->getComposerInformation('//depot@0.0.1'); - $expected = array( + $expected = [ 'name' => 'test/perforce', 'description' => 'Basic project for testing', 'minimum-stability' => 'dev', - 'autoload' => array('psr-0' => array()), - ); + 'autoload' => ['psr-0' => []], + ]; $this->assertEquals($expected, $result); } @@ -503,12 +498,12 @@ public function testGetComposerInformationWithoutLabelWithStream(): void $result = $this->perforce->getComposerInformation('//depot/branch'); - $expected = array( + $expected = [ 'name' => 'test/perforce', 'description' => 'Basic project for testing', 'minimum-stability' => 'dev', - 'autoload' => array('psr-0' => array()), - ); + 'autoload' => ['psr-0' => []], + ]; $this->assertEquals($expected, $result); } @@ -532,12 +527,12 @@ public function testGetComposerInformationWithLabelWithStream(): void $result = $this->perforce->getComposerInformation('//depot/branch@0.0.1'); - $expected = array( + $expected = [ 'name' => 'test/perforce', 'description' => 'Basic project for testing', 'minimum-stability' => 'dev', - 'autoload' => array('psr-0' => array()), - ); + 'autoload' => ['psr-0' => []], + ]; $this->assertEquals($expected, $result); } @@ -578,8 +573,6 @@ public function testCheckServerExists(): void * Test if "p4" command is missing. * * @covers \Composer\Util\Perforce::checkServerExists - * - * @return void */ public function testCheckServerClientError(): void { @@ -595,9 +588,6 @@ public function testCheckServerClientError(): void $this->assertFalse($result); } - /** - * @return string - */ public static function getComposerJson(): string { return JsonFile::encode([ @@ -611,13 +601,11 @@ public static function getComposerJson(): string } /** - * @param bool $withStream - * * @return string[] */ private function getExpectedClientSpec(bool $withStream): array { - $expectedArray = array( + $expectedArray = [ 'Client: composer_perforce_TEST_depot', PHP_EOL, 'Update:', @@ -636,7 +624,7 @@ private function getExpectedClientSpec(bool $withStream): array PHP_EOL, 'LineEnd: local', PHP_EOL, - ); + ]; if ($withStream) { $expectedArray[] = 'Stream:'; $expectedArray[] = ' //depot/branch'; @@ -647,9 +635,6 @@ private function getExpectedClientSpec(bool $withStream): array return $expectedArray; } - /** - * @return void - */ private function setPerforceToStream(): void { $this->perforce->setStream('//depot/branch'); diff --git a/tests/Composer/Test/Util/ProcessExecutorTest.php b/tests/Composer/Test/Util/ProcessExecutorTest.php index 8af418d4de7e..72a73652afe5 100644 --- a/tests/Composer/Test/Util/ProcessExecutorTest.php +++ b/tests/Composer/Test/Util/ProcessExecutorTest.php @@ -69,9 +69,6 @@ public function testTimeout(): void /** * @dataProvider hidePasswordProvider - * - * @param string $command - * @param string $expectedCommandOutput */ public function testHidePasswords(string $command, string $expectedCommandOutput): void { @@ -82,13 +79,13 @@ public function testHidePasswords(string $command, string $expectedCommandOutput public function hidePasswordProvider(): array { - return array( - array('echo https://foo:bar@example.org/', 'echo https://foo:***@example.org/'), - array('echo http://foo@example.org', 'echo http://foo@example.org'), - array('echo http://abcdef1234567890234578:x-oauth-token@github.com/', 'echo http://***:***@github.com/'), - array("svn ls --verbose --non-interactive --username 'foo' --password 'bar' 'https://foo.example.org/svn/'", "svn ls --verbose --non-interactive --username 'foo' --password '***' 'https://foo.example.org/svn/'"), - array("svn ls --verbose --non-interactive --username 'foo' --password 'bar \'bar' 'https://foo.example.org/svn/'", "svn ls --verbose --non-interactive --username 'foo' --password '***' 'https://foo.example.org/svn/'"), - ); + return [ + ['echo https://foo:bar@example.org/', 'echo https://foo:***@example.org/'], + ['echo http://foo@example.org', 'echo http://foo@example.org'], + ['echo http://abcdef1234567890234578:x-oauth-token@github.com/', 'echo http://***:***@github.com/'], + ["svn ls --verbose --non-interactive --username 'foo' --password 'bar' 'https://foo.example.org/svn/'", "svn ls --verbose --non-interactive --username 'foo' --password '***' 'https://foo.example.org/svn/'"], + ["svn ls --verbose --non-interactive --username 'foo' --password 'bar \'bar' 'https://foo.example.org/svn/'", "svn ls --verbose --non-interactive --username 'foo' --password '***' 'https://foo.example.org/svn/'"], + ]; } public function testDoesntHidePorts(): void @@ -101,18 +98,18 @@ public function testDoesntHidePorts(): void public function testSplitLines(): void { $process = new ProcessExecutor; - $this->assertEquals(array(), $process->splitLines('')); - $this->assertEquals(array(), $process->splitLines(null)); - $this->assertEquals(array('foo'), $process->splitLines('foo')); - $this->assertEquals(array('foo', 'bar'), $process->splitLines("foo\nbar")); - $this->assertEquals(array('foo', 'bar'), $process->splitLines("foo\r\nbar")); - $this->assertEquals(array('foo', 'bar'), $process->splitLines("foo\r\nbar\n")); + $this->assertEquals([], $process->splitLines('')); + $this->assertEquals([], $process->splitLines(null)); + $this->assertEquals(['foo'], $process->splitLines('foo')); + $this->assertEquals(['foo', 'bar'], $process->splitLines("foo\nbar")); + $this->assertEquals(['foo', 'bar'], $process->splitLines("foo\r\nbar")); + $this->assertEquals(['foo', 'bar'], $process->splitLines("foo\r\nbar\n")); } public function testConsoleIODoesNotFormatSymfonyConsoleStyle(): void { $output = new BufferedOutput(OutputInterface::VERBOSITY_NORMAL, true); - $process = new ProcessExecutor(new ConsoleIO(new ArrayInput(array()), $output, new HelperSet(array()))); + $process = new ProcessExecutor(new ConsoleIO(new ArrayInput([]), $output, new HelperSet([]))); $process->execute('php -ddisplay_errors=0 -derror_reporting=0 -r "echo \'foo\'.PHP_EOL;"'); $this->assertSame('foo'.PHP_EOL, $output->fetch()); @@ -139,8 +136,6 @@ public function testExecuteAsyncCancel(): void * @dataProvider dataEscapeArguments * * @param string|false|null $argument - * @param string $win - * @param string $unix */ public function testEscapeArgument($argument, string $win, string $unix): void { @@ -154,75 +149,75 @@ public function testEscapeArgument($argument, string $win, string $unix): void */ public function dataEscapeArguments(): array { - return array( + return [ // empty argument - must be quoted - 'empty' => array('', '""', "''"), + 'empty' => ['', '""', "''"], // null argument - must be quoted - 'empty null' => array(null, '""', "''"), + 'empty null' => [null, '""', "''"], // false argument - must be quoted - 'empty false' => array(false, '""', "''"), + 'empty false' => [false, '""', "''"], // unix single-quote must be escaped - 'unix-sq' => array("a'bc", "a'bc", "'a'\\''bc'"), + 'unix-sq' => ["a'bc", "a'bc", "'a'\\''bc'"], // new lines must be replaced - 'new lines' => array("a\nb\nc", '"a b c"', "'a\nb\nc'"), + 'new lines' => ["a\nb\nc", '"a b c"', "'a\nb\nc'"], // whitespace must be quoted - 'ws space' => array('a b c', '"a b c"', "'a b c'"), + 'ws space' => ['a b c', '"a b c"', "'a b c'"], // whitespace must be quoted - 'ws tab' => array("a\tb\tc", "\"a\tb\tc\"", "'a\tb\tc'"), + 'ws tab' => ["a\tb\tc", "\"a\tb\tc\"", "'a\tb\tc'"], // no whitespace must not be quoted - 'no-ws' => array('abc', 'abc', "'abc'"), + 'no-ws' => ['abc', 'abc', "'abc'"], // commas must be quoted - 'comma' => array('a,bc', '"a,bc"', "'a,bc'"), + 'comma' => ['a,bc', '"a,bc"', "'a,bc'"], // double-quotes must be backslash-escaped - 'dq' => array('a"bc', 'a\^"bc', "'a\"bc'"), + 'dq' => ['a"bc', 'a\^"bc', "'a\"bc'"], // double-quotes must be backslash-escaped with preceeding backslashes doubled - 'dq-bslash' => array('a\\"bc', 'a\\\\\^"bc', "'a\\\"bc'"), + 'dq-bslash' => ['a\\"bc', 'a\\\\\^"bc', "'a\\\"bc'"], // backslashes not preceeding a double-quote are treated as literal - 'bslash' => array('ab\\\\c\\', 'ab\\\\c\\', "'ab\\\\c\\'"), + 'bslash' => ['ab\\\\c\\', 'ab\\\\c\\', "'ab\\\\c\\'"], // trailing backslashes must be doubled up when the argument is quoted - 'bslash dq' => array('a b c\\\\', '"a b c\\\\\\\\"', "'a b c\\\\'"), + 'bslash dq' => ['a b c\\\\', '"a b c\\\\\\\\"', "'a b c\\\\'"], // meta: outer double-quotes must be caret-escaped as well - 'meta dq' => array('a "b" c', '^"a \^"b\^" c^"', "'a \"b\" c'"), + 'meta dq' => ['a "b" c', '^"a \^"b\^" c^"', "'a \"b\" c'"], // meta: percent expansion must be caret-escaped - 'meta-pc1' => array('%path%', '^%path^%', "'%path%'"), + 'meta-pc1' => ['%path%', '^%path^%', "'%path%'"], // meta: expansion must have two percent characters - 'meta-pc2' => array('%path', '%path', "'%path'"), + 'meta-pc2' => ['%path', '%path', "'%path'"], // meta: expansion must have have two surrounding percent characters - 'meta-pc3' => array('%%path', '%%path', "'%%path'"), + 'meta-pc3' => ['%%path', '%%path', "'%%path'"], // meta: bang expansion must be double caret-escaped - 'meta-bang1' => array('!path!', '^^!path^^!', "'!path!'"), + 'meta-bang1' => ['!path!', '^^!path^^!', "'!path!'"], // meta: bang expansion must have two bang characters - 'meta-bang2' => array('!path', '!path', "'!path'"), + 'meta-bang2' => ['!path', '!path', "'!path'"], // meta: bang expansion must have two surrounding ang characters - 'meta-bang3' => array('!!path', '!!path', "'!!path'"), + 'meta-bang3' => ['!!path', '!!path', "'!!path'"], // meta: caret-escaping must escape all other meta chars (triggered by double-quote) - 'meta-all-dq' => array('<>"&|()^', '^<^>\^"^&^|^(^)^^', "'<>\"&|()^'"), + 'meta-all-dq' => ['<>"&|()^', '^<^>\^"^&^|^(^)^^', "'<>\"&|()^'"], // other meta: no caret-escaping when whitespace in argument - 'other meta' => array('<> &| ()^', '"<> &| ()^"', "'<> &| ()^'"), + 'other meta' => ['<> &| ()^', '"<> &| ()^"', "'<> &| ()^'"], // other meta: quote escape chars when no whitespace in argument - 'other-meta' => array('<>&|()^', '"<>&|()^"', "'<>&|()^'"), - ); + 'other-meta' => ['<>&|()^', '"<>&|()^"', "'<>&|()^'"], + ]; } } diff --git a/tests/Composer/Test/Util/RemoteFilesystemTest.php b/tests/Composer/Test/Util/RemoteFilesystemTest.php index 4fc7c745409f..d7326b1492b5 100644 --- a/tests/Composer/Test/Util/RemoteFilesystemTest.php +++ b/tests/Composer/Test/Util/RemoteFilesystemTest.php @@ -33,7 +33,7 @@ public function testGetOptionsForUrl(): void ->willReturn(false) ; - $res = $this->callGetOptionsForUrl($io, array('http://example.org', array())); + $res = $this->callGetOptionsForUrl($io, ['http://example.org', []]); $this->assertTrue(isset($res['http']['header']) && is_array($res['http']['header']), 'getOptions must return an array with headers'); } @@ -48,10 +48,10 @@ public function testGetOptionsForUrlWithAuthorization(): void $io ->expects($this->once()) ->method('getAuthentication') - ->willReturn(array('username' => 'login', 'password' => 'password')) + ->willReturn(['username' => 'login', 'password' => 'password']) ; - $options = $this->callGetOptionsForUrl($io, array('http://example.org', array())); + $options = $this->callGetOptionsForUrl($io, ['http://example.org', []]); $found = false; foreach ($options['http']['header'] as $header) { @@ -74,14 +74,14 @@ public function testGetOptionsForUrlWithStreamOptions(): void $io ->expects($this->once()) ->method('getAuthentication') - ->willReturn(array('username' => null, 'password' => null)) + ->willReturn(['username' => null, 'password' => null]) ; - $streamOptions = array('ssl' => array( + $streamOptions = ['ssl' => [ 'allow_self_signed' => true, - )); + ]]; - $res = $this->callGetOptionsForUrl($io, array('https://example.org', array()), $streamOptions); + $res = $this->callGetOptionsForUrl($io, ['https://example.org', []], $streamOptions); $this->assertTrue( isset($res['ssl'], $res['ssl']['allow_self_signed']) && true === $res['ssl']['allow_self_signed'], 'getOptions must return an array with a allow_self_signed set to true' @@ -100,14 +100,14 @@ public function testGetOptionsForUrlWithCallOptionsKeepsHeader(): void $io ->expects($this->once()) ->method('getAuthentication') - ->willReturn(array('username' => null, 'password' => null)) + ->willReturn(['username' => null, 'password' => null]) ; - $streamOptions = array('http' => array( + $streamOptions = ['http' => [ 'header' => 'Foo: bar', - )); + ]]; - $res = $this->callGetOptionsForUrl($io, array('https://example.org', $streamOptions)); + $res = $this->callGetOptionsForUrl($io, ['https://example.org', $streamOptions]); $this->assertTrue(isset($res['http']['header']), 'getOptions must return an array with a http.header key'); $found = false; @@ -173,11 +173,11 @@ public function testCopy(): void public function testCopyWithNoRetryOnFailure(): void { self::expectException('Composer\Downloader\TransportException'); - $fs = $this->getRemoteFilesystemWithMockedMethods(array('getRemoteContents')); + $fs = $this->getRemoteFilesystemWithMockedMethods(['getRemoteContents']); $fs->expects($this->once())->method('getRemoteContents') - ->willReturnCallback(function ($originUrl, $fileUrl, $ctx, &$http_response_header): string { - $http_response_header = array('http/1.1 401 unauthorized'); + ->willReturnCallback(static function ($originUrl, $fileUrl, $ctx, &$http_response_header): string { + $http_response_header = ['http/1.1 401 unauthorized']; return ''; }); @@ -190,32 +190,32 @@ public function testCopyWithNoRetryOnFailure(): void 'file://' . __FILE__, $file, true, - array('retry-auth-failure' => false) + ['retry-auth-failure' => false] ); } public function testCopyWithSuccessOnRetry(): void { - $authHelper = $this->getAuthHelperWithMockedMethods(array('promptAuthIfNeeded')); - $fs = $this->getRemoteFilesystemWithMockedMethods(array('getRemoteContents'), $authHelper); + $authHelper = $this->getAuthHelperWithMockedMethods(['promptAuthIfNeeded']); + $fs = $this->getRemoteFilesystemWithMockedMethods(['getRemoteContents'], $authHelper); $authHelper->expects($this->once()) ->method('promptAuthIfNeeded') - ->willReturn(array( + ->willReturn([ 'storeAuth' => true, 'retry' => true, - )); + ]); $counter = 0; $fs->expects($this->exactly(2)) ->method('getRemoteContents') - ->willReturnCallback(function ($originUrl, $fileUrl, $ctx, &$http_response_header) use (&$counter) { + ->willReturnCallback(static function ($originUrl, $fileUrl, $ctx, &$http_response_header) use (&$counter) { if ($counter++ === 0) { - $http_response_header = array('http/1.1 401 unauthorized'); + $http_response_header = ['http/1.1 401 unauthorized']; return ''; } else { - $http_response_header = array('http/1.1 200 OK'); + $http_response_header = ['http/1.1 200 OK']; return ' true) + ['retry-auth-failure' => true] ); $this->assertTrue($copyResult); @@ -245,7 +245,7 @@ public function testGetOptionsForUrlCreatesSecureTlsDefaults(): void { $io = $this->getIOInterfaceMock(); - $res = $this->callGetOptionsForUrl($io, array('example.org', array('ssl' => array('cafile' => '/some/path/file.crt'))), array(), 'http://www.example.org'); + $res = $this->callGetOptionsForUrl($io, ['example.org', ['ssl' => ['cafile' => '/some/path/file.crt']]], [], 'http://www.example.org'); $this->assertTrue(isset($res['ssl']['ciphers'])); $this->assertMatchesRegularExpression('|!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA|', $res['ssl']['ciphers']); @@ -267,16 +267,14 @@ public function testGetOptionsForUrlCreatesSecureTlsDefaults(): void */ public function provideBitbucketPublicDownloadUrls(): array { - return array( - array('https://bitbucket.org/seldaek/composer-live-test-repo/downloads/composer-unit-test-download-me.txt', '1234'), - ); + return [ + ['https://bitbucket.org/seldaek/composer-live-test-repo/downloads/composer-unit-test-download-me.txt', '1234'], + ]; } /** * Tests that a BitBucket public download is correctly retrieved. * - * @param string $url - * @param string $contents * @dataProvider provideBitbucketPublicDownloadUrls */ public function testBitBucketPublicDownload(string $url, string $contents): void @@ -298,8 +296,6 @@ public function testBitBucketPublicDownload(string $url, string $contents): void /** * Tests that a BitBucket public download is correctly retrieved when `bitbucket-oauth` is configured. * - * @param string $url - * @param string $contents * @dataProvider provideBitbucketPublicDownloadUrls */ public function testBitBucketPublicDownloadWithAuthConfigured(string $url, string $contents): void @@ -310,10 +306,10 @@ public function testBitBucketPublicDownloadWithAuthConfigured(string $url, strin ->disableOriginalConstructor() ->getMock(); - $domains = array(); + $domains = []; $io ->method('hasAuthentication') - ->willReturnCallback(function ($arg) use (&$domains): bool { + ->willReturnCallback(static function ($arg) use (&$domains): bool { $domains[] = $arg; // first time is called with bitbucket.org, then it redirects to bbuseruploads.s3.amazonaws.com so next time we have no auth configured return $arg === 'bitbucket.org'; @@ -321,11 +317,11 @@ public function testBitBucketPublicDownloadWithAuthConfigured(string $url, strin $io ->method('getAuthentication') ->with('bitbucket.org') - ->willReturn(array( + ->willReturn([ 'username' => 'x-token-auth', // This token is fake, but it matches a valid token's pattern. 'password' => '1A0yeK5Po3ZEeiiRiMWLivS0jirLdoGuaSGq9NvESFx1Fsdn493wUDXC8rz_1iKVRTl1GINHEUCsDxGh5lZ=', - )); + ]); $rfs = new RemoteFilesystem($io, $this->getConfigMock()); $hostname = parse_url($url, PHP_URL_HOST); @@ -333,17 +329,16 @@ public function testBitBucketPublicDownloadWithAuthConfigured(string $url, strin $result = $rfs->getContents($hostname, $url, false); $this->assertEquals($contents, $result); - $this->assertEquals(array('bitbucket.org', 'bbuseruploads.s3.amazonaws.com'), $domains); + $this->assertEquals(['bitbucket.org', 'bbuseruploads.s3.amazonaws.com'], $domains); } /** * @param mixed[] $args * @param mixed[] $options - * @param string $fileUrl * * @return mixed[] */ - private function callGetOptionsForUrl(IOInterface $io, array $args = array(), array $options = array(), string $fileUrl = ''): array + private function callGetOptionsForUrl(IOInterface $io, array $args = [], array $options = [], string $fileUrl = ''): array { $fs = new RemoteFilesystem($io, $this->getConfigMock(), $options); $ref = new ReflectionMethod($fs, 'getOptionsForUrl'); @@ -364,9 +359,9 @@ private function getConfigMock() $config = $this->getMockBuilder('Composer\Config')->getMock(); $config ->method('get') - ->willReturnCallback(function ($key) { + ->willReturnCallback(static function ($key) { if ($key === 'github-domains' || $key === 'gitlab-domains') { - return array(); + return []; } return null; @@ -375,16 +370,6 @@ private function getConfigMock() return $config; } - /** - * @param int $notificationCode - * @param int $severity - * @param string $message - * @param int $messageCode - * @param int $bytesTransferred - * @param int $bytesMax - * - * @return void - */ private function callCallbackGet(RemoteFilesystem $fs, int $notificationCode, int $severity, string $message, int $messageCode, int $bytesTransferred, int $bytesMax): void { $ref = new ReflectionMethod($fs, 'callbackGet'); @@ -394,10 +379,7 @@ private function callCallbackGet(RemoteFilesystem $fs, int $notificationCode, in /** * @param object|string $object - * @param string $attribute * @param mixed $value - * - * @return void */ private function setAttribute($object, string $attribute, $value): void { @@ -408,10 +390,7 @@ private function setAttribute($object, string $attribute, $value): void /** * @param mixed $value - * @param string $attribute * @param object|string $object - * - * @return void */ private function assertAttributeEqualsCustom($value, string $attribute, $object): void { @@ -433,16 +412,16 @@ private function getIOInterfaceMock() * * @return RemoteFilesystem|MockObject */ - private function getRemoteFilesystemWithMockedMethods(array $mockedMethods, AuthHelper $authHelper = null) + private function getRemoteFilesystemWithMockedMethods(array $mockedMethods, ?AuthHelper $authHelper = null) { return $this->getMockBuilder('Composer\Util\RemoteFilesystem') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->getIOInterfaceMock(), $this->getConfigMock(), - array(), + [], false, $authHelper, - )) + ]) ->onlyMethods($mockedMethods) ->getMock(); } @@ -455,10 +434,10 @@ private function getRemoteFilesystemWithMockedMethods(array $mockedMethods, Auth private function getAuthHelperWithMockedMethods(array $mockedMethods) { return $this->getMockBuilder('Composer\Util\AuthHelper') - ->setConstructorArgs(array( + ->setConstructorArgs([ $this->getIOInterfaceMock(), $this->getConfigMock(), - )) + ]) ->onlyMethods($mockedMethods) ->getMock(); } diff --git a/tests/Composer/Test/Util/SilencerTest.php b/tests/Composer/Test/Util/SilencerTest.php index 0c9ad5777a24..9161dae60123 100644 --- a/tests/Composer/Test/Util/SilencerTest.php +++ b/tests/Composer/Test/Util/SilencerTest.php @@ -35,7 +35,7 @@ public function testSilencer(): void Silencer::restore(); // Check all parameters and return values are passed correctly in a silenced call. - $result = Silencer::call(function ($a, $b, $c) { + $result = Silencer::call(static function ($a, $b, $c) { @trigger_error('Test', E_USER_WARNING); return $a * $b * $c; @@ -54,7 +54,7 @@ public function testSilencedException(): void $verification = microtime(); self::expectException('RuntimeException'); self::expectExceptionMessage($verification); - Silencer::call(function () use ($verification): void { + Silencer::call(static function () use ($verification): void { throw new \RuntimeException($verification); }); } diff --git a/tests/Composer/Test/Util/StreamContextFactoryTest.php b/tests/Composer/Test/Util/StreamContextFactoryTest.php index e16d9ad79061..3632479345ca 100644 --- a/tests/Composer/Test/Util/StreamContextFactoryTest.php +++ b/tests/Composer/Test/Util/StreamContextFactoryTest.php @@ -51,17 +51,17 @@ public function testGetContext(array $expectedOptions, array $defaultOptions, ar public function dataGetContext(): array { - return array( - array( - $a = array('http' => array('follow_location' => 1, 'max_redirects' => 20, 'header' => array('User-Agent: foo'))), array('http' => array('header' => 'User-Agent: foo')), - array('options' => $a), array(), - ), - array( - $a = array('http' => array('method' => 'GET', 'max_redirects' => 20, 'follow_location' => 1, 'header' => array('User-Agent: foo'))), array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo')), - array('options' => $a, 'notification' => $f = function (): void { - }), array('notification' => $f), - ), - ); + return [ + [ + $a = ['http' => ['follow_location' => 1, 'max_redirects' => 20, 'header' => ['User-Agent: foo']]], ['http' => ['header' => 'User-Agent: foo']], + ['options' => $a], [], + ], + [ + $a = ['http' => ['method' => 'GET', 'max_redirects' => 20, 'follow_location' => 1, 'header' => ['User-Agent: foo']]], ['http' => ['method' => 'GET', 'header' => 'User-Agent: foo']], + ['options' => $a, 'notification' => $f = static function (): void { + }], ['notification' => $f], + ], + ]; } public function testHttpProxy(): void @@ -69,17 +69,17 @@ public function testHttpProxy(): void $_SERVER['http_proxy'] = 'http://username:p%40ssword@proxyserver.net:3128/'; $_SERVER['HTTP_PROXY'] = 'http://proxyserver/'; - $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo'))); + $context = StreamContextFactory::getContext('http://example.org', ['http' => ['method' => 'GET', 'header' => 'User-Agent: foo']]); $options = stream_context_get_options($context); - $this->assertEquals(array('http' => array( + $this->assertEquals(['http' => [ 'proxy' => 'tcp://proxyserver.net:3128', 'request_fulluri' => true, 'method' => 'GET', - 'header' => array('User-Agent: foo', "Proxy-Authorization: Basic " . base64_encode('username:p@ssword')), + 'header' => ['User-Agent: foo', "Proxy-Authorization: Basic " . base64_encode('username:p@ssword')], 'max_redirects' => 20, 'follow_location' => 1, - )), $options); + ]], $options); } public function testHttpProxyWithNoProxy(): void @@ -87,15 +87,15 @@ public function testHttpProxyWithNoProxy(): void $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; $_SERVER['no_proxy'] = 'foo,example.org'; - $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo'))); + $context = StreamContextFactory::getContext('http://example.org', ['http' => ['method' => 'GET', 'header' => 'User-Agent: foo']]); $options = stream_context_get_options($context); - $this->assertEquals(array('http' => array( + $this->assertEquals(['http' => [ 'method' => 'GET', 'max_redirects' => 20, 'follow_location' => 1, - 'header' => array('User-Agent: foo'), - )), $options); + 'header' => ['User-Agent: foo'], + ]], $options); } public function testHttpProxyWithNoProxyWildcard(): void @@ -103,48 +103,48 @@ public function testHttpProxyWithNoProxyWildcard(): void $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; $_SERVER['no_proxy'] = '*'; - $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo'))); + $context = StreamContextFactory::getContext('http://example.org', ['http' => ['method' => 'GET', 'header' => 'User-Agent: foo']]); $options = stream_context_get_options($context); - $this->assertEquals(array('http' => array( + $this->assertEquals(['http' => [ 'method' => 'GET', 'max_redirects' => 20, 'follow_location' => 1, - 'header' => array('User-Agent: foo'), - )), $options); + 'header' => ['User-Agent: foo'], + ]], $options); } public function testOptionsArePreserved(): void { $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; - $context = StreamContextFactory::getContext('http://example.org', array('http' => array('method' => 'GET', 'header' => array('User-Agent: foo', "X-Foo: bar"), 'request_fulluri' => false))); + $context = StreamContextFactory::getContext('http://example.org', ['http' => ['method' => 'GET', 'header' => ['User-Agent: foo', "X-Foo: bar"], 'request_fulluri' => false]]); $options = stream_context_get_options($context); - $this->assertEquals(array('http' => array( + $this->assertEquals(['http' => [ 'proxy' => 'tcp://proxyserver.net:3128', 'request_fulluri' => false, 'method' => 'GET', - 'header' => array('User-Agent: foo', "X-Foo: bar", "Proxy-Authorization: Basic " . base64_encode('username:password')), + 'header' => ['User-Agent: foo', "X-Foo: bar", "Proxy-Authorization: Basic " . base64_encode('username:password')], 'max_redirects' => 20, 'follow_location' => 1, - )), $options); + ]], $options); } public function testHttpProxyWithoutPort(): void { $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net'; - $context = StreamContextFactory::getContext('https://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo'))); + $context = StreamContextFactory::getContext('https://example.org', ['http' => ['method' => 'GET', 'header' => 'User-Agent: foo']]); $options = stream_context_get_options($context); - $this->assertEquals(array('http' => array( + $this->assertEquals(['http' => [ 'proxy' => 'tcp://proxyserver.net:80', 'method' => 'GET', - 'header' => array('User-Agent: foo', "Proxy-Authorization: Basic " . base64_encode('username:password')), + 'header' => ['User-Agent: foo', "Proxy-Authorization: Basic " . base64_encode('username:password')], 'max_redirects' => 20, 'follow_location' => 1, - )), $options); + ]], $options); } public function testHttpsProxyOverride(): void @@ -158,30 +158,27 @@ public function testHttpsProxyOverride(): void // Pointless test replaced by ProxyHelperTest.php self::expectException('Composer\Downloader\TransportException'); - $context = StreamContextFactory::getContext('https://example.org', array('http' => array('method' => 'GET', 'header' => 'User-Agent: foo'))); + $context = StreamContextFactory::getContext('https://example.org', ['http' => ['method' => 'GET', 'header' => 'User-Agent: foo']]); } /** * @dataProvider dataSSLProxy - * - * @param string $expected - * @param string $proxy */ public function testSSLProxy(string $expected, string $proxy): void { $_SERVER['http_proxy'] = $proxy; if (extension_loaded('openssl')) { - $context = StreamContextFactory::getContext('http://example.org', array('http' => array('header' => 'User-Agent: foo'))); + $context = StreamContextFactory::getContext('http://example.org', ['http' => ['header' => 'User-Agent: foo']]); $options = stream_context_get_options($context); - $this->assertEquals(array('http' => array( + $this->assertEquals(['http' => [ 'proxy' => $expected, 'request_fulluri' => true, 'max_redirects' => 20, 'follow_location' => 1, - 'header' => array('User-Agent: foo'), - )), $options); + 'header' => ['User-Agent: foo'], + ]], $options); } else { try { StreamContextFactory::getContext('http://example.org'); @@ -194,29 +191,29 @@ public function testSSLProxy(string $expected, string $proxy): void public function dataSSLProxy(): array { - return array( - array('ssl://proxyserver:443', 'https://proxyserver/'), - array('ssl://proxyserver:8443', 'https://proxyserver:8443'), - ); + return [ + ['ssl://proxyserver:443', 'https://proxyserver/'], + ['ssl://proxyserver:8443', 'https://proxyserver:8443'], + ]; } public function testEnsureThatfixHttpHeaderFieldMovesContentTypeToEndOfOptions(): void { - $options = array( - 'http' => array( + $options = [ + 'http' => [ 'header' => "User-agent: foo\r\nX-Foo: bar\r\nContent-Type: application/json\r\nAuthorization: Basic aW52YWxpZA==", - ), - ); - $expectedOptions = array( - 'http' => array( - 'header' => array( + ], + ]; + $expectedOptions = [ + 'http' => [ + 'header' => [ "User-agent: foo", "X-Foo: bar", "Authorization: Basic aW52YWxpZA==", "Content-Type: application/json", - ), - ), - ); + ], + ], + ]; $context = StreamContextFactory::getContext('http://example.org', $options); $ctxoptions = stream_context_get_options($context); $this->assertEquals(end($expectedOptions['http']['header']), end($ctxoptions['http']['header'])); @@ -226,7 +223,7 @@ public function testInitOptionsDoesIncludeProxyAuthHeaders(): void { $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; - $options = array(); + $options = []; $options = StreamContextFactory::initOptions('https://example.org', $options); $headers = implode(' ', $options['http']['header']); @@ -241,7 +238,7 @@ public function testInitOptionsForCurlDoesNotIncludeProxyAuthHeaders(): void $_SERVER['http_proxy'] = 'http://username:password@proxyserver.net:3128/'; - $options = array(); + $options = []; $options = StreamContextFactory::initOptions('https://example.org', $options, true); $headers = implode(' ', $options['http']['header']); diff --git a/tests/Composer/Test/Util/SvnTest.php b/tests/Composer/Test/Util/SvnTest.php index 4f5d2eaec116..3b2509200f57 100644 --- a/tests/Composer/Test/Util/SvnTest.php +++ b/tests/Composer/Test/Util/SvnTest.php @@ -38,11 +38,11 @@ public function testCredentials(string $url, string $expect): void public function urlProvider(): array { - return array( - array('http://till:test@svn.example.org/', $this->getCmd(" --username 'till' --password 'test' ")), - array('http://svn.apache.org/', ''), - array('svn://johndoe@example.org', $this->getCmd(" --username 'johndoe' --password '' ")), - ); + return [ + ['http://till:test@svn.example.org/', $this->getCmd(" --username 'till' --password 'test' ")], + ['http://svn.apache.org/', ''], + ['svn://johndoe@example.org', $this->getCmd(" --username 'johndoe' --password '' ")], + ]; } public function testInteractiveString(): void @@ -55,7 +55,7 @@ public function testInteractiveString(): void $this->assertEquals( $this->getCmd("svn ls --non-interactive -- 'http://svn.example.org'"), - $reflMethod->invokeArgs($svn, array('svn ls', $url)) + $reflMethod->invokeArgs($svn, ['svn ls', $url]) ); } @@ -64,13 +64,13 @@ public function testCredentialsFromConfig(): void $url = 'http://svn.apache.org'; $config = new Config(); - $config->merge(array( - 'config' => array( - 'http-basic' => array( - 'svn.apache.org' => array('username' => 'foo', 'password' => 'bar'), - ), - ), - )); + $config->merge([ + 'config' => [ + 'http-basic' => [ + 'svn.apache.org' => ['username' => 'foo', 'password' => 'bar'], + ], + ], + ]); $svn = new Svn($url, new NullIO, $config); $reflMethod = new \ReflectionMethod('Composer\\Util\\Svn', 'getCredentialString'); @@ -85,13 +85,13 @@ public function testCredentialsFromConfigWithCacheCredentialsTrue(): void $config = new Config(); $config->merge( - array( - 'config' => array( - 'http-basic' => array( - 'svn.apache.org' => array('username' => 'foo', 'password' => 'bar'), - ), - ), - ) + [ + 'config' => [ + 'http-basic' => [ + 'svn.apache.org' => ['username' => 'foo', 'password' => 'bar'], + ], + ], + ] ); $svn = new Svn($url, new NullIO, $config); @@ -108,13 +108,13 @@ public function testCredentialsFromConfigWithCacheCredentialsFalse(): void $config = new Config(); $config->merge( - array( - 'config' => array( - 'http-basic' => array( - 'svn.apache.org' => array('username' => 'foo', 'password' => 'bar'), - ), - ), - ) + [ + 'config' => [ + 'http-basic' => [ + 'svn.apache.org' => ['username' => 'foo', 'password' => 'bar'], + ], + ], + ] ); $svn = new Svn($url, new NullIO, $config); diff --git a/tests/Composer/Test/Util/TlsHelperTest.php b/tests/Composer/Test/Util/TlsHelperTest.php index b2692d473f58..58c4cd374553 100644 --- a/tests/Composer/Test/Util/TlsHelperTest.php +++ b/tests/Composer/Test/Util/TlsHelperTest.php @@ -20,8 +20,6 @@ class TlsHelperTest extends TestCase /** * @dataProvider dataCheckCertificateHost * - * @param bool $expectedResult - * @param string $hostname * @param string[] $certNames */ public function testCheckCertificateHost(bool $expectedResult, string $hostname, array $certNames): void @@ -43,28 +41,28 @@ public function testCheckCertificateHost(bool $expectedResult, string $hostname, public function dataCheckCertificateHost(): array { - return array( - array(true, 'getcomposer.org', array('getcomposer.org')), - array(true, 'getcomposer.org', array('getcomposer.org', 'packagist.org')), - array(true, 'getcomposer.org', array('packagist.org', 'getcomposer.org')), - array(true, 'foo.getcomposer.org', array('*.getcomposer.org')), - array(false, 'xyz.foo.getcomposer.org', array('*.getcomposer.org')), - array(true, 'foo.getcomposer.org', array('getcomposer.org', '*.getcomposer.org')), - array(true, 'foo.getcomposer.org', array('foo.getcomposer.org', 'foo*.getcomposer.org')), - array(true, 'foo1.getcomposer.org', array('foo.getcomposer.org', 'foo*.getcomposer.org')), - array(true, 'foo2.getcomposer.org', array('foo.getcomposer.org', 'foo*.getcomposer.org')), - array(false, 'foo2.another.getcomposer.org', array('foo.getcomposer.org', 'foo*.getcomposer.org')), - array(false, 'test.example.net', array('**.example.net', '**.example.net')), - array(false, 'test.example.net', array('t*t.example.net', 't*t.example.net')), - array(false, 'xyz.example.org', array('*z.example.org', '*z.example.org')), - array(false, 'foo.bar.example.com', array('foo.*.example.com', 'foo.*.example.com')), - array(false, 'example.com', array('example.*', 'example.*')), - array(true, 'localhost', array('localhost')), - array(false, 'localhost', array('*')), - array(false, 'localhost', array('local*')), - array(false, 'example.net', array('*.net', '*.org', 'ex*.net')), - array(true, 'example.net', array('*.net', '*.org', 'example.net')), - ); + return [ + [true, 'getcomposer.org', ['getcomposer.org']], + [true, 'getcomposer.org', ['getcomposer.org', 'packagist.org']], + [true, 'getcomposer.org', ['packagist.org', 'getcomposer.org']], + [true, 'foo.getcomposer.org', ['*.getcomposer.org']], + [false, 'xyz.foo.getcomposer.org', ['*.getcomposer.org']], + [true, 'foo.getcomposer.org', ['getcomposer.org', '*.getcomposer.org']], + [true, 'foo.getcomposer.org', ['foo.getcomposer.org', 'foo*.getcomposer.org']], + [true, 'foo1.getcomposer.org', ['foo.getcomposer.org', 'foo*.getcomposer.org']], + [true, 'foo2.getcomposer.org', ['foo.getcomposer.org', 'foo*.getcomposer.org']], + [false, 'foo2.another.getcomposer.org', ['foo.getcomposer.org', 'foo*.getcomposer.org']], + [false, 'test.example.net', ['**.example.net', '**.example.net']], + [false, 'test.example.net', ['t*t.example.net', 't*t.example.net']], + [false, 'xyz.example.org', ['*z.example.org', '*z.example.org']], + [false, 'foo.bar.example.com', ['foo.*.example.com', 'foo.*.example.com']], + [false, 'example.com', ['example.*', 'example.*']], + [true, 'localhost', ['localhost']], + [false, 'localhost', ['*']], + [false, 'localhost', ['local*']], + [false, 'example.net', ['*.net', '*.org', 'ex*.net']], + [true, 'example.net', ['*.net', '*.org', 'example.net']], + ]; } public function testGetCertificateNames(): void @@ -76,10 +74,10 @@ public function testGetCertificateNames(): void $names = TlsHelper::getCertificateNames($certificate); $this->assertSame('example.net', $names['cn']); - $this->assertSame(array( + $this->assertSame([ 'example.com', 'getcomposer.org', 'composer.example.org', - ), $names['san']); + ], $names['san']); } } diff --git a/tests/Composer/Test/Util/UrlTest.php b/tests/Composer/Test/Util/UrlTest.php index 1d26967e2ae0..d2c4e59a611d 100644 --- a/tests/Composer/Test/Util/UrlTest.php +++ b/tests/Composer/Test/Util/UrlTest.php @@ -21,54 +21,48 @@ class UrlTest extends TestCase /** * @dataProvider distRefsProvider * - * @param string $url - * @param string $expectedUrl * @param array $conf - * @param string $ref */ - public function testUpdateDistReference(string $url, string $expectedUrl, array $conf = array(), string $ref = 'newref'): void + public function testUpdateDistReference(string $url, string $expectedUrl, array $conf = [], string $ref = 'newref'): void { $config = new Config(); - $config->merge(array('config' => $conf)); + $config->merge(['config' => $conf]); $this->assertSame($expectedUrl, Url::updateDistReference($config, $url, $ref)); } public static function distRefsProvider(): array { - return array( + return [ // github - array('https://github.com/foo/bar/zipball/abcd', 'https://api.github.com/repos/foo/bar/zipball/newref'), - array('https://www.github.com/foo/bar/zipball/abcd', 'https://api.github.com/repos/foo/bar/zipball/newref'), - array('https://github.com/foo/bar/archive/abcd.zip', 'https://api.github.com/repos/foo/bar/zipball/newref'), - array('https://github.com/foo/bar/archive/abcd.tar.gz', 'https://api.github.com/repos/foo/bar/tarball/newref'), - array('https://api.github.com/repos/foo/bar/tarball', 'https://api.github.com/repos/foo/bar/tarball/newref'), - array('https://api.github.com/repos/foo/bar/tarball/abcd', 'https://api.github.com/repos/foo/bar/tarball/newref'), + ['https://github.com/foo/bar/zipball/abcd', 'https://api.github.com/repos/foo/bar/zipball/newref'], + ['https://www.github.com/foo/bar/zipball/abcd', 'https://api.github.com/repos/foo/bar/zipball/newref'], + ['https://github.com/foo/bar/archive/abcd.zip', 'https://api.github.com/repos/foo/bar/zipball/newref'], + ['https://github.com/foo/bar/archive/abcd.tar.gz', 'https://api.github.com/repos/foo/bar/tarball/newref'], + ['https://api.github.com/repos/foo/bar/tarball', 'https://api.github.com/repos/foo/bar/tarball/newref'], + ['https://api.github.com/repos/foo/bar/tarball/abcd', 'https://api.github.com/repos/foo/bar/tarball/newref'], // github enterprise - array('https://mygithub.com/api/v3/repos/foo/bar/tarball/abcd', 'https://mygithub.com/api/v3/repos/foo/bar/tarball/newref', array('github-domains' => array('mygithub.com'))), + ['https://mygithub.com/api/v3/repos/foo/bar/tarball/abcd', 'https://mygithub.com/api/v3/repos/foo/bar/tarball/newref', ['github-domains' => ['mygithub.com']]], // bitbucket - array('https://bitbucket.org/foo/bar/get/abcd.zip', 'https://bitbucket.org/foo/bar/get/newref.zip'), - array('https://www.bitbucket.org/foo/bar/get/abcd.tar.bz2', 'https://bitbucket.org/foo/bar/get/newref.tar.bz2'), + ['https://bitbucket.org/foo/bar/get/abcd.zip', 'https://bitbucket.org/foo/bar/get/newref.zip'], + ['https://www.bitbucket.org/foo/bar/get/abcd.tar.bz2', 'https://bitbucket.org/foo/bar/get/newref.tar.bz2'], // gitlab - array('https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=abcd', 'https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=newref'), - array('https://www.gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=abcd', 'https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=newref'), - array('https://gitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.gz?sha=abcd', 'https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.tar.gz?sha=newref'), + ['https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=abcd', 'https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=newref'], + ['https://www.gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=abcd', 'https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.zip?sha=newref'], + ['https://gitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.gz?sha=abcd', 'https://gitlab.com/api/v4/projects/foo%2Fbar/repository/archive.tar.gz?sha=newref'], // gitlab enterprise - array('https://mygitlab.com/api/v4/projects/foo%2Fbar/repository/archive.tar.gz?sha=abcd', 'https://mygitlab.com/api/v4/projects/foo%2Fbar/repository/archive.tar.gz?sha=newref', array('gitlab-domains' => array('mygitlab.com'))), - array('https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=abcd', 'https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=newref', array('gitlab-domains' => array('mygitlab.com'))), - array('https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=abcd', 'https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=65', array('gitlab-domains' => array('mygitlab.com')), '65'), - ); + ['https://mygitlab.com/api/v4/projects/foo%2Fbar/repository/archive.tar.gz?sha=abcd', 'https://mygitlab.com/api/v4/projects/foo%2Fbar/repository/archive.tar.gz?sha=newref', ['gitlab-domains' => ['mygitlab.com']]], + ['https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=abcd', 'https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=newref', ['gitlab-domains' => ['mygitlab.com']]], + ['https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=abcd', 'https://mygitlab.com/api/v3/projects/foo%2Fbar/repository/archive.tar.bz2?sha=65', ['gitlab-domains' => ['mygitlab.com']], '65'], + ]; } /** * @dataProvider sanitizeProvider - * - * @param string $expected - * @param string $url */ public function testSanitize(string $expected, string $url): void { @@ -77,24 +71,24 @@ public function testSanitize(string $expected, string $url): void public static function sanitizeProvider(): array { - return array( + return [ // with scheme - array('https://foo:***@example.org/', 'https://foo:bar@example.org/'), - array('https://foo@example.org/', 'https://foo@example.org/'), - array('https://example.org/', 'https://example.org/'), - array('http://***:***@example.org', 'http://10a8f08e8d7b7b9:foo@example.org'), - array('https://foo:***@example.org:123/', 'https://foo:bar@example.org:123/'), - array('https://example.org/foo/bar?access_token=***', 'https://example.org/foo/bar?access_token=abcdef'), - array('https://example.org/foo/bar?foo=bar&access_token=***', 'https://example.org/foo/bar?foo=bar&access_token=abcdef'), - array('https://***:***@github.com/acme/repo', 'https://ghp_1234567890abcdefghijklmnopqrstuvwxyzAB:x-oauth-basic@github.com/acme/repo'), + ['https://foo:***@example.org/', 'https://foo:bar@example.org/'], + ['https://foo@example.org/', 'https://foo@example.org/'], + ['https://example.org/', 'https://example.org/'], + ['http://***:***@example.org', 'http://10a8f08e8d7b7b9:foo@example.org'], + ['https://foo:***@example.org:123/', 'https://foo:bar@example.org:123/'], + ['https://example.org/foo/bar?access_token=***', 'https://example.org/foo/bar?access_token=abcdef'], + ['https://example.org/foo/bar?foo=bar&access_token=***', 'https://example.org/foo/bar?foo=bar&access_token=abcdef'], + ['https://***:***@github.com/acme/repo', 'https://ghp_1234567890abcdefghijklmnopqrstuvwxyzAB:x-oauth-basic@github.com/acme/repo'], // without scheme - array('foo:***@example.org/', 'foo:bar@example.org/'), - array('foo@example.org/', 'foo@example.org/'), - array('example.org/', 'example.org/'), - array('***:***@example.org', '10a8f08e8d7b7b9:foo@example.org'), - array('foo:***@example.org:123/', 'foo:bar@example.org:123/'), - array('example.org/foo/bar?access_token=***', 'example.org/foo/bar?access_token=abcdef'), - array('example.org/foo/bar?foo=bar&access_token=***', 'example.org/foo/bar?foo=bar&access_token=abcdef'), - ); + ['foo:***@example.org/', 'foo:bar@example.org/'], + ['foo@example.org/', 'foo@example.org/'], + ['example.org/', 'example.org/'], + ['***:***@example.org', '10a8f08e8d7b7b9:foo@example.org'], + ['foo:***@example.org:123/', 'foo:bar@example.org:123/'], + ['example.org/foo/bar?access_token=***', 'example.org/foo/bar?access_token=abcdef'], + ['example.org/foo/bar?foo=bar&access_token=***', 'example.org/foo/bar?foo=bar&access_token=abcdef'], + ]; } } From d48acda4856ee351a75fa9518f62e2874f4c7a88 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 14:59:24 +0200 Subject: [PATCH 258/618] Add RuleReasonDataReturnTypeExtension to resolve ReasonData types where possible in PHPStan --- phpstan/rules.neon | 4 + src/Composer/DependencyResolver/Problem.php | 9 +- src/Composer/DependencyResolver/Rule.php | 119 ++++++++---------- .../RuleReasonDataReturnTypeExtension.php | 78 ++++++++++++ 4 files changed, 139 insertions(+), 71 deletions(-) create mode 100644 src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php diff --git a/phpstan/rules.neon b/phpstan/rules.neon index 8d81b0dd3683..6dae5cfd483a 100644 --- a/phpstan/rules.neon +++ b/phpstan/rules.neon @@ -8,3 +8,7 @@ services: class: Composer\PHPStan\ConfigReturnTypeExtension tags: - phpstan.broker.dynamicMethodReturnTypeExtension + - + class: Composer\PHPStan\RuleReasonDataReturnTypeExtension + tags: + - phpstan.broker.dynamicMethodReturnTypeExtension diff --git a/src/Composer/DependencyResolver/Problem.php b/src/Composer/DependencyResolver/Problem.php index 9ded041f4f43..a1379368a9be 100644 --- a/src/Composer/DependencyResolver/Problem.php +++ b/src/Composer/DependencyResolver/Problem.php @@ -91,13 +91,8 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $packageName = $reasonData['packageName']; $constraint = $reasonData['constraint']; - if (isset($constraint)) { - $packages = $pool->whatProvides($packageName, $constraint); - } else { - $packages = []; - } - - if (empty($packages)) { + $packages = $pool->whatProvides($packageName, $constraint); + if (count($packages) === 0) { return "\n ".implode(self::getMissingPackageReason($repositorySet, $request, $pool, $isVerbose, $packageName, $constraint)); } } diff --git a/src/Composer/DependencyResolver/Rule.php b/src/Composer/DependencyResolver/Rule.php index dba29ed1b54e..1b2f1aa951e6 100644 --- a/src/Composer/DependencyResolver/Rule.php +++ b/src/Composer/DependencyResolver/Rule.php @@ -100,18 +100,13 @@ public function getReasonData() public function getRequiredPackage(): ?string { - $reason = $this->getReason(); - - if ($reason === self::RULE_ROOT_REQUIRE) { - return $this->reasonData['packageName']; - } - - if ($reason === self::RULE_FIXED) { - return $this->reasonData['package']->getName(); - } - - if ($reason === self::RULE_PACKAGE_REQUIRES) { - return $this->reasonData->getTarget(); + switch ($this->getReason()) { + case self::RULE_ROOT_REQUIRE: + return $this->getReasonData()['packageName']; + case self::RULE_FIXED: + return $this->getReasonData()['package']->getName(); + case self::RULE_PACKAGE_REQUIRES: + return $this->getReasonData()->getTarget(); } return null; @@ -155,16 +150,16 @@ abstract public function isAssertion(): bool; public function isCausedByLock(RepositorySet $repositorySet, Request $request, Pool $pool): bool { if ($this->getReason() === self::RULE_PACKAGE_REQUIRES) { - if (PlatformRepository::isPlatformPackage($this->reasonData->getTarget())) { + if (PlatformRepository::isPlatformPackage($this->getReasonData()->getTarget())) { return false; } if ($request->getLockedRepository()) { foreach ($request->getLockedRepository()->getPackages() as $package) { - if ($package->getName() === $this->reasonData->getTarget()) { + if ($package->getName() === $this->getReasonData()->getTarget()) { if ($pool->isUnacceptableFixedOrLockedPackage($package)) { return true; } - if (!$this->reasonData->getConstraint()->matches(new Constraint('=', $package->getVersion()))) { + if (!$this->getReasonData()->getConstraint()->matches(new Constraint('=', $package->getVersion()))) { return true; } // required package was locked but has been unlocked and still matches @@ -178,16 +173,16 @@ public function isCausedByLock(RepositorySet $repositorySet, Request $request, P } if ($this->getReason() === self::RULE_ROOT_REQUIRE) { - if (PlatformRepository::isPlatformPackage($this->reasonData['packageName'])) { + if (PlatformRepository::isPlatformPackage($this->getReasonData()['packageName'])) { return false; } if ($request->getLockedRepository()) { foreach ($request->getLockedRepository()->getPackages() as $package) { - if ($package->getName() === $this->reasonData['packageName']) { + if ($package->getName() === $this->getReasonData()['packageName']) { if ($pool->isUnacceptableFixedOrLockedPackage($package)) { return true; } - if (!$this->reasonData['constraint']->matches(new Constraint('=', $package->getVersion()))) { + if (!$this->getReasonData()['constraint']->matches(new Constraint('=', $package->getVersion()))) { return true; } break; @@ -211,11 +206,10 @@ public function getSourcePackage(Pool $pool): BasePackage $package1 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[0])); $package2 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[1])); - if ($reasonData = $this->getReasonData()) { - // swap literals if they are not in the right order with package2 being the conflicter - if ($reasonData->getSource() === $package1->getName()) { - [$package2, $package1] = [$package1, $package2]; - } + $reasonData = $this->getReasonData(); + // swap literals if they are not in the right order with package2 being the conflicter + if ($reasonData->getSource() === $package1->getName()) { + [$package2, $package1] = [$package1, $package2]; } return $package2; @@ -241,12 +235,13 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, switch ($this->getReason()) { case self::RULE_ROOT_REQUIRE: - $packageName = $this->reasonData['packageName']; - $constraint = $this->reasonData['constraint']; + $reasonData = $this->getReasonData(); + $packageName = $reasonData['packageName']; + $constraint = $reasonData['constraint']; $packages = $pool->whatProvides($packageName, $constraint); if (!$packages) { - return 'No package found to satisfy root composer.json require '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : ''); + return 'No package found to satisfy root composer.json require '.$packageName.' '.$constraint->getPrettyString(); } $packagesNonAlias = array_values(array_filter($packages, static function ($p): bool { @@ -259,10 +254,10 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, } } - return 'Root composer.json requires '.$packageName.($constraint ? ' '.$constraint->getPrettyString() : '').' -> satisfiable by '.$this->formatPackagesUnique($pool, $packages, $isVerbose, $constraint).'.'; + return 'Root composer.json requires '.$packageName.' '.$constraint->getPrettyString().' -> satisfiable by '.$this->formatPackagesUnique($pool, $packages, $isVerbose, $constraint).'.'; case self::RULE_FIXED: - $package = $this->deduplicateDefaultBranchAlias($this->reasonData['package']); + $package = $this->deduplicateDefaultBranchAlias($this->getReasonData()['package']); if ($request->isLockedPackage($package)) { return $package->getPrettyName().' is locked to version '.$package->getPrettyVersion().' and an update of this package was not requested.'; @@ -275,38 +270,36 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $package2 = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($literals[1])); $conflictTarget = $package1->getPrettyString(); - if ($reasonData = $this->getReasonData()) { - assert($reasonData instanceof Link); + $reasonData = $this->getReasonData(); - // swap literals if they are not in the right order with package2 being the conflicter - if ($reasonData->getSource() === $package1->getName()) { - [$package2, $package1] = [$package1, $package2]; - $conflictTarget = $package1->getPrettyName().' '.$reasonData->getPrettyConstraint(); - } + // swap literals if they are not in the right order with package2 being the conflicter + if ($reasonData->getSource() === $package1->getName()) { + [$package2, $package1] = [$package1, $package2]; + $conflictTarget = $package1->getPrettyName().' '.$reasonData->getPrettyConstraint(); + } - // if the conflict is not directly against the package but something it provides/replaces, - // we try to find that link to display a better message - if ($reasonData->getTarget() !== $package1->getName()) { - $provideType = null; - $provided = null; - foreach ($package1->getProvides() as $provide) { - if ($provide->getTarget() === $reasonData->getTarget()) { - $provideType = 'provides'; - $provided = $provide->getPrettyConstraint(); - break; - } + // if the conflict is not directly against the package but something it provides/replaces, + // we try to find that link to display a better message + if ($reasonData->getTarget() !== $package1->getName()) { + $provideType = null; + $provided = null; + foreach ($package1->getProvides() as $provide) { + if ($provide->getTarget() === $reasonData->getTarget()) { + $provideType = 'provides'; + $provided = $provide->getPrettyConstraint(); + break; } - foreach ($package1->getReplaces() as $replace) { - if ($replace->getTarget() === $reasonData->getTarget()) { - $provideType = 'replaces'; - $provided = $replace->getPrettyConstraint(); - break; - } - } - if (null !== $provideType) { - $conflictTarget = $reasonData->getTarget().' '.$reasonData->getPrettyConstraint().' ('.$package1->getPrettyString().' '.$provideType.' '.$reasonData->getTarget().' '.$provided.')'; + } + foreach ($package1->getReplaces() as $replace) { + if ($replace->getTarget() === $reasonData->getTarget()) { + $provideType = 'replaces'; + $provided = $replace->getPrettyConstraint(); + break; } } + if (null !== $provideType) { + $conflictTarget = $reasonData->getTarget().' '.$reasonData->getPrettyConstraint().' ('.$package1->getPrettyString().' '.$provideType.' '.$reasonData->getTarget().' '.$provided.')'; + } } return $package2->getPrettyString().' conflicts with '.$conflictTarget.'.'; @@ -314,8 +307,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, case self::RULE_PACKAGE_REQUIRES: $sourceLiteral = array_shift($literals); $sourcePackage = $this->deduplicateDefaultBranchAlias($pool->literalToPackage($sourceLiteral)); - /** @var Link */ - $reasonData = $this->reasonData; + $reasonData = $this->getReasonData(); $requires = []; foreach ($literals as $literal) { @@ -324,11 +316,11 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $text = $reasonData->getPrettyString($sourcePackage); if ($requires) { - $text .= ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $requires, $isVerbose, $this->reasonData->getConstraint()) . '.'; + $text .= ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $requires, $isVerbose, $reasonData->getConstraint()) . '.'; } else { $targetName = $reasonData->getTarget(); - $reason = Problem::getMissingPackageReason($repositorySet, $request, $pool, $isVerbose, $targetName, $this->reasonData->getConstraint()); + $reason = Problem::getMissingPackageReason($repositorySet, $request, $pool, $isVerbose, $targetName, $reasonData->getConstraint()); return $text . ' -> ' . $reason[1]; } @@ -341,8 +333,7 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, $package = $pool->literalToPackage($literal); $packageNames[$package->getName()] = true; } - /** @var string $replacedName */ - $replacedName = $this->reasonData; + $replacedName = $this->getReasonData(); if (count($packageNames) > 1) { $reason = null; @@ -382,9 +373,9 @@ public function getPrettyString(RepositorySet $repositorySet, Request $request, return 'You can only install one version of a package, so only one of these can be installed: ' . $this->formatPackagesUnique($pool, $literals, $isVerbose, null, true) . '.'; case self::RULE_LEARNED: /** @TODO currently still generates way too much output to be helpful, and in some cases can even lead to endless recursion */ - // if (isset($learnedPool[$this->reasonData])) { - // echo $this->reasonData."\n"; - // $learnedString = ', learned rules:' . Problem::formatDeduplicatedRules($learnedPool[$this->reasonData], ' ', $repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool); + // if (isset($learnedPool[$this->getReasonData()])) { + // echo $this->getReasonData()."\n"; + // $learnedString = ', learned rules:' . Problem::formatDeduplicatedRules($learnedPool[$this->getReasonData()], ' ', $repositorySet, $request, $pool, $isVerbose, $installedMap, $learnedPool); // } else { // $learnedString = ' (reasoning unavailable)'; // } diff --git a/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php b/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php new file mode 100644 index 000000000000..c68e43a142ca --- /dev/null +++ b/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php @@ -0,0 +1,78 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\PHPStan; + +use Composer\Config; +use Composer\DependencyResolver\Rule; +use Composer\Json\JsonFile; +use Composer\Package\BasePackage; +use Composer\Package\Link; +use Composer\Semver\Constraint\ConstraintInterface; +use PhpParser\Node\Expr\MethodCall; +use PHPStan\Analyser\Scope; +use PHPStan\Reflection\MethodReflection; +use PHPStan\Reflection\ParametersAcceptorSelector; +use PHPStan\Type\Accessory\AccessoryNonEmptyStringType; +use PHPStan\Type\ArrayType; +use PHPStan\Type\BooleanType; +use PHPStan\Type\Constant\ConstantArrayType; +use PHPStan\Type\Constant\ConstantBooleanType; +use PHPStan\Type\Constant\ConstantStringType; +use PHPStan\Type\Constant\ConstantIntegerType; +use PHPStan\Type\DynamicMethodReturnTypeExtension; +use PHPStan\Type\IntegerRangeType; +use PHPStan\Type\IntegerType; +use PHPStan\Type\MixedType; +use PHPStan\Type\StringType; +use PHPStan\Type\Type; +use PHPStan\Type\ObjectType; +use PHPStan\Type\TypeCombinator; +use PHPStan\Type\UnionType; +use PhpParser\Node\Identifier; + +final class RuleReasonDataReturnTypeExtension implements DynamicMethodReturnTypeExtension +{ + public function getClass(): string + { + return Rule::class; + } + + public function isMethodSupported(MethodReflection $methodReflection): bool + { + return strtolower($methodReflection->getName()) === 'getreasondata'; + } + + public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type + { + $reasonType = $scope->getType(new MethodCall($methodCall->var, new Identifier('getReason'))); + + $types = [ + Rule::RULE_ROOT_REQUIRE => new ConstantArrayType([new ConstantStringType('packageName'), new ConstantStringType('constraint')], [new StringType, new ObjectType(ConstraintInterface::class)]), + Rule::RULE_FIXED => new ConstantArrayType([new ConstantStringType('package')], [new ObjectType(BasePackage::class)]), + Rule::RULE_PACKAGE_CONFLICT => new ObjectType(Link::class), + Rule::RULE_PACKAGE_REQUIRES => new ObjectType(Link::class), + Rule::RULE_PACKAGE_SAME_NAME => TypeCombinator::intersect(new StringType, new AccessoryNonEmptyStringType()), + Rule::RULE_LEARNED => new IntegerType(), + Rule::RULE_PACKAGE_ALIAS => new ObjectType(BasePackage::class), + Rule::RULE_PACKAGE_INVERSE_ALIAS => new ObjectType(BasePackage::class), + ]; + + foreach ($types as $const => $type) { + if ((new ConstantIntegerType($const))->isSuperTypeOf($reasonType)->yes()) { + return $type; + } + } + + return TypeCombinator::union(...$types); + } +} From 31f9cc3b495581bb0e3532036e6ac8b14cee3d24 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 15:03:14 +0200 Subject: [PATCH 259/618] Clean up unused types --- .../PHPStan/RuleReasonDataReturnTypeExtension.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php b/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php index c68e43a142ca..58a9e4bba179 100644 --- a/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php +++ b/src/Composer/PHPStan/RuleReasonDataReturnTypeExtension.php @@ -12,32 +12,23 @@ namespace Composer\PHPStan; -use Composer\Config; use Composer\DependencyResolver\Rule; -use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\Link; use Composer\Semver\Constraint\ConstraintInterface; use PhpParser\Node\Expr\MethodCall; use PHPStan\Analyser\Scope; use PHPStan\Reflection\MethodReflection; -use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Type\Accessory\AccessoryNonEmptyStringType; -use PHPStan\Type\ArrayType; -use PHPStan\Type\BooleanType; use PHPStan\Type\Constant\ConstantArrayType; -use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\DynamicMethodReturnTypeExtension; -use PHPStan\Type\IntegerRangeType; use PHPStan\Type\IntegerType; -use PHPStan\Type\MixedType; use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\ObjectType; use PHPStan\Type\TypeCombinator; -use PHPStan\Type\UnionType; use PhpParser\Node\Identifier; final class RuleReasonDataReturnTypeExtension implements DynamicMethodReturnTypeExtension From c4d8061ebf3865b83c5f7916134d15c2cc965216 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 15:09:30 +0200 Subject: [PATCH 260/618] Update baseline --- phpstan/baseline.neon | 50 ------------------------------------------- 1 file changed, 50 deletions(-) diff --git a/phpstan/baseline.neon b/phpstan/baseline.neon index bfa6364bfcd0..9e57ace0a302 100644 --- a/phpstan/baseline.neon +++ b/phpstan/baseline.neon @@ -1410,16 +1410,6 @@ parameters: count: 4 path: ../src/Composer/DependencyResolver/PoolOptimizer.php - - - message: "#^Cannot access offset 'constraint' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 1 - path: ../src/Composer/DependencyResolver/Problem.php - - - - message: "#^Cannot access offset 'packageName' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 1 - path: ../src/Composer/DependencyResolver/Problem.php - - message: "#^Cannot call method getRepoName\\(\\) on Composer\\\\Repository\\\\RepositoryInterface\\|null\\.$#" count: 3 @@ -1430,11 +1420,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/Problem.php - - - message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" - count: 1 - path: ../src/Composer/DependencyResolver/Problem.php - - message: "#^Only booleans are allowed in &&, Composer\\\\DependencyResolver\\\\Pool\\|null given on the left side\\.$#" count: 2 @@ -1500,36 +1485,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/Request.php - - - message: "#^Cannot access offset 'constraint' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 2 - path: ../src/Composer/DependencyResolver/Rule.php - - - - message: "#^Cannot access offset 'package' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 2 - path: ../src/Composer/DependencyResolver/Rule.php - - - - message: "#^Cannot access offset 'packageName' on array\\{package\\: Composer\\\\Package\\\\BasePackage\\}\\|array\\{packageName\\: string, constraint\\: Composer\\\\Semver\\\\Constraint\\\\ConstraintInterface\\}\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 4 - path: ../src/Composer/DependencyResolver/Rule.php - - - - message: "#^Cannot call method getConstraint\\(\\) on array\\\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 3 - path: ../src/Composer/DependencyResolver/Rule.php - - - - message: "#^Cannot call method getSource\\(\\) on array\\\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\\\|int\\<1, max\\>\\|string\\.$#" - count: 1 - path: ../src/Composer/DependencyResolver/Rule.php - - - - message: "#^Cannot call method getTarget\\(\\) on array\\\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string\\.$#" - count: 3 - path: ../src/Composer/DependencyResolver/Rule.php - - message: "#^Foreach overwrites \\$literal with its value variable\\.$#" count: 1 @@ -1570,11 +1525,6 @@ parameters: count: 1 path: ../src/Composer/DependencyResolver/Rule.php - - - message: "#^Only booleans are allowed in an if condition, array\\\\|Composer\\\\Package\\\\BasePackage\\|Composer\\\\Package\\\\Link\\|int\\|string given\\.$#" - count: 2 - path: ../src/Composer/DependencyResolver/Rule.php - - message: "#^Parameter \\#1 \\$literal of method Composer\\\\DependencyResolver\\\\Pool\\:\\:literalToPackage\\(\\) expects int, int\\|null given\\.$#" count: 2 From c5290876318942e418e6dbd1b0680be59df954e8 Mon Sep 17 00:00:00 2001 From: EXTEON Date: Wed, 17 Aug 2022 16:11:34 +0300 Subject: [PATCH 261/618] performance: Do not create a local cache repo for local repos (#11001) --- src/Composer/Downloader/GitDownloader.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index d11a37958038..3ba921868406 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -60,6 +60,11 @@ public function __construct(IOInterface $io, Config $config, ?ProcessExecutor $p */ protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface { + // Do not create an extra local cache when repository is already local + if (Filesystem::isLocalPath($url)) { + return \React\Promise\resolve(null); + } + GitUtil::cleanEnv(); $cachePath = $this->config->get('cache-vcs-dir').'/'.Preg::replace('{[^a-z0-9.]}i', '-', $url).'/'; From 6b31fbec011f033f7d67f60ae0e6aa5dd861bdd4 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 17 Aug 2022 17:43:21 +0200 Subject: [PATCH 262/618] Update pull_request_template.md --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9121a1a5989a..57f1139110a4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,5 +1,5 @@ From 20b3e3e79c5dd62d65b0eafe3d968a31a05b1c31 Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Wed, 17 Aug 2022 23:24:40 +0200 Subject: [PATCH 263/618] Fix docs for issue composer/satis#656 (#11005) --- doc/articles/handling-private-packages.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/doc/articles/handling-private-packages.md b/doc/articles/handling-private-packages.md index 3e3c93bb2561..efb131e05c1c 100644 --- a/doc/articles/handling-private-packages.md +++ b/doc/articles/handling-private-packages.md @@ -34,9 +34,11 @@ packages, or your own. You can get it from For example let's assume you have a few packages you want to reuse across your company but don't really want to open-source. You would first define a Satis -configuration: a json file with an arbitrary name that lists your curated +configuration: a json file that lists your curated [repositories](../05-repositories.md). +The default file name is satis.json but it could be anything you like. + Here is an example configuration, you see that it holds a few VCS repositories, but those could be any types of [repositories](../05-repositories.md). Then it uses `"require-all": true` which selects all versions of all packages in the @@ -46,7 +48,7 @@ The default file Satis looks for is `satis.json` in the root of the repository. ```json { - "name": "My Repository", + "name": "my/repository", "homepage": "http://packages.example.org", "repositories": [ { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, @@ -337,4 +339,4 @@ is set to true. [ssl context options]: https://secure.php.net/manual/en/context.ssl.php [Twig]: https://twig.sensiolabs.org/ [config schema]: https://getcomposer.org/doc/04-schema.md#config -[notify-batch]: https://getcomposer.org/doc/05-repositories.md#notify-batch +[notify-batch]: https://getcomposer.org/doc/05-repositories.md#notify-batch \ No newline at end of file From cad5dc5b8baa770cfce0990e340e539e34cdec90 Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sat, 20 Aug 2022 01:41:14 -0400 Subject: [PATCH 264/618] Match default choice to actual default (#11010) The 'Y' is capital, so Yes should be the default choice and is what most people would want, but No was the default. --- src/Composer/Command/SelfUpdateCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index 518ca592e7e4..00cac75e038b 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -596,7 +596,7 @@ protected function tryAsWindowsAdmin(string $localFilename, string $newFilename) $helpMessage = 'Please run the self-update command as an Administrator.'; $question = 'Complete this operation with Administrator privileges [Y,n]? '; - if (!$io->askConfirmation($question, false)) { + if (!$io->askConfirmation($question, true)) { $io->writeError('Operation cancelled. '.$helpMessage.''); return false; From 7ccf230390da3af45d87c64ada6e2b78f2d1ddfb Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 20 Aug 2022 08:42:20 +0300 Subject: [PATCH 265/618] Fix cache invalidation issue when a git tag gets created on an old ref after the cache is populated, fixes #11002 (#11004) --- src/Composer/Downloader/GitDownloader.php | 2 +- src/Composer/Util/Git.php | 24 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index 3ba921868406..9ba60002ab86 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -75,7 +75,7 @@ protected function doDownload(PackageInterface $package, string $path, string $u $this->io->writeError(" - Syncing " . $package->getName() . " (" . $package->getFullPrettyVersion() . ") into cache"); $this->io->writeError(sprintf(' Cloning to cache at %s', ProcessExecutor::escape($cachePath)), true, IOInterface::DEBUG); $ref = $package->getSourceReference(); - if ($this->gitUtil->fetchRefOrSyncMirror($url, $cachePath, $ref) && is_dir($cachePath)) { + if ($this->gitUtil->fetchRefOrSyncMirror($url, $cachePath, $ref, $package->getPrettyVersion()) && is_dir($cachePath)) { $this->cachedPackages[$package->getId()][$ref] = true; } } elseif (null === $gitVersion) { diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php index f43ba052b975..80521ca3bfd8 100644 --- a/src/Composer/Util/Git.php +++ b/src/Composer/Util/Git.php @@ -297,9 +297,31 @@ public function syncMirror(string $url, string $dir): bool return true; } - public function fetchRefOrSyncMirror(string $url, string $dir, string $ref): bool + public function fetchRefOrSyncMirror(string $url, string $dir, string $ref, string $prettyVersion = null): bool { if ($this->checkRefIsInMirror($dir, $ref)) { + if (Preg::isMatch('{^[a-f0-9]{40}$}', $ref) && $prettyVersion !== null) { + $branch = Preg::replace('{(?:^dev-|(?:\.x)?-dev$)}i', '', $prettyVersion); + $branches = null; + $tags = null; + if (0 === $this->process->execute('git branch', $output, $dir)) { + $branches = $output; + } + if (0 === $this->process->execute('git tag', $output, $dir)) { + $tags = $output; + } + + // if the pretty version cannot be found as a branch (nor branch with 'v' in front of the branch as it may have been stripped when generating pretty name), + // nor as a tag, then we sync the mirror as otherwise it will likely fail during install. + // this can occur if a git tag gets created *after* the reference is already put into the cache, as the ref check above will then not sync the new tags + // see https://github.com/composer/composer/discussions/11002 + if (null !== $branches && !Preg::isMatch('{^[\s*]*v?'.preg_quote($branch).'$}m', $branches) + && null !== $tags && !Preg::isMatch('{^[\s*]*'.preg_quote($branch).'$}m', $tags) + ) { + $this->syncMirror($url, $dir); + } + } + return true; } From 51774693c72905cb6044571e1c9ffd9b81b2c2fd Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Sat, 20 Aug 2022 08:34:38 +0200 Subject: [PATCH 266/618] Do not apply non-string package link constraints in ArrayLoader (#11009) --- src/Composer/Package/Loader/ArrayLoader.php | 3 ++ .../Test/Package/Loader/ArrayLoaderTest.php | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index ef7ae0fb6771..9491710b6362 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -364,6 +364,9 @@ public function parseLinks(string $source, string $sourceVersion, string $descri { $res = []; foreach ($links as $target => $constraint) { + if (!is_string($constraint)) { + continue; + } $target = strtolower((string) $target); $res[$target] = $this->createLink($source, $sourceVersion, $description, $target, $constraint); } diff --git a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php index 4f73b3728ed6..6dbc71a59aff 100644 --- a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php @@ -371,4 +371,35 @@ public function testBranchAliasIntegerIndex(): void $this->assertNull($this->loader->getBranchAlias($config)); } + + public function testPackageLinksRequire(): void + { + $config = array( + 'name' => 'acme/package', + 'version' => 'dev-1', + 'require' => [ + 'foo/bar' => '1.0', + ], + ); + + $package = $this->loader->load($config); + $this->assertArrayHasKey('foo/bar', $package->getRequires()); + $this->assertSame('1.0', $package->getRequires()['foo/bar']->getConstraint()->getPrettyString()); + } + + public function testPackageLinksRequireInvalid(): void + { + $config = array( + 'name' => 'acme/package', + 'version' => 'dev-1', + 'require' => [ + 'foo/bar' => [ + 'random-string' => '1.0', + ], + ], + ); + + $package = $this->loader->load($config); + $this->assertCount(0, $package->getRequires()); + } } From d2d84740139af5afd75d0b9829d8892000c706e1 Mon Sep 17 00:00:00 2001 From: Zan Baldwin Date: Sat, 20 Aug 2022 08:58:17 +0200 Subject: [PATCH 267/618] Do not apply non-array package links in ArrayLoader (#11008) --- src/Composer/Package/Loader/ArrayLoader.php | 21 ++++++++------- .../Test/Package/Loader/ArrayLoaderTest.php | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/Composer/Package/Loader/ArrayLoader.php b/src/Composer/Package/Loader/ArrayLoader.php index 9491710b6362..72e0df76aabd 100644 --- a/src/Composer/Package/Loader/ArrayLoader.php +++ b/src/Composer/Package/Loader/ArrayLoader.php @@ -55,17 +55,18 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa $package = $this->createObject($config, $class); foreach (BasePackage::$supportedLinkTypes as $type => $opts) { - if (isset($config[$type])) { - $method = 'set'.ucfirst($opts['method']); - $package->{$method}( - $this->parseLinks( - $package->getName(), - $package->getPrettyVersion(), - $opts['method'], - $config[$type] - ) - ); + if (!isset($config[$type]) || !is_array($config[$type])) { + continue; } + $method = 'set'.ucfirst($opts['method']); + $package->{$method}( + $this->parseLinks( + $package->getName(), + $package->getPrettyVersion(), + $opts['method'], + $config[$type] + ) + ); } $package = $this->configureObject($package, $config); diff --git a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php index 6dbc71a59aff..0ae37b030b3b 100644 --- a/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php +++ b/tests/Composer/Test/Package/Loader/ArrayLoaderTest.php @@ -402,4 +402,31 @@ public function testPackageLinksRequireInvalid(): void $package = $this->loader->load($config); $this->assertCount(0, $package->getRequires()); } + + public function testPackageLinksReplace(): void + { + $config = array( + 'name' => 'acme/package', + 'version' => 'dev-1', + 'replace' => [ + 'coyote/package' => 'self.version', + ], + ); + + $package = $this->loader->load($config); + $this->assertArrayHasKey('coyote/package', $package->getReplaces()); + $this->assertSame('dev-1', $package->getReplaces()['coyote/package']->getConstraint()->getPrettyString()); + } + + public function testPackageLinksReplaceInvalid(): void + { + $config = array( + 'name' => 'acme/package', + 'version' => 'dev-1', + 'replace' => 'coyote/package', + ); + + $package = $this->loader->load($config); + $this->assertCount(0, $package->getReplaces()); + } } From ceb8bef778b98ae63e61ed688f8972aceb17c4fe Mon Sep 17 00:00:00 2001 From: Thomas Landauer Date: Sat, 20 Aug 2022 09:24:25 +0200 Subject: [PATCH 268/618] Adding hint what "Direct dependencies" means (#11013) --- src/Composer/Command/ShowCommand.php | 4 ++-- tests/Composer/Test/Command/ShowCommandTest.php | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 7506113ce0a4..eca2149aeb61 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -601,14 +601,14 @@ protected function execute(InputInterface $input, OutputInterface $output) } $io->write(''); - $io->write('Direct dependencies:'); + $io->write('Direct dependencies required in composer.json:'); if (\count($directDeps) > 0) { $this->printPackages($io, $directDeps, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } else { $io->write('Everything up to date'); } $io->write(''); - $io->write('Transitive dependencies:'); + $io->write('Transitive dependencies not required in composer.json:'); if (\count($transitiveDeps) > 0) { $this->printPackages($io, $transitiveDeps, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } else { diff --git a/tests/Composer/Test/Command/ShowCommandTest.php b/tests/Composer/Test/Command/ShowCommandTest.php index 9f44b3ce7a54..ea23fad11860 100644 --- a/tests/Composer/Test/Command/ShowCommandTest.php +++ b/tests/Composer/Test/Command/ShowCommandTest.php @@ -102,10 +102,10 @@ public function provideShow(): \Generator ! patch or minor release available - update recommended ~ major release available - update possible -Direct dependencies: +Direct dependencies required in composer.json: Everything up to date -Transitive dependencies: +Transitive dependencies not required in composer.json: outdated/major 1.0.0 ~ 2.0.0 outdated/minor 1.0.0 ! 1.1.1 outdated/patch 1.0.0 ! 1.0.1', @@ -129,10 +129,10 @@ public function provideShow(): \Generator ! patch or minor release available - update recommended ~ major release available - update possible -Direct dependencies: +Direct dependencies required in composer.json: Everything up to date -Transitive dependencies: +Transitive dependencies not required in composer.json: outdated/major 1.0.0 ~ 2.0.0', ]; @@ -142,10 +142,10 @@ public function provideShow(): \Generator ! patch or minor release available - update recommended ~ major release available - update possible -Direct dependencies: +Direct dependencies required in composer.json: outdated/minor 1.0.0 ! 1.1.1 -Transitive dependencies: +Transitive dependencies not required in composer.json: outdated/major 1.0.0 ! 1.1.1 outdated/patch 1.0.0 ! 1.0.1', ['outdated/minor' => '*'], @@ -157,10 +157,10 @@ public function provideShow(): \Generator ! patch or minor release available - update recommended ~ major release available - update possible -Direct dependencies: +Direct dependencies required in composer.json: Everything up to date -Transitive dependencies: +Transitive dependencies not required in composer.json: outdated/major 1.0.0 ! 1.0.1 outdated/minor 1.0.0 ! 1.0.1 outdated/patch 1.0.0 ! 1.0.1', From 7ec6d16da96c8f64e0188821f2b89e43b57ab4e1 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 20 Aug 2022 11:44:25 +0200 Subject: [PATCH 269/618] Update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d65c6f130a0a..ea74b378f4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +### [2.4.1] 2022-08-20 + + * Added a `COMPOSER_NO_AUDIT` env var to easily apply the new --no-audit flag in CI (#10998) + * Fixed `show` command showing packages in two sections, this was only meant for the `outdated` command (#11000) + * Fixed local git repos being copied to cache unnecessarily (#11001) + * Fixed git cache invalidation issue when a git tag gets created after the cache has loaded a given reference (#11004) + ### [2.4.0] 2022-08-16 * Added `json` format output to the new `audit` command (#10965) @@ -1619,6 +1626,7 @@ * Initial release +[2.4.1]: https://github.com/composer/composer/compare/2.4.0...2.4.1 [2.4.0]: https://github.com/composer/composer/compare/2.4.0-RC1...2.4.0 [2.4.0-RC1]: https://github.com/composer/composer/compare/2.3.10...2.4.0-RC1 [2.3.10]: https://github.com/composer/composer/compare/2.3.9...2.3.10 From 777d542e3af65f8e7a66a4d98ce7a697da339414 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 20 Aug 2022 11:44:50 +0200 Subject: [PATCH 270/618] Release 2.4.1 --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index c6f083dfdb51..9f8481bfe580 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '@package_version@'; - public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; - public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.4.999-dev+source'; + public const VERSION = '2.4.1'; + public const BRANCH_ALIAS_VERSION = ''; + public const RELEASE_DATE = '2022-08-20 11:44:50'; + public const SOURCE_VERSION = ''; /** * Version number of the internal composer-runtime-api package From afeaabe089edbf257b43d43165a4294793bc4324 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 20 Aug 2022 11:44:51 +0200 Subject: [PATCH 271/618] Reverting release version changes --- src/Composer/Composer.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index 9f8481bfe580..c6f083dfdb51 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -51,10 +51,10 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.4.1'; - public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2022-08-20 11:44:50'; - public const SOURCE_VERSION = ''; + public const VERSION = '@package_version@'; + public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; + public const RELEASE_DATE = '@release_date@'; + public const SOURCE_VERSION = '2.4.999-dev+source'; /** * Version number of the internal composer-runtime-api package From ceec6ff8e2a2cdf5becf5eab25a3d379181c9115 Mon Sep 17 00:00:00 2001 From: Jeffrey Cafferata Date: Sat, 20 Aug 2022 12:23:00 +0200 Subject: [PATCH 272/618] Documentation code syntax highlighting (#11011) * Add newline at end of file. * Create a uniformat in the code syntax highlighting by using the main syntax `shell` instead of the alias `bash`/`sh`. * Added (of corrected) the missing code syntax highlighting. * Split the shell commands from the text outputs. * Fix JSON samples formatting. * Checked the commands and updated the text output. --- doc/00-intro.md | 16 +- doc/01-basic-usage.md | 10 +- doc/03-cli.md | 156 ++++++++++-------- doc/04-schema.md | 20 +-- doc/05-repositories.md | 13 +- doc/articles/aliases.md | 2 +- .../authentication-for-private-packages.md | 48 +++--- .../composer-platform-dependencies.md | 6 +- doc/articles/handling-private-packages.md | 148 ++++++++--------- doc/articles/plugins.md | 2 +- doc/articles/resolving-merge-conflicts.md | 2 +- doc/articles/scripts.md | 14 +- doc/articles/troubleshooting.md | 27 +-- doc/articles/versions.md | 8 +- ...ow-to-install-composer-programmatically.md | 4 +- ...ow-to-install-untrusted-packages-safely.md | 2 +- 16 files changed, 253 insertions(+), 225 deletions(-) diff --git a/doc/00-intro.md b/doc/00-intro.md index 464b58ff9bd8..f126c38a3458 100644 --- a/doc/00-intro.md +++ b/doc/00-intro.md @@ -76,7 +76,7 @@ running the installer when following [the Download page instructions](https://getcomposer.org/download/) add the following parameters: -```sh +```shell php composer-setup.php --install-dir=bin --filename=composer ``` @@ -92,7 +92,7 @@ interpreter. After running the installer following [the Download page instructions](https://getcomposer.org/download/) you can run this to move composer.phar to a directory that is in your path: -```sh +```shell mv composer.phar /usr/local/bin/composer ``` @@ -138,13 +138,13 @@ Create a new `composer.bat` file alongside `composer.phar`: Using cmd.exe: -```sh +```shell C:\bin> echo @php "%~dp0composer.phar" %*>composer.bat ``` Using PowerShell: -```sh +```shell PS C:\bin> Set-Content composer.bat '@php "%~dp0composer.phar" %*' ``` @@ -155,9 +155,11 @@ use your search engine of choice. Close your current terminal. Test usage with a new terminal: -```sh +```shell C:\Users\username>composer -V -Composer version 2.0.12 2021-04-01 10:14:59 +``` +```text +Composer version 2.4.0 2022-08-16 16:10:48 ``` ## Docker Image @@ -166,7 +168,7 @@ Composer is published as Docker container in a few places, see the list in the [ Example usage: -```sh +```shell docker pull composer/composer docker run --rm -it -v "$(pwd):/app" composer/composer install ``` diff --git a/doc/01-basic-usage.md b/doc/01-basic-usage.md index 671e46dd66aa..e0ac13c1cab1 100644 --- a/doc/01-basic-usage.md +++ b/doc/01-basic-usage.md @@ -92,7 +92,7 @@ versions, how versions relate to each other, and on version constraints. To initially install the defined dependencies for your project, you should run the [`update`](03-cli.md#update-u) command. -```sh +```shell php composer.phar update ``` @@ -148,7 +148,7 @@ So after fetching new changes from your VCS repository it is recommended to run a Composer `install` to make sure the vendor directory is up in sync with your `composer.lock` file. -```sh +```shell php composer.phar install ``` @@ -160,7 +160,7 @@ the latest versions of your dependencies. To update to the latest versions, use versions (according to your `composer.json` file) and update the lock file with the new versions. -```sh +```shell php composer.phar update ``` @@ -170,7 +170,7 @@ php composer.phar update If you only want to install, upgrade or remove one dependency, you can explicitly list it as an argument: -```sh +```shell php composer.phar update monolog/monolog [...] ``` @@ -249,7 +249,7 @@ filename would be `src/Foo.php` containing an `Acme\Foo` class. After adding the [`autoload`](04-schema.md#autoload) field, you have to re-run this command: -```sh +```shell php composer.phar dump-autoload ``` diff --git a/doc/03-cli.md b/doc/03-cli.md index d7a2977ee2c2..221cae1011b4 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -8,7 +8,7 @@ to see the complete list of commands, then `--help` combined with any of those can give you more information. As Composer uses [symfony/console](https://github.com/symfony/console) you can call commands by short name if it's not ambiguous. -```sh +```shell php composer.phar dump ``` calls `composer dump-autoload`. @@ -55,7 +55,7 @@ In the [Libraries](02-libraries.md) chapter we looked at how to create a When you run the command it will interactively ask you to fill in the fields, while using some smart defaults. -```sh +```shell php composer.phar init ``` @@ -83,7 +83,7 @@ php composer.phar init The `install` command reads the `composer.json` file from the current directory, resolves the dependencies, and installs them into `vendor`. -```sh +```shell php composer.phar install ``` @@ -141,7 +141,7 @@ In order to get the latest versions of the dependencies and to update the aliased as `upgrade` as it does the same as `upgrade` does if you are thinking of `apt-get` or similar package managers. -```sh +```shell php composer.phar update ``` @@ -150,13 +150,13 @@ into `composer.lock`. If you only want to update a few packages and not all, you can list them as such: -```sh +```shell php composer.phar update vendor/package vendor/package2 ``` You can also use wildcards to update a bunch of packages at once: -```sh +```shell php composer.phar update "vendor/*" ``` @@ -164,7 +164,7 @@ php composer.phar update "vendor/*" If you want to downgrade a package to a specific version without changing your composer.json you can use `--with` and provide a custom version constraint: -```sh +```shell php composer.phar update --with vendor/package:2.0.1 ``` @@ -172,7 +172,7 @@ Note that with the above all packages will be updated. If you only want to update the package(s) for which you provide custom constraints using `--with`, you can skip `--with` and instead use constraints with the partial update syntax: -```sh +```shell php composer.phar update vendor/package:2.0.1 vendor/package2:3.0.* ``` @@ -237,7 +237,7 @@ Specifying one of the words `mirrors`, `lock`, or `nothing` as an argument has t The `require` command adds new packages to the `composer.json` file from the current directory. If no file exists one will be created on the fly. -```sh +```shell php composer.phar require ``` @@ -247,7 +247,7 @@ installed or updated. If you do not want to choose requirements interactively, you can pass them to the command. -```sh +```shell php composer.phar require "vendor/package:2.*" vendor/package2:dev-master ``` @@ -301,7 +301,7 @@ If you do not specify a package, Composer will prompt you to search for a packag The `remove` command removes packages from the `composer.json` file from the current directory. -```sh +```shell php composer.phar remove vendor/package vendor/package2 ``` @@ -363,14 +363,14 @@ uninstalls them and reinstalls them. This lets you do a clean install of a package if you messed with its files, or if you wish to change the installation type using --prefer-install. -```sh +```shell php composer.phar reinstall acme/foo acme/bar ``` You can specify more than one package name to reinstall, or use a wildcard to select several packages at once: -```sh +```shell php composer.phar reinstall "acme/*" ``` @@ -430,7 +430,7 @@ can hold CLI tools or Composer plugins that you want to have available everywher This can be used to install CLI utilities globally. Here is an example: -```sh +```shell php composer.phar global require friendsofphp/php-cs-fixer ``` @@ -438,13 +438,13 @@ Now the `php-cs-fixer` binary is available globally. Make sure your global [vendor binaries](articles/vendor-binaries.md) directory is in your `$PATH` environment variable, you can get its location with the following command : -```sh +```shell php composer.phar global config bin-dir --absolute ``` If you wish to update the binary later on you can run a global update: -```sh +```shell php composer.phar global update ``` @@ -454,7 +454,7 @@ The search command allows you to search through the current project's package repositories. Usually this will be packagist. You pass it the terms you want to search for. -```sh +```shell php composer.phar search monolog ``` @@ -476,44 +476,54 @@ You can also search for more than one term by passing multiple arguments. To list all of the available packages, you can use the `show` command. -```sh +```shell php composer.phar show ``` To filter the list you can pass a package mask using wildcards. -```sh -php composer.phar show monolog/* - -monolog/monolog 1.19.0 Sends your logs to files, sockets, inboxes, databases and various web services +```shell +php composer.phar show "monolog/*" +``` +```text +monolog/monolog 2.4.0 Sends your logs to files, sockets, inboxes, databases and various web services ``` If you want to see the details of a certain package, you can pass the package name. -```sh +```shell php composer.phar show monolog/monolog - +``` +```text name : monolog/monolog -versions : master-dev, 1.0.2, 1.0.1, 1.0.0, 1.0.0-RC1 +descrip. : Sends your logs to files, sockets, inboxes, databases and various web services +keywords : log, logging, psr-3 +versions : * 1.27.1 type : library -names : monolog/monolog -source : [git] https://github.com/Seldaek/monolog.git 3d4e60d0cbc4b888fe5ad223d77964428b1978da -dist : [zip] https://github.com/Seldaek/monolog/zipball/3d4e60d0cbc4b888fe5ad223d77964428b1978da 3d4e60d0cbc4b888fe5ad223d77964428b1978da -license : MIT +license : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText +homepage : http://github.com/Seldaek/monolog +source : [git] https://github.com/Seldaek/monolog.git 904713c5929655dc9b97288b69cfeedad610c9a1 +dist : [zip] https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1 904713c5929655dc9b97288b69cfeedad610c9a1 +names : monolog/monolog, psr/log-implementation + +support +issues : https://github.com/Seldaek/monolog/issues +source : https://github.com/Seldaek/monolog/tree/1.27.1 autoload -psr-0 -Monolog : src/ +psr-4 +Monolog\ => src/Monolog requires php >=5.3.0 +psr/log ~1.0 ``` You can even pass the package version, which will tell you the details of that specific version. -```sh +```shell php composer.phar show monolog/monolog 1.0.2 ``` @@ -624,10 +634,12 @@ The `depends` command tells you which other packages depend on a certain package. As with installation `require-dev` relationships are only considered for the root package. -```sh +```shell php composer.phar depends doctrine/lexer - doctrine/annotations v1.2.7 requires doctrine/lexer (1.*) - doctrine/common v2.6.1 requires doctrine/lexer (1.*) +``` +```text +doctrine/annotations 1.13.3 requires doctrine/lexer (1.*) +doctrine/common 2.13.3 requires doctrine/lexer (^1.0) ``` You can optionally specify a version constraint after the package to limit the @@ -636,16 +648,17 @@ search. Add the `--tree` or `-t` flag to show a recursive tree of why the package is depended upon, for example: -```sh +```shell php composer.phar depends psr/log -t -psr/log 1.0.0 Common interface for logging libraries -|- aboutyou/app-sdk 2.6.11 (requires psr/log 1.0.*) -| `- __root__ (requires aboutyou/app-sdk ^2.6) -|- monolog/monolog 1.17.2 (requires psr/log ~1.0) -| `- laravel/framework v5.2.16 (requires monolog/monolog ~1.11) -| `- __root__ (requires laravel/framework ^5.2) -`- symfony/symfony v3.0.2 (requires psr/log ~1.0) - `- __root__ (requires symfony/symfony ^3.0) +``` +```text +psr/log 1.1.4 Common interface for logging libraries +├──composer/composer 2.4.x-dev (requires psr/log ^1.0 || ^2.0 || ^3.0) +├──composer/composer dev-main (requires psr/log ^1.0 || ^2.0 || ^3.0) +├──composer/xdebug-handler 3.0.3 (requires psr/log ^1 || ^2 || ^3) +│ ├──composer/composer 2.4.x-dev (requires composer/xdebug-handler ^2.0.2 || ^3.0.3) +│ └──composer/composer dev-main (requires composer/xdebug-handler ^2.0.2 || ^3.0.3) +└──symfony/console v5.4.11 (conflicts psr/log >=3) (circular dependency aborted here) ``` ### Options @@ -660,19 +673,23 @@ from being installed. Specify a version constraint to verify whether upgrades can be performed in your project, and if not why not. See the following example: -```sh +```shell php composer.phar prohibits symfony/symfony 3.1 - laravel/framework v5.2.16 requires symfony/var-dumper (2.8.*|3.0.*) +``` +```text +laravel/framework v5.2.16 requires symfony/var-dumper (2.8.*|3.0.*) ``` Note that you can also specify platform requirements, for example to check whether you can upgrade your server to PHP 8.0: -```sh +```shell php composer.phar prohibits php 8 - doctrine/cache v1.6.0 requires php (~5.5|~7.0) - doctrine/common v2.6.1 requires php (~5.5|~7.0) - doctrine/instantiator 1.0.5 requires php (>=5.3,<8.0-DEV) +``` +```text +doctrine/cache v1.6.0 requires php (~5.5|~7.0) +doctrine/common v2.6.1 requires php (~5.5|~7.0) +doctrine/instantiator 1.0.5 requires php (>=5.3,<8.0-DEV) ``` As with `depends` you can request a recursive lookup, which will list all @@ -689,7 +706,7 @@ You should always run the `validate` command before you commit your `composer.json` file, and before you tag a release. It will check if your `composer.json` is valid. -```sh +```shell php composer.phar validate ``` @@ -707,16 +724,17 @@ If you often need to modify the code of your dependencies and they are installed from source, the `status` command allows you to check if you have local changes in any of them. -```sh +```shell php composer.phar status ``` With the `--verbose` option you get some more information about what was changed: -```sh +```shell php composer.phar status -v - +``` +```text You have changes in the following dependencies: vendor/seld/jsonlint: M README.mdown @@ -727,20 +745,20 @@ vendor/seld/jsonlint: To update Composer itself to the latest version, run the `self-update` command. It will replace your `composer.phar` with the latest version. -```sh +```shell php composer.phar self-update ``` If you would like to instead update to a specific release specify it: -```sh -php composer.phar self-update 1.0.0-alpha7 +```shell +php composer.phar self-update 2.4.0-RC1 ``` If you have installed Composer for your entire system (see [global installation](00-intro.md#globally)), you may have to run the command with `root` privileges -```sh +```shell sudo -H composer self-update ``` @@ -768,7 +786,7 @@ in either the local `composer.json` file or the global `config.json` file. Additionally it lets you edit most properties in the local `composer.json`. -```sh +```shell php composer.phar config --list ``` @@ -813,13 +831,13 @@ See the [Config](06-config.md) chapter for valid configuration options. In addition to modifying the config section, the `config` command also supports making changes to the repositories section by using it the following way: -```sh +```shell php composer.phar config repositories.foo vcs https://github.com/foo/bar ``` If your repository requires more configuration options, you can instead pass its JSON representation : -```sh +```shell php composer.phar config repositories.foo '{"type": "vcs", "url": "http://svn.example.org/my-project/", "trunk-path": "master"}' ``` @@ -828,7 +846,7 @@ php composer.phar config repositories.foo '{"type": "vcs", "url": "http://svn.ex In addition to modifying the config section, the `config` command also supports making changes to the extra section by using it the following way: -```sh +```shell php composer.phar config extra.foo.bar value ``` @@ -838,7 +856,7 @@ would set `"extra": { "foo": { "bar": "value" } }`. If you have a complex value to add/modify, you can use the `--json` and `--merge` flags to edit extra fields as json: -```sh +```shell php composer.phar config --json extra.foo.bar '{"baz": true, "qux": []}' ``` @@ -861,7 +879,7 @@ provide a version as a third argument, otherwise the latest version is used. If the directory does not currently exist, it will be created during installation. -```sh +```shell php composer.phar create-project doctrine/orm path "2.2.*" ``` @@ -994,7 +1012,7 @@ If you think you found a bug, or something is behaving strangely, you might want to run the `diagnose` command to perform automated checks for many common problems. -```sh +```shell php composer.phar diagnose ``` @@ -1004,7 +1022,7 @@ This command is used to generate a zip/tar archive for a given package in a given version. It can also be used to archive your entire project without excluded/ignored files. -```sh +```shell php composer.phar archive vendor/package 2.0.21 --format=zip ``` @@ -1022,7 +1040,7 @@ for possible security issues. It checks for and lists security vulnerability advisories according to the [Packagist.org api](https://packagist.org/apidoc#list-security-advisories). -```sh +```shell php composer.phar audit ``` @@ -1036,7 +1054,7 @@ php composer.phar audit To get more information about a certain command, you can use `help`. -```sh +```shell php composer.phar help install ``` @@ -1059,7 +1077,7 @@ By setting the `COMPOSER` env variable it is possible to set the filename of For example: -```sh +```shell COMPOSER=composer-other.json php composer.phar install ``` diff --git a/doc/04-schema.md b/doc/04-schema.md index 5e65dee16151..4278edc91aa8 100644 --- a/doc/04-schema.md +++ b/doc/04-schema.md @@ -182,8 +182,8 @@ An Example for disjunctive licenses: ```json { "license": [ - "LGPL-2.1-only", - "GPL-3.0-or-later" + "LGPL-2.1-only", + "GPL-3.0-or-later" ] } ``` @@ -385,8 +385,8 @@ Example: ```json { - "require" : { - "php" : ">=7.4", + "require": { + "php": ">=7.4", "ext-mbstring": "*" } } @@ -861,16 +861,16 @@ override packages from it. Using JSON object notation is also possible. However, JSON key/value pairs are to be considered unordered so consistent behaviour cannot be guaranteed. - ```json +```json { "repositories": { - "foo": { - "type": "composer", - "url": "http://packages.foo.com" - } + "foo": { + "type": "composer", + "url": "http://packages.foo.com" + } } } - ``` +``` ### config ([root-only](04-schema.md#root-package)) diff --git a/doc/05-repositories.md b/doc/05-repositories.md index a403fd9bfcdd..6f98dbb70f58 100644 --- a/doc/05-repositories.md +++ b/doc/05-repositories.md @@ -646,9 +646,10 @@ those private packages: Each zip artifact is a ZIP archive with `composer.json` in root folder: -```sh +```shell unzip -l acme-corp-parser-10.3.5.zip - +``` +```text composer.json ... ``` @@ -665,11 +666,11 @@ you to depend on a local directory, either absolute or relative. This can be especially useful when dealing with monolithic repositories. For instance, if you have the following directory structure in your repository: -``` +```text ... ├── apps -│   └── my-app -│   └── composer.json +│ └── my-app +│ └── composer.json ├── packages │ └── my-package │ └── composer.json @@ -797,7 +798,7 @@ You can disable the default Packagist.org repository by adding this to your You can disable Packagist.org globally by using the global config flag: -```bash +```shell php composer.phar config -g repo.packagist false ``` diff --git a/doc/articles/aliases.md b/doc/articles/aliases.md index 1b03d42e505c..ce5a5b71d3d4 100644 --- a/doc/articles/aliases.md +++ b/doc/articles/aliases.md @@ -91,7 +91,7 @@ Add this to your project's root `composer.json`: Or let Composer add it for you with: -``` +```shell php composer.phar require "monolog/monolog:dev-bugfix as 1.0.x-dev" ``` diff --git a/doc/articles/authentication-for-private-packages.md b/doc/articles/authentication-for-private-packages.md index 8e4b142b9826..f84a9afa168c 100644 --- a/doc/articles/authentication-for-private-packages.md +++ b/doc/articles/authentication-for-private-packages.md @@ -64,7 +64,7 @@ For all authentication methods it is possible to edit them using the command lin To manually edit it, run: -```sh +```shell php composer.phar config --global --editor [--auth] ``` @@ -82,7 +82,7 @@ Manually editing this file instead of using the command line may result in inval To fix this you need to open the file in an editor and fix the error. To find the location of your global `auth.json`, execute: -```sh +```shell php composer.phar config --global home ``` @@ -117,18 +117,18 @@ Read more about the usage of this environment variable [here](../03-cli.md#compo ### Command line http-basic -```sh +```shell php composer.phar config [--global] http-basic.repo.example.org username password ``` In the above command, the config key `http-basic.repo.example.org` consists of two parts: - `http-basic` is the authentication method. -- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. +- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. ### Manual http-basic -```sh +```shell php composer.phar config [--global] --editor --auth ``` @@ -154,13 +154,13 @@ If the username e.g. is an email address it needs to be passed as `name%40exampl ### Command line inline http-basic -```sh +```shell php composer.phar config [--global] repositories composer.unique-name https://username:password@repo.example.org ``` ### Manual inline http-basic -```sh +```shell php composer.phar config [--global] --editor ``` @@ -179,18 +179,18 @@ php composer.phar config [--global] --editor ### Command line HTTP Bearer authentication -```sh +```shell php composer.phar config [--global] bearer.repo.example.org token ``` In the above command, the config key `bearer.repo.example.org` consists of two parts: - `bearer` is the authentication method. -- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. +- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. ### Manual HTTP Bearer authentication -```sh +```shell php composer.phar config [--global] --editor --auth ``` @@ -207,7 +207,7 @@ php composer.phar config [--global] --editor --auth ### Manual custom token authentication -```sh +```shell php composer.phar config [--global] --editor ``` @@ -218,11 +218,11 @@ php composer.phar config [--global] --editor "type": "composer", "url": "https://example.org", "options": { - "http": { - "header": [ - "API-TOKEN: YOUR-API-TOKEN" - ] - } + "http": { + "header": [ + "API-TOKEN: YOUR-API-TOKEN" + ] + } } } ] @@ -236,7 +236,7 @@ php composer.phar config [--global] --editor ### Command line gitlab-oauth -```sh +```shell php composer.phar config [--global] gitlab-oauth.gitlab.example.org token ``` @@ -247,7 +247,7 @@ In the above command, the config key `gitlab-oauth.gitlab.example.org` consists ### Manual gitlab-oauth -```sh +```shell php composer.phar config [--global] --editor --auth ``` @@ -271,7 +271,7 @@ When creating a gitlab token manually, make sure it has either the `read_api` or ### Command line gitlab-token -```sh +```shell php composer.phar config [--global] gitlab-token.gitlab.example.org token ``` @@ -282,7 +282,7 @@ In the above command, the config key `gitlab-token.gitlab.example.org` consists ### Manual gitlab-token -```sh +```shell php composer.phar config [--global] --editor --auth ``` @@ -306,7 +306,7 @@ Read more about [Personal Access Tokens](https://docs.github.com/en/authenticati ### Command line github-oauth -```sh +```shell php composer.phar config [--global] github-oauth.github.com token ``` @@ -317,7 +317,7 @@ In the above command, the config key `github-oauth.github.com` consists of two p ### Manual github-oauth -```sh +```shell php composer.phar config [--global] --editor --auth ``` @@ -335,7 +335,7 @@ The BitBucket driver uses OAuth to access your private repositories via the BitB ### Command line bitbucket-oauth -```sh +```shell php composer.phar config [--global] bitbucket-oauth.bitbucket.org consumer-key consumer-secret ``` @@ -346,7 +346,7 @@ In the above command, the config key `bitbucket-oauth.bitbucket.org` consists of ### Manual bitbucket-oauth -```sh +```shell php composer.phar config [--global] --editor --auth ``` diff --git a/doc/articles/composer-platform-dependencies.md b/doc/articles/composer-platform-dependencies.md index a3f2cadb2bd3..e166d6f4a103 100644 --- a/doc/articles/composer-platform-dependencies.md +++ b/doc/articles/composer-platform-dependencies.md @@ -23,8 +23,8 @@ That's how packages can add a dependency on the used PHP version: ```json { - "require" : { - "php" : ">=7.4" + "require": { + "php": ">=7.4" } } ``` @@ -61,7 +61,7 @@ autoloader are considered the application "runtime". Starting with version 2.0, Composer makes [additional features](../07-runtime.md) (besides registering the class autoloader) available to the application runtime environment. Similar to `composer-plugin-api`, not every Composer release adds new runtime features, -thus the version of `composer-runtimeapi` is also increased independently from Composer's version. +thus the version of `composer-runtimeapi` is also increased independently from Composer's version. ## Composer package `composer` diff --git a/doc/articles/handling-private-packages.md b/doc/articles/handling-private-packages.md index efb131e05c1c..9548809f96a5 100644 --- a/doc/articles/handling-private-packages.md +++ b/doc/articles/handling-private-packages.md @@ -48,14 +48,14 @@ The default file Satis looks for is `satis.json` in the root of the repository. ```json { - "name": "my/repository", - "homepage": "http://packages.example.org", - "repositories": [ - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, - { "type": "vcs", "url": "http://svn.example.org/private/repo" }, - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } - ], - "require-all": true + "name": "my/repository", + "homepage": "http://packages.example.org", + "repositories": [ + { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, + { "type": "vcs", "url": "http://svn.example.org/private/repo" }, + { "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } + ], + "require-all": true } ``` @@ -66,16 +66,16 @@ or another constraint if you want really specific versions. ```json { - "repositories": [ - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, - { "type": "vcs", "url": "http://svn.example.org/private/repo" }, - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } - ], - "require": { - "company/package": "*", - "company/package2": "*", - "company/package3": "2.0.0" - } + "repositories": [ + { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, + { "type": "vcs", "url": "http://svn.example.org/private/repo" }, + { "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } + ], + "require": { + "company/package": "*", + "company/package2": "*", + "company/package3": "2.0.0" + } } ``` @@ -119,11 +119,11 @@ to declare a *name* for all your package (this only work on VCS repositories typ ```json { - "repositories": [ - { "name": "company/privaterepo", "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, - { "name": "private/repo", "type": "vcs", "url": "http://svn.example.org/private/repo" }, - { "name": "mycompany/privaterepo2", "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } - ] + "repositories": [ + { "name": "company/privaterepo", "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, + { "name": "private/repo", "type": "vcs", "url": "http://svn.example.org/private/repo" }, + { "name": "mycompany/privaterepo2", "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } + ] } ``` @@ -142,12 +142,12 @@ will update itself. ```json { - "repositories": [ { "type": "composer", "url": "http://packages.example.org/" } ], - "require": { - "company/package": "1.2.0", - "company/package2": "1.5.2", - "company/package3": "dev-master" - } + "repositories": [ { "type": "composer", "url": "http://packages.example.org/" } ], + "require": { + "company/package": "1.2.0", + "company/package2": "1.5.2", + "company/package3": "dev-master" + } } ``` @@ -161,17 +161,17 @@ Example using a custom repository using SSH (requires the SSH2 PECL extension): ```json { - "repositories": [{ - "type": "composer", - "url": "ssh2.sftp://example.org", - "options": { - "ssh2": { - "username": "composer", - "pubkey_file": "/home/composer/.ssh/id_rsa.pub", - "privkey_file": "/home/composer/.ssh/id_rsa" - } - } - }] + "repositories": [{ + "type": "composer", + "url": "ssh2.sftp://example.org", + "options": { + "ssh2": { + "username": "composer", + "pubkey_file": "/home/composer/.ssh/id_rsa.pub", + "privkey_file": "/home/composer/.ssh/id_rsa" + } + } + }] } ``` @@ -181,15 +181,15 @@ Example using SSL/TLS (HTTPS) using a client certificate: ```json { - "repositories": [{ - "type": "composer", - "url": "https://example.org", - "options": { - "ssl": { - "local_cert": "/home/composer/.ssl/composer.pem" - } - } - }] + "repositories": [{ + "type": "composer", + "url": "https://example.org", + "options": { + "ssl": { + "local_cert": "/home/composer/.ssl/composer.pem" + } + } + }] } ``` @@ -199,17 +199,17 @@ Example using a custom HTTP Header field for token authentication: ```json { - "repositories": [{ - "type": "composer", - "url": "https://example.org", - "options": { - "http": { - "header": [ - "API-TOKEN: YOUR-API-TOKEN" - ] - } - } - }] + "repositories": [{ + "type": "composer", + "url": "https://example.org", + "options": { + "http": { + "header": [ + "API-TOKEN: YOUR-API-TOKEN" + ] + } + } + }] } ``` @@ -231,14 +231,14 @@ and thus installations usually take a lot longer. To enable your satis installation to create downloads for all (Git, Mercurial and Subversion) your packages, add the following to your `satis.json`: -``` json +```json { - "archive": { - "directory": "dist", - "format": "tar", - "prefix-url": "https://amazing.cdn.example.org", - "skip-dev": true - } + "archive": { + "directory": "dist", + "format": "tar", + "prefix-url": "https://amazing.cdn.example.org", + "skip-dev": true + } } ``` @@ -287,10 +287,10 @@ add the following to your `satis.json`: ```json { - "abandoned": { - "company/package": true, - "company/package2": "company/newpackage" - } + "abandoned": { + "company/package": true, + "company/package2": "company/newpackage" + } } ``` @@ -309,8 +309,8 @@ complete local mirror of packages. Add the following to your `satis.json`: ```json { - "require-dependencies": true, - "require-dev-dependencies": true + "require-dependencies": true, + "require-dev-dependencies": true } ``` @@ -339,4 +339,4 @@ is set to true. [ssl context options]: https://secure.php.net/manual/en/context.ssl.php [Twig]: https://twig.sensiolabs.org/ [config schema]: https://getcomposer.org/doc/04-schema.md#config -[notify-batch]: https://getcomposer.org/doc/05-repositories.md#notify-batch \ No newline at end of file +[notify-batch]: https://getcomposer.org/doc/05-repositories.md#notify-batch diff --git a/doc/articles/plugins.md b/doc/articles/plugins.md index e26d16385135..18d9666569e9 100644 --- a/doc/articles/plugins.md +++ b/doc/articles/plugins.md @@ -351,7 +351,7 @@ The necessary configuration files are automatically loaded, in case your plugin To make use of it, your Composer plugin project needs a [PHPStan config file][12], which includes the `phpstan/rules.neon` file: -``` +```neon includes: - vendor/composer/composer/phpstan/rules.neon diff --git a/doc/articles/resolving-merge-conflicts.md b/doc/articles/resolving-merge-conflicts.md index 5a433556aea8..e4033b7d8258 100644 --- a/doc/articles/resolving-merge-conflicts.md +++ b/doc/articles/resolving-merge-conflicts.md @@ -42,7 +42,7 @@ To resolve the conflict when we merge these two branches: Before committing, make sure the resulting `composer.json` and `composer.lock` files are valid. To do this, run the following commands: -```sh +```shell php composer.phar validate php composer.phar install [--dry-run] ``` diff --git a/doc/articles/scripts.md b/doc/articles/scripts.md index 37fe8e7ff24a..5337720fe310 100644 --- a/doc/articles/scripts.md +++ b/doc/articles/scripts.md @@ -194,7 +194,7 @@ objects: If you would like to run the scripts for an event manually, the syntax is: -```sh +```shell php composer.phar run-script [--dev] [--no-dev] script ``` @@ -270,14 +270,14 @@ composer.json configuration: It's also possible to set the global environment variable to disable the timeout of all following scripts in the current terminal environment: -``` +```shell export COMPOSER_PROCESS_TIMEOUT=0 ``` To disable the timeout of a single script call, you must use the `run-script` composer command and specify the `--timeout` parameter: -``` +```shell php composer.phar run-script --timeout=0 test ``` @@ -302,10 +302,10 @@ You can also refer a script and pass it new arguments: ```json { - "scripts": { - "tests": "phpunit", - "testsVerbose": "@tests -vvv" - } + "scripts": { + "tests": "phpunit", + "testsVerbose": "@tests -vvv" + } } ``` diff --git a/doc/articles/troubleshooting.md b/doc/articles/troubleshooting.md index 6e5a4018cbef..461d1f897b72 100644 --- a/doc/articles/troubleshooting.md +++ b/doc/articles/troubleshooting.md @@ -157,7 +157,7 @@ In this case, the PHP `memory_limit` should be increased. To get the current `memory_limit` value, run: -```sh +```shell php -r "echo ini_get('memory_limit').PHP_EOL;" ``` @@ -171,13 +171,13 @@ memory_limit = -1 Composer also respects a memory limit defined by the `COMPOSER_MEMORY_LIMIT` environment variable: -```sh +```shell COMPOSER_MEMORY_LIMIT=-1 composer.phar <...> ``` Or, you can increase the limit with a command-line argument: -```sh +```shell php -d memory_limit=-1 composer.phar <...> ``` @@ -222,9 +222,10 @@ If Composer shows proc_open() fork failed on some commands: This could be happening because the VPS runs out of memory and has no Swap space enabled. -```sh +```shell free -m - +``` +```text total used free shared buffers cached Mem: 2048 357 1690 0 0 237 -/+ buffers/cache: 119 1928 @@ -233,7 +234,7 @@ Swap: 0 0 0 To enable the swap you can use for example: -```sh +```shell /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 /sbin/mkswap /var/swap.1 /bin/chmod 0600 /var/swap.1 @@ -282,7 +283,7 @@ If you have been pointed to this page, you want to check a few things: You may run into errors if IPv6 is not configured correctly. A common error is: -``` +```text The "https://getcomposer.org/version" file could not be downloaded: failed to open stream: Operation timed out ``` @@ -295,7 +296,7 @@ following workarounds: On linux, it seems that running this command helps to make ipv4 traffic have a higher priority than ipv6, which is a better alternative than disabling ipv6 entirely: -```bash +```shell sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf" ``` @@ -307,13 +308,13 @@ On windows the only way is to disable ipv6 entirely I am afraid (either in windo Get name of your network device: -```bash +```shell networksetup -listallnetworkservices ``` Disable IPv6 on that device (in this case "Wi-Fi"): -```bash +```shell networksetup -setv6off Wi-Fi ``` @@ -321,7 +322,7 @@ Run Composer ... You can enable IPv6 again with: -```bash +```shell networksetup -setv6automatic Wi-Fi ``` @@ -340,7 +341,7 @@ The reason for this is a SSH Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1 As a workaround, open a SSH connection to your Git host before running Composer: -```bash +```shell ssh -t git@mygitserver.tld php composer.phar update ``` @@ -368,7 +369,7 @@ an unexpected result such as an unresolvable set of dependencies or conflicts wh think Composer is wrong, you might want to disable the optimizer by using the environment variable `COMPOSER_POOL_OPTIMIZER` and run the update again like so: -```bash +```shell COMPOSER_POOL_OPTIMIZER=0 php composer.phar update ``` diff --git a/doc/articles/versions.md b/doc/articles/versions.md index 5a50b805b114..5d13e72a4415 100644 --- a/doc/articles/versions.md +++ b/doc/articles/versions.md @@ -27,14 +27,20 @@ in `composer.json`). *For the following discussion, let's assume the following sample library repository:* -```sh +```shell ~/my-library$ git branch +``` +```text v1 v2 my-feature another-feature +``` +```shell ~/my-library$ git tag +``` +```text v1.0 v1.0.1 v1.0.2 diff --git a/doc/faqs/how-to-install-composer-programmatically.md b/doc/faqs/how-to-install-composer-programmatically.md index 77666f6e3dab..7363c47c1ae6 100644 --- a/doc/faqs/how-to-install-composer-programmatically.md +++ b/doc/faqs/how-to-install-composer-programmatically.md @@ -6,7 +6,7 @@ it should not be relied upon in the long term. An alternative is to use this script which only works with UNIX utilities: -```bash +```shell #!/bin/sh EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')" @@ -34,7 +34,7 @@ a specific version from GitHub's history. The commit hash should be enough to give it uniqueness and authenticity as long as you can trust the GitHub servers. For example: -```bash +```shell wget https://raw.githubusercontent.com/composer/getcomposer.org/76a7060ccb93902cd7576b67264ad91c8a2700e2/web/installer -O - -q | php -- --quiet ``` diff --git a/doc/faqs/how-to-install-untrusted-packages-safely.md b/doc/faqs/how-to-install-untrusted-packages-safely.md index bfa23b5b9998..b59fb2c38d4f 100644 --- a/doc/faqs/how-to-install-untrusted-packages-safely.md +++ b/doc/faqs/how-to-install-untrusted-packages-safely.md @@ -10,7 +10,7 @@ Composer command. You can disable plugins and scripts during package installation or updates with the following syntax so only Composer's code, and no third party code, will execute: -```sh +```shell php composer.phar install --no-plugins --no-scripts ... php composer.phar update --no-plugins --no-scripts ... ``` From cd71cf47b3680a81bb9e280e4fe57dc1adb7b59d Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 20 Aug 2022 13:13:59 +0200 Subject: [PATCH 273/618] Bump main to target 2.5 --- composer.json | 2 +- src/Composer/Composer.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 85fbff553fd7..fb8fe22b83e0 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ }, "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "phpstan": { "includes": [ diff --git a/src/Composer/Composer.php b/src/Composer/Composer.php index c6f083dfdb51..8a870cc477dc 100644 --- a/src/Composer/Composer.php +++ b/src/Composer/Composer.php @@ -54,7 +54,7 @@ class Composer extends PartialComposer public const VERSION = '@package_version@'; public const BRANCH_ALIAS_VERSION = '@package_branch_alias_version@'; public const RELEASE_DATE = '@release_date@'; - public const SOURCE_VERSION = '2.4.999-dev+source'; + public const SOURCE_VERSION = '2.5.999-dev+source'; /** * Version number of the internal composer-runtime-api package From 476fb03fb11c05b40b042d8dbbbd0a4c183430ed Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Sat, 20 Aug 2022 14:34:06 +0200 Subject: [PATCH 274/618] Update lock --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index a6764fb6f55b..e68b080fe5cd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d3dba05c3c2010d8328f0795e69c7c8f", + "content-hash": "4ec20acb078c0911a5f2cb0ab986bf2f", "packages": [ { "name": "composer/ca-bundle", @@ -2168,16 +2168,16 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "1.2.8", + "version": "1.2.9", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "28fe677ec3ad43eb4c0946c502535365e3040ecf" + "reference": "f4cb3b8915d3656e780f305f01c86b70ff933272" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/28fe677ec3ad43eb4c0946c502535365e3040ecf", - "reference": "28fe677ec3ad43eb4c0946c502535365e3040ecf", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/f4cb3b8915d3656e780f305f01c86b70ff933272", + "reference": "f4cb3b8915d3656e780f305f01c86b70ff933272", "shasum": "" }, "require": { @@ -2233,9 +2233,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.2.8" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.2.9" }, - "time": "2022-07-20T12:02:52+00:00" + "time": "2022-08-05T20:13:38+00:00" }, { "name": "symfony/phpunit-bridge", From b6028951b8a2254d4896b4dd13bcbe380a3d51bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Mirtes?= Date: Mon, 22 Aug 2022 15:00:18 +0200 Subject: [PATCH 275/618] Tests bootstrap - require InstalledVersions only if it's not declared yet (#11014) --- tests/bootstrap.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index e4fa7fa3c001..010ded939460 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -10,6 +10,7 @@ * file that was distributed with this source code. */ +use Composer\InstalledVersions; use Composer\Util\Platform; error_reporting(E_ALL); @@ -19,7 +20,11 @@ } require __DIR__.'/../src/bootstrap.php'; -require __DIR__.'/../src/Composer/InstalledVersions.php'; + +if (!class_exists(InstalledVersions::class, false)) { + require __DIR__.'/../src/Composer/InstalledVersions.php'; +} + require __DIR__.'/Composer/Test/TestCase.php'; Platform::putEnv('COMPOSER_TESTS_ARE_RUNNING', '1'); From a1bc424a064b5eee7324f4fab8580c1038ced48a Mon Sep 17 00:00:00 2001 From: Alex <93376818+sashashura@users.noreply.github.com> Date: Sun, 28 Aug 2022 08:40:56 +0100 Subject: [PATCH 276/618] Update release.yml --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0e1efd9d1d8..2ed3941bf3e6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,11 +5,16 @@ on: tags: - "*" +permissions: + contents: read + env: COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --no-suggest --prefer-dist" jobs: build: + permissions: + contents: write # for actions/create-release to create a release name: Upload Release Asset runs-on: ubuntu-latest steps: From 13421f7d66ae8e824e9b821f2aee75772284cbbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Mirtes?= Date: Fri, 26 Aug 2022 15:01:28 +0200 Subject: [PATCH 277/618] Config - always respect COMPOSER_DISCARD_CHANGES --- src/Composer/Config.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Composer/Config.php b/src/Composer/Config.php index 141efa6ff01f..8d132bb7c068 100644 --- a/src/Composer/Config.php +++ b/src/Composer/Config.php @@ -376,7 +376,8 @@ public function get(string $key, int $flags = 0) return $value; case 'discard-changes': - if ($env = $this->getComposerEnv('COMPOSER_DISCARD_CHANGES')) { + $env = $this->getComposerEnv('COMPOSER_DISCARD_CHANGES'); + if ($env !== false) { if (!in_array($env, ['stash', 'true', 'false', '1', '0'], true)) { throw new \RuntimeException( "Invalid value for COMPOSER_DISCARD_CHANGES: {$env}. Expected 1, 0, true, false or stash" @@ -519,7 +520,7 @@ private function realpath(string $path): string * This should be used to read COMPOSER_ environment variables * that overload config values. * - * @return string|bool + * @return string|false */ private function getComposerEnv(string $var) { From 740de14a397bbbe1f2031584bda3d5c7f1536c4e Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Tue, 30 Aug 2022 14:10:28 +0200 Subject: [PATCH 278/618] Fix the heading levels for the doc about composer repositories (#11030) --- doc/05-repositories.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/05-repositories.md b/doc/05-repositories.md index 6f98dbb70f58..1ab7f5ca60eb 100644 --- a/doc/05-repositories.md +++ b/doc/05-repositories.md @@ -149,7 +149,7 @@ number. This field is optional. -### metadata-url, available-packages and available-package-patterns +#### metadata-url, available-packages and available-package-patterns The `metadata-url` field allows you to provide a URL template to serve all packages which are in the repository. It must contain the placeholder @@ -204,7 +204,7 @@ every matching package name in this repository). This field is optional. -### providers-api +#### providers-api The `providers-api` field allows you to provide a URL template to serve all packages which provide a given package name, but not the package which has @@ -222,7 +222,7 @@ monolog/monolog itself. This field is optional. -### list +#### list The `list` field allows you to return the names of packages which match a given field (or all names if no filter is present). It should accept an From 2d48c7dbb0660c014989319d927af7ca5578193e Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 30 Aug 2022 20:45:07 +0200 Subject: [PATCH 279/618] Fix handling of zero-major versions in outdated --major-only flag, fixes #11032 --- src/Composer/Command/ShowCommand.php | 4 +- .../Composer/Test/Command/ShowCommandTest.php | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index eca2149aeb61..260af566b518 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -1356,8 +1356,8 @@ private function findLatestPackage(PackageInterface $package, Composer $composer } if ($targetVersion === null) { - if ($majorOnly && Preg::isMatch('{^(\d+)\.}', $package->getVersion(), $match)) { - $targetVersion = '>='.($match[1] + 1).',<9999999-dev'; + if ($majorOnly && Preg::isMatch('{^(?P0\.)?(?P\d+)\.}', $package->getVersion(), $match)) { + $targetVersion = '>='.$match['zero_major'].($match['first_meaningful'] + 1).',<9999999-dev'; } if ($minorOnly) { diff --git a/tests/Composer/Test/Command/ShowCommandTest.php b/tests/Composer/Test/Command/ShowCommandTest.php index ea23fad11860..ea33377e3e03 100644 --- a/tests/Composer/Test/Command/ShowCommandTest.php +++ b/tests/Composer/Test/Command/ShowCommandTest.php @@ -192,6 +192,61 @@ public function testShowPlatformOnlyShowsPlatformPackages(): void } } + public function testOutdatedWithZeroMajor(): void + { + $this->initTempComposer([ + 'repositories' => [ + 'packages' => [ + 'type' => 'package', + 'package' => [ + ['name' => 'zero/major', 'description' => 'generic description', 'version' => '0.1.0'], + ['name' => 'zero/major', 'description' => 'generic description', 'version' => '0.2.0'], + ['name' => 'zero/minor', 'description' => 'generic description', 'version' => '0.1.0'], + ['name' => 'zero/minor', 'description' => 'generic description', 'version' => '0.1.2'], + ['name' => 'zero/patch', 'description' => 'generic description', 'version' => '0.1.2'], + ['name' => 'zero/patch', 'description' => 'generic description', 'version' => '0.1.2.1'], + ], + ], + ], + 'require' => [ + 'zero/major' => '^0.1', + 'zero/minor' => '^0.1', + 'zero/patch' => '^0.1', + ], + ]); + + $this->createInstalledJson([ + $this->getPackage('zero/major', '0.1.0'), + $this->getPackage('zero/minor', '0.1.0'), + $this->getPackage('zero/patch', '0.1.2'), + ]); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'outdated', '--direct' => true, '--patch-only' => true]); + self::assertSame( +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible +zero/patch 0.1.2 ! 0.1.2.1', trim($appTester->getDisplay(true))); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'outdated', '--direct' => true, '--minor-only' => true]); + self::assertSame( +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible +zero/minor 0.1.0 ! 0.1.2 +zero/patch 0.1.2 ! 0.1.2.1', trim($appTester->getDisplay(true))); + + $appTester = $this->getApplicationTester(); + $appTester->run(['command' => 'outdated', '--direct' => true, '--major-only' => true]); + self::assertSame( +'Legend: +! patch or minor release available - update recommended +~ major release available - update possible +zero/major 0.1.0 ~ 0.2.0', trim($appTester->getDisplay(true))); + } + public function testShowAllShowsAllSections(): void { $this->initTempComposer([ From 3177b2132447a970eb96954df13e45ba57448922 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 31 Aug 2022 09:47:59 +0200 Subject: [PATCH 280/618] Fix handling for double-zero prefix, refs #11032 --- src/Composer/Command/ShowCommand.php | 2 +- tests/Composer/Test/Command/ShowCommandTest.php | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index 260af566b518..2ec21c33fcb6 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -1356,7 +1356,7 @@ private function findLatestPackage(PackageInterface $package, Composer $composer } if ($targetVersion === null) { - if ($majorOnly && Preg::isMatch('{^(?P0\.)?(?P\d+)\.}', $package->getVersion(), $match)) { + if ($majorOnly && Preg::isMatch('{^(?P(?:0\.)+)?(?P\d+)\.}', $package->getVersion(), $match)) { $targetVersion = '>='.$match['zero_major'].($match['first_meaningful'] + 1).',<9999999-dev'; } diff --git a/tests/Composer/Test/Command/ShowCommandTest.php b/tests/Composer/Test/Command/ShowCommandTest.php index ea33377e3e03..9c9880203448 100644 --- a/tests/Composer/Test/Command/ShowCommandTest.php +++ b/tests/Composer/Test/Command/ShowCommandTest.php @@ -199,6 +199,8 @@ public function testOutdatedWithZeroMajor(): void 'packages' => [ 'type' => 'package', 'package' => [ + ['name' => 'zerozero/major', 'description' => 'generic description', 'version' => '0.0.1'], + ['name' => 'zerozero/major', 'description' => 'generic description', 'version' => '0.0.2'], ['name' => 'zero/major', 'description' => 'generic description', 'version' => '0.1.0'], ['name' => 'zero/major', 'description' => 'generic description', 'version' => '0.2.0'], ['name' => 'zero/minor', 'description' => 'generic description', 'version' => '0.1.0'], @@ -209,6 +211,7 @@ public function testOutdatedWithZeroMajor(): void ], ], 'require' => [ + 'zerozero/major' => '^0.0.1', 'zero/major' => '^0.1', 'zero/minor' => '^0.1', 'zero/patch' => '^0.1', @@ -216,6 +219,7 @@ public function testOutdatedWithZeroMajor(): void ]); $this->createInstalledJson([ + $this->getPackage('zerozero/major', '0.0.1'), $this->getPackage('zero/major', '0.1.0'), $this->getPackage('zero/minor', '0.1.0'), $this->getPackage('zero/patch', '0.1.2'), @@ -244,7 +248,8 @@ public function testOutdatedWithZeroMajor(): void 'Legend: ! patch or minor release available - update recommended ~ major release available - update possible -zero/major 0.1.0 ~ 0.2.0', trim($appTester->getDisplay(true))); +zero/major 0.1.0 ~ 0.2.0 +zerozero/major 0.0.1 ~ 0.0.2', trim($appTester->getDisplay(true))); } public function testShowAllShowsAllSections(): void From 9306eebf0c02695b32c85ae0bf0c7ed1e9cb5641 Mon Sep 17 00:00:00 2001 From: Korvin Szanto Date: Wed, 31 Aug 2022 01:43:54 -0700 Subject: [PATCH 281/618] Update gitlab fetch failure message with new path (#11038) `https://gitlab.com/-/profile/personal_access_token` is not correct, the current URL for personal access token settings is `https://gitlab.com/-/profile/personal_access_tokens`. This is the only occurrence of the bad URL, we use the proper URL elsewhere. --- src/Composer/Util/GitLab.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Composer/Util/GitLab.php b/src/Composer/Util/GitLab.php index ce04d29fec75..d1878058f928 100644 --- a/src/Composer/Util/GitLab.php +++ b/src/Composer/Util/GitLab.php @@ -127,7 +127,7 @@ public function authorizeOAuthInteractively(string $scheme, string $originUrl, ? $this->io->writeError(sprintf('A token will be created and stored in "%s", your password will never be stored', $this->config->getAuthConfigSource()->getName())); $this->io->writeError('To revoke access to this token you can visit '.$scheme.'://'.$originUrl.'/-/profile/applications'); - $this->io->writeError('Alternatively you can setup an personal access token on '.$scheme.'://'.$originUrl.'/-/profile/personal_access_token and store it under "gitlab-token" see https://getcomposer.org/doc/articles/authentication-for-private-packages.md#gitlab-token for more details.'); + $this->io->writeError('Alternatively you can setup an personal access token on '.$scheme.'://'.$originUrl.'/-/profile/personal_access_tokens and store it under "gitlab-token" see https://getcomposer.org/doc/articles/authentication-for-private-packages.md#gitlab-token for more details.'); $attemptCounter = 0; From 39de9899a70d8351db134027dc24ed35fc629346 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Wed, 31 Aug 2022 13:07:23 +0300 Subject: [PATCH 282/618] Lock down include wrappers to avoid abuse from third parties (#11015) --- src/Composer/Autoload/AutoloadGenerator.php | 39 +++++++------------ src/Composer/Autoload/ClassLoader.php | 31 ++++++++------- .../autoload_real_files_by_dependency.php | 27 +++++-------- .../Fixtures/autoload_real_functions.php | 27 +++++-------- ...load_real_functions_with_include_paths.php | 27 +++++-------- .../Fixtures/autoload_real_target_dir.php | 27 +++++-------- 6 files changed, 69 insertions(+), 109 deletions(-) diff --git a/src/Composer/Autoload/AutoloadGenerator.php b/src/Composer/Autoload/AutoloadGenerator.php index 2a20265df7cb..921ba6b6ee15 100644 --- a/src/Composer/Autoload/AutoloadGenerator.php +++ b/src/Composer/Autoload/AutoloadGenerator.php @@ -1007,9 +1007,16 @@ public static function getLoader() if ($useIncludeFiles) { $file .= << \$file) { - composerRequire$suffix(\$fileIdentifier, \$file); + \$filesToLoad = \Composer\Autoload\ComposerStaticInit$suffix::\$files; + \$requireFile = static function (\$fileIdentifier, \$file) { + if (empty(\$GLOBALS['__composer_autoload_files'][\$fileIdentifier])) { + \$GLOBALS['__composer_autoload_files'][\$fileIdentifier] = true; + + require \$file; + } + }; + foreach (\$filesToLoad as \$fileIdentifier => \$file) { + (\$requireFile)(\$fileIdentifier, \$file); } @@ -1024,27 +1031,6 @@ public static function getLoader() $file .= $targetDirLoader; - if ($useIncludeFiles) { - return $file . <<