From 4d05112375686db68bc7f16486133684b68fd8ef Mon Sep 17 00:00:00 2001 From: nobody Date: Thu, 27 May 2021 12:29:06 +1000 Subject: [PATCH] package updates --- composer.json | 7 +- composer.lock | 609 ++- vendor/composer/ClassLoader.php | 38 +- vendor/composer/InstalledVersions.php | 595 +++ vendor/composer/autoload_classmap.php | 12 +- vendor/composer/autoload_files.php | 4 +- vendor/composer/autoload_real.php | 6 +- vendor/composer/autoload_static.php | 16 +- vendor/composer/installed.json | 4222 +++++++++-------- vendor/composer/installed.php | 335 ++ vendor/composer/platform_check.php | 26 + vendor/phpseclib/phpseclib/.gitattributes | 9 + vendor/phpseclib/phpseclib/.gitignore | 3 + vendor/phpseclib/phpseclib/.travis.yml | 45 + vendor/phpseclib/phpseclib/CHANGELOG.md | 547 +++ vendor/phpseclib/phpseclib/build/build.xml | 25 + .../build/code-sniffer-ruleset-tests.xml | 17 + .../phpseclib/build/code-sniffer-ruleset.xml | 35 + .../phpseclib/phpseclib/Crypt/Base.php | 67 +- .../phpseclib/phpseclib/Crypt/RSA.php | 62 +- .../phpseclib/phpseclib/File/ASN1.php | 68 +- .../phpseclib/phpseclib/File/X509.php | 9 +- .../phpseclib/phpseclib/Math/BigInteger.php | 6 +- .../phpseclib/phpseclib/Net/SFTP.php | 30 +- .../phpseclib/phpseclib/Net/SFTP/Stream.php | 6 +- .../phpseclib/phpseclib/Net/SSH2.php | 57 +- vendor/phpseclib/phpseclib/phpunit.xml.dist | 21 + .../travis/install-php-extensions.sh | 25 + .../phpseclib/phpseclib/travis/run-phpunit.sh | 51 + .../phpseclib/travis/setup-composer.sh | 3 + .../phpseclib/travis/setup-secure-shell.sh | 33 + vendor/psr/log/.gitattributes | 2 + vendor/psr/log/.gitignore | 1 + vendor/psr/log/Psr/Log/AbstractLogger.php | 32 +- vendor/psr/log/Psr/Log/LoggerAwareTrait.php | 2 +- vendor/psr/log/composer.json | 2 +- .../deprecation-contracts/CHANGELOG.md | 2 +- vendor/symfony/deprecation-contracts/LICENSE | 2 +- .../deprecation-contracts/composer.json | 2 +- vendor/symfony/process/.gitattributes | 4 + vendor/symfony/process/.gitignore | 3 + vendor/symfony/process/Process.php | 4 +- .../process/Tests/CreateNewConsoleTest.php | 45 + .../process/Tests/ErrorProcessInitiator.php | 36 + .../process/Tests/ExecutableFinderTest.php | 175 + .../Tests/KillableProcessWithOutput.php | 25 + .../process/Tests/NonStopableProcess.php | 47 + .../process/Tests/PhpExecutableFinderTest.php | 61 + .../symfony/process/Tests/PhpProcessTest.php | 74 + .../PipeStdinInStdoutStdErrStreamSelect.php | 72 + .../Tests/ProcessFailedExceptionTest.php | 134 + vendor/symfony/process/Tests/ProcessTest.php | 1552 ++++++ .../symfony/process/Tests/SignalListener.php | 21 + .../process/Tests/ThreeSecondProcess.php | 14 + vendor/symfony/process/phpunit.xml.dist | 30 + 55 files changed, 7008 insertions(+), 2323 deletions(-) create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/phpseclib/phpseclib/.gitattributes create mode 100644 vendor/phpseclib/phpseclib/.gitignore create mode 100644 vendor/phpseclib/phpseclib/.travis.yml create mode 100644 vendor/phpseclib/phpseclib/CHANGELOG.md create mode 100644 vendor/phpseclib/phpseclib/build/build.xml create mode 100644 vendor/phpseclib/phpseclib/build/code-sniffer-ruleset-tests.xml create mode 100644 vendor/phpseclib/phpseclib/build/code-sniffer-ruleset.xml create mode 100644 vendor/phpseclib/phpseclib/phpunit.xml.dist create mode 100755 vendor/phpseclib/phpseclib/travis/install-php-extensions.sh create mode 100755 vendor/phpseclib/phpseclib/travis/run-phpunit.sh create mode 100755 vendor/phpseclib/phpseclib/travis/setup-composer.sh create mode 100755 vendor/phpseclib/phpseclib/travis/setup-secure-shell.sh create mode 100644 vendor/psr/log/.gitattributes create mode 100644 vendor/psr/log/.gitignore create mode 100644 vendor/symfony/process/.gitattributes create mode 100644 vendor/symfony/process/.gitignore create mode 100644 vendor/symfony/process/Tests/CreateNewConsoleTest.php create mode 100755 vendor/symfony/process/Tests/ErrorProcessInitiator.php create mode 100644 vendor/symfony/process/Tests/ExecutableFinderTest.php create mode 100644 vendor/symfony/process/Tests/KillableProcessWithOutput.php create mode 100644 vendor/symfony/process/Tests/NonStopableProcess.php create mode 100644 vendor/symfony/process/Tests/PhpExecutableFinderTest.php create mode 100644 vendor/symfony/process/Tests/PhpProcessTest.php create mode 100644 vendor/symfony/process/Tests/PipeStdinInStdoutStdErrStreamSelect.php create mode 100644 vendor/symfony/process/Tests/ProcessFailedExceptionTest.php create mode 100644 vendor/symfony/process/Tests/ProcessTest.php create mode 100644 vendor/symfony/process/Tests/SignalListener.php create mode 100644 vendor/symfony/process/Tests/ThreeSecondProcess.php create mode 100644 vendor/symfony/process/phpunit.xml.dist diff --git a/composer.json b/composer.json index 36e383f63..66d8e3c30 100644 --- a/composer.json +++ b/composer.json @@ -69,9 +69,6 @@ "config" : { "notify-on-install" : false, "optimize-autoloader" : true - }, - "repositories": [{ - "type": "vcs", - "url": "https://github.com/simplepie/simplepie" - }] + } + } diff --git a/composer.lock b/composer.lock index f79adb15e..71a0d547a 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": "1b4fe49efccb9f54f198566c249c7e76", + "content-hash": "2b461f682e5b5e871ae9179a71324b9d", "packages": [ { "name": "blueimp/jquery-file-upload", @@ -59,6 +59,10 @@ "upload", "widget" ], + "support": { + "forum": "https://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload", + "source": "https://github.com/vkhramtsov/jQuery-File-Upload/tree/v10.31.0" + }, "funding": [ { "url": "https://github.com/blueimp", @@ -123,6 +127,10 @@ "oauth", "oauth2" ], + "support": { + "issues": "https://github.com/bshaffer/oauth2-server-php/issues", + "source": "https://github.com/bshaffer/oauth2-server-php/tree/master" + }, "time": "2018-12-04T00:29:32+00:00" }, { @@ -167,6 +175,10 @@ } ], "description": "Internationalization library powered by CLDR data.", + "support": { + "issues": "https://github.com/commerceguys/intl/issues", + "source": "https://github.com/commerceguys/intl/tree/master" + }, "time": "2017-12-29T00:13:05+00:00" }, { @@ -232,6 +244,10 @@ "iterators", "php" ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/1.6.7" + }, "time": "2020-07-27T17:53:49+00:00" }, { @@ -282,6 +298,10 @@ "keywords": [ "html" ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/master" + }, "time": "2020-06-29T00:56:53+00:00" }, { @@ -329,6 +349,10 @@ "forkawesome", "icon" ], + "support": { + "issues": "https://github.com/ForkAwesome/Fork-Awesome/issues", + "source": "https://github.com/ForkAwesome/Fork-Awesome/tree/1.1.7" + }, "time": "2019-02-28T15:21:34+00:00" }, { @@ -388,6 +412,10 @@ "url", "urlify" ], + "support": { + "issues": "https://github.com/jbroadway/urlify/issues", + "source": "https://github.com/jbroadway/urlify/tree/master" + }, "time": "2020-06-14T17:15:34+00:00" }, { @@ -434,6 +462,10 @@ } ], "description": "A Git wrapper for PHP5.3+", + "support": { + "issues": "https://github.com/kzykhys/PHPGit/issues", + "source": "https://github.com/kzykhys/PHPGit/tree/master" + }, "time": "2014-02-15T06:18:00+00:00" }, { @@ -498,6 +530,10 @@ "html", "markdown" ], + "support": { + "issues": "https://github.com/thephpleague/html-to-markdown/issues", + "source": "https://github.com/thephpleague/html-to-markdown/tree/4.10.0" + }, "funding": [ { "url": "https://www.colinodell.com/sponsor", @@ -581,6 +617,10 @@ "serializer", "xml" ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.7.4" + }, "time": "2020-10-01T13:52:52+00:00" }, { @@ -630,6 +670,10 @@ "keywords": [ "markdown" ], + "support": { + "issues": "https://github.com/michelf/php-markdown/issues", + "source": "https://github.com/michelf/php-markdown/tree/1.9.0" + }, "time": "2019-12-02T02:32:27+00:00" }, { @@ -671,6 +715,10 @@ ], "description": "Detect and return all emoji found in a string", "homepage": "https://github.com/aaronpk/emoji-detector-php", + "support": { + "issues": "https://github.com/aaronpk/emoji-detector-php/issues", + "source": "https://github.com/aaronpk/emoji-detector-php/tree/master" + }, "time": "2017-11-30T21:02:53+00:00" }, { @@ -716,20 +764,25 @@ "pseudorandom", "random" ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, "time": "2018-07-02T15:55:56+00:00" }, { "name": "phpseclib/phpseclib", - "version": "2.0.30", + "version": "2.0.31", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36" + "reference": "233a920cb38636a43b18d428f9a8db1f0a1a08f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/136b9ca7eebef78be14abf90d65c5e57b6bc5d36", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/233a920cb38636a43b18d428f9a8db1f0a1a08f4", + "reference": "233a920cb38636a43b18d428f9a8db1f0a1a08f4", "shasum": "" }, "require": { @@ -807,6 +860,10 @@ "x.509", "x509" ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.31" + }, "funding": [ { "url": "https://github.com/terrafrost", @@ -821,20 +878,20 @@ "type": "tidelift" } ], - "time": "2020-12-17T05:42:04+00:00" + "time": "2021-04-06T13:56:45+00:00" }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -858,7 +915,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -868,7 +925,10 @@ "psr", "psr-3" ], - "time": "2020-03-23T09:12:05+00:00" + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" }, { "name": "ramsey/uuid", @@ -955,6 +1015,12 @@ "identifier", "uuid" ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "rss": "https://github.com/ramsey/uuid/releases.atom", + "source": "https://github.com/ramsey/uuid", + "wiki": "https://github.com/ramsey/uuid/wiki" + }, "time": "2020-02-21T04:36:14+00:00" }, { @@ -1038,6 +1104,11 @@ "framework", "iCalendar" ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/dav/issues", + "source": "https://github.com/fruux/sabre-dav" + }, "time": "2018-10-19T09:58:27+00:00" }, { @@ -1095,6 +1166,11 @@ "promise", "signal" ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/event/issues", + "source": "https://github.com/fruux/sabre-event" + }, "time": "2015-11-05T20:14:39+00:00" }, { @@ -1151,6 +1227,11 @@ "keywords": [ "http" ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/http/issues", + "source": "https://github.com/fruux/sabre-http" + }, "time": "2018-02-23T11:10:29+00:00" }, { @@ -1202,6 +1283,11 @@ "uri", "url" ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/uri/issues", + "source": "https://github.com/fruux/sabre-uri" + }, "time": "2017-02-20T19:59:28+00:00" }, { @@ -1298,6 +1384,11 @@ "xCal", "xCard" ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/vobject/issues", + "source": "https://github.com/fruux/sabre-vobject" + }, "time": "2020-01-14T10:18:45+00:00" }, { @@ -1361,6 +1452,11 @@ "dom", "xml" ], + "support": { + "forum": "https://groups.google.com/group/sabredav-discuss", + "issues": "https://github.com/sabre-io/xml/issues", + "source": "https://github.com/fruux/sabre-xml" + }, "time": "2019-01-09T13:51:57+00:00" }, { @@ -1415,6 +1511,10 @@ "recurring", "rrule" ], + "support": { + "issues": "https://github.com/simshaun/recurr/issues", + "source": "https://github.com/simshaun/recurr/tree/v4.0.5" + }, "time": "2021-03-25T23:00:49+00:00" }, { @@ -1472,20 +1572,26 @@ "keywords": [ "templating" ], + "support": { + "forum": "http://www.smarty.net/forums/", + "irc": "irc://irc.freenode.org/smarty", + "issues": "https://github.com/smarty-php/smarty/issues", + "source": "https://github.com/smarty-php/smarty/tree/v3.1.39" + }, "time": "2021-02-17T21:57:51+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", "shasum": "" }, "require": { @@ -1494,7 +1600,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -1522,6 +1628,9 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1536,7 +1645,7 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/options-resolver", @@ -1588,6 +1697,9 @@ "configuration", "options" ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v5.2.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1664,6 +1776,9 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1740,6 +1855,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1820,6 +1938,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1838,16 +1959,16 @@ }, { "name": "symfony/process", - "version": "v5.2.4", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f" + "reference": "98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f", + "url": "https://api.github.com/repos/symfony/process/zipball/98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e", + "reference": "98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e", "shasum": "" }, "require": { @@ -1879,6 +2000,9 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.0-BETA1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1893,7 +2017,7 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:15:41+00:00" + "time": "2021-04-08T10:27:02+00:00" }, { "name": "twbs/bootstrap", @@ -1944,6 +2068,10 @@ "sass", "web" ], + "support": { + "issues": "https://github.com/twbs/bootstrap/issues", + "source": "https://github.com/twbs/bootstrap/tree/v4-dev" + }, "time": "2018-07-24T15:54:34+00:00" }, { @@ -1992,6 +2120,10 @@ "clean", "php" ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, "funding": [ { "url": "https://www.paypal.me/moelleken", @@ -2057,6 +2189,10 @@ "stop words", "stop-words" ], + "support": { + "issues": "https://github.com/voku/stop-words/issues", + "source": "https://github.com/voku/stop-words/tree/master" + }, "time": "2018-11-23T01:37:27+00:00" } ], @@ -2139,6 +2275,10 @@ "symfony", "testing" ], + "support": { + "issues": "https://github.com/Behat/Behat/issues", + "source": "https://github.com/Behat/Behat/tree/v3.8.1" + }, "time": "2020-11-07T15:55:18+00:00" }, { @@ -2199,6 +2339,10 @@ "gherkin", "parser" ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" + }, "time": "2021-02-04T12:44:21+00:00" }, { @@ -2260,6 +2404,10 @@ "testing", "web" ], + "support": { + "issues": "https://github.com/minkphp/Mink/issues", + "source": "https://github.com/minkphp/Mink/tree/v1.8.1" + }, "time": "2020-03-11T15:45:53+00:00" }, { @@ -2317,6 +2465,10 @@ "browser", "testing" ], + "support": { + "issues": "https://github.com/minkphp/MinkBrowserKitDriver/issues", + "source": "https://github.com/minkphp/MinkBrowserKitDriver/tree/v1.3.4" + }, "time": "2020-03-11T09:49:45+00:00" }, { @@ -2376,6 +2528,10 @@ "test", "web" ], + "support": { + "issues": "https://github.com/Behat/MinkExtension/issues", + "source": "https://github.com/Behat/MinkExtension/tree/master" + }, "time": "2018-02-06T15:36:30+00:00" }, { @@ -2431,6 +2587,10 @@ "headless", "testing" ], + "support": { + "issues": "https://github.com/minkphp/MinkGoutteDriver/issues", + "source": "https://github.com/minkphp/MinkGoutteDriver/tree/master" + }, "time": "2016-03-05T09:04:22+00:00" }, { @@ -2476,6 +2636,10 @@ "slug", "transliterator" ], + "support": { + "issues": "https://github.com/Behat/Transliterator/issues", + "source": "https://github.com/Behat/Transliterator/tree/v1.3.0" + }, "time": "2020-01-14T16:39:13+00:00" }, { @@ -2527,6 +2691,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -2596,6 +2764,10 @@ "keywords": [ "scraper" ], + "support": { + "issues": "https://github.com/FriendsOfPHP/Goutte/issues", + "source": "https://github.com/FriendsOfPHP/Goutte/tree/v3.3.1" + }, "time": "2020-11-01T09:30:18+00:00" }, { @@ -2663,6 +2835,10 @@ "rest", "web service" ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, "time": "2020-06-16T21:01:06+00:00" }, { @@ -2714,20 +2890,24 @@ "keywords": [ "promise" ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.1" + }, "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/35ea11d335fd638b5882ff1725228b3d35496ab1", - "reference": "35ea11d335fd638b5882ff1725228b3d35496ab1", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -2785,7 +2965,11 @@ "uri", "url" ], - "time": "2021-03-21T16:25:00+00:00" + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.8.2" + }, + "time": "2021-04-26T09:17:50+00:00" }, { "name": "myclabs/deep-copy", @@ -2833,6 +3017,10 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", @@ -2843,16 +3031,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.10.4", + "version": "v4.10.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e" + "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e", - "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f", + "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f", "shasum": "" }, "require": { @@ -2891,7 +3079,11 @@ "parser", "php" ], - "time": "2020-12-20T10:01:03+00:00" + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.5" + }, + "time": "2021-05-03T19:11:20+00:00" }, { "name": "phar-io/manifest", @@ -2947,6 +3139,10 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, "time": "2020-06-27T14:33:11+00:00" }, { @@ -2994,6 +3190,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, "time": "2021-02-23T14:00:09+00:00" }, { @@ -3059,6 +3259,10 @@ "test", "test double" ], + "support": { + "issues": "https://github.com/php-mock/php-mock/issues", + "source": "https://github.com/php-mock/php-mock/tree/2.3.0" + }, "funding": [ { "url": "https://github.com/michalbundyra", @@ -3118,6 +3322,10 @@ "test", "test double" ], + "support": { + "issues": "https://github.com/php-mock/php-mock-integration/issues", + "source": "https://github.com/php-mock/php-mock-integration/tree/2.1.0" + }, "time": "2020-02-08T14:40:25+00:00" }, { @@ -3172,6 +3380,10 @@ "test", "test double" ], + "support": { + "issues": "https://github.com/php-mock/php-mock-phpunit/issues", + "source": "https://github.com/php-mock/php-mock-phpunit/tree/2.6.0" + }, "time": "2020-02-08T15:44:47+00:00" }, { @@ -3221,6 +3433,10 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -3273,6 +3489,10 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -3318,6 +3538,10 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, "time": "2020-09-17T18:55:26+00:00" }, { @@ -3381,6 +3605,10 @@ "spy", "stub" ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + }, "time": "2021-03-17T13:42:18+00:00" }, { @@ -3440,6 +3668,11 @@ "testing", "xunit" ], + "support": { + "irc": "irc://irc.freenode.net/phpunit", + "issues": "https://github.com/sebastianbergmann/dbunit/issues", + "source": "https://github.com/sebastianbergmann/dbunit/tree/1.3.1" + }, "abandoned": true, "time": "2014-03-26T11:25:06+00:00" }, @@ -3508,6 +3741,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3564,6 +3801,10 @@ "filesystem", "iterator" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3623,6 +3864,10 @@ "keywords": [ "process" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3678,6 +3923,10 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3733,6 +3982,10 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -3828,6 +4081,10 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4" + }, "funding": [ { "url": "https://phpunit.de/donate.html", @@ -3882,6 +4139,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, "time": "2021-03-05T17:36:06+00:00" }, { @@ -3928,6 +4189,10 @@ "psr", "psr-14" ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, "time": "2019-01-08T18:20:26+00:00" }, { @@ -3978,6 +4243,9 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, "time": "2016-08-06T14:39:51+00:00" }, { @@ -4018,6 +4286,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -4064,6 +4336,10 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4116,6 +4392,10 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4167,6 +4447,10 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4237,6 +4521,10 @@ "compare", "equality" ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4290,6 +4578,10 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4352,6 +4644,10 @@ "unidiff", "unified diff" ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4411,6 +4707,10 @@ "environment", "hhvm" ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4484,6 +4784,10 @@ "export", "exporter" ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4544,6 +4848,10 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4597,6 +4905,10 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4650,6 +4962,10 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4701,6 +5017,10 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4760,6 +5080,10 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4811,6 +5135,10 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4863,6 +5191,10 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4912,6 +5244,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -4922,16 +5258,16 @@ }, { "name": "symfony/browser-kit", - "version": "v4.4.20", + "version": "v4.4.24", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "cfa8d92f95294747e3abc04969efee51ed374424" + "reference": "7e6a92d5d97d826830924bd8cd22daa452c9e467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/cfa8d92f95294747e3abc04969efee51ed374424", - "reference": "cfa8d92f95294747e3abc04969efee51ed374424", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/7e6a92d5d97d826830924bd8cd22daa452c9e467", + "reference": "7e6a92d5d97d826830924bd8cd22daa452c9e467", "shasum": "" }, "require": { @@ -4972,6 +5308,9 @@ ], "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v4.4.24" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4986,20 +5325,20 @@ "type": "tidelift" } ], - "time": "2021-02-18T10:52:56+00:00" + "time": "2021-05-16T09:52:47+00:00" }, { "name": "symfony/config", - "version": "v4.4.20", + "version": "v4.4.23", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "98606c6fa1a8f55ff964ccdd704275bf5b9f71b3" + "reference": "be9e601f17fc684ddfd6c675fdfcd04bb51fa928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/98606c6fa1a8f55ff964ccdd704275bf5b9f71b3", - "reference": "98606c6fa1a8f55ff964ccdd704275bf5b9f71b3", + "url": "https://api.github.com/repos/symfony/config/zipball/be9e601f17fc684ddfd6c675fdfcd04bb51fa928", + "reference": "be9e601f17fc684ddfd6c675fdfcd04bb51fa928", "shasum": "" }, "require": { @@ -5045,6 +5384,9 @@ ], "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v4.4.23" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5059,20 +5401,20 @@ "type": "tidelift" } ], - "time": "2021-02-22T15:36:50+00:00" + "time": "2021-05-07T13:37:51+00:00" }, { "name": "symfony/console", - "version": "v5.2.6", + "version": "v5.2.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d" + "reference": "864568fdc0208b3eba3638b6000b69d2386e6768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/35f039df40a3b335ebf310f244cb242b3a83ac8d", - "reference": "35f039df40a3b335ebf310f244cb242b3a83ac8d", + "url": "https://api.github.com/repos/symfony/console/zipball/864568fdc0208b3eba3638b6000b69d2386e6768", + "reference": "864568fdc0208b3eba3638b6000b69d2386e6768", "shasum": "" }, "require": { @@ -5139,6 +5481,9 @@ "console", "terminal" ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.2.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5153,20 +5498,20 @@ "type": "tidelift" } ], - "time": "2021-03-28T09:42:18+00:00" + "time": "2021-05-11T15:45:21+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.4", + "version": "v5.2.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f" + "reference": "5d5f97809015102116208b976eb2edb44b689560" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f", - "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/5d5f97809015102116208b976eb2edb44b689560", + "reference": "5d5f97809015102116208b976eb2edb44b689560", "shasum": "" }, "require": { @@ -5201,6 +5546,9 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.2.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5215,20 +5563,20 @@ "type": "tidelift" } ], - "time": "2021-01-27T10:01:46+00:00" + "time": "2021-05-16T13:07:46+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.4.21", + "version": "v4.4.24", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b5f97557faa48ead4671bc311cfca423d476e93e" + "reference": "8422396fb0b477ecbbe130907f90a0809b49c835" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b5f97557faa48ead4671bc311cfca423d476e93e", - "reference": "b5f97557faa48ead4671bc311cfca423d476e93e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/8422396fb0b477ecbbe130907f90a0809b49c835", + "reference": "8422396fb0b477ecbbe130907f90a0809b49c835", "shasum": "" }, "require": { @@ -5249,7 +5597,7 @@ "require-dev": { "symfony/config": "^4.3", "symfony/expression-language": "^3.4|^4.0|^5.0", - "symfony/yaml": "^3.4|^4.0|^5.0" + "symfony/yaml": "^4.4|^5.0" }, "suggest": { "symfony/config": "", @@ -5283,6 +5631,9 @@ ], "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v4.4.24" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5297,20 +5648,20 @@ "type": "tidelift" } ], - "time": "2021-03-05T18:16:26+00:00" + "time": "2021-05-16T09:52:47+00:00" }, { "name": "symfony/dom-crawler", - "version": "v4.4.20", + "version": "v4.4.24", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "be133557f1b0e6672367325b508e65da5513a311" + "reference": "fc0bd1f215b0cd9f4efdc63bb66808f3417331bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/be133557f1b0e6672367325b508e65da5513a311", - "reference": "be133557f1b0e6672367325b508e65da5513a311", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/fc0bd1f215b0cd9f4efdc63bb66808f3417331bc", + "reference": "fc0bd1f215b0cd9f4efdc63bb66808f3417331bc", "shasum": "" }, "require": { @@ -5353,6 +5704,9 @@ ], "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v4.4.24" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5367,7 +5721,7 @@ "type": "tidelift" } ], - "time": "2021-02-14T12:29:41+00:00" + "time": "2021-05-16T09:52:47+00:00" }, { "name": "symfony/event-dispatcher", @@ -5435,6 +5789,9 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.2.4" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5453,16 +5810,16 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", "shasum": "" }, "require": { @@ -5475,7 +5832,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5511,6 +5868,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5525,20 +5885,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/filesystem", - "version": "v5.2.6", + "version": "v5.2.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f" + "reference": "056e92acc21d977c37e6ea8e97374b2a6c8551b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/8c86a82f51658188119e62cff0a050a12d09836f", - "reference": "8c86a82f51658188119e62cff0a050a12d09836f", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/056e92acc21d977c37e6ea8e97374b2a6c8551b0", + "reference": "056e92acc21d977c37e6ea8e97374b2a6c8551b0", "shasum": "" }, "require": { @@ -5570,6 +5930,9 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.2.7" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5584,7 +5947,7 @@ "type": "tidelift" } ], - "time": "2021-03-28T14:30:26+00:00" + "time": "2021-04-01T10:42:13+00:00" }, { "name": "symfony/polyfill-intl-grapheme", @@ -5648,6 +6011,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5732,6 +6098,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5813,6 +6182,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5890,6 +6262,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5963,6 +6338,9 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.1" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5981,21 +6359,21 @@ }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -6003,7 +6381,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6039,6 +6417,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6053,20 +6434,20 @@ "type": "tidelift" } ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/string", - "version": "v5.2.6", + "version": "v5.2.8", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572" + "reference": "01b35eb64cac8467c3f94cd0ce2d0d376bb7d1db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572", - "reference": "ad0bd91bce2054103f5eaa18ebeba8d3bc2a0572", + "url": "https://api.github.com/repos/symfony/string/zipball/01b35eb64cac8467c3f94cd0ce2d0d376bb7d1db", + "reference": "01b35eb64cac8467c3f94cd0ce2d0d376bb7d1db", "shasum": "" }, "require": { @@ -6119,6 +6500,9 @@ "utf-8", "utf8" ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.2.8" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6133,20 +6517,20 @@ "type": "tidelift" } ], - "time": "2021-03-17T17:12:15+00:00" + "time": "2021-05-10T14:56:10+00:00" }, { "name": "symfony/translation", - "version": "v4.4.21", + "version": "v4.4.24", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "eb8f5428cc3b40d6dffe303b195b084f1c5fbd14" + "reference": "424d29dfcc15575af05196de0100d7b52f650602" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/eb8f5428cc3b40d6dffe303b195b084f1c5fbd14", - "reference": "eb8f5428cc3b40d6dffe303b195b084f1c5fbd14", + "url": "https://api.github.com/repos/symfony/translation/zipball/424d29dfcc15575af05196de0100d7b52f650602", + "reference": "424d29dfcc15575af05196de0100d7b52f650602", "shasum": "" }, "require": { @@ -6204,6 +6588,9 @@ ], "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v4.4.24" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6218,20 +6605,20 @@ "type": "tidelift" } ], - "time": "2021-03-23T16:25:01+00:00" + "time": "2021-05-16T09:52:47+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.3.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", "shasum": "" }, "require": { @@ -6243,7 +6630,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6279,6 +6666,9 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6293,20 +6683,20 @@ "type": "tidelift" } ], - "time": "2020-09-28T13:05:58+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/yaml", - "version": "v5.2.5", + "version": "v5.2.9", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "298a08ddda623485208506fcee08817807a251dd" + "reference": "d23115e4a3d50520abddccdbec9514baab1084c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", - "reference": "298a08ddda623485208506fcee08817807a251dd", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d23115e4a3d50520abddccdbec9514baab1084c8", + "reference": "d23115e4a3d50520abddccdbec9514baab1084c8", "shasum": "" }, "require": { @@ -6351,6 +6741,9 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.2.9" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -6365,7 +6758,7 @@ "type": "tidelift" } ], - "time": "2021-03-06T07:59:01+00:00" + "time": "2021-05-16T13:07:46+00:00" }, { "name": "theseer/tokenizer", @@ -6405,6 +6798,10 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, "funding": [ { "url": "https://github.com/theseer", @@ -6465,6 +6862,10 @@ "check", "validate" ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, "time": "2021-03-09T10:59:23+00:00" } ], @@ -6489,5 +6890,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.0.0" } diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index fce8549f0..4d989a212 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -37,11 +37,13 @@ namespace Composer\Autoload; * * @author Fabien Potencier * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { + private $vendorDir; + // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); @@ -57,10 +59,17 @@ class ClassLoader private $missingClasses = array(); private $apcuPrefix; + private static $registeredLoaders = array(); + + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + public function getPrefixes() { if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); @@ -300,6 +309,15 @@ class ClassLoader public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + //no-op + } elseif ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } } /** @@ -308,6 +326,10 @@ class ClassLoader public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } } /** @@ -367,6 +389,16 @@ class ClassLoader return $file; } + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + private function findFileWithExtension($class, $ext) { // PSR-4 lookup diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 000000000..a9e7e1d0e --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,595 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * To require it's presence, you can require `composer-runtime-api ^2.0` + */ +class InstalledVersions +{ + private static $installed = array ( + 'root' => + array ( + 'pretty_version' => 'dev-dev', + 'version' => 'dev-dev', + 'aliases' => + array ( + ), + 'reference' => '7f4e6c2b64be07ce7587dc906e1d65494121a534', + 'name' => 'zot/zap', + ), + 'versions' => + array ( + 'blueimp/jquery-file-upload' => + array ( + 'pretty_version' => 'v10.31.0', + 'version' => '10.31.0.0', + 'aliases' => + array ( + ), + 'reference' => '0740f81829698b84efe17e72501e0f420ea0d611', + ), + 'bshaffer/oauth2-server-php' => + array ( + 'pretty_version' => 'v1.11.1', + 'version' => '1.11.1.0', + 'aliases' => + array ( + ), + 'reference' => '5a0c8000d4763b276919e2106f54eddda6bc50fa', + ), + 'commerceguys/intl' => + array ( + 'pretty_version' => 'v0.7.5', + 'version' => '0.7.5.0', + 'aliases' => + array ( + ), + 'reference' => 'de1435502068393fae4061818e194e4ea61b98d6', + ), + 'doctrine/collections' => + array ( + 'pretty_version' => '1.6.7', + 'version' => '1.6.7.0', + 'aliases' => + array ( + ), + 'reference' => '55f8b799269a1a472457bd1a41b4f379d4cfba4a', + ), + 'ezyang/htmlpurifier' => + array ( + 'pretty_version' => 'v4.13.0', + 'version' => '4.13.0.0', + 'aliases' => + array ( + ), + 'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75', + ), + 'forkawesome/fork-awesome' => + array ( + 'pretty_version' => '1.1.7', + 'version' => '1.1.7.0', + 'aliases' => + array ( + ), + 'reference' => '326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3', + ), + 'jbroadway/urlify' => + array ( + 'pretty_version' => '1.2.2-stable', + 'version' => '1.2.2.0', + 'aliases' => + array ( + ), + 'reference' => '9b227e8548f16268cef55b5eb5d659a801fa824b', + ), + 'kzykhys/git' => + array ( + 'pretty_version' => 'v0.1.2', + 'version' => '0.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '3c4db987494c38eac300593719a4a7832abddadd', + ), + 'league/html-to-markdown' => + array ( + 'pretty_version' => '4.10.0', + 'version' => '4.10.0.0', + 'aliases' => + array ( + ), + 'reference' => '0868ae7a552e809e5cd8f93ba022071640408e88', + ), + 'masterminds/html5' => + array ( + 'pretty_version' => '2.7.4', + 'version' => '2.7.4.0', + 'aliases' => + array ( + ), + 'reference' => '9227822783c75406cfe400984b2f095cdf03d417', + ), + 'michelf/php-markdown' => + array ( + 'pretty_version' => '1.9.0', + 'version' => '1.9.0.0', + 'aliases' => + array ( + ), + 'reference' => 'c83178d49e372ca967d1a8c77ae4e051b3a3c75c', + ), + 'p3k/emoji-detector' => + array ( + 'pretty_version' => '0.2.1', + 'version' => '0.2.1.0', + 'aliases' => + array ( + ), + 'reference' => 'fb0765845e554f04ccd2b594a7ab8ca44d804bab', + ), + 'paragonie/random_compat' => + array ( + 'pretty_version' => 'v9.99.99', + 'version' => '9.99.99.0', + 'aliases' => + array ( + ), + 'reference' => '84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95', + ), + 'phpseclib/phpseclib' => + array ( + 'pretty_version' => '2.0.31', + 'version' => '2.0.31.0', + 'aliases' => + array ( + ), + 'reference' => '233a920cb38636a43b18d428f9a8db1f0a1a08f4', + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.4', + 'version' => '1.1.4.0', + 'aliases' => + array ( + ), + 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', + ), + 'ramsey/uuid' => + array ( + 'pretty_version' => '3.9.3', + 'version' => '3.9.3.0', + 'aliases' => + array ( + ), + 'reference' => '7e1633a6964b48589b142d60542f9ed31bd37a92', + ), + 'rhumsaa/uuid' => + array ( + 'replaced' => + array ( + 0 => '3.9.3', + ), + ), + 'sabre/dav' => + array ( + 'pretty_version' => '3.2.3', + 'version' => '3.2.3.0', + 'aliases' => + array ( + ), + 'reference' => 'a9780ce4f35560ecbd0af524ad32d9d2c8954b80', + ), + 'sabre/event' => + array ( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '831d586f5a442dceacdcf5e9c4c36a4db99a3534', + ), + 'sabre/http' => + array ( + 'pretty_version' => 'v4.2.4', + 'version' => '4.2.4.0', + 'aliases' => + array ( + ), + 'reference' => 'acccec4ba863959b2d10c1fa0fb902736c5c8956', + ), + 'sabre/uri' => + array ( + 'pretty_version' => '1.2.1', + 'version' => '1.2.1.0', + 'aliases' => + array ( + ), + 'reference' => 'ada354d83579565949d80b2e15593c2371225e61', + ), + 'sabre/vobject' => + array ( + 'pretty_version' => '4.2.2', + 'version' => '4.2.2.0', + 'aliases' => + array ( + ), + 'reference' => '449616b2d45b95c8973975de23f34a3d14f63b4b', + ), + 'sabre/xml' => + array ( + 'pretty_version' => '1.5.1', + 'version' => '1.5.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a367665f1df614c3b8fefc30a54de7cd295e444e', + ), + 'simshaun/recurr' => + array ( + 'pretty_version' => 'v4.0.5', + 'version' => '4.0.5.0', + 'aliases' => + array ( + ), + 'reference' => '08b0b46879f598cd11dd42b4c1a9c221a0562749', + ), + 'smarty/smarty' => + array ( + 'pretty_version' => 'v3.1.39', + 'version' => '3.1.39.0', + 'aliases' => + array ( + ), + 'reference' => 'e27da524f7bcd7361e3ea5cdfa99c4378a7b5419', + ), + 'symfony/deprecation-contracts' => + array ( + 'pretty_version' => 'v2.4.0', + 'version' => '2.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627', + ), + 'symfony/options-resolver' => + array ( + 'pretty_version' => 'v5.2.4', + 'version' => '5.2.4.0', + 'aliases' => + array ( + ), + 'reference' => '5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'c6c942b1ac76c82448322025e084cadc56048b4e', + ), + 'symfony/polyfill-php73' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a678b42e92f86eca04b7fa4c0f6f19d097fb69e2', + ), + 'symfony/polyfill-php80' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'dc3063ba22c2a1fd2f45ed856374d79114998f91', + ), + 'symfony/process' => + array ( + 'pretty_version' => 'v5.2.7', + 'version' => '5.2.7.0', + 'aliases' => + array ( + ), + 'reference' => '98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e', + ), + 'twbs/bootstrap' => + array ( + 'pretty_version' => 'v4.1.3', + 'version' => '4.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '3b558734382ce58b51e5fc676453bfd53bba9201', + ), + 'twitter/bootstrap' => + array ( + 'replaced' => + array ( + 0 => 'v4.1.3', + ), + ), + 'voku/portable-ascii' => + array ( + 'pretty_version' => '1.5.6', + 'version' => '1.5.6.0', + 'aliases' => + array ( + ), + 'reference' => '80953678b19901e5165c56752d087fc11526017c', + ), + 'voku/stop-words' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '8e63c0af20f800b1600783764e0ce19e53969f71', + ), + 'zot/zap' => + array ( + 'pretty_version' => 'dev-dev', + 'version' => 'dev-dev', + 'aliases' => + array ( + ), + 'reference' => '7f4e6c2b64be07ce7587dc906e1d65494121a534', + ), + ), +); + private static $canGetVendors; + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @return bool + */ + public static function isInstalled($packageName) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return true; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @return array[] + * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list} + */ + public static function getRawData() + { + return self::$installed; + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @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[]}, versions: list} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + // @phpstan-ignore-next-line + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + } + } + } + + $installed[] = self::$installed; + + return $installed; + } +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index fe6236f07..1995a1f0a 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -37,6 +37,7 @@ return array( 'CommerceGuys\\Intl\\NumberFormat\\NumberFormatInterface' => $vendorDir . '/commerceguys/intl/src/NumberFormat/NumberFormatInterface.php', 'CommerceGuys\\Intl\\NumberFormat\\NumberFormatRepository' => $vendorDir . '/commerceguys/intl/src/NumberFormat/NumberFormatRepository.php', 'CommerceGuys\\Intl\\NumberFormat\\NumberFormatRepositoryInterface' => $vendorDir . '/commerceguys/intl/src/NumberFormat/NumberFormatRepositoryInterface.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Doctrine\\Common\\Collections\\AbstractLazyCollection' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php', 'Doctrine\\Common\\Collections\\ArrayCollection' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php', 'Doctrine\\Common\\Collections\\Collection' => $vendorDir . '/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php', @@ -227,9 +228,6 @@ return array( 'HTMLPurifier_Printer' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php', 'HTMLPurifier_Printer_CSSDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php', 'HTMLPurifier_Printer_ConfigForm' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', - 'HTMLPurifier_Printer_ConfigForm_NullDecorator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', - 'HTMLPurifier_Printer_ConfigForm_bool' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', - 'HTMLPurifier_Printer_ConfigForm_default' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', 'HTMLPurifier_Printer_HTMLDefinition' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php', 'HTMLPurifier_PropertyList' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php', 'HTMLPurifier_PropertyListIterator' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php', @@ -437,6 +435,9 @@ return array( 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php', 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php', 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php', 'Ramsey\\Uuid\\BinaryUtils' => $vendorDir . '/ramsey/uuid/src/BinaryUtils.php', 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php', 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => $vendorDir . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php', @@ -1066,6 +1067,7 @@ return array( 'Zotlabs\\Daemon\\Addon' => $baseDir . '/Zotlabs/Daemon/Addon.php', 'Zotlabs\\Daemon\\CacheThumb' => $baseDir . '/Zotlabs/Daemon/CacheThumb.php', 'Zotlabs\\Daemon\\Cache_embeds' => $baseDir . '/Zotlabs/Daemon/Cache_embeds.php', + 'Zotlabs\\Daemon\\Cache_image' => $baseDir . '/Zotlabs/Daemon/Cache_image.php', 'Zotlabs\\Daemon\\Channel_purge' => $baseDir . '/Zotlabs/Daemon/Channel_purge.php', 'Zotlabs\\Daemon\\Checksites' => $baseDir . '/Zotlabs/Daemon/Checksites.php', 'Zotlabs\\Daemon\\Content_importer' => $baseDir . '/Zotlabs/Daemon/Content_importer.php', @@ -1141,7 +1143,6 @@ return array( 'Zotlabs\\Lib\\Share' => $baseDir . '/Zotlabs/Lib/Share.php', 'Zotlabs\\Lib\\SvgSanitizer' => $baseDir . '/Zotlabs/Lib/SvgSanitizer.php', 'Zotlabs\\Lib\\System' => $baseDir . '/Zotlabs/Lib/System.php', - 'Zotlabs\\Lib\\TableConverter' => $baseDir . '/Zotlabs/Lib/Markdown.php', 'Zotlabs\\Lib\\ThreadItem' => $baseDir . '/Zotlabs/Lib/ThreadItem.php', 'Zotlabs\\Lib\\ThreadListener' => $baseDir . '/Zotlabs/Lib/ThreadListener.php', 'Zotlabs\\Lib\\ThreadStream' => $baseDir . '/Zotlabs/Lib/ThreadStream.php', @@ -1168,6 +1169,7 @@ return array( 'Zotlabs\\Module\\Admin\\Site' => $baseDir . '/Zotlabs/Module/Admin/Site.php', 'Zotlabs\\Module\\Admin\\Themes' => $baseDir . '/Zotlabs/Module/Admin/Themes.php', 'Zotlabs\\Module\\Affinity' => $baseDir . '/Zotlabs/Module/Affinity.php', + 'Zotlabs\\Module\\Album' => $baseDir . '/Zotlabs/Module/Album.php', 'Zotlabs\\Module\\Ap_probe' => $baseDir . '/Zotlabs/Module/Ap_probe.php', 'Zotlabs\\Module\\Api' => $baseDir . '/Zotlabs/Module/Api.php', 'Zotlabs\\Module\\Appman' => $baseDir . '/Zotlabs/Module/Appman.php', @@ -1200,6 +1202,7 @@ return array( 'Zotlabs\\Module\\Connedit' => $baseDir . '/Zotlabs/Module/Connedit.php', 'Zotlabs\\Module\\Contactgroup' => $baseDir . '/Zotlabs/Module/Contactgroup.php', 'Zotlabs\\Module\\Content_filter' => $baseDir . '/Zotlabs/Module/Content_filter.php', + 'Zotlabs\\Module\\Conversation' => $baseDir . '/Zotlabs/Module/Conversation.php', 'Zotlabs\\Module\\Cover_photo' => $baseDir . '/Zotlabs/Module/Cover_photo.php', 'Zotlabs\\Module\\Dav' => $baseDir . '/Zotlabs/Module/Dav.php', 'Zotlabs\\Module\\Defperms' => $baseDir . '/Zotlabs/Module/Defperms.php', @@ -1631,6 +1634,7 @@ return array( 'Zotlabs\\Update\\_1245' => $baseDir . '/Zotlabs/Update/_1245.php', 'Zotlabs\\Update\\_1246' => $baseDir . '/Zotlabs/Update/_1246.php', 'Zotlabs\\Update\\_1247' => $baseDir . '/Zotlabs/Update/_1247.php', + 'Zotlabs\\Update\\_1248' => $baseDir . '/Zotlabs/Update/_1248.php', 'Zotlabs\\Web\\Controller' => $baseDir . '/Zotlabs/Web/Controller.php', 'Zotlabs\\Web\\HTTPHeaders' => $baseDir . '/Zotlabs/Web/HTTPHeaders.php', 'Zotlabs\\Web\\HTTPSig' => $baseDir . '/Zotlabs/Web/HTTPSig.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 300ae54de..4b6bd8db8 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -13,12 +13,12 @@ return array( 'a1cce3d26cc15c00fcd0b3354bd72c88' => $vendorDir . '/sabre/event/lib/Promise/functions.php', '3569eecfeed3bcf0bad3c998a494ecb8' => $vendorDir . '/sabre/xml/lib/Deserializer/functions.php', '93aa591bc4ca510c520999e34229ee79' => $vendorDir . '/sabre/xml/lib/Serializer/functions.php', - '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', 'ebdb698ed4152ae445614b69b5e4bb6a' => $vendorDir . '/sabre/http/lib/functions.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', 'd08bec471a180204a14ef3c91e951f99' => $vendorDir . '/p3k/emoji-detector/src/Emoji.php', - 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', 'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php', + 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', ); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index eba4461ec..8c3cbf061 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -22,13 +22,15 @@ class ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); spl_autoload_unregister(array('ComposerAutoloaderInit7b34d7e50a62201ec5d5e526a5b8b35d', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; + require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d::getInitializer($loader)); } else { diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index dcf573a88..e0df5000d 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -14,14 +14,14 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'a1cce3d26cc15c00fcd0b3354bd72c88' => __DIR__ . '/..' . '/sabre/event/lib/Promise/functions.php', '3569eecfeed3bcf0bad3c998a494ecb8' => __DIR__ . '/..' . '/sabre/xml/lib/Deserializer/functions.php', '93aa591bc4ca510c520999e34229ee79' => __DIR__ . '/..' . '/sabre/xml/lib/Serializer/functions.php', - '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', 'ebdb698ed4152ae445614b69b5e4bb6a' => __DIR__ . '/..' . '/sabre/http/lib/functions.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', 'd08bec471a180204a14ef3c91e951f99' => __DIR__ . '/..' . '/p3k/emoji-detector/src/Emoji.php', - 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', 'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php', + 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', ); public static $prefixLengthsPsr4 = array ( @@ -254,6 +254,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'CommerceGuys\\Intl\\NumberFormat\\NumberFormatInterface' => __DIR__ . '/..' . '/commerceguys/intl/src/NumberFormat/NumberFormatInterface.php', 'CommerceGuys\\Intl\\NumberFormat\\NumberFormatRepository' => __DIR__ . '/..' . '/commerceguys/intl/src/NumberFormat/NumberFormatRepository.php', 'CommerceGuys\\Intl\\NumberFormat\\NumberFormatRepositoryInterface' => __DIR__ . '/..' . '/commerceguys/intl/src/NumberFormat/NumberFormatRepositoryInterface.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Doctrine\\Common\\Collections\\AbstractLazyCollection' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php', 'Doctrine\\Common\\Collections\\ArrayCollection' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php', 'Doctrine\\Common\\Collections\\Collection' => __DIR__ . '/..' . '/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php', @@ -444,9 +445,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'HTMLPurifier_Printer' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer.php', 'HTMLPurifier_Printer_CSSDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/CSSDefinition.php', 'HTMLPurifier_Printer_ConfigForm' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', - 'HTMLPurifier_Printer_ConfigForm_NullDecorator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', - 'HTMLPurifier_Printer_ConfigForm_bool' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', - 'HTMLPurifier_Printer_ConfigForm_default' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/ConfigForm.php', 'HTMLPurifier_Printer_HTMLDefinition' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Printer/HTMLDefinition.php', 'HTMLPurifier_PropertyList' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyList.php', 'HTMLPurifier_PropertyListIterator' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/PropertyListIterator.php', @@ -654,6 +652,9 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php', 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php', 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php', + 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/DummyTest.php', + 'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php', + 'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php', 'Ramsey\\Uuid\\BinaryUtils' => __DIR__ . '/..' . '/ramsey/uuid/src/BinaryUtils.php', 'Ramsey\\Uuid\\Builder\\DefaultUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DefaultUuidBuilder.php', 'Ramsey\\Uuid\\Builder\\DegradedUuidBuilder' => __DIR__ . '/..' . '/ramsey/uuid/src/Builder/DegradedUuidBuilder.php', @@ -1283,6 +1284,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Daemon\\Addon' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Addon.php', 'Zotlabs\\Daemon\\CacheThumb' => __DIR__ . '/../..' . '/Zotlabs/Daemon/CacheThumb.php', 'Zotlabs\\Daemon\\Cache_embeds' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cache_embeds.php', + 'Zotlabs\\Daemon\\Cache_image' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Cache_image.php', 'Zotlabs\\Daemon\\Channel_purge' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Channel_purge.php', 'Zotlabs\\Daemon\\Checksites' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Checksites.php', 'Zotlabs\\Daemon\\Content_importer' => __DIR__ . '/../..' . '/Zotlabs/Daemon/Content_importer.php', @@ -1358,7 +1360,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Lib\\Share' => __DIR__ . '/../..' . '/Zotlabs/Lib/Share.php', 'Zotlabs\\Lib\\SvgSanitizer' => __DIR__ . '/../..' . '/Zotlabs/Lib/SvgSanitizer.php', 'Zotlabs\\Lib\\System' => __DIR__ . '/../..' . '/Zotlabs/Lib/System.php', - 'Zotlabs\\Lib\\TableConverter' => __DIR__ . '/../..' . '/Zotlabs/Lib/Markdown.php', 'Zotlabs\\Lib\\ThreadItem' => __DIR__ . '/../..' . '/Zotlabs/Lib/ThreadItem.php', 'Zotlabs\\Lib\\ThreadListener' => __DIR__ . '/../..' . '/Zotlabs/Lib/ThreadListener.php', 'Zotlabs\\Lib\\ThreadStream' => __DIR__ . '/../..' . '/Zotlabs/Lib/ThreadStream.php', @@ -1385,6 +1386,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Admin\\Site' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Site.php', 'Zotlabs\\Module\\Admin\\Themes' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Themes.php', 'Zotlabs\\Module\\Affinity' => __DIR__ . '/../..' . '/Zotlabs/Module/Affinity.php', + 'Zotlabs\\Module\\Album' => __DIR__ . '/../..' . '/Zotlabs/Module/Album.php', 'Zotlabs\\Module\\Ap_probe' => __DIR__ . '/../..' . '/Zotlabs/Module/Ap_probe.php', 'Zotlabs\\Module\\Api' => __DIR__ . '/../..' . '/Zotlabs/Module/Api.php', 'Zotlabs\\Module\\Appman' => __DIR__ . '/../..' . '/Zotlabs/Module/Appman.php', @@ -1417,6 +1419,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Module\\Connedit' => __DIR__ . '/../..' . '/Zotlabs/Module/Connedit.php', 'Zotlabs\\Module\\Contactgroup' => __DIR__ . '/../..' . '/Zotlabs/Module/Contactgroup.php', 'Zotlabs\\Module\\Content_filter' => __DIR__ . '/../..' . '/Zotlabs/Module/Content_filter.php', + 'Zotlabs\\Module\\Conversation' => __DIR__ . '/../..' . '/Zotlabs/Module/Conversation.php', 'Zotlabs\\Module\\Cover_photo' => __DIR__ . '/../..' . '/Zotlabs/Module/Cover_photo.php', 'Zotlabs\\Module\\Dav' => __DIR__ . '/../..' . '/Zotlabs/Module/Dav.php', 'Zotlabs\\Module\\Defperms' => __DIR__ . '/../..' . '/Zotlabs/Module/Defperms.php', @@ -1848,6 +1851,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d 'Zotlabs\\Update\\_1245' => __DIR__ . '/../..' . '/Zotlabs/Update/_1245.php', 'Zotlabs\\Update\\_1246' => __DIR__ . '/../..' . '/Zotlabs/Update/_1246.php', 'Zotlabs\\Update\\_1247' => __DIR__ . '/../..' . '/Zotlabs/Update/_1247.php', + 'Zotlabs\\Update\\_1248' => __DIR__ . '/../..' . '/Zotlabs/Update/_1248.php', 'Zotlabs\\Web\\Controller' => __DIR__ . '/../..' . '/Zotlabs/Web/Controller.php', 'Zotlabs\\Web\\HTTPHeaders' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPHeaders.php', 'Zotlabs\\Web\\HTTPSig' => __DIR__ . '/../..' . '/Zotlabs/Web/HTTPSig.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 23efe50ff..98cb4795c 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,2121 +1,2171 @@ -[ - { - "name": "blueimp/jquery-file-upload", - "version": "v10.31.0", - "version_normalized": "10.31.0.0", - "source": { - "type": "git", - "url": "https://github.com/vkhramtsov/jQuery-File-Upload.git", - "reference": "0740f81829698b84efe17e72501e0f420ea0d611" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/0740f81829698b84efe17e72501e0f420ea0d611", - "reference": "0740f81829698b84efe17e72501e0f420ea0d611", - "shasum": "" - }, - "time": "2020-07-13T05:42:06+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "server/php/UploadHandler.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian Tschan", - "homepage": "https://blueimp.net" - } - ], - "description": "File Upload widget for jQuery.", - "homepage": "https://github.com/blueimp/jQuery-File-Upload", - "keywords": [ - "bootstrap", - "chunk", - "cross-domain", - "cross-site", - "drag", - "drop", - "file", - "gae", - "go", - "jquery", - "multiple", - "php", - "preview", - "progress", - "python", - "resume", - "selection", - "upload", - "widget" - ], - "funding": [ - { - "url": "https://github.com/blueimp", - "type": "github" - } - ] - }, - { - "name": "bshaffer/oauth2-server-php", - "version": "v1.11.1", - "version_normalized": "1.11.1.0", - "source": { - "type": "git", - "url": "https://github.com/bshaffer/oauth2-server-php.git", - "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/5a0c8000d4763b276919e2106f54eddda6bc50fa", - "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "aws/aws-sdk-php": "~2.8", - "firebase/php-jwt": "~2.2", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^4.0", - "predis/predis": "dev-master", - "thobbs/phpcassa": "dev-master" - }, - "suggest": { - "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage", - "firebase/php-jwt": "~2.2 is required to use JWT features", - "mongodb/mongodb": "^1.1 is required to use MongoDB storage", - "predis/predis": "Required to use Redis storage", - "thobbs/phpcassa": "Required to use Cassandra storage" - }, - "time": "2018-12-04T00:29:32+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "OAuth2": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brent Shaffer", - "email": "bshafs@gmail.com", - "homepage": "http://brentertainment.com" - } - ], - "description": "OAuth2 Server for PHP", - "homepage": "http://github.com/bshaffer/oauth2-server-php", - "keywords": [ - "auth", - "oauth", - "oauth2" - ] - }, - { - "name": "commerceguys/intl", - "version": "v0.7.5", - "version_normalized": "0.7.5.0", - "source": { - "type": "git", - "url": "https://github.com/commerceguys/intl.git", - "reference": "de1435502068393fae4061818e194e4ea61b98d6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/commerceguys/intl/zipball/de1435502068393fae4061818e194e4ea61b98d6", - "reference": "de1435502068393fae4061818e194e4ea61b98d6", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "mikey179/vfsstream": "1.*", - "phpunit/phpunit": "~4.0" - }, - "time": "2017-12-29T00:13:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "CommerceGuys\\Intl\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bojan Zivanovic" - } - ], - "description": "Internationalization library powered by CLDR data." - }, - { - "name": "doctrine/collections", - "version": "1.6.7", - "version_normalized": "1.6.7.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "time": "2020-07-27T17:53:49+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" +{ + "packages": [ + { + "name": "blueimp/jquery-file-upload", + "version": "v10.31.0", + "version_normalized": "10.31.0.0", + "source": { + "type": "git", + "url": "https://github.com/vkhramtsov/jQuery-File-Upload.git", + "reference": "0740f81829698b84efe17e72501e0f420ea0d611" }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vkhramtsov/jQuery-File-Upload/zipball/0740f81829698b84efe17e72501e0f420ea0d611", + "reference": "0740f81829698b84efe17e72501e0f420ea0d611", + "shasum": "" }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" + "time": "2020-07-13T05:42:06+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "server/php/UploadHandler.php" + ] }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ] - }, - { - "name": "ezyang/htmlpurifier", - "version": "v4.13.0", - "version_normalized": "4.13.0.0", - "source": { - "type": "git", - "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" - }, - "time": "2020-06-29T00:56:53+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "HTMLPurifier": "library/" - }, - "files": [ - "library/HTMLPurifier.composer.php" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "exclude-from-classmap": [ - "/library/HTMLPurifier/Language/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-or-later" - ], - "authors": [ - { - "name": "Edward Z. Yang", - "email": "admin@htmlpurifier.org", - "homepage": "http://ezyang.com" - } - ], - "description": "Standards compliant HTML filter written in PHP", - "homepage": "http://htmlpurifier.org/", - "keywords": [ - "html" - ] - }, - { - "name": "forkawesome/fork-awesome", - "version": "1.1.7", - "version_normalized": "1.1.7.0", - "source": { - "type": "git", - "url": "https://github.com/ForkAwesome/Fork-Awesome.git", - "reference": "326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ForkAwesome/Fork-Awesome/zipball/326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3", - "reference": "326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3", - "shasum": "" - }, - "require-dev": { - "jekyll": "1.0.2", - "lessc": "1.4.2" - }, - "time": "2019-02-28T15:21:34+00:00", - "type": "component", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "OFL-1.1", - "MIT" - ], - "authors": [ - { - "name": "Fork Awesome Community", - "homepage": "https://forkawesome.github.io" - } - ], - "description": "A fork of the iconic font and CSS framework", - "homepage": "http://forkawesome.github.io/Fork-Awesome/", - "keywords": [ - "FontAwesome", - "awesome", - "bootstrap", - "font", - "forkawesome", - "icon" - ] - }, - { - "name": "jbroadway/urlify", - "version": "1.2.2-stable", - "version_normalized": "1.2.2.0", - "source": { - "type": "git", - "url": "https://github.com/jbroadway/urlify.git", - "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jbroadway/urlify/zipball/9b227e8548f16268cef55b5eb5d659a801fa824b", - "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b", - "shasum": "" - }, - "require": { - "php": ">=7.2.0", - "voku/portable-ascii": "^1.4", - "voku/stop-words": "^2.0" - }, - "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0" - }, - "time": "2020-06-14T17:15:34+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "URLify": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause-Clear" - ], - "authors": [ - { - "name": "Johnny Broadway", - "email": "johnny@johnnybroadway.com", - "homepage": "http://www.johnnybroadway.com/" - } - ], - "description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.", - "homepage": "https://github.com/jbroadway/urlify", - "keywords": [ - "encode", - "iconv", - "link", - "slug", - "translit", - "transliterate", - "transliteration", - "url", - "urlify" - ] - }, - { - "name": "kzykhys/git", - "version": "v0.1.2", - "version_normalized": "0.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/kzykhys/PHPGit.git", - "reference": "3c4db987494c38eac300593719a4a7832abddadd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/kzykhys/PHPGit/zipball/3c4db987494c38eac300593719a4a7832abddadd", - "reference": "3c4db987494c38eac300593719a4a7832abddadd", - "shasum": "" - }, - "require": { - "php": ">=5.3.2", - "symfony/options-resolver": ">=2.3", - "symfony/process": ">=2.3" - }, - "require-dev": { - "symfony/filesystem": ">=2.3" - }, - "time": "2014-02-15T06:18:00+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kazuyuki Hayashi", - "email": "hayashi@valnur.net" - } - ], - "description": "A Git wrapper for PHP5.3+" - }, - { - "name": "league/html-to-markdown", - "version": "4.10.0", - "version_normalized": "4.10.0.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/html-to-markdown.git", - "reference": "0868ae7a552e809e5cd8f93ba022071640408e88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0868ae7a552e809e5cd8f93ba022071640408e88", - "reference": "0868ae7a552e809e5cd8f93ba022071640408e88", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xml": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "mikehaertl/php-shellcommand": "~1.1.0", - "phpunit/phpunit": "^4.8|^5.7", - "scrutinizer/ocular": "~1.1" - }, - "time": "2020-07-01T00:34:03+00:00", - "bin": [ - "bin/html-to-markdown" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.10-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "League\\HTMLToMarkdown\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Colin O'Dell", - "email": "colinodell@gmail.com", - "homepage": "https://www.colinodell.com", - "role": "Lead Developer" - }, - { - "name": "Nick Cernis", - "email": "nick@cern.is", - "homepage": "http://modernnerd.net", - "role": "Original Author" - } - ], - "description": "An HTML-to-markdown conversion helper for PHP", - "homepage": "https://github.com/thephpleague/html-to-markdown", - "keywords": [ - "html", - "markdown" - ], - "funding": [ - { - "url": "https://www.colinodell.com/sponsor", - "type": "custom" - }, - { - "url": "https://www.paypal.me/colinpodell/10.00", - "type": "custom" - }, - { - "url": "https://github.com/colinodell", - "type": "github" - }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - } - ] - }, - { - "name": "masterminds/html5", - "version": "2.7.4", - "version_normalized": "2.7.4.0", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "9227822783c75406cfe400984b2f095cdf03d417" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/9227822783c75406cfe400984b2f095cdf03d417", - "reference": "9227822783c75406cfe400984b2f095cdf03d417", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-dom": "*", - "ext-libxml": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35" - }, - "time": "2020-10-01T13:52:52+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ] - }, - { - "name": "michelf/php-markdown", - "version": "1.9.0", - "version_normalized": "1.9.0.0", - "source": { - "type": "git", - "url": "https://github.com/michelf/php-markdown.git", - "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/michelf/php-markdown/zipball/c83178d49e372ca967d1a8c77ae4e051b3a3c75c", - "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.3 <5.8" - }, - "time": "2019-12-02T02:32:27+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Michelf\\": "Michelf/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Michel Fortin", - "email": "michel.fortin@michelf.ca", - "homepage": "https://michelf.ca/", - "role": "Developer" - }, - { - "name": "John Gruber", - "homepage": "https://daringfireball.net/" - } - ], - "description": "PHP Markdown", - "homepage": "https://michelf.ca/projects/php-markdown/", - "keywords": [ - "markdown" - ] - }, - { - "name": "p3k/emoji-detector", - "version": "0.2.1", - "version_normalized": "0.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/aaronpk/emoji-detector-php.git", - "reference": "fb0765845e554f04ccd2b594a7ab8ca44d804bab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/aaronpk/emoji-detector-php/zipball/fb0765845e554f04ccd2b594a7ab8ca44d804bab", - "reference": "fb0765845e554f04ccd2b594a7ab8ca44d804bab", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "4.8" - }, - "time": "2017-11-30T21:02:53+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "src/Emoji.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Parecki", - "email": "aaron@parecki.com", - "homepage": "https://aaronparecki.com/" - } - ], - "description": "Detect and return all emoji found in a string", - "homepage": "https://github.com/aaronpk/emoji-detector-php" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "version_normalized": "9.99.99.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "time": "2018-07-02T15:55:56+00:00", - "type": "library", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ] - }, - { - "name": "phpseclib/phpseclib", - "version": "2.0.30", - "version_normalized": "2.0.30.0", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/136b9ca7eebef78be14abf90d65c5e57b6bc5d36", - "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", - "squizlabs/php_codesniffer": "~2.0" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "time": "2020-12-17T05:42:04+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" + "authors": [ + { + "name": "Sebastian Tschan", + "homepage": "https://blueimp.net" + } ], - "psr-4": { - "phpseclib\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ] - }, - { - "name": "psr/log", - "version": "1.1.3", - "version_normalized": "1.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2020-03-23T09:12:05+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ] - }, - { - "name": "ramsey/uuid", - "version": "3.9.3", - "version_normalized": "3.9.3.0", - "source": { - "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", - "shasum": "" - }, - "require": { - "ext-json": "*", - "paragonie/random_compat": "^1 | ^2 | 9.99.99", - "php": "^5.4 | ^7 | ^8", - "symfony/polyfill-ctype": "^1.8" - }, - "replace": { - "rhumsaa/uuid": "self.version" - }, - "require-dev": { - "codeception/aspect-mock": "^1 | ^2", - "doctrine/annotations": "^1.2", - "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", - "jakub-onderka/php-parallel-lint": "^1", - "mockery/mockery": "^0.9.11 | ^1", - "moontoast/math": "^1.1", - "paragonie/random-lib": "^2", - "php-mock/php-mock-phpunit": "^0.3 | ^1.1", - "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "ext-ctype": "Provides support for PHP Ctype functions", - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", - "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", - "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." - }, - "time": "2020-02-21T04:36:14+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Ramsey\\Uuid\\": "src/" - }, - "files": [ - "src/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - }, - { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - } - ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", - "homepage": "https://github.com/ramsey/uuid", - "keywords": [ - "guid", - "identifier", - "uuid" - ] - }, - { - "name": "sabre/dav", - "version": "3.2.3", - "version_normalized": "3.2.3.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/dav.git", - "reference": "a9780ce4f35560ecbd0af524ad32d9d2c8954b80" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/dav/zipball/a9780ce4f35560ecbd0af524ad32d9d2c8954b80", - "reference": "a9780ce4f35560ecbd0af524ad32d9d2c8954b80", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-date": "*", - "ext-dom": "*", - "ext-iconv": "*", - "ext-mbstring": "*", - "ext-pcre": "*", - "ext-simplexml": "*", - "ext-spl": "*", - "lib-libxml": ">=2.7.0", - "php": ">=5.5.0", - "psr/log": "^1.0", - "sabre/event": ">=2.0.0, <4.0.0", - "sabre/http": "^4.2.1", - "sabre/uri": "^1.0.1", - "sabre/vobject": "^4.1.0", - "sabre/xml": "^1.4.0" - }, - "require-dev": { - "evert/phpdoc-md": "~0.1.0", - "monolog/monolog": "^1.18", - "phpunit/phpunit": "> 4.8, <6.0.0", - "sabre/cs": "^1.0.0" - }, - "suggest": { - "ext-curl": "*", - "ext-pdo": "*" - }, - "time": "2018-10-19T09:58:27+00:00", - "bin": [ - "bin/sabredav", - "bin/naturalselection" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Sabre\\DAV\\": "lib/DAV/", - "Sabre\\DAVACL\\": "lib/DAVACL/", - "Sabre\\CalDAV\\": "lib/CalDAV/", - "Sabre\\CardDAV\\": "lib/CardDAV/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "WebDAV Framework for PHP", - "homepage": "http://sabre.io/", - "keywords": [ - "CalDAV", - "CardDAV", - "WebDAV", - "framework", - "iCalendar" - ] - }, - { - "name": "sabre/event", - "version": "3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/event.git", - "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/event/zipball/831d586f5a442dceacdcf5e9c4c36a4db99a3534", - "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "*", - "sabre/cs": "~0.0.4" - }, - "time": "2015-11-05T20:14:39+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Sabre\\Event\\": "lib/" - }, - "files": [ - "lib/coroutine.php", - "lib/Loop/functions.php", - "lib/Promise/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "sabre/event is a library for lightweight event-based programming", - "homepage": "http://sabre.io/event/", - "keywords": [ - "EventEmitter", - "async", - "events", - "hooks", - "plugin", - "promise", - "signal" - ] - }, - { - "name": "sabre/http", - "version": "v4.2.4", - "version_normalized": "4.2.4.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/http.git", - "reference": "acccec4ba863959b2d10c1fa0fb902736c5c8956" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/http/zipball/acccec4ba863959b2d10c1fa0fb902736c5c8956", - "reference": "acccec4ba863959b2d10c1fa0fb902736c5c8956", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-mbstring": "*", - "php": ">=5.4", - "sabre/event": ">=1.0.0,<4.0.0", - "sabre/uri": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.3", - "sabre/cs": "~0.0.1" - }, - "suggest": { - "ext-curl": " to make http requests with the Client class" - }, - "time": "2018-02-23T11:10:29+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib/functions.php" + "description": "File Upload widget for jQuery.", + "homepage": "https://github.com/blueimp/jQuery-File-Upload", + "keywords": [ + "bootstrap", + "chunk", + "cross-domain", + "cross-site", + "drag", + "drop", + "file", + "gae", + "go", + "jquery", + "multiple", + "php", + "preview", + "progress", + "python", + "resume", + "selection", + "upload", + "widget" ], - "psr-4": { - "Sabre\\HTTP\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "The sabre/http library provides utilities for dealing with http requests and responses. ", - "homepage": "https://github.com/fruux/sabre-http", - "keywords": [ - "http" - ] - }, - { - "name": "sabre/uri", - "version": "1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/uri.git", - "reference": "ada354d83579565949d80b2e15593c2371225e61" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/uri/zipball/ada354d83579565949d80b2e15593c2371225e61", - "reference": "ada354d83579565949d80b2e15593c2371225e61", - "shasum": "" - }, - "require": { - "php": ">=5.4.7" - }, - "require-dev": { - "phpunit/phpunit": ">=4.0,<6.0", - "sabre/cs": "~1.0.0" - }, - "time": "2017-02-20T19:59:28+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib/functions.php" + "funding": [ + { + "url": "https://github.com/blueimp", + "type": "github" + } ], - "psr-4": { - "Sabre\\Uri\\": "lib/" - } + "install-path": "../blueimp/jquery-file-upload" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "Functions for making sense out of URIs.", - "homepage": "http://sabre.io/uri/", - "keywords": [ - "rfc3986", - "uri", - "url" - ] - }, - { - "name": "sabre/vobject", - "version": "4.2.2", - "version_normalized": "4.2.2.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/vobject.git", - "reference": "449616b2d45b95c8973975de23f34a3d14f63b4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/vobject/zipball/449616b2d45b95c8973975de23f34a3d14f63b4b", - "reference": "449616b2d45b95c8973975de23f34a3d14f63b4b", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=5.5", - "sabre/xml": ">=1.5 <3.0" - }, - "require-dev": { - "phpunit/phpunit": "> 4.8.35, <6.0.0" - }, - "suggest": { - "hoa/bench": "If you would like to run the benchmark scripts" - }, - "time": "2020-01-14T10:18:45+00:00", - "bin": [ - "bin/vobject", - "bin/generate_vcards" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Sabre\\VObject\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" + { + "name": "bshaffer/oauth2-server-php", + "version": "v1.11.1", + "version_normalized": "1.11.1.0", + "source": { + "type": "git", + "url": "https://github.com/bshaffer/oauth2-server-php.git", + "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa" }, - { - "name": "Dominik Tobschall", - "email": "dominik@fruux.com", - "homepage": "http://tobschall.de/", - "role": "Developer" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/5a0c8000d4763b276919e2106f54eddda6bc50fa", + "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa", + "shasum": "" }, - { - "name": "Ivan Enderlin", - "email": "ivan.enderlin@hoa-project.net", - "homepage": "http://mnt.io/", - "role": "Developer" - } - ], - "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects", - "homepage": "http://sabre.io/vobject/", - "keywords": [ - "availability", - "freebusy", - "iCalendar", - "ical", - "ics", - "jCal", - "jCard", - "recurrence", - "rfc2425", - "rfc2426", - "rfc2739", - "rfc4770", - "rfc5545", - "rfc5546", - "rfc6321", - "rfc6350", - "rfc6351", - "rfc6474", - "rfc6638", - "rfc6715", - "rfc6868", - "vCalendar", - "vCard", - "vcf", - "xCal", - "xCard" - ] - }, - { - "name": "sabre/xml", - "version": "1.5.1", - "version_normalized": "1.5.1.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/xml.git", - "reference": "a367665f1df614c3b8fefc30a54de7cd295e444e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/xml/zipball/a367665f1df614c3b8fefc30a54de7cd295e444e", - "reference": "a367665f1df614c3b8fefc30a54de7cd295e444e", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "lib-libxml": ">=2.6.20", - "php": ">=5.5.5", - "sabre/uri": ">=1.0,<3.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.8|~5.7", - "sabre/cs": "~1.0.0" - }, - "time": "2019-01-09T13:51:57+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Sabre\\Xml\\": "lib/" + "require": { + "php": ">=5.3.9" }, - "files": [ - "lib/Deserializer/functions.php", - "lib/Serializer/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" + "require-dev": { + "aws/aws-sdk-php": "~2.8", + "firebase/php-jwt": "~2.2", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^4.0", + "predis/predis": "dev-master", + "thobbs/phpcassa": "dev-master" }, - { - "name": "Markus Staab", - "email": "markus.staab@redaxo.de", - "role": "Developer" - } - ], - "description": "sabre/xml is an XML library that you may not hate.", - "homepage": "https://sabre.io/xml/", - "keywords": [ - "XMLReader", - "XMLWriter", - "dom", - "xml" - ] - }, - { - "name": "simshaun/recurr", - "version": "v4.0.5", - "version_normalized": "4.0.5.0", - "source": { - "type": "git", - "url": "https://github.com/simshaun/recurr.git", - "reference": "08b0b46879f598cd11dd42b4c1a9c221a0562749" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/simshaun/recurr/zipball/08b0b46879f598cd11dd42b4c1a9c221a0562749", - "reference": "08b0b46879f598cd11dd42b4c1a9c221a0562749", - "shasum": "" - }, - "require": { - "doctrine/collections": "~1.3", - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "~5.7" - }, - "time": "2021-03-25T23:00:49+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Recurr\\": "src/Recurr/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Shaun Simmons", - "email": "shaun@shaun.pub", - "homepage": "https://shaun.pub" - } - ], - "description": "PHP library for working with recurrence rules", - "homepage": "https://github.com/simshaun/recurr", - "keywords": [ - "dates", - "events", - "recurrence", - "recurring", - "rrule" - ] - }, - { - "name": "smarty/smarty", - "version": "v3.1.39", - "version_normalized": "3.1.39.0", - "source": { - "type": "git", - "url": "https://github.com/smarty-php/smarty.git", - "reference": "e27da524f7bcd7361e3ea5cdfa99c4378a7b5419" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/e27da524f7bcd7361e3ea5cdfa99c4378a7b5419", - "reference": "e27da524f7bcd7361e3ea5cdfa99c4378a7b5419", - "shasum": "" - }, - "require": { - "php": ">=5.2" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^6.5 || ^5.7 || ^4.8", - "smarty/smarty-lexer": "^3.1" - }, - "time": "2021-02-17T21:57:51+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "libs/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Monte Ohrt", - "email": "monte@ohrt.com" + "suggest": { + "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage", + "firebase/php-jwt": "~2.2 is required to use JWT features", + "mongodb/mongodb": "^1.1 is required to use MongoDB storage", + "predis/predis": "Required to use Redis storage", + "thobbs/phpcassa": "Required to use Cassandra storage" }, - { - "name": "Uwe Tews", - "email": "uwe.tews@googlemail.com" + "time": "2018-12-04T00:29:32+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "OAuth2": "src/" + } }, - { - "name": "Rodney Rehm", - "email": "rodney.rehm@medialize.de" - } - ], - "description": "Smarty - the compiling PHP template engine", - "homepage": "http://www.smarty.net", - "keywords": [ - "templating" - ] - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "version_normalized": "2.2.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2020-09-07T11:33:47+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ] - }, - { - "name": "symfony/options-resolver", - "version": "v5.2.4", - "version_normalized": "5.2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php73": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "time": "2021-01-27T12:56:27+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ] - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.22.1", - "version_normalized": "1.22.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", - "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "time": "2021-01-07T16:49:33+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ] - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.22.1", - "version_normalized": "1.22.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-01-07T16:49:33+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ] - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.22.1", - "version_normalized": "1.22.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", - "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2021-01-07T16:49:33+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.22-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" + "authors": [ + { + "name": "Brent Shaffer", + "email": "bshafs@gmail.com", + "homepage": "http://brentertainment.com" + } ], - "classmap": [ - "Resources/stubs" - ] + "description": "OAuth2 Server for PHP", + "homepage": "http://github.com/bshaffer/oauth2-server-php", + "keywords": [ + "auth", + "oauth", + "oauth2" + ], + "install-path": "../bshaffer/oauth2-server-php" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" + { + "name": "commerceguys/intl", + "version": "v0.7.5", + "version_normalized": "0.7.5.0", + "source": { + "type": "git", + "url": "https://github.com/commerceguys/intl.git", + "reference": "de1435502068393fae4061818e194e4ea61b98d6" }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/commerceguys/intl/zipball/de1435502068393fae4061818e194e4ea61b98d6", + "reference": "de1435502068393fae4061818e194e4ea61b98d6", + "shasum": "" }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" + "require": { + "php": ">=5.4.0" }, - { - "url": "https://github.com/fabpot", - "type": "github" + "require-dev": { + "mikey179/vfsstream": "1.*", + "phpunit/phpunit": "~4.0" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ] - }, - { - "name": "symfony/process", - "version": "v5.2.4", - "version_normalized": "5.2.4.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f", - "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "time": "2021-01-27T10:15:41+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" + "time": "2017-12-29T00:13:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.x-dev" + } }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "installation-source": "dist", + "autoload": { + "psr-4": { + "CommerceGuys\\Intl\\": "src" + } }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bojan Zivanovic" + } + ], + "description": "Internationalization library powered by CLDR data.", + "install-path": "../commerceguys/intl" + }, + { + "name": "doctrine/collections", + "version": "1.6.7", + "version_normalized": "1.6.7.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" }, - { - "url": "https://github.com/fabpot", - "type": "github" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", + "shasum": "" }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ] - }, - { - "name": "twbs/bootstrap", - "version": "v4.1.3", - "version_normalized": "4.1.3.0", - "source": { - "type": "git", - "url": "https://github.com/twbs/bootstrap.git", - "reference": "3b558734382ce58b51e5fc676453bfd53bba9201" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/3b558734382ce58b51e5fc676453bfd53bba9201", - "reference": "3b558734382ce58b51e5fc676453bfd53bba9201", - "shasum": "" - }, - "replace": { - "twitter/bootstrap": "self.version" - }, - "time": "2018-07-24T15:54:34+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev" - } - }, - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jacob Thornton", - "email": "jacobthornton@gmail.com" + "require": { + "php": "^7.1.3 || ^8.0" }, - { - "name": "Mark Otto", - "email": "markdotto@gmail.com" - } - ], - "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", - "homepage": "https://getbootstrap.com/", - "keywords": [ - "JS", - "css", - "framework", - "front-end", - "mobile-first", - "responsive", - "sass", - "web" - ] - }, - { - "name": "voku/portable-ascii", - "version": "1.5.6", - "version_normalized": "1.5.6.0", - "source": { - "type": "git", - "url": "https://github.com/voku/portable-ascii.git", - "reference": "80953678b19901e5165c56752d087fc11526017c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", - "reference": "80953678b19901e5165c56752d087fc11526017c", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" - }, - "suggest": { - "ext-intl": "Use Intl for transliterator_transliterate() support" - }, - "time": "2020-11-12T00:07:28+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" - } - ], - "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", - "homepage": "https://github.com/voku/portable-ascii", - "keywords": [ - "ascii", - "clean", - "php" - ], - "funding": [ - { - "url": "https://www.paypal.me/moelleken", - "type": "custom" + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan-shim": "^0.9.2", + "phpunit/phpunit": "^7.0", + "vimeo/psalm": "^3.8.1" }, - { - "url": "https://github.com/voku", - "type": "github" + "time": "2020-07-27T17:53:49+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } }, - { - "url": "https://opencollective.com/portable-ascii", - "type": "open_collective" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "install-path": "../doctrine/collections" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.13.0", + "version_normalized": "4.13.0.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" }, - { - "url": "https://www.patreon.com/voku", - "type": "patreon" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "shasum": "" }, - { - "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", - "type": "tidelift" - } - ] - }, - { - "name": "voku/stop-words", - "version": "2.0.1", - "version_normalized": "2.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/voku/stop-words.git", - "reference": "8e63c0af20f800b1600783764e0ce19e53969f71" + "require": { + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + }, + "time": "2020-06-29T00:56:53+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "install-path": "../ezyang/htmlpurifier" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71", - "reference": "8e63c0af20f800b1600783764e0ce19e53969f71", - "shasum": "" + { + "name": "forkawesome/fork-awesome", + "version": "1.1.7", + "version_normalized": "1.1.7.0", + "source": { + "type": "git", + "url": "https://github.com/ForkAwesome/Fork-Awesome.git", + "reference": "326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ForkAwesome/Fork-Awesome/zipball/326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3", + "reference": "326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3", + "shasum": "" + }, + "require-dev": { + "jekyll": "1.0.2", + "lessc": "1.4.2" + }, + "time": "2019-02-28T15:21:34+00:00", + "type": "component", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OFL-1.1", + "MIT" + ], + "authors": [ + { + "name": "Fork Awesome Community", + "homepage": "https://forkawesome.github.io" + } + ], + "description": "A fork of the iconic font and CSS framework", + "homepage": "http://forkawesome.github.io/Fork-Awesome/", + "keywords": [ + "FontAwesome", + "awesome", + "bootstrap", + "font", + "forkawesome", + "icon" + ], + "install-path": "../forkawesome/fork-awesome" }, - "require": { - "php": ">=7.0.0" + { + "name": "jbroadway/urlify", + "version": "1.2.2-stable", + "version_normalized": "1.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/jbroadway/urlify.git", + "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jbroadway/urlify/zipball/9b227e8548f16268cef55b5eb5d659a801fa824b", + "reference": "9b227e8548f16268cef55b5eb5d659a801fa824b", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "voku/portable-ascii": "^1.4", + "voku/stop-words": "^2.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0" + }, + "time": "2020-06-14T17:15:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "URLify": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause-Clear" + ], + "authors": [ + { + "name": "Johnny Broadway", + "email": "johnny@johnnybroadway.com", + "homepage": "http://www.johnnybroadway.com/" + } + ], + "description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.", + "homepage": "https://github.com/jbroadway/urlify", + "keywords": [ + "encode", + "iconv", + "link", + "slug", + "translit", + "transliterate", + "transliteration", + "url", + "urlify" + ], + "install-path": "../jbroadway/urlify" }, - "require-dev": { - "phpunit/phpunit": "~6.0" + { + "name": "kzykhys/git", + "version": "v0.1.2", + "version_normalized": "0.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/kzykhys/PHPGit.git", + "reference": "3c4db987494c38eac300593719a4a7832abddadd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/kzykhys/PHPGit/zipball/3c4db987494c38eac300593719a4a7832abddadd", + "reference": "3c4db987494c38eac300593719a4a7832abddadd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "symfony/options-resolver": ">=2.3", + "symfony/process": ">=2.3" + }, + "require-dev": { + "symfony/filesystem": ">=2.3" + }, + "time": "2014-02-15T06:18:00+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kazuyuki Hayashi", + "email": "hayashi@valnur.net" + } + ], + "description": "A Git wrapper for PHP5.3+", + "install-path": "../kzykhys/git" }, - "time": "2018-11-23T01:37:27+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "voku\\": "src/voku/" - } + { + "name": "league/html-to-markdown", + "version": "4.10.0", + "version_normalized": "4.10.0.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/html-to-markdown.git", + "reference": "0868ae7a552e809e5cd8f93ba022071640408e88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/0868ae7a552e809e5cd8f93ba022071640408e88", + "reference": "0868ae7a552e809e5cd8f93ba022071640408e88", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xml": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "mikehaertl/php-shellcommand": "~1.1.0", + "phpunit/phpunit": "^4.8|^5.7", + "scrutinizer/ocular": "~1.1" + }, + "time": "2020-07-01T00:34:03+00:00", + "bin": [ + "bin/html-to-markdown" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.10-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\HTMLToMarkdown\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + }, + { + "name": "Nick Cernis", + "email": "nick@cern.is", + "homepage": "http://modernnerd.net", + "role": "Original Author" + } + ], + "description": "An HTML-to-markdown conversion helper for PHP", + "homepage": "https://github.com/thephpleague/html-to-markdown", + "keywords": [ + "html", + "markdown" + ], + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + } + ], + "install-path": "../league/html-to-markdown" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" - } - ], - "description": "Stop-Words via PHP", - "keywords": [ - "stop words", - "stop-words" - ] - } -] + { + "name": "masterminds/html5", + "version": "2.7.4", + "version_normalized": "2.7.4.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "9227822783c75406cfe400984b2f095cdf03d417" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/9227822783c75406cfe400984b2f095cdf03d417", + "reference": "9227822783c75406cfe400984b2f095cdf03d417", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-libxml": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35" + }, + "time": "2020-10-01T13:52:52+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "install-path": "../masterminds/html5" + }, + { + "name": "michelf/php-markdown", + "version": "1.9.0", + "version_normalized": "1.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/michelf/php-markdown.git", + "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/michelf/php-markdown/zipball/c83178d49e372ca967d1a8c77ae4e051b3a3c75c", + "reference": "c83178d49e372ca967d1a8c77ae4e051b3a3c75c", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.3 <5.8" + }, + "time": "2019-12-02T02:32:27+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Michelf\\": "Michelf/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Michel Fortin", + "email": "michel.fortin@michelf.ca", + "homepage": "https://michelf.ca/", + "role": "Developer" + }, + { + "name": "John Gruber", + "homepage": "https://daringfireball.net/" + } + ], + "description": "PHP Markdown", + "homepage": "https://michelf.ca/projects/php-markdown/", + "keywords": [ + "markdown" + ], + "install-path": "../michelf/php-markdown" + }, + { + "name": "p3k/emoji-detector", + "version": "0.2.1", + "version_normalized": "0.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/aaronpk/emoji-detector-php.git", + "reference": "fb0765845e554f04ccd2b594a7ab8ca44d804bab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aaronpk/emoji-detector-php/zipball/fb0765845e554f04ccd2b594a7ab8ca44d804bab", + "reference": "fb0765845e554f04ccd2b594a7ab8ca44d804bab", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "4.8" + }, + "time": "2017-11-30T21:02:53+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/Emoji.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aaron Parecki", + "email": "aaron@parecki.com", + "homepage": "https://aaronparecki.com/" + } + ], + "description": "Detect and return all emoji found in a string", + "homepage": "https://github.com/aaronpk/emoji-detector-php", + "install-path": "../p3k/emoji-detector" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "version_normalized": "9.99.99.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2018-07-02T15:55:56+00:00", + "type": "library", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "install-path": "../paragonie/random_compat" + }, + { + "name": "phpseclib/phpseclib", + "version": "2.0.31", + "version_normalized": "2.0.31.0", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "233a920cb38636a43b18d428f9a8db1f0a1a08f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/233a920cb38636a43b18d428f9a8db1f0a1a08f4", + "reference": "233a920cb38636a43b18d428f9a8db1f0a1a08f4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4", + "squizlabs/php_codesniffer": "~2.0" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "time": "2021-04-06T13:56:45+00:00", + "type": "library", + "installation-source": "source", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/2.0.31" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "install-path": "../phpseclib/phpseclib" + }, + { + "name": "psr/log", + "version": "1.1.4", + "version_normalized": "1.1.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2021-05-03T11:20:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "install-path": "../psr/log" + }, + { + "name": "ramsey/uuid", + "version": "3.9.3", + "version_normalized": "3.9.3.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", + "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", + "shasum": "" + }, + "require": { + "ext-json": "*", + "paragonie/random_compat": "^1 | ^2 | 9.99.99", + "php": "^5.4 | ^7 | ^8", + "symfony/polyfill-ctype": "^1.8" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "codeception/aspect-mock": "^1 | ^2", + "doctrine/annotations": "^1.2", + "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", + "jakub-onderka/php-parallel-lint": "^1", + "mockery/mockery": "^0.9.11 | ^1", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock-phpunit": "^0.3 | ^1.1", + "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-ctype": "Provides support for PHP Ctype functions", + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "time": "2020-02-21T04:36:14+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + }, + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "install-path": "../ramsey/uuid" + }, + { + "name": "sabre/dav", + "version": "3.2.3", + "version_normalized": "3.2.3.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/dav.git", + "reference": "a9780ce4f35560ecbd0af524ad32d9d2c8954b80" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/dav/zipball/a9780ce4f35560ecbd0af524ad32d9d2c8954b80", + "reference": "a9780ce4f35560ecbd0af524ad32d9d2c8954b80", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-dom": "*", + "ext-iconv": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "lib-libxml": ">=2.7.0", + "php": ">=5.5.0", + "psr/log": "^1.0", + "sabre/event": ">=2.0.0, <4.0.0", + "sabre/http": "^4.2.1", + "sabre/uri": "^1.0.1", + "sabre/vobject": "^4.1.0", + "sabre/xml": "^1.4.0" + }, + "require-dev": { + "evert/phpdoc-md": "~0.1.0", + "monolog/monolog": "^1.18", + "phpunit/phpunit": "> 4.8, <6.0.0", + "sabre/cs": "^1.0.0" + }, + "suggest": { + "ext-curl": "*", + "ext-pdo": "*" + }, + "time": "2018-10-19T09:58:27+00:00", + "bin": [ + "bin/sabredav", + "bin/naturalselection" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabre\\DAV\\": "lib/DAV/", + "Sabre\\DAVACL\\": "lib/DAVACL/", + "Sabre\\CalDAV\\": "lib/CalDAV/", + "Sabre\\CardDAV\\": "lib/CardDAV/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "WebDAV Framework for PHP", + "homepage": "http://sabre.io/", + "keywords": [ + "CalDAV", + "CardDAV", + "WebDAV", + "framework", + "iCalendar" + ], + "install-path": "../sabre/dav" + }, + { + "name": "sabre/event", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/event.git", + "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/event/zipball/831d586f5a442dceacdcf5e9c4c36a4db99a3534", + "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "*", + "sabre/cs": "~0.0.4" + }, + "time": "2015-11-05T20:14:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabre\\Event\\": "lib/" + }, + "files": [ + "lib/coroutine.php", + "lib/Loop/functions.php", + "lib/Promise/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "sabre/event is a library for lightweight event-based programming", + "homepage": "http://sabre.io/event/", + "keywords": [ + "EventEmitter", + "async", + "events", + "hooks", + "plugin", + "promise", + "signal" + ], + "install-path": "../sabre/event" + }, + { + "name": "sabre/http", + "version": "v4.2.4", + "version_normalized": "4.2.4.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/http.git", + "reference": "acccec4ba863959b2d10c1fa0fb902736c5c8956" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/http/zipball/acccec4ba863959b2d10c1fa0fb902736c5c8956", + "reference": "acccec4ba863959b2d10c1fa0fb902736c5c8956", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-mbstring": "*", + "php": ">=5.4", + "sabre/event": ">=1.0.0,<4.0.0", + "sabre/uri": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.3", + "sabre/cs": "~0.0.1" + }, + "suggest": { + "ext-curl": " to make http requests with the Client class" + }, + "time": "2018-02-23T11:10:29+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Sabre\\HTTP\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "The sabre/http library provides utilities for dealing with http requests and responses. ", + "homepage": "https://github.com/fruux/sabre-http", + "keywords": [ + "http" + ], + "install-path": "../sabre/http" + }, + { + "name": "sabre/uri", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/uri.git", + "reference": "ada354d83579565949d80b2e15593c2371225e61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/uri/zipball/ada354d83579565949d80b2e15593c2371225e61", + "reference": "ada354d83579565949d80b2e15593c2371225e61", + "shasum": "" + }, + "require": { + "php": ">=5.4.7" + }, + "require-dev": { + "phpunit/phpunit": ">=4.0,<6.0", + "sabre/cs": "~1.0.0" + }, + "time": "2017-02-20T19:59:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "lib/functions.php" + ], + "psr-4": { + "Sabre\\Uri\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "Functions for making sense out of URIs.", + "homepage": "http://sabre.io/uri/", + "keywords": [ + "rfc3986", + "uri", + "url" + ], + "install-path": "../sabre/uri" + }, + { + "name": "sabre/vobject", + "version": "4.2.2", + "version_normalized": "4.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/vobject.git", + "reference": "449616b2d45b95c8973975de23f34a3d14f63b4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/vobject/zipball/449616b2d45b95c8973975de23f34a3d14f63b4b", + "reference": "449616b2d45b95c8973975de23f34a3d14f63b4b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.5", + "sabre/xml": ">=1.5 <3.0" + }, + "require-dev": { + "phpunit/phpunit": "> 4.8.35, <6.0.0" + }, + "suggest": { + "hoa/bench": "If you would like to run the benchmark scripts" + }, + "time": "2020-01-14T10:18:45+00:00", + "bin": [ + "bin/vobject", + "bin/generate_vcards" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabre\\VObject\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + }, + { + "name": "Dominik Tobschall", + "email": "dominik@fruux.com", + "homepage": "http://tobschall.de/", + "role": "Developer" + }, + { + "name": "Ivan Enderlin", + "email": "ivan.enderlin@hoa-project.net", + "homepage": "http://mnt.io/", + "role": "Developer" + } + ], + "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects", + "homepage": "http://sabre.io/vobject/", + "keywords": [ + "availability", + "freebusy", + "iCalendar", + "ical", + "ics", + "jCal", + "jCard", + "recurrence", + "rfc2425", + "rfc2426", + "rfc2739", + "rfc4770", + "rfc5545", + "rfc5546", + "rfc6321", + "rfc6350", + "rfc6351", + "rfc6474", + "rfc6638", + "rfc6715", + "rfc6868", + "vCalendar", + "vCard", + "vcf", + "xCal", + "xCard" + ], + "install-path": "../sabre/vobject" + }, + { + "name": "sabre/xml", + "version": "1.5.1", + "version_normalized": "1.5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sabre-io/xml.git", + "reference": "a367665f1df614c3b8fefc30a54de7cd295e444e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabre-io/xml/zipball/a367665f1df614c3b8fefc30a54de7cd295e444e", + "reference": "a367665f1df614c3b8fefc30a54de7cd295e444e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "lib-libxml": ">=2.6.20", + "php": ">=5.5.5", + "sabre/uri": ">=1.0,<3.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8|~5.7", + "sabre/cs": "~1.0.0" + }, + "time": "2019-01-09T13:51:57+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabre\\Xml\\": "lib/" + }, + "files": [ + "lib/Deserializer/functions.php", + "lib/Serializer/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + }, + { + "name": "Markus Staab", + "email": "markus.staab@redaxo.de", + "role": "Developer" + } + ], + "description": "sabre/xml is an XML library that you may not hate.", + "homepage": "https://sabre.io/xml/", + "keywords": [ + "XMLReader", + "XMLWriter", + "dom", + "xml" + ], + "install-path": "../sabre/xml" + }, + { + "name": "simshaun/recurr", + "version": "v4.0.5", + "version_normalized": "4.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/simshaun/recurr.git", + "reference": "08b0b46879f598cd11dd42b4c1a9c221a0562749" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/simshaun/recurr/zipball/08b0b46879f598cd11dd42b4c1a9c221a0562749", + "reference": "08b0b46879f598cd11dd42b4c1a9c221a0562749", + "shasum": "" + }, + "require": { + "doctrine/collections": "~1.3", + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "~5.7" + }, + "time": "2021-03-25T23:00:49+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Recurr\\": "src/Recurr/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Shaun Simmons", + "email": "shaun@shaun.pub", + "homepage": "https://shaun.pub" + } + ], + "description": "PHP library for working with recurrence rules", + "homepage": "https://github.com/simshaun/recurr", + "keywords": [ + "dates", + "events", + "recurrence", + "recurring", + "rrule" + ], + "install-path": "../simshaun/recurr" + }, + { + "name": "smarty/smarty", + "version": "v3.1.39", + "version_normalized": "3.1.39.0", + "source": { + "type": "git", + "url": "https://github.com/smarty-php/smarty.git", + "reference": "e27da524f7bcd7361e3ea5cdfa99c4378a7b5419" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/e27da524f7bcd7361e3ea5cdfa99c4378a7b5419", + "reference": "e27da524f7bcd7361e3ea5cdfa99c4378a7b5419", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^6.5 || ^5.7 || ^4.8", + "smarty/smarty-lexer": "^3.1" + }, + "time": "2021-02-17T21:57:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "libs/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Monte Ohrt", + "email": "monte@ohrt.com" + }, + { + "name": "Uwe Tews", + "email": "uwe.tews@googlemail.com" + }, + { + "name": "Rodney Rehm", + "email": "rodney.rehm@medialize.de" + } + ], + "description": "Smarty - the compiling PHP template engine", + "homepage": "http://www.smarty.net", + "keywords": [ + "templating" + ], + "install-path": "../smarty/smarty" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", + "version_normalized": "2.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2021-03-23T23:28:01+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "source", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" + }, + { + "name": "symfony/options-resolver", + "version": "v5.2.4", + "version_normalized": "5.2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "reference": "5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php73": "~1.0", + "symfony/polyfill-php80": "^1.15" + }, + "time": "2021-01-27T12:56:27+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/options-resolver" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.22.1", + "version_normalized": "1.22.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2021-01-07T16:49:33+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.22.1", + "version_normalized": "1.22.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2021-01-07T16:49:33+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php73" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.22.1", + "version_normalized": "1.22.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "time": "2021-01-07T16:49:33+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php80" + }, + { + "name": "symfony/process", + "version": "v5.2.7", + "version_normalized": "5.2.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e", + "reference": "98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.15" + }, + "time": "2021-04-08T10:27:02+00:00", + "type": "library", + "installation-source": "source", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.0-BETA1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/process" + }, + { + "name": "twbs/bootstrap", + "version": "v4.1.3", + "version_normalized": "4.1.3.0", + "source": { + "type": "git", + "url": "https://github.com/twbs/bootstrap.git", + "reference": "3b558734382ce58b51e5fc676453bfd53bba9201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/3b558734382ce58b51e5fc676453bfd53bba9201", + "reference": "3b558734382ce58b51e5fc676453bfd53bba9201", + "shasum": "" + }, + "replace": { + "twitter/bootstrap": "self.version" + }, + "time": "2018-07-24T15:54:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jacob Thornton", + "email": "jacobthornton@gmail.com" + }, + { + "name": "Mark Otto", + "email": "markdotto@gmail.com" + } + ], + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "homepage": "https://getbootstrap.com/", + "keywords": [ + "JS", + "css", + "framework", + "front-end", + "mobile-first", + "responsive", + "sass", + "web" + ], + "install-path": "../twbs/bootstrap" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "version_normalized": "1.5.6.0", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "time": "2020-11-12T00:07:28+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "install-path": "../voku/portable-ascii" + }, + { + "name": "voku/stop-words", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/voku/stop-words.git", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/stop-words/zipball/8e63c0af20f800b1600783764e0ce19e53969f71", + "reference": "8e63c0af20f800b1600783764e0ce19e53969f71", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0" + }, + "time": "2018-11-23T01:37:27+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Stop-Words via PHP", + "keywords": [ + "stop words", + "stop-words" + ], + "install-path": "../voku/stop-words" + } + ], + "dev": false, + "dev-package-names": [] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 000000000..2e5c08c6c --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,335 @@ + + array ( + 'pretty_version' => 'dev-dev', + 'version' => 'dev-dev', + 'aliases' => + array ( + ), + 'reference' => '7f4e6c2b64be07ce7587dc906e1d65494121a534', + 'name' => 'zot/zap', + ), + 'versions' => + array ( + 'blueimp/jquery-file-upload' => + array ( + 'pretty_version' => 'v10.31.0', + 'version' => '10.31.0.0', + 'aliases' => + array ( + ), + 'reference' => '0740f81829698b84efe17e72501e0f420ea0d611', + ), + 'bshaffer/oauth2-server-php' => + array ( + 'pretty_version' => 'v1.11.1', + 'version' => '1.11.1.0', + 'aliases' => + array ( + ), + 'reference' => '5a0c8000d4763b276919e2106f54eddda6bc50fa', + ), + 'commerceguys/intl' => + array ( + 'pretty_version' => 'v0.7.5', + 'version' => '0.7.5.0', + 'aliases' => + array ( + ), + 'reference' => 'de1435502068393fae4061818e194e4ea61b98d6', + ), + 'doctrine/collections' => + array ( + 'pretty_version' => '1.6.7', + 'version' => '1.6.7.0', + 'aliases' => + array ( + ), + 'reference' => '55f8b799269a1a472457bd1a41b4f379d4cfba4a', + ), + 'ezyang/htmlpurifier' => + array ( + 'pretty_version' => 'v4.13.0', + 'version' => '4.13.0.0', + 'aliases' => + array ( + ), + 'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75', + ), + 'forkawesome/fork-awesome' => + array ( + 'pretty_version' => '1.1.7', + 'version' => '1.1.7.0', + 'aliases' => + array ( + ), + 'reference' => '326af9c8bee0c80ff4c00cb2fadd4f1edd2a08c3', + ), + 'jbroadway/urlify' => + array ( + 'pretty_version' => '1.2.2-stable', + 'version' => '1.2.2.0', + 'aliases' => + array ( + ), + 'reference' => '9b227e8548f16268cef55b5eb5d659a801fa824b', + ), + 'kzykhys/git' => + array ( + 'pretty_version' => 'v0.1.2', + 'version' => '0.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '3c4db987494c38eac300593719a4a7832abddadd', + ), + 'league/html-to-markdown' => + array ( + 'pretty_version' => '4.10.0', + 'version' => '4.10.0.0', + 'aliases' => + array ( + ), + 'reference' => '0868ae7a552e809e5cd8f93ba022071640408e88', + ), + 'masterminds/html5' => + array ( + 'pretty_version' => '2.7.4', + 'version' => '2.7.4.0', + 'aliases' => + array ( + ), + 'reference' => '9227822783c75406cfe400984b2f095cdf03d417', + ), + 'michelf/php-markdown' => + array ( + 'pretty_version' => '1.9.0', + 'version' => '1.9.0.0', + 'aliases' => + array ( + ), + 'reference' => 'c83178d49e372ca967d1a8c77ae4e051b3a3c75c', + ), + 'p3k/emoji-detector' => + array ( + 'pretty_version' => '0.2.1', + 'version' => '0.2.1.0', + 'aliases' => + array ( + ), + 'reference' => 'fb0765845e554f04ccd2b594a7ab8ca44d804bab', + ), + 'paragonie/random_compat' => + array ( + 'pretty_version' => 'v9.99.99', + 'version' => '9.99.99.0', + 'aliases' => + array ( + ), + 'reference' => '84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95', + ), + 'phpseclib/phpseclib' => + array ( + 'pretty_version' => '2.0.31', + 'version' => '2.0.31.0', + 'aliases' => + array ( + ), + 'reference' => '233a920cb38636a43b18d428f9a8db1f0a1a08f4', + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.4', + 'version' => '1.1.4.0', + 'aliases' => + array ( + ), + 'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11', + ), + 'ramsey/uuid' => + array ( + 'pretty_version' => '3.9.3', + 'version' => '3.9.3.0', + 'aliases' => + array ( + ), + 'reference' => '7e1633a6964b48589b142d60542f9ed31bd37a92', + ), + 'rhumsaa/uuid' => + array ( + 'replaced' => + array ( + 0 => '3.9.3', + ), + ), + 'sabre/dav' => + array ( + 'pretty_version' => '3.2.3', + 'version' => '3.2.3.0', + 'aliases' => + array ( + ), + 'reference' => 'a9780ce4f35560ecbd0af524ad32d9d2c8954b80', + ), + 'sabre/event' => + array ( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'aliases' => + array ( + ), + 'reference' => '831d586f5a442dceacdcf5e9c4c36a4db99a3534', + ), + 'sabre/http' => + array ( + 'pretty_version' => 'v4.2.4', + 'version' => '4.2.4.0', + 'aliases' => + array ( + ), + 'reference' => 'acccec4ba863959b2d10c1fa0fb902736c5c8956', + ), + 'sabre/uri' => + array ( + 'pretty_version' => '1.2.1', + 'version' => '1.2.1.0', + 'aliases' => + array ( + ), + 'reference' => 'ada354d83579565949d80b2e15593c2371225e61', + ), + 'sabre/vobject' => + array ( + 'pretty_version' => '4.2.2', + 'version' => '4.2.2.0', + 'aliases' => + array ( + ), + 'reference' => '449616b2d45b95c8973975de23f34a3d14f63b4b', + ), + 'sabre/xml' => + array ( + 'pretty_version' => '1.5.1', + 'version' => '1.5.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a367665f1df614c3b8fefc30a54de7cd295e444e', + ), + 'simshaun/recurr' => + array ( + 'pretty_version' => 'v4.0.5', + 'version' => '4.0.5.0', + 'aliases' => + array ( + ), + 'reference' => '08b0b46879f598cd11dd42b4c1a9c221a0562749', + ), + 'smarty/smarty' => + array ( + 'pretty_version' => 'v3.1.39', + 'version' => '3.1.39.0', + 'aliases' => + array ( + ), + 'reference' => 'e27da524f7bcd7361e3ea5cdfa99c4378a7b5419', + ), + 'symfony/deprecation-contracts' => + array ( + 'pretty_version' => 'v2.4.0', + 'version' => '2.4.0.0', + 'aliases' => + array ( + ), + 'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627', + ), + 'symfony/options-resolver' => + array ( + 'pretty_version' => 'v5.2.4', + 'version' => '5.2.4.0', + 'aliases' => + array ( + ), + 'reference' => '5d0f633f9bbfcf7ec642a2b5037268e61b0a62ce', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'c6c942b1ac76c82448322025e084cadc56048b4e', + ), + 'symfony/polyfill-php73' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a678b42e92f86eca04b7fa4c0f6f19d097fb69e2', + ), + 'symfony/polyfill-php80' => + array ( + 'pretty_version' => 'v1.22.1', + 'version' => '1.22.1.0', + 'aliases' => + array ( + ), + 'reference' => 'dc3063ba22c2a1fd2f45ed856374d79114998f91', + ), + 'symfony/process' => + array ( + 'pretty_version' => 'v5.2.7', + 'version' => '5.2.7.0', + 'aliases' => + array ( + ), + 'reference' => '98cb8eeb72e55d4196dd1e36f1f16e7b3a9a088e', + ), + 'twbs/bootstrap' => + array ( + 'pretty_version' => 'v4.1.3', + 'version' => '4.1.3.0', + 'aliases' => + array ( + ), + 'reference' => '3b558734382ce58b51e5fc676453bfd53bba9201', + ), + 'twitter/bootstrap' => + array ( + 'replaced' => + array ( + 0 => 'v4.1.3', + ), + ), + 'voku/portable-ascii' => + array ( + 'pretty_version' => '1.5.6', + 'version' => '1.5.6.0', + 'aliases' => + array ( + ), + 'reference' => '80953678b19901e5165c56752d087fc11526017c', + ), + 'voku/stop-words' => + array ( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '8e63c0af20f800b1600783764e0ce19e53969f71', + ), + 'zot/zap' => + array ( + 'pretty_version' => 'dev-dev', + 'version' => 'dev-dev', + 'aliases' => + array ( + ), + 'reference' => '7f4e6c2b64be07ce7587dc906e1d65494121a534', + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 000000000..a8b98d5ce --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70205)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.5". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/vendor/phpseclib/phpseclib/.gitattributes b/vendor/phpseclib/phpseclib/.gitattributes new file mode 100644 index 000000000..484960de2 --- /dev/null +++ b/vendor/phpseclib/phpseclib/.gitattributes @@ -0,0 +1,9 @@ +* text=auto +/build/ export-ignore +/tests/ export-ignore +/travis/ export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/CHANGELOG.md export-ignore +/phpunit.xml.dist export-ignore diff --git a/vendor/phpseclib/phpseclib/.gitignore b/vendor/phpseclib/phpseclib/.gitignore new file mode 100644 index 000000000..bd40548a9 --- /dev/null +++ b/vendor/phpseclib/phpseclib/.gitignore @@ -0,0 +1,3 @@ +/vendor +/composer.phar +composer.lock diff --git a/vendor/phpseclib/phpseclib/.travis.yml b/vendor/phpseclib/phpseclib/.travis.yml new file mode 100644 index 000000000..b6a5d303b --- /dev/null +++ b/vendor/phpseclib/phpseclib/.travis.yml @@ -0,0 +1,45 @@ +language: php + +matrix: + include: + - php: 5.3 + dist: precise + - php: 5.4 + dist: trusty + - php: 5.5.9 + dist: trusty + - php: 5.5 + dist: trusty + - php: 5.6 + dist: xenial + - php: 7.0 + dist: xenial + - php: 7.1 + dist: xenial + - php: 7.2 + dist: xenial + - php: 7.3 + dist: xenial + - php: 7.4 + dist: xenial + - php: 8.0 + dist: bionic + +before_install: true + +install: + - wget http://ftp.gnu.org/gnu/parallel/parallel-20170822.tar.bz2 + - tar -xvjf parallel* + - cd parallel-20170822 + - ./configure + - make + - sudo make install + - cd .. + - eval `ssh-agent -s` + - travis/setup-secure-shell.sh + - sh -c "if [ '$TRAVIS_PHP_VERSION' != 'hhvm' -a `php -r "echo (int) version_compare(PHP_VERSION, '7.0', '<');"` = "1" ]; then travis/install-php-extensions.sh; fi" + - travis/setup-composer.sh + +script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.5' ]; then vendor/bin/phing -f build/build.xml sniff; fi" + - travis/run-phpunit.sh diff --git a/vendor/phpseclib/phpseclib/CHANGELOG.md b/vendor/phpseclib/phpseclib/CHANGELOG.md new file mode 100644 index 000000000..25e253114 --- /dev/null +++ b/vendor/phpseclib/phpseclib/CHANGELOG.md @@ -0,0 +1,547 @@ +# Changelog + +## 2.0.31 - 2021-04-06 + +- X509: always parse the first cert of a bundle (#1568) +- SSH2: behave like putty with broken publickey auth (#1572) +- SSH2: don't close channel on unexpected response to channel request (#1631) +- RSA: support keys with PSS algorithm identifier (#1584) +- RSA: cleanup RSA PKCS#1 v1.5 signature verification (CVE-2021-30130) +- SFTP/Stream: make it so you can write past the end of a file (#1618) +- SFTP: fix undefined index notice in stream touch() (#1615) +- SFTP: digit only filenames were converted to integers by php (#1623) +- BigInteger: fix issue with toBits on 32-bit PHP 8 installs +- Crypt: use a custom error handler for mcrypt to avoid deprecation errors + +## 2.0.30 - 2020-12-16 + +- X509: don't attempt to parse multi-cert PEMs (#1542) +- SFTP: add stream to get method (#1546) +- SFTP: progress callback should report actual downloaded bytes (#1543) +- SSH2: end connection faster for algorithm mismatch +- SSH2: add setKeepAlive() method (#1529) +- ANSI: fix PHP8 compatibility issues + +## 2.0.29 - 2020-09-07 + +- SFTP: add enableDatePreservation() / disableDatePreservation() (#1496) +- SFTP: uploads on low speed networks could get in infinite loop (#1507) +- SSH2: when building algo list look at if crypto engine is set (#1500) +- X509: really looong base64 encoded strings broke extractBER() (#1486) + +## 2.0.28 - 2020-07-08 + +- SFTP: realpath('') produced an error (#1474) +- SFTP: if /path/to/file is a file then /path/to/file/whatever errors (#1475) +- SFTP: speed up uploads (by changing SFTP upload packet size from 4KB to 32KB) +- ANSI: fix "Number of elements can't be negative" error + +## 2.0.27 - 2020-05-22 + +- SFTP: another attempt at speeding up uploads (#1455) +- SSH2: try logging in with none as an auth method first (#1454) +- ASN1: fix for malformed ASN1 strings (#1456) + +## 2.0.26 - 2020-03-22 + +- SFTP: another attempt at speeding up uploads (#1455) +- SSH2: try logging in with none as an auth method first (#1454) +- ASN1: fix for malformed ASN1 strings (#1456) + +## 2.0.25 - 2020-02-25 + +- SFTP: re-add buffering (#1455) + +## 2.0.24 - 2020-02-22 + +- X509: fix PHP 5.3 compatability issue +- SSH2: arcfour128 / arcfour256 were being included twice +- SSH2: make window resizing behave more consistently with PuTTY (#1421) +- SSH2: sodium_compat doesn't support memzero (#1432) +- SSH2: logging enhancements +- SFTP: don't buffer up download requests (PuTTY doesn't) (#1425) +- RSA: make PSS verification work for key length that aren't a power of 2 (#1423) + +## 2.0.23 - 2019-09-16 + +- SSH2: fix regression for connecting to servers with bad hostnames (#1405) + +## 2.0.22 - 2019-09-15 + +- SSH2: backport setPreferredAlgorithms() / getAlgorithmsNegotiated (#1156) +- SSH2 / SFTP: fix issues with ping() (#1402) +- X509: IPs in nameconstraints extension include netmask (#1387) +- X509: fix issue with explicit time tags whose maps expect implicit (#1388) +- BigInteger: fix bug with toBytes() with fixed precision negative numbers +- fix PHP 7.4 deprecations + +## 2.0.21 - 2019-07-14 + +- SSH2: only auto close the channel for exec() timeouts (#1384) + +## 2.0.20 - 2019-06-23 + +- BigInteger: lower PHP req back down to PHP 5.3.3 (#1382) + +## 2.0.19 - 2019-06-19 + +- BigInteger: fix issues with divide method in pure-PHP mode + +## 2.0.18 - 2019-06-13 + +- SSH2: close channel when a timeout occurs (#1378) +- SFTP: improve handling of malformed packets (#1371) +- RSA: add support for OpenSSH private keys (#1372) + +## 2.0.17 - 2019-05-26 + +- BigInteger: new BigInteger('-0') caused issues with GMP + +## 2.0.16 - 2019-05-26 + +- BigInteger: new BigInteger('00') caused issues with GMP +- BigInteger: GMP engine didn't always return 1 or -1 +- ASN1: revamp how OIDs are handled (#1367) +- ASN1: correctly handle long tags +- SSH2: fix issue with reconnecting via ping() (#1353) +- RSA: use hash_equals if available + +## 2.0.15 - 2019-03-10 + +- SFTP: make it so get() can correctly handle out of order responses (#1343) +- Crypt: avoid bogus IV errors in ECB mode with OpenSSL (#1087) +- RSA: protect against possible timing attack during OAEP decryption +- RSA: fix possible memory leak with XML keys (#1346) +- Hash: fix issue with undefined constants (#1347) +- Hash: fix issues with the mode +- SCP: issue error if remote_file is empty in put() call (#1335) +- X509: whitelist OID 1.3.6.1.4.1.11129.2.4.2 (#1341) + +## 2.0.14 - 2019-01-27 + +- SSH2: ssh-rsa is sometimes incorrectly used instead of rsa-sha2-256 (#1331) +- SSH2: more strictly adhere to RFC8332 for rsa-sha2-256/512 (#1332) + +## 2.0.13 - 2018-12-16 + +- SSH2: fix order of user_error() / bitmap reset (#1314) +- SSH2: setTimeout(0) didn't work as intended (#1116) +- Agent: add support for rsa-sha2-256 / rsa-sha2-512 (#1319) +- Agent: add parameter to constructor (#1319) +- X509: fix errors with validateDate (#1318) + +## 2.0.12 - 2018-11-04 + +- SSH2: fixes relating to delayed global requests (#1271) +- SSH2: setEngine -> setPreferredEngine (#1294) +- SSH2: reset $this->bitmap when the connection fails (#1298) +- SSH2: add ping() method (#1298) +- SSH2: add support for rsa-sha2-256 / rsa-sha2-512 (RFC8332) +- SFTP: make rawlist give same result regardless of stat cache (#1287) +- Hash: save hashed keys for re-use + +## 2.0.11 - 2018-04-15 + +- X509: auto download intermediate certs +- BigInteger: fix for (new BigInteger(48))->toString(true)) (#1264) +- ASN1: class is never set as key in _decode_ber +- check if phpinfo() is available before using (#1256) +- backport CFB8 support from master to 2.0 (#1257) + +## 2.0.10 - 2018-02-08 + +- BigInteger: fix issue with bitwise_xor (#1245) +- Crypt: some of the minimum lengths were off +- SFTP: update stat cache accordingly when file becomes a directory (#1235) +- SFTP: fix issue with extended attributes on 64-bit PHP installs (#1248) +- SSH2: more channel handling updates (#1200) +- X509: use anonymous functions in PHP >= 5.3.0 +- X509: revise logic for validateSignature (#1213) +- X509: fix 7.2 error when extensions were removed and new ones added (#1243) +- fix float to int conversions on ARM CPU's (#1220) + +## 2.0.9 - 2017-11-29 + +- 2.0.8 tag was done off of master branch - not 2.0 branch + +## 2.0.8 - 2017-11-29 + +- SSH2: fix issue with key re-exchange +- SSH2: updates to dealing with extraneous channel packets +- X509: URL validation didn't work (#1203) + +## 2.0.7 - 2017-10-22 + +- SSH2: + - add new READ_NEXT mode (#1140) + - add sendIdentificationStringFirst() + - add sendKEXINITFirst() + - add sendIdentificationStringLast() + - add sendKEXINITLast() (#1162) + - assume any SSH server >= 1.99 supports SSH2 (#1170) + - workaround for bad arcfour256 implementations (#1171) + - don't choke when getting response from diff channel in exec() (#1167) +- SFTP: + - add enablePathCanonicalization() + - add disablePathCanonicalization() (#1137) + - fix put() with remote file stream resource (#1177) +- ANSI: misc fixes (#1150, #1161) +- X509: use DateTime instead of unix time (#1166) +- Ciphers: use eval() instead of create_function() for >= 5.3 + +## 2.0.6 - 2017-06-05 + +- Crypt: fix OpenSSL engine on <= PHP 5.3.6 (#1122) +- Random: suppress possible E_DEPRECATED errors +- RSA: reset variables if bad key was loaded + +## 2.0.5 - 2017-05-07 + +- SSH2: don't use timeout value of 0 for fsockopen (#775) +- SSH2: make it so disabling PTY closes exec() channel if it's open (#1009) +- SSH2: include `
` tags in getLog result when SAPI isn't CLI
+- SFTP: don't assume current directory when $path parameter for delete is null (#1059)
+- SFTP: fix put() with php://input as source (#1119)
+- ASN1: fix UTCTime parsing (#1110)
+- X509: ignore certificate transparency extension (#1073)
+- Crypt: OpenSSL apparently supports variable size keys (#1085)
+
+## 2.0.4 - 2016-10-03
+
+- fix E_DEPRECATED errors on PHP 7.1 (#1041)
+- SFTP: speed up downloads (#945)
+- SFTP: fix infinite loop when uploading empty file (#995)
+- ASN1: fix possible infinite loop in decode (#1027)
+
+## 2.0.3 - 2016-08-18
+
+- BigInteger/RSA: don't compare openssl versions > 1.0 (#946)
+- RSA: don't attempt to use the CRT when zero value components exist (#980)
+- RSA: zero salt length RSA signatures don't work (#1002)
+- ASN1: fix PHP Warning on PHP 7.1 (#1013)
+- X509: set parameter fields to null for CSR's / RSA (#914)
+- CRL optimizations (#1000)
+- SSH2: fix "Expected SSH_FXP_STATUS or ..." error (#999)
+- SSH2: use stream_get_* instead of fread() / fgets() (#967)
+- SFTP: make symlinks support relative target's (#1004)
+- SFTP: fix sending stream resulting in zero byte file (#995)
+
+## 2.0.2 - 2016-06-04
+
+- All Ciphers: fix issue with CBC mode / OpenSSL / continuous buffers / decryption (#938)
+- Random: fix issues with serialize() (#932)
+- RC2: fix issue with decrypting
+- RC4: fix issue with key not being truncated correctly
+- SFTP: nlist() on a non-existent directory resulted in error
+- SFTP: add is_writable, is_writeable, is_readable
+- X509: add IPv6 support for subjectaltname extension (#936)
+
+## 2.0.1 - 2016-01-18
+
+- RSA: fix regression in PSS mode ([#769](https://github.com/phpseclib/phpseclib/pull/769))
+- RSA: fix issue loading PKCS8 specific keys ([#861](https://github.com/phpseclib/phpseclib/pull/861))
+- X509: add getOID() method ([#789](https://github.com/phpseclib/phpseclib/pull/789))
+- X509: improve base64-encoded detection rules ([#855](https://github.com/phpseclib/phpseclib/pull/855))
+- SFTP: fix quirky behavior with put() ([#830](https://github.com/phpseclib/phpseclib/pull/830))
+- SFTP: fix E_NOTICE ([#883](https://github.com/phpseclib/phpseclib/pull/883))
+- SFTP/Stream: fix issue with filenames with hashes ([#901](https://github.com/phpseclib/phpseclib/pull/901))
+- SSH2: add isAuthenticated() method ([#897](https://github.com/phpseclib/phpseclib/pull/897))
+- SSH/Agent: fix possible PHP warning ([#923](https://github.com/phpseclib/phpseclib/issues/923))
+- BigInteger: add __debugInfo() magic method ([#881](https://github.com/phpseclib/phpseclib/pull/881))
+- BigInteger: fix issue with doing bitwise not on 0
+- add getBlockLength() method to symmetric ciphers
+
+## 2.0.0 - 2015-08-04
+
+- Classes were renamed and namespaced ([#243](https://github.com/phpseclib/phpseclib/issues/243))
+- The use of an autoloader is now required (e.g. Composer)
+
+## 1.0.19 - 2020-07-07
+
+- SSH2: arcfour128 / arcfour256 were being included twice
+- SSH2: make window resizing behave more consistently with PuTTY (#1421)
+- SSH2: logging enhancements
+- SSH2: try logging in with none as an auth method first (#1454)
+- SFTP: change the mode with a SETSTAT instead of MKDIR (#1463)
+- SFTP: make it so extending SFTP class doesn't cause a segfault (#1465)
+- SFTP: realpath('') produced an error (#1474)
+- SFTP: if /path/to/file is a file then /path/to/file/whatever errors (#1475)
+- RSA: make PSS verification work for key length that aren't a power of 2 (#1423)
+- ASN1: fix for malformed ASN1 strings (#1456)
+- ANSI: fix "Number of elements can't be negative" error
+
+## 1.0.18 - 2019-09-16
+
+- SSH2: fix regression for connecting to servers with bad hostnames (#1405)
+
+## 1.0.17 - 2019-09-15
+
+- SSH2: backport setPreferredAlgorithms() / getAlgorithmsNegotiated (#1156)
+- SSH2 / SFTP: fix issues with ping() (#1402)
+- SSH2: only auto close the channel for exec() timeouts (#1384)
+- SSH2 / SFTP: fix issues with ping() (#1402)
+- SFTP: add progress callback to get() (#1375)
+- SFTP: fix array_merge(): Argument #1 is not an array error (#1379)
+- X509: IPs in nameconstraints extension include netmask (#1387)
+- X509: fix issue with explicit time tags whose maps expect implicit (#1388)
+- BigInteger: fix issues with divide method
+- BigInteger: fix bug with toBytes() with fixed precision negative numbers
+- fix PHP 7.4 deprecations
+
+## 1.0.16 - 2019-06-13
+
+- BigInteger: new BigInteger('-0') caused issues with GMP
+- BigInteger: new BigInteger('00') caused issues with GMP
+- BigInteger: GMP engine didn't always return 1 or -1
+- ASN1: revamp how OIDs are handled (#1367)
+- ASN1: correctly handle long tags
+- SSH2: fix issue with reconnecting via ping() (#1353)
+- SSH2: close channel when a timeout occurs (#1378)
+- SFTP: improve handling of malformed packets (#1371)
+- RSA: add support for OpenSSH private keys (#1372)
+- RSA: use hash_equals if available
+
+## 1.0.15 - 2019-03-10
+
+- SFTP: make it so get() can correctly handle out of order responses (#1343)
+- Crypt: avoid bogus IV errors in ECB mode with OpenSSL (#1087)
+- RSA: protect against possible timing attack during OAEP decryption
+- RSA: fix possible memory leak with XML keys (#1346)
+- Hash: fix issues with the mode
+- SCP: issue error if remote_file is empty in put() call (#1335)
+- X509: whitelist OID 1.3.6.1.4.1.11129.2.4.2 (#1341)
+
+## 1.0.14 - 2019-01-27
+
+- SSH2: ssh-rsa is sometimes incorrectly used instead of rsa-sha2-256 (#1331)
+- SSH2: more strictly adhere to RFC8332 for rsa-sha2-256/512 (#1332)
+
+## 1.0.13 - 2018-12-16
+
+- SSH2: fix order of user_error() / bitmap reset (#1314)
+- SSH2: setTimeout(0) didn't work as intended (#1116)
+- Agent: add support for rsa-sha2-256 / rsa-sha2-512 (#1319)
+- Agent: add parameter to constructor (#1319)
+
+## 1.0.12 - 2018-11-04
+
+- SSH2: fixes relating to delayed global requests (#1271)
+- SSH2: setEngine -> setPreferredEngine (#1294)
+- SSH2: reset $this->bitmap when the connection fails (#1298)
+- SSH2: add ping() method (#1298)
+- SSH2: add support for rsa-sha2-256 / rsa-sha2-512 (RFC8332)
+- SFTP: make rawlist give same result regardless of stat cache (#1287)
+- Hash: save hashed keys for re-use
+
+## 1.0.11 - 2018-04-15
+
+- X509: auto download intermediate certs
+- BigInteger: fix for (new BigInteger(48))->toString(true)) (#1264)
+- ASN1: class is never set as key in _decode_ber
+
+## 1.0.10 - 2018-02-08
+
+- BigInteger: fix issue with bitwise_xor (#1245)
+- Crypt: some of the minimum lengths were off
+- SFTP: update stat cache accordingly when file becomes a directory (#1235)
+- SFTP: fix issue with extended attributes on 64-bit PHP installs (#1248)
+- SSH2: more channel handling updates (#1200)
+- X509: use anonymous functions in PHP >= 5.3.0
+- X509: revise logic for validateSignature (#1213)
+- X509: fix 7.2 error when extensions were removed and new ones added (#1243)
+- fix float to int conversions on ARM CPU's (#1220)
+
+## 1.0.9 - 2017-11-29
+
+- SSH2: fix issue with key re-exchange
+- SSH2: updates to dealing with extraneous channel packets
+- X509: URL validation didn't work (#1203)
+
+## 1.0.8 - 2017-10-22
+
+- SSH2:
+  - add new READ_NEXT mode (#1140)
+  - add sendIdentificationStringFirst()
+  - add sendKEXINITFirst()
+  - add sendIdentificationStringLast()
+  - add sendKEXINITLast() (#1162)
+  - assume any SSH server >= 1.99 supports SSH2 (#1170)
+  - workaround for bad arcfour256 implementations (#1171)
+  - don't choke when getting response from diff channel in exec() (#1167)
+- SFTP:
+  - add enablePathCanonicalization()
+  - add disablePathCanonicalization() (#1137)
+  - fix put() with remote file stream resource (#1177)
+- ANSI: misc fixes (#1150, #1161)
+- X509: use DateTime instead of unix time (#1166)
+- Ciphers: use eval() instead of create_function() for >= 5.3
+
+## 1.0.7 - 2017-06-05
+
+- Crypt: fix OpenSSL engine on <= PHP 5.3.6 (#1122)
+- Random: suppress possible E_DEPRECATED errors
+- RSA: reset variables if bad key was loaded
+
+## 1.0.6 - 2017-05-07
+
+- SSH2: don't use timeout value of 0 for fsockopen (#775)
+- SSH2: make it so disabling PTY closes exec() channel if it's open (#1009)
+- SSH2: include `
` tags in getLog result when SAPI isn't CLI
+- SFTP: don't assume current directory when $path parameter for delete is null (#1059)
+- SFTP: fix put() with php://input as source (#1119)
+- ASN1: fix UTCTime parsing (#1110)
+- X509: ignore certificate transparency extension (#1073)
+- Crypt: OpenSSL apparently supports variable size keys (#1085)
+
+## 1.0.5 - 2016-10-22
+
+- fix issue preventing installation of 1.0.x via Composer (#1048)
+
+## 1.0.4 - 2016-10-03
+
+- fix E_DEPRECATED errors on PHP 7.0 and 7.1 (#1041)
+- fix float to int conversions on 32-bit Linux pre-PHP 5.3 (#1038, #1034)
+- SFTP: speed up downloads (#945)
+- SFTP: fix infinite loop when uploading empty file (#995)
+- ASN1: fix possible infinite loop in decode (#1027)
+
+## 1.0.3 - 2016-08-18
+
+- BigInteger/RSA: don't compare openssl versions > 1.0 (#946)
+- RSA: don't attempt to use the CRT when zero value components exist (#980)
+- RSA: zero salt length RSA signatures don't work (#1002)
+- ASN1: fix PHP Warning on PHP 7.1 (#1013)
+- X509: set parameter fields to null for CSR's / RSA (#914)
+- CRL optimizations (#1000)
+- SSH2: fix "Expected SSH_FXP_STATUS or ..." error (#999)
+- SFTP: make symlinks support relative target's (#1004)
+- SFTP: fix sending stream resulting in zero byte file (#995)
+
+## 1.0.2 - 2016-05-07
+
+- All Ciphers: fix issue with CBC mode / OpenSSL / continuous buffers / decryption (#938)
+- Random: fix issues with serialize() (#932)
+- RC2: fix issue with decrypting
+- RC4: fix issue with key not being truncated correctly
+- SFTP: nlist() on a non-existent directory resulted in error
+- SFTP: add is_writable, is_writeable, is_readable
+- RSA: fix PHP4 compatibility issue
+
+## 1.0.1 - 2016-01-18
+
+- RSA: fix regression in PSS mode ([#769](https://github.com/phpseclib/phpseclib/pull/769))
+- RSA: fix issue loading PKCS8 specific keys ([#861](https://github.com/phpseclib/phpseclib/pull/861))
+- X509: add getOID() method ([#789](https://github.com/phpseclib/phpseclib/pull/789))
+- X509: improve base64-encoded detection rules ([#855](https://github.com/phpseclib/phpseclib/pull/855))
+- SFTP: fix quirky behavior with put() ([#830](https://github.com/phpseclib/phpseclib/pull/830))
+- SFTP: fix E_NOTICE ([#883](https://github.com/phpseclib/phpseclib/pull/883))
+- SFTP/Stream: fix issue with filenames with hashes ([#901](https://github.com/phpseclib/phpseclib/pull/901))
+- SSH2: add isAuthenticated() method ([#897](https://github.com/phpseclib/phpseclib/pull/897))
+- SSH/Agent: fix possible PHP warning ([#923](https://github.com/phpseclib/phpseclib/issues/923))
+- BigInteger: add __debugInfo() magic method ([#881](https://github.com/phpseclib/phpseclib/pull/881))
+- BigInteger: fix issue with doing bitwise not on 0
+- add getBlockLength() method to symmetric ciphers
+
+## 1.0.0 - 2015-08-02
+
+- OpenSSL support for symmetric ciphers ([#507](https://github.com/phpseclib/phpseclib/pull/507))
+- rewritten vt100 terminal emulator (File_ANSI) ([#689](https://github.com/phpseclib/phpseclib/pull/689))
+- agent-forwarding support (System_SSH_Agent) ([#592](https://github.com/phpseclib/phpseclib/pull/592))
+- Net_SSH2 improvements
+  - diffie-hellman-group-exchange-sha1/sha256 support ([#714](https://github.com/phpseclib/phpseclib/pull/714))
+  - window size handling updates ([#717](https://github.com/phpseclib/phpseclib/pull/717))
+- Net_SFTP improvements
+  - add callback support to put() ([#655](https://github.com/phpseclib/phpseclib/pull/655))
+  - stat cache fixes ([#743](https://github.com/phpseclib/phpseclib/issues/743), [#730](https://github.com/phpseclib/phpseclib/issues/730), [#709](https://github.com/phpseclib/phpseclib/issues/709), [#726](https://github.com/phpseclib/phpseclib/issues/726))
+- add "none" encryption mode to Crypt_RSA ([#692](https://github.com/phpseclib/phpseclib/pull/692))
+- misc ASN.1 / X.509 parsing fixes ([#721](https://github.com/phpseclib/phpseclib/pull/721), [#627](https://github.com/phpseclib/phpseclib/pull/627))
+- use a random serial number for new X509 certs ([#740](https://github.com/phpseclib/phpseclib/pull/740))
+- add getPublicKeyFingerprint() to Crypt_RSA ([#677](https://github.com/phpseclib/phpseclib/pull/677))
+
+## 0.3.10 - 2015-02-04
+
+- simplify SSH2 window size handling ([#538](https://github.com/phpseclib/phpseclib/pull/538))
+- slightly relax the conditions under which OpenSSL is used ([#598](https://github.com/phpseclib/phpseclib/pull/598))
+- fix issue with empty constructed context-specific tags in ASN1 ([#606](https://github.com/phpseclib/phpseclib/pull/606))
+
+## 0.3.9 - 2014-11-09
+
+- PHP 5.6 improvements ([#482](https://github.com/phpseclib/phpseclib/pull/482), [#491](https://github.com/phpseclib/phpseclib/issues/491))
+
+## 0.3.8 - 2014-09-12
+
+- improve support for indef lengths in File_ASN1
+- add hmac-sha2-256 support to Net_SSH2
+- make it so negotiated algorithms can be seen before Net_SSH2 login
+- add sha256-96 and sha512-96 to Crypt_Hash
+- window size handling adjustments in Net_SSH2
+
+## 0.3.7 - 2014-07-05
+
+- auto-detect public vs private keys
+- add file_exists, is_dir, is_file, readlink and symlink to Net_SFTP
+- add support for recursive nlist and rawlist
+- make it so nlist and rawlist can return pre-sorted output
+- make it so callback functions can make exec() return early
+- add signSPKAC and saveSPKAC methods to File_X509
+- add support for PKCS8 keys in Crypt_RSA
+- add pbkdf1 support to setPassword() in Crypt_Base
+- add getWindowColumns, getWindowRows, setWindowColumns, setWindowRows to Net_SSH2
+- add support for filenames with spaces in them to Net_SCP
+
+## 0.3.6 - 2014-02-23
+
+- add preliminary support for custom SSH subsystems
+- add ssh-agent support
+
+## 0.3.5 - 2013-07-11
+
+- numerous SFTP changes:
+  - chown
+  - chgrp
+  - truncate
+  - improved file type detection
+  - put() can write to the middle of a file
+  - mkdir accepts the same parameters that PHP's mkdir does
+  - the ability to upload/download 2GB files
+- across-the-board speedups for the various encryption algorithms
+- multi-factor authentication support for Net_SSH2
+- a $callback parameter for Net_SSH2::exec
+- new classes:
+  - Net_SFTP_StreamWrapper
+  - Net_SCP
+  - Crypt_Twofish
+  - Crypt_Blowfish
+
+## 0.3.1 - 2012-11-20
+
+- add Net_SSH2::enableQuietMode() for suppressing stderr
+- add Crypt_RSA::__toString() and Crypt_RSA::getSize()
+- fix problems with File_X509::validateDate(), File_X509::sign() and Crypt_RSA::verify()
+- use OpenSSL to speed up modular exponention in Math_BigInteger
+- improved timeout functionality in Net_SSH2
+- add support for SFTPv2
+- add support for CRLs in File_X509
+- SSH-2.0-SSH doesn't implement hmac-*-96 correctly
+
+## 0.3.0 - 2012-07-08
+
+- add support for reuming Net_SFTP::put()
+- add support for recursive deletes and recursive chmods to Net_SFTP
+- add setTimeout() to Net_SSH2
+- add support for PBKDF2 to the various Crypt_* classes via setPassword()
+- add File_X509 and File_ASN1
+- add the ability to decode various formats in Crypt_RSA
+- make Net_SSH2::getServerPublicHostKey() return a printer-friendly version of the public key
+
+## 0.2.2 - 2011-05-09
+
+- CFB and OFB modes were added to all block ciphers
+- support for interactive mode was added to Net_SSH2
+- Net_SSH2 now has limited keyboard_interactive authentication support
+- support was added for PuTTY formatted RSA private keys and XML formatted RSA private keys
+- Crypt_RSA::loadKey() will now try all key types automatically
+- add support for AES-128-CBC and DES-EDE3-CFB encrypted RSA private keys
+- add Net_SFTP::stat(), Net_SFTP::lstat() and Net_SFTP::rawlist()
+- logging was added to Net_SSH1
+- the license was changed to the less restrictive MIT license
diff --git a/vendor/phpseclib/phpseclib/build/build.xml b/vendor/phpseclib/phpseclib/build/build.xml
new file mode 100644
index 000000000..26ab24b8a
--- /dev/null
+++ b/vendor/phpseclib/phpseclib/build/build.xml
@@ -0,0 +1,25 @@
+
+
+
+  
+
+  
+  
+  
+    
+  
+  
+    
+  
+
diff --git a/vendor/phpseclib/phpseclib/build/code-sniffer-ruleset-tests.xml b/vendor/phpseclib/phpseclib/build/code-sniffer-ruleset-tests.xml
new file mode 100644
index 000000000..8767eee94
--- /dev/null
+++ b/vendor/phpseclib/phpseclib/build/code-sniffer-ruleset-tests.xml
@@ -0,0 +1,17 @@
+
+
+
+ phpseclib coding standard for tests
+
+ 
+ 
+  
+
+  
+  
+  
+  
+ 
+
+
diff --git a/vendor/phpseclib/phpseclib/build/code-sniffer-ruleset.xml b/vendor/phpseclib/phpseclib/build/code-sniffer-ruleset.xml
new file mode 100644
index 000000000..2e399139c
--- /dev/null
+++ b/vendor/phpseclib/phpseclib/build/code-sniffer-ruleset.xml
@@ -0,0 +1,35 @@
+
+
+
+ phpseclib coding standard
+
+ 
+ 
+  
+  
+  
+  
+
+  
+  
+  
+
+  
+  
+  
+  
+
+  
+  
+  
+ 
+
+ 
+
+ 
+ 
+
+ 
+ 
+
+
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php
index efbcd242b..8822b9b88 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Crypt/Base.php
@@ -779,12 +779,14 @@ abstract class Base
         }
 
         if ($this->engine === self::ENGINE_MCRYPT) {
+            set_error_handler(array($this, 'do_nothing'));
+
             if ($this->changed) {
                 $this->_setupMcrypt();
                 $this->changed = false;
             }
             if ($this->enchanged) {
-                @mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
+                mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
                 $this->enchanged = false;
             }
 
@@ -817,15 +819,15 @@ abstract class Base
                 if ($len >= $block_size) {
                     if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) {
                         if ($this->enbuffer['enmcrypt_init'] === true) {
-                            @mcrypt_generic_init($this->enmcrypt, $this->key, $iv);
+                            mcrypt_generic_init($this->enmcrypt, $this->key, $iv);
                             $this->enbuffer['enmcrypt_init'] = false;
                         }
-                        $ciphertext.= @mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size));
+                        $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size));
                         $iv = substr($ciphertext, -$block_size);
                         $len%= $block_size;
                     } else {
                         while ($len >= $block_size) {
-                            $iv = @mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size);
+                            $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size);
                             $ciphertext.= $iv;
                             $len-= $block_size;
                             $i+= $block_size;
@@ -834,22 +836,26 @@ abstract class Base
                 }
 
                 if ($len) {
-                    $iv = @mcrypt_generic($this->ecb, $iv);
+                    $iv = mcrypt_generic($this->ecb, $iv);
                     $block = $iv ^ substr($plaintext, -$len);
                     $iv = substr_replace($iv, $block, 0, $len);
                     $ciphertext.= $block;
                     $pos = $len;
                 }
 
+                restore_error_handler();
+
                 return $ciphertext;
             }
 
-            $ciphertext = @mcrypt_generic($this->enmcrypt, $plaintext);
+            $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext);
 
             if (!$this->continuousBuffer) {
-                @mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
+                mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
             }
 
+            restore_error_handler();
+
             return $ciphertext;
         }
 
@@ -1118,13 +1124,14 @@ abstract class Base
         }
 
         if ($this->engine === self::ENGINE_MCRYPT) {
+            set_error_handler(array($this, 'do_nothing'));
             $block_size = $this->block_size;
             if ($this->changed) {
                 $this->_setupMcrypt();
                 $this->changed = false;
             }
             if ($this->dechanged) {
-                @mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
+                mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
                 $this->dechanged = false;
             }
 
@@ -1152,26 +1159,30 @@ abstract class Base
                 }
                 if ($len >= $block_size) {
                     $cb = substr($ciphertext, $i, $len - $len % $block_size);
-                    $plaintext.= @mcrypt_generic($this->ecb, $iv . $cb) ^ $cb;
+                    $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb;
                     $iv = substr($cb, -$block_size);
                     $len%= $block_size;
                 }
                 if ($len) {
-                    $iv = @mcrypt_generic($this->ecb, $iv);
+                    $iv = mcrypt_generic($this->ecb, $iv);
                     $plaintext.= $iv ^ substr($ciphertext, -$len);
                     $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len);
                     $pos = $len;
                 }
 
+                restore_error_handler();
+
                 return $plaintext;
             }
 
-            $plaintext = @mdecrypt_generic($this->demcrypt, $ciphertext);
+            $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
 
             if (!$this->continuousBuffer) {
-                @mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
+                mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
             }
 
+            restore_error_handler();
+
             return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
         }
 
@@ -1649,9 +1660,12 @@ abstract class Base
                 }
                 return false;
             case self::ENGINE_MCRYPT:
-                return $this->cipher_name_mcrypt &&
+                set_error_handler(array($this, 'do_nothing'));
+                $result = $this->cipher_name_mcrypt &&
                        extension_loaded('mcrypt') &&
-                       in_array($this->cipher_name_mcrypt, @mcrypt_list_algorithms());
+                       in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms());
+                restore_error_handler();
+                return $result;
             case self::ENGINE_INTERNAL:
                 return true;
         }
@@ -1728,17 +1742,19 @@ abstract class Base
         }
 
         if ($this->engine != self::ENGINE_MCRYPT && $this->enmcrypt) {
+            set_error_handler(array($this, 'do_nothing'));
             // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed,
             // (re)open them with the module named in $this->cipher_name_mcrypt
-            @mcrypt_module_close($this->enmcrypt);
-            @mcrypt_module_close($this->demcrypt);
+            mcrypt_module_close($this->enmcrypt);
+            mcrypt_module_close($this->demcrypt);
             $this->enmcrypt = null;
             $this->demcrypt = null;
 
             if ($this->ecb) {
-                @mcrypt_module_close($this->ecb);
+                mcrypt_module_close($this->ecb);
                 $this->ecb = null;
             }
+            restore_error_handler();
         }
 
         $this->changed = true;
@@ -1851,19 +1867,19 @@ abstract class Base
                 self::MODE_STREAM => MCRYPT_MODE_STREAM,
             );
 
-            $this->demcrypt = @mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
-            $this->enmcrypt = @mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
+            $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
+            $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
 
             // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer()
             // to workaround mcrypt's broken ncfb implementation in buffered mode
             // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
             if ($this->mode == self::MODE_CFB) {
-                $this->ecb = @mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, '');
+                $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, '');
             }
         } // else should mcrypt_generic_deinit be called?
 
         if ($this->mode == self::MODE_CFB) {
-            @mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size));
+            mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size));
         }
     }
 
@@ -2696,4 +2712,13 @@ abstract class Base
                 return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))';
         }
     }
+
+    /**
+     * Dummy error handler to suppress mcrypt errors
+     *
+     * @access private
+     */
+    function do_nothing()
+    {
+    }
 }
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php b/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php
index 17e2b8329..811d039d3 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Crypt/RSA.php
@@ -1219,6 +1219,7 @@ class RSA
                     $length = $this->_decodeLength($temp);
                     switch ($this->_string_shift($temp, $length)) {
                         case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption
+                        case "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0A": // rsaPSS
                             break;
                         case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC
                             /*
@@ -2916,6 +2917,59 @@ class RSA
         return $em;
     }
 
+    /**
+     * EMSA-PKCS1-V1_5-ENCODE (without NULL)
+     *
+     * Quoting https://tools.ietf.org/html/rfc8017#page-65,
+     *
+     * "The parameters field associated with id-sha1, id-sha224, id-sha256,
+     *  id-sha384, id-sha512, id-sha512/224, and id-sha512/256 should
+     *  generally be omitted, but if present, it shall have a value of type
+     *  NULL"
+     *
+     * @access private
+     * @param string $m
+     * @param int $emLen
+     * @return string
+     */
+    function _emsa_pkcs1_v1_5_encode_without_null($m, $emLen)
+    {
+        $h = $this->hash->hash($m);
+        if ($h === false) {
+            return false;
+        }
+
+        switch ($this->hashName) {
+            case 'sha1':
+                $t = pack('H*', '301f300706052b0e03021a0414');
+                break;
+            case 'sha256':
+                $t = pack('H*', '302f300b06096086480165030402010420');
+                break;
+            case 'sha384':
+                $t = pack('H*', '303f300b06096086480165030402020430');
+                break;
+            case 'sha512':
+                $t = pack('H*', '304f300b06096086480165030402030440');
+                break;
+            default:
+                return false;
+        }
+        $t.= $h;
+        $tLen = strlen($t);
+
+        if ($emLen < $tLen + 11) {
+            user_error('Intended encoded message length too short');
+            return false;
+        }
+
+        $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3);
+
+        $em = "\0\1$ps\0$t";
+
+        return $em;
+    }
+
     /**
      * RSASSA-PKCS1-V1_5-SIGN
      *
@@ -2982,13 +3036,17 @@ class RSA
         // EMSA-PKCS1-v1_5 encoding
 
         $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
-        if ($em2 === false) {
+        $em3 = $this->_emsa_pkcs1_v1_5_encode_without_null($m, $this->k);
+
+        if ($em2 === false && $em3 === false) {
             user_error('RSA modulus too short');
             return false;
         }
 
         // Compare
-        return $this->_equals($em, $em2);
+
+        return ($em2 !== false && $this->_equals($em, $em2)) ||
+               ($em3 !== false && $this->_equals($em, $em3));
     }
 
     /**
diff --git a/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php b/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php
index 807ca88ce..dc5b78f64 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/File/ASN1.php
@@ -235,7 +235,7 @@ class ASN1
         $current = array('start' => $start);
 
         $type = ord($encoded[$encoded_pos++]);
-        $start++;
+        $startOffset = 1;
 
         $constructed = ($type >> 5) & 1;
 
@@ -245,13 +245,20 @@ class ASN1
             // process septets (since the eighth bit is ignored, it's not an octet)
             do {
                 $temp = ord($encoded[$encoded_pos++]);
+                $startOffset++;
                 $loop = $temp >> 7;
                 $tag <<= 7;
-                $tag |= $temp & 0x7F;
-                $start++;
+                $temp &= 0x7F;
+                // "bits 7 to 1 of the first subsequent octet shall not all be zero"
+                if ($startOffset == 2 && $temp == 0) {
+                    return false;
+                }
+                $tag |= $temp;
             } while ($loop);
         }
 
+        $start+= $startOffset;
+
         // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13
         $length = ord($encoded[$encoded_pos++]);
         $start++;
@@ -344,13 +351,16 @@ class ASN1
         switch ($tag) {
             case self::TYPE_BOOLEAN:
                 // "The contents octets shall consist of a single octet." -- paragraph 8.2.1
-                //if (strlen($content) != 1) {
-                //    return false;
-                //}
+                if ($constructed || strlen($content) != 1) {
+                    return false;
+                }
                 $current['content'] = (bool) ord($content[$content_pos]);
                 break;
             case self::TYPE_INTEGER:
             case self::TYPE_ENUMERATED:
+                if ($constructed) {
+                    return false;
+                }
                 $current['content'] = new BigInteger(substr($content, $content_pos), -256);
                 break;
             case self::TYPE_REAL: // not currently supported
@@ -370,15 +380,15 @@ class ASN1
                     $last = count($temp) - 1;
                     for ($i = 0; $i < $last; $i++) {
                         // all subtags should be bit strings
-                        //if ($temp[$i]['type'] != self::TYPE_BIT_STRING) {
-                        //    return false;
-                        //}
+                        if ($temp[$i]['type'] != self::TYPE_BIT_STRING) {
+                            return false;
+                        }
                         $current['content'].= substr($temp[$i]['content'], 1);
                     }
                     // all subtags should be bit strings
-                    //if ($temp[$last]['type'] != self::TYPE_BIT_STRING) {
-                    //    return false;
-                    //}
+                    if ($temp[$last]['type'] != self::TYPE_BIT_STRING) {
+                        return false;
+                    }
                     $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1);
                 }
                 break;
@@ -395,9 +405,9 @@ class ASN1
                         }
                         $content_pos += $temp['length'];
                         // all subtags should be octet strings
-                        //if ($temp['type'] != self::TYPE_OCTET_STRING) {
-                        //    return false;
-                        //}
+                        if ($temp['type'] != self::TYPE_OCTET_STRING) {
+                            return false;
+                        }
                         $current['content'].= $temp['content'];
                         $length+= $temp['length'];
                     }
@@ -408,12 +418,15 @@ class ASN1
                 break;
             case self::TYPE_NULL:
                 // "The contents octets shall not contain any octets." -- paragraph 8.8.2
-                //if (strlen($content)) {
-                //    return false;
-                //}
+                if ($constructed || strlen($content)) {
+                    return false;
+                }
                 break;
             case self::TYPE_SEQUENCE:
             case self::TYPE_SET:
+                if (!$constructed) {
+                    return false;
+                }
                 $offset = 0;
                 $current['content'] = array();
                 $content_len = strlen($content);
@@ -434,7 +447,13 @@ class ASN1
                 }
                 break;
             case self::TYPE_OBJECT_IDENTIFIER:
+                if ($constructed) {
+                    return false;
+                }
                 $current['content'] = $this->_decodeOID(substr($content, $content_pos));
+                if ($current['content'] === false) {
+                    return false;
+                }
                 break;
             /* Each character string type shall be encoded as if it had been declared:
                [UNIVERSAL x] IMPLICIT OCTET STRING
@@ -464,12 +483,20 @@ class ASN1
             case self::TYPE_UTF8_STRING:
                 // ????
             case self::TYPE_BMP_STRING:
+                if ($constructed) {
+                    return false;
+                }
                 $current['content'] = substr($content, $content_pos);
                 break;
             case self::TYPE_UTC_TIME:
             case self::TYPE_GENERALIZED_TIME:
+                if ($constructed) {
+                    return false;
+                }
                 $current['content'] = $this->_decodeTime(substr($content, $content_pos), $tag);
+                break;
             default:
+                return false;
         }
 
         $start+= $length;
@@ -1127,6 +1154,11 @@ class ASN1
         $oid = array();
         $pos = 0;
         $len = strlen($content);
+
+        if (ord($content[$len - 1]) & 0x80) {
+            return false;
+        }
+
         $n = new BigInteger();
         while ($pos < $len) {
             $temp = ord($content[$pos++]);
diff --git a/vendor/phpseclib/phpseclib/phpseclib/File/X509.php b/vendor/phpseclib/phpseclib/phpseclib/File/X509.php
index 3520efdc1..7b1b1cfad 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/File/X509.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/File/X509.php
@@ -5054,9 +5054,12 @@ class X509
          * subject=/O=organization/OU=org unit/CN=common name
          * issuer=/O=organization/CN=common name
          */
-        $temp = strlen($str) <= ini_get('pcre.backtrack_limit') ?
-            preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1) :
-            $str;
+        if (strlen($str) > ini_get('pcre.backtrack_limit')) {
+            $temp = $str;
+        } else {
+            $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1);
+            $temp = preg_replace('#-+END.*[\r\n ]*.*#ms', '', $str, 1);
+        }
         // remove new lines
         $temp = str_replace(array("\r", "\n", ' '), '', $temp);
         // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php b/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php
index 9df0bf0f2..fc24b9145 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Math/BigInteger.php
@@ -658,11 +658,11 @@ class BigInteger
     {
         $hex = $this->toHex($twos_compliment);
         $bits = '';
-        for ($i = strlen($hex) - 8, $start = strlen($hex) & 7; $i >= $start; $i-=8) {
-            $bits = str_pad(decbin(hexdec(substr($hex, $i, 8))), 32, '0', STR_PAD_LEFT) . $bits;
+        for ($i = strlen($hex) - 6, $start = strlen($hex) % 6; $i >= $start; $i-=6) {
+            $bits = str_pad(decbin(hexdec(substr($hex, $i, 6))), 24, '0', STR_PAD_LEFT) . $bits;
         }
         if ($start) { // hexdec('') == 0
-            $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8, '0', STR_PAD_LEFT) . $bits;
+            $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8 * $start, '0', STR_PAD_LEFT) . $bits;
         }
         $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0');
 
diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php
index 8ae43fa04..34741831b 100644
--- a/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php
+++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP.php
@@ -1024,7 +1024,7 @@ class SFTP extends SSH2
             uasort($contents, array(&$this, '_comparator'));
         }
 
-        return $raw ? $contents : array_keys($contents);
+        return $raw ? $contents : array_map('strval', array_keys($contents));
     }
 
     /**
@@ -3004,9 +3004,17 @@ class SFTP extends SSH2
             $packet_type = '-> ' . $this->packet_types[$type] .
                            ' (' . round($stop - $start, 4) . 's)';
             if (NET_SFTP_LOGGING == self::LOG_REALTIME) {
-                echo "
\r\n" . $this->_format_log(array($data), array($packet_type)) . "\r\n
\r\n"; - flush(); - ob_flush(); + switch (PHP_SAPI) { + case 'cli': + $start = $stop = "\r\n"; + break; + default: + $start = '
';
+                        $stop = '
'; + } + echo $start . $this->_format_log(array($data), array($packet_type)) . $stop; + @flush(); + @ob_flush(); } else { $this->packet_type_log[] = $packet_type; if (NET_SFTP_LOGGING == self::LOG_COMPLEX) { @@ -3113,9 +3121,17 @@ class SFTP extends SSH2 $packet_type = '<- ' . $this->packet_types[$this->packet_type] . ' (' . round($stop - $start, 4) . 's)'; if (NET_SFTP_LOGGING == self::LOG_REALTIME) { - echo "
\r\n" . $this->_format_log(array($packet), array($packet_type)) . "\r\n
\r\n"; - flush(); - ob_flush(); + switch (PHP_SAPI) { + case 'cli': + $start = $stop = "\r\n"; + break; + default: + $start = '
';
+                        $stop = '
'; + } + echo $start . $this->_format_log(array($packet), array($packet_type)) . $stop; + @flush(); + @ob_flush(); } else { $this->packet_type_log[] = $packet_type; if (NET_SFTP_LOGGING == self::LOG_COMPLEX) { diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php index 1a44b10a0..ec9e5841a 100644 --- a/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php +++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php @@ -410,7 +410,7 @@ class Stream { switch ($whence) { case SEEK_SET: - if ($offset >= $this->size || $offset < 0) { + if ($offset < 0) { return false; } break; @@ -447,7 +447,9 @@ class Stream // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 switch ($option) { case 1: // PHP_STREAM_META_TOUCH - return $this->sftp->touch($path, $var[0], $var[1]); + $time = isset($var[0]) ? $var[0] : null; + $atime = isset($var[1]) ? $var[1] : null; + return $this->sftp->touch($path, $time, $atime); case 2: // PHP_STREAM_OWNER_NAME case 3: // PHP_STREAM_GROUP_NAME return false; diff --git a/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php b/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php index e2571190b..f8f8dcfde 100644 --- a/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php +++ b/vendor/phpseclib/phpseclib/phpseclib/Net/SSH2.php @@ -2634,6 +2634,13 @@ class SSH2 // we'll just take it on faith that the public key blob and the public key algorithm name are as // they should be $this->_updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PK_OK'); + break; + case NET_SSH2_MSG_USERAUTH_SUCCESS: + $this->bitmap |= self::MASK_LOGIN; + return true; + default: + user_error('Unexpected response to publickey authentication pt 1'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); } $packet = $part1 . chr(1) . $part2; @@ -2668,7 +2675,8 @@ class SSH2 return true; } - return false; + user_error('Unexpected response to publickey authentication pt 2'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); } /** @@ -2690,7 +2698,7 @@ class SSH2 * * Sends an SSH2_MSG_IGNORE message every x seconds, if x is a positive non-zero number. * - * @param mixed $timeout + * @param int $interval * @access public */ function setKeepAlive($interval) @@ -2927,28 +2935,6 @@ class SSH2 return false; } - $response = $this->_get_binary_packet(); - if ($response === false) { - $this->bitmap = 0; - user_error('Connection closed by server'); - return false; - } - - if (!strlen($response)) { - return false; - } - list(, $type) = unpack('C', $this->_string_shift($response, 1)); - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - // if a pty can't be opened maybe commands can still be executed - case NET_SSH2_MSG_CHANNEL_FAILURE: - break; - default: - user_error('Unable to request pseudo-terminal'); - return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); - } - $packet = pack( 'CNNa*C', NET_SSH2_MSG_CHANNEL_REQUEST, @@ -2961,14 +2947,7 @@ class SSH2 return false; } - $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->_get_channel_packet(self::CHANNEL_SHELL); - if ($response === false) { - return false; - } - - $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; + $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_IGNORE; $this->bitmap |= self::MASK_SHELL; @@ -3897,6 +3876,16 @@ class SSH2 return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); } break; + case NET_SSH2_MSG_IGNORE: + switch ($type) { + case NET_SSH2_MSG_CHANNEL_SUCCESS: + //$this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_DATA; + continue 3; + case NET_SSH2_MSG_CHANNEL_FAILURE: + user_error('Error opening channel'); + return $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); + } + break; case NET_SSH2_MSG_CHANNEL_REQUEST: switch ($type) { case NET_SSH2_MSG_CHANNEL_SUCCESS: @@ -3916,6 +3905,10 @@ class SSH2 switch ($type) { case NET_SSH2_MSG_CHANNEL_DATA: + //if ($this->channel_status[$channel] == NET_SSH2_MSG_IGNORE) { + // $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_DATA; + //} + /* if ($channel == self::CHANNEL_EXEC) { // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server diff --git a/vendor/phpseclib/phpseclib/phpunit.xml.dist b/vendor/phpseclib/phpseclib/phpunit.xml.dist new file mode 100644 index 000000000..09f8b8ffb --- /dev/null +++ b/vendor/phpseclib/phpseclib/phpunit.xml.dist @@ -0,0 +1,21 @@ + + + + + + ./tests/Unit/ + + + ./tests/Functional/ + + + + + + + ./phpseclib/ + + + diff --git a/vendor/phpseclib/phpseclib/travis/install-php-extensions.sh b/vendor/phpseclib/phpseclib/travis/install-php-extensions.sh new file mode 100755 index 000000000..5244261c8 --- /dev/null +++ b/vendor/phpseclib/phpseclib/travis/install-php-extensions.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# +# This file is part of the phpseclib project. +# +# (c) Andreas Fischer +# +# For the full copyright and license information, please view the LICENSE +# file that was distributed with this source code. +# +set -e + +function install_php_extension +{ + cd "$1" + phpize + ./configure + make + make install + cd .. + echo "extension=$1.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"` +} + +# runkit +git clone https://github.com/zenovich/runkit.git +install_php_extension 'runkit' diff --git a/vendor/phpseclib/phpseclib/travis/run-phpunit.sh b/vendor/phpseclib/phpseclib/travis/run-phpunit.sh new file mode 100755 index 000000000..31b98afcf --- /dev/null +++ b/vendor/phpseclib/phpseclib/travis/run-phpunit.sh @@ -0,0 +1,51 @@ +#!/bin/sh +set -e +set -x + +export PHPSECLIB_SSH_HOSTNAME='localhost' +export PHPSECLIB_SSH_USERNAME='phpseclib' +export PHPSECLIB_SSH_PASSWORD='EePoov8po1aethu2kied1ne0' +export PHPSECLIB_SSH_HOME='/home/phpseclib' + +if [ "$TRAVIS_PHP_VERSION" = '5.2' ] +then + PHPUNIT="phpunit" +else + PHPUNIT="$(dirname "$0")/../vendor/bin/phpunit" +fi + +PHPUNIT_ARGS='--verbose' +if [ `php -r "echo (int) version_compare(PHP_VERSION, '5.4', '<');"` = "1" ] +then + PHPUNIT_ARGS="$PHPUNIT_ARGS -d zend.enable_gc=0" +fi + +if $PHPUNIT --atleast-version 9 +then + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/n setUpBeforeClass()/n setUpBeforeClass(): void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/n setUp()/n setUp(): void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/n tearDown()/n tearDown(): void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/\(n assertIsArray([^)]*)\)/\1: void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/\(n assertIsString([^)]*)\)/\1: void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/\(n assertStringContainsString([^)]*)\)/\1: void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/\(n assertStringNotContainsString([^)]*)\)/\1: void/g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/^class Unit_Crypt_\(AES\|Hash\|RSA\)_/class /g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/^class Unit_File_\(X509\)_/class /g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/^class Unit_Math_\(BigInteger\)_/class /g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/^class Unit_\(Crypt\|File\|Math\|Net\)_/class /g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/^class Functional_Net_/class /g' + find tests -type f -name "*.php" -print0 | xargs -0 sed -i 's/extends Unit_Crypt_Hash_\(SHA512Test\|SHA256Test\)/extends \1/g' +fi + +if [ "$TRAVIS_PHP_VERSION" = 'hhvm' -o `php -r "echo (int) version_compare(PHP_VERSION, '7.0', '>=');"` = "1" ] +then + find tests -type f -name "*Test.php" | \ + parallel --gnu --keep-order \ + "echo '== {} =='; \"$PHPUNIT\" $PHPUNIT_ARGS {};" +else + "$PHPUNIT" \ + $PHPUNIT_ARGS \ + --coverage-text \ + --coverage-clover code_coverage/clover.xml \ + --coverage-html code_coverage/ +fi diff --git a/vendor/phpseclib/phpseclib/travis/setup-composer.sh b/vendor/phpseclib/phpseclib/travis/setup-composer.sh new file mode 100755 index 000000000..3416074cc --- /dev/null +++ b/vendor/phpseclib/phpseclib/travis/setup-composer.sh @@ -0,0 +1,3 @@ +#!/bin/sh +composer self-update --no-interaction +composer install --no-interaction diff --git a/vendor/phpseclib/phpseclib/travis/setup-secure-shell.sh b/vendor/phpseclib/phpseclib/travis/setup-secure-shell.sh new file mode 100755 index 000000000..22395aa72 --- /dev/null +++ b/vendor/phpseclib/phpseclib/travis/setup-secure-shell.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# +# This file is part of the phpseclib project. +# +# (c) Andreas Fischer +# +# For the full copyright and license information, please view the LICENSE +# file that was distributed with this source code. +# +set -e +set -x + +USERNAME='phpseclib' +PASSWORD='EePoov8po1aethu2kied1ne0' + +# Create phpseclib user and home directory +sudo useradd --create-home --base-dir /home "$USERNAME" + +# Set phpseclib user password +echo "$USERNAME:$PASSWORD" | sudo chpasswd + +# Create a 1024 bit RSA SSH key pair without passphrase for the travis user +ssh-keygen -t rsa -b 1024 -f "$HOME/.ssh/id_rsa" -q -N "" + +# Add the generated private key to SSH agent of travis user +ssh-add "$HOME/.ssh/id_rsa" + +# Allow the private key of the travis user to log in as phpseclib user +sudo mkdir -p "/home/$USERNAME/.ssh/" +sudo cp "$HOME/.ssh/id_rsa.pub" "/home/$USERNAME/.ssh/authorized_keys" +sudo ssh-keyscan -t rsa localhost > "/tmp/known_hosts" +sudo cp "/tmp/known_hosts" "/home/$USERNAME/.ssh/known_hosts" +sudo chown "$USERNAME:$USERNAME" "/home/$USERNAME/.ssh/" -R diff --git a/vendor/psr/log/.gitattributes b/vendor/psr/log/.gitattributes new file mode 100644 index 000000000..596615322 --- /dev/null +++ b/vendor/psr/log/.gitattributes @@ -0,0 +1,2 @@ +.gitattributes export-ignore +.gitignore export-ignore diff --git a/vendor/psr/log/.gitignore b/vendor/psr/log/.gitignore new file mode 100644 index 000000000..22d0d82f8 --- /dev/null +++ b/vendor/psr/log/.gitignore @@ -0,0 +1 @@ +vendor diff --git a/vendor/psr/log/Psr/Log/AbstractLogger.php b/vendor/psr/log/Psr/Log/AbstractLogger.php index 90e721af2..e02f9daf3 100644 --- a/vendor/psr/log/Psr/Log/AbstractLogger.php +++ b/vendor/psr/log/Psr/Log/AbstractLogger.php @@ -14,8 +14,8 @@ abstract class AbstractLogger implements LoggerInterface /** * System is unusable. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -30,8 +30,8 @@ abstract class AbstractLogger implements LoggerInterface * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -45,8 +45,8 @@ abstract class AbstractLogger implements LoggerInterface * * Example: Application component unavailable, unexpected exception. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -59,8 +59,8 @@ abstract class AbstractLogger implements LoggerInterface * Runtime errors that do not require immediate action but should typically * be logged and monitored. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -75,8 +75,8 @@ abstract class AbstractLogger implements LoggerInterface * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -88,8 +88,8 @@ abstract class AbstractLogger implements LoggerInterface /** * Normal but significant events. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -103,8 +103,8 @@ abstract class AbstractLogger implements LoggerInterface * * Example: User logs in, SQL logs. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ @@ -116,8 +116,8 @@ abstract class AbstractLogger implements LoggerInterface /** * Detailed debug information. * - * @param string $message - * @param array $context + * @param string $message + * @param mixed[] $context * * @return void */ diff --git a/vendor/psr/log/Psr/Log/LoggerAwareTrait.php b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php index 639f79bda..82bf45c89 100644 --- a/vendor/psr/log/Psr/Log/LoggerAwareTrait.php +++ b/vendor/psr/log/Psr/Log/LoggerAwareTrait.php @@ -10,7 +10,7 @@ trait LoggerAwareTrait /** * The logger instance. * - * @var LoggerInterface + * @var LoggerInterface|null */ protected $logger; diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json index 3f6d4eea4..ca0569537 100644 --- a/vendor/psr/log/composer.json +++ b/vendor/psr/log/composer.json @@ -7,7 +7,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "require": { diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md index e9847779b..7932e2613 100644 --- a/vendor/symfony/deprecation-contracts/CHANGELOG.md +++ b/vendor/symfony/deprecation-contracts/CHANGELOG.md @@ -2,4 +2,4 @@ CHANGELOG ========= The changelog is maintained for all Symfony contracts at the following URL: -https://github.com/symfony/contracts/blob/master/CHANGELOG.md +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/deprecation-contracts/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE index 5593b1d84..ad85e1737 100644 --- a/vendor/symfony/deprecation-contracts/LICENSE +++ b/vendor/symfony/deprecation-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020 Fabien Potencier +Copyright (c) 2020-2021 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json index 052541cce..388488963 100644 --- a/vendor/symfony/deprecation-contracts/composer.json +++ b/vendor/symfony/deprecation-contracts/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/vendor/symfony/process/.gitattributes b/vendor/symfony/process/.gitattributes new file mode 100644 index 000000000..84c7add05 --- /dev/null +++ b/vendor/symfony/process/.gitattributes @@ -0,0 +1,4 @@ +/Tests export-ignore +/phpunit.xml.dist export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore diff --git a/vendor/symfony/process/.gitignore b/vendor/symfony/process/.gitignore new file mode 100644 index 000000000..c49a5d8df --- /dev/null +++ b/vendor/symfony/process/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php index 49192eeb4..877f16cd3 100644 --- a/vendor/symfony/process/Process.php +++ b/vendor/symfony/process/Process.php @@ -133,7 +133,7 @@ class Process implements \IteratorAggregate * @param array $command The command to run and its arguments listed as separate entries * @param string|null $cwd The working directory or null to use the working dir of the current PHP process * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input + * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input * @param int|float|null $timeout The timeout in seconds or null to disable * * @throws LogicException When proc_open is not installed @@ -180,7 +180,7 @@ class Process implements \IteratorAggregate * @param string $command The command line to pass to the shell of the OS * @param string|null $cwd The working directory or null to use the working dir of the current PHP process * @param array|null $env The environment variables or null to use the same environment as the current PHP process - * @param mixed|null $input The input as stream resource, scalar or \Traversable, or null for no input + * @param mixed $input The input as stream resource, scalar or \Traversable, or null for no input * @param int|float|null $timeout The timeout in seconds or null to disable * * @return static diff --git a/vendor/symfony/process/Tests/CreateNewConsoleTest.php b/vendor/symfony/process/Tests/CreateNewConsoleTest.php new file mode 100644 index 000000000..4d43fb8d9 --- /dev/null +++ b/vendor/symfony/process/Tests/CreateNewConsoleTest.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\Process; + +/** + * @author Andrei Olteanu + */ +class CreateNewConsoleTest extends TestCase +{ + public function testOptionCreateNewConsole() + { + $this->expectNotToPerformAssertions(); + try { + $process = new Process(['php', __DIR__.'/ThreeSecondProcess.php']); + $process->setOptions(['create_new_console' => true]); + $process->disableOutput(); + $process->start(); + } catch (\Exception $e) { + $this->fail($e); + } + } + + public function testItReturnsFastAfterStart() + { + // The started process must run in background after the main has finished but that can't be tested with PHPUnit + $startTime = microtime(true); + $process = new Process(['php', __DIR__.'/ThreeSecondProcess.php']); + $process->setOptions(['create_new_console' => true]); + $process->disableOutput(); + $process->start(); + $this->assertLessThan(3000, $startTime - microtime(true)); + } +} diff --git a/vendor/symfony/process/Tests/ErrorProcessInitiator.php b/vendor/symfony/process/Tests/ErrorProcessInitiator.php new file mode 100755 index 000000000..ae90c6518 --- /dev/null +++ b/vendor/symfony/process/Tests/ErrorProcessInitiator.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use Symfony\Component\Process\Exception\ProcessTimedOutException; +use Symfony\Component\Process\Process; + +require \dirname(__DIR__).'/vendor/autoload.php'; + +['e' => $php] = getopt('e:') + ['e' => 'php']; + +try { + $process = new Process("exec $php -r \"echo 'ready'; trigger_error('error', E_USER_ERROR);\""); + $process->start(); + $process->setTimeout(0.5); + while (false === strpos($process->getOutput(), 'ready')) { + usleep(1000); + } + $process->signal(\SIGSTOP); + $process->wait(); + + return $process->getExitCode(); +} catch (ProcessTimedOutException $t) { + echo $t->getMessage().\PHP_EOL; + + return 1; +} diff --git a/vendor/symfony/process/Tests/ExecutableFinderTest.php b/vendor/symfony/process/Tests/ExecutableFinderTest.php new file mode 100644 index 000000000..83f263ff3 --- /dev/null +++ b/vendor/symfony/process/Tests/ExecutableFinderTest.php @@ -0,0 +1,175 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\ExecutableFinder; + +/** + * @author Chris Smith + */ +class ExecutableFinderTest extends TestCase +{ + private $path; + + protected function tearDown(): void + { + if ($this->path) { + // Restore path if it was changed. + putenv('PATH='.$this->path); + } + } + + private function setPath($path) + { + $this->path = getenv('PATH'); + putenv('PATH='.$path); + } + + public function testFind() + { + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + + $this->setPath(\dirname(\PHP_BINARY)); + + $finder = new ExecutableFinder(); + $result = $finder->find($this->getPhpBinaryName()); + + $this->assertSamePath(\PHP_BINARY, $result); + } + + public function testFindWithDefault() + { + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + + $expected = 'defaultValue'; + + $this->setPath(''); + + $finder = new ExecutableFinder(); + $result = $finder->find('foo', $expected); + + $this->assertEquals($expected, $result); + } + + public function testFindWithNullAsDefault() + { + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + + $this->setPath(''); + + $finder = new ExecutableFinder(); + + $result = $finder->find('foo'); + + $this->assertNull($result); + } + + public function testFindWithExtraDirs() + { + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + + $this->setPath(''); + + $extraDirs = [\dirname(\PHP_BINARY)]; + + $finder = new ExecutableFinder(); + $result = $finder->find($this->getPhpBinaryName(), null, $extraDirs); + + $this->assertSamePath(\PHP_BINARY, $result); + } + + public function testFindWithOpenBaseDir() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Cannot run test on windows'); + } + + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + + $this->iniSet('open_basedir', \dirname(\PHP_BINARY).\PATH_SEPARATOR.'/'); + + $finder = new ExecutableFinder(); + $result = $finder->find($this->getPhpBinaryName()); + + $this->assertSamePath(\PHP_BINARY, $result); + } + + public function testFindProcessInOpenBasedir() + { + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Cannot run test on windows'); + } + + $this->setPath(''); + $this->iniSet('open_basedir', \PHP_BINARY.\PATH_SEPARATOR.'/'); + + $finder = new ExecutableFinder(); + $result = $finder->find($this->getPhpBinaryName(), false); + + $this->assertSamePath(\PHP_BINARY, $result); + } + + public function testFindBatchExecutableOnWindows() + { + if (ini_get('open_basedir')) { + $this->markTestSkipped('Cannot test when open_basedir is set'); + } + if ('\\' !== \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Can be only tested on windows'); + } + + $target = tempnam(sys_get_temp_dir(), 'example-windows-executable'); + + touch($target); + touch($target.'.BAT'); + + $this->assertFalse(is_executable($target)); + + $this->setPath(sys_get_temp_dir()); + + $finder = new ExecutableFinder(); + $result = $finder->find(basename($target), false); + + unlink($target); + unlink($target.'.BAT'); + + $this->assertSamePath($target.'.BAT', $result); + } + + private function assertSamePath($expected, $tested) + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->assertEquals(strtolower($expected), strtolower($tested)); + } else { + $this->assertEquals($expected, $tested); + } + } + + private function getPhpBinaryName() + { + return basename(\PHP_BINARY, '\\' === \DIRECTORY_SEPARATOR ? '.exe' : ''); + } +} diff --git a/vendor/symfony/process/Tests/KillableProcessWithOutput.php b/vendor/symfony/process/Tests/KillableProcessWithOutput.php new file mode 100644 index 000000000..28a6a271b --- /dev/null +++ b/vendor/symfony/process/Tests/KillableProcessWithOutput.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$outputs = [ + 'First iteration output', + 'Second iteration output', + 'One more iteration output', + 'This took more time', +]; + +$iterationTime = 10000; + +foreach ($outputs as $output) { + usleep($iterationTime); + $iterationTime *= 10; + echo $output."\n"; +} diff --git a/vendor/symfony/process/Tests/NonStopableProcess.php b/vendor/symfony/process/Tests/NonStopableProcess.php new file mode 100644 index 000000000..c695f544d --- /dev/null +++ b/vendor/symfony/process/Tests/NonStopableProcess.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Runs a PHP script that can be stopped only with a SIGKILL (9) signal for 3 seconds. + * + * @args duration Run this script with a custom duration + * + * @example `php NonStopableProcess.php 42` will run the script for 42 seconds + */ +function handleSignal($signal) +{ + switch ($signal) { + case \SIGTERM: + $name = 'SIGTERM'; + break; + case \SIGINT: + $name = 'SIGINT'; + break; + default: + $name = $signal.' (unknown)'; + break; + } + + echo "signal $name\n"; +} + +pcntl_signal(\SIGTERM, 'handleSignal'); +pcntl_signal(\SIGINT, 'handleSignal'); + +echo 'received '; + +$duration = isset($argv[1]) ? (int) $argv[1] : 3; +$start = microtime(true); + +while ($duration > (microtime(true) - $start)) { + usleep(10000); + pcntl_signal_dispatch(); +} diff --git a/vendor/symfony/process/Tests/PhpExecutableFinderTest.php b/vendor/symfony/process/Tests/PhpExecutableFinderTest.php new file mode 100644 index 000000000..cf3ffb55e --- /dev/null +++ b/vendor/symfony/process/Tests/PhpExecutableFinderTest.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\PhpExecutableFinder; + +/** + * @author Robert Schönthal + */ +class PhpExecutableFinderTest extends TestCase +{ + /** + * tests find() with the constant PHP_BINARY. + */ + public function testFind() + { + $f = new PhpExecutableFinder(); + + $current = \PHP_BINARY; + $args = 'phpdbg' === \PHP_SAPI ? ' -qrr' : ''; + + $this->assertEquals($current.$args, $f->find(), '::find() returns the executable PHP'); + $this->assertEquals($current, $f->find(false), '::find() returns the executable PHP'); + } + + /** + * tests find() with the env var PHP_PATH. + */ + public function testFindArguments() + { + $f = new PhpExecutableFinder(); + + if ('phpdbg' === \PHP_SAPI) { + $this->assertEquals(['-qrr'], $f->findArguments(), '::findArguments() returns phpdbg arguments'); + } else { + $this->assertEquals([], $f->findArguments(), '::findArguments() returns no arguments'); + } + } + + public function testNotExitsBinaryFile() + { + $f = new PhpExecutableFinder(); + $phpBinaryEnv = \PHP_BINARY; + putenv('PHP_BINARY=/usr/local/php/bin/php-invalid'); + + $this->assertFalse($f->find(), '::find() returns false because of not exist file'); + $this->assertFalse($f->find(false), '::find(false) returns false because of not exist file'); + + putenv('PHP_BINARY='.$phpBinaryEnv); + } +} diff --git a/vendor/symfony/process/Tests/PhpProcessTest.php b/vendor/symfony/process/Tests/PhpProcessTest.php new file mode 100644 index 000000000..111dc4c76 --- /dev/null +++ b/vendor/symfony/process/Tests/PhpProcessTest.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\Exception\LogicException; +use Symfony\Component\Process\PhpExecutableFinder; +use Symfony\Component\Process\PhpProcess; + +class PhpProcessTest extends TestCase +{ + public function testNonBlockingWorks() + { + $expected = 'hello world!'; + $process = new PhpProcess(<<start(); + $process->wait(); + $this->assertEquals($expected, $process->getOutput()); + } + + public function testCommandLine() + { + $process = new PhpProcess(<<<'PHP' +getCommandLine(); + + $process->start(); + $this->assertStringContainsString($commandLine, $process->getCommandLine(), '::getCommandLine() returns the command line of PHP after start'); + + $process->wait(); + $this->assertStringContainsString($commandLine, $process->getCommandLine(), '::getCommandLine() returns the command line of PHP after wait'); + + $this->assertSame(\PHP_VERSION.\PHP_SAPI, $process->getOutput()); + } + + public function testPassingPhpExplicitly() + { + $finder = new PhpExecutableFinder(); + $php = array_merge([$finder->find(false)], $finder->findArguments()); + + $expected = 'hello world!'; + $script = <<run(); + $this->assertEquals($expected, $process->getOutput()); + } + + public function testProcessCannotBeCreatedUsingFromShellCommandLine() + { + static::expectException(LogicException::class); + static::expectExceptionMessage('The "Symfony\Component\Process\PhpProcess::fromShellCommandline()" method cannot be called when using "Symfony\Component\Process\PhpProcess".'); + PhpProcess::fromShellCommandline(<< + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +define('ERR_SELECT_FAILED', 1); +define('ERR_TIMEOUT', 2); +define('ERR_READ_FAILED', 3); +define('ERR_WRITE_FAILED', 4); + +$read = [\STDIN]; +$write = [\STDOUT, \STDERR]; + +stream_set_blocking(\STDIN, 0); +stream_set_blocking(\STDOUT, 0); +stream_set_blocking(\STDERR, 0); + +$out = $err = ''; +while ($read || $write) { + $r = $read; + $w = $write; + $e = null; + $n = stream_select($r, $w, $e, 5); + + if (false === $n) { + exit(ERR_SELECT_FAILED); + } elseif ($n < 1) { + exit(ERR_TIMEOUT); + } + + if (in_array(\STDOUT, $w) && strlen($out) > 0) { + $written = fwrite(\STDOUT, (string) $out, 32768); + if (false === $written) { + exit(ERR_WRITE_FAILED); + } + $out = (string) substr($out, $written); + } + if (null === $read && '' === $out) { + $write = array_diff($write, [\STDOUT]); + } + + if (in_array(\STDERR, $w) && strlen($err) > 0) { + $written = fwrite(\STDERR, (string) $err, 32768); + if (false === $written) { + exit(ERR_WRITE_FAILED); + } + $err = (string) substr($err, $written); + } + if (null === $read && '' === $err) { + $write = array_diff($write, [\STDERR]); + } + + if ($r) { + $str = fread(\STDIN, 32768); + if (false !== $str) { + $out .= $str; + $err .= $str; + } + if (false === $str || feof(\STDIN)) { + $read = null; + if (!feof(\STDIN)) { + exit(ERR_READ_FAILED); + } + } + } +} diff --git a/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php b/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php new file mode 100644 index 000000000..d6d7bfb07 --- /dev/null +++ b/vendor/symfony/process/Tests/ProcessFailedExceptionTest.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Process; + +/** + * @author Sebastian Marek + */ +class ProcessFailedExceptionTest extends TestCase +{ + /** + * tests ProcessFailedException throws exception if the process was successful. + */ + public function testProcessFailedExceptionThrowsException() + { + $process = $this->getMockBuilder(Process::class)->setMethods(['isSuccessful'])->setConstructorArgs([['php']])->getMock(); + $process->expects($this->once()) + ->method('isSuccessful') + ->willReturn(true); + + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Expected a failed process, but the given process was successful.'); + + new ProcessFailedException($process); + } + + /** + * tests ProcessFailedException uses information from process output + * to generate exception message. + */ + public function testProcessFailedExceptionPopulatesInformationFromProcessOutput() + { + $cmd = 'php'; + $exitCode = 1; + $exitText = 'General error'; + $output = 'Command output'; + $errorOutput = 'FATAL: Unexpected error'; + $workingDirectory = getcwd(); + + $process = $this->getMockBuilder(Process::class)->setMethods(['isSuccessful', 'getOutput', 'getErrorOutput', 'getExitCode', 'getExitCodeText', 'isOutputDisabled', 'getWorkingDirectory'])->setConstructorArgs([[$cmd]])->getMock(); + $process->expects($this->once()) + ->method('isSuccessful') + ->willReturn(false); + + $process->expects($this->once()) + ->method('getOutput') + ->willReturn($output); + + $process->expects($this->once()) + ->method('getErrorOutput') + ->willReturn($errorOutput); + + $process->expects($this->once()) + ->method('getExitCode') + ->willReturn($exitCode); + + $process->expects($this->once()) + ->method('getExitCodeText') + ->willReturn($exitText); + + $process->expects($this->once()) + ->method('isOutputDisabled') + ->willReturn(false); + + $process->expects($this->once()) + ->method('getWorkingDirectory') + ->willReturn($workingDirectory); + + $exception = new ProcessFailedException($process); + + $this->assertEquals( + "The command \"$cmd\" failed.\n\nExit Code: $exitCode($exitText)\n\nWorking directory: {$workingDirectory}\n\nOutput:\n================\n{$output}\n\nError Output:\n================\n{$errorOutput}", + str_replace("'php'", 'php', $exception->getMessage()) + ); + } + + /** + * Tests that ProcessFailedException does not extract information from + * process output if it was previously disabled. + */ + public function testDisabledOutputInFailedExceptionDoesNotPopulateOutput() + { + $cmd = 'php'; + $exitCode = 1; + $exitText = 'General error'; + $workingDirectory = getcwd(); + + $process = $this->getMockBuilder(Process::class)->setMethods(['isSuccessful', 'isOutputDisabled', 'getExitCode', 'getExitCodeText', 'getOutput', 'getErrorOutput', 'getWorkingDirectory'])->setConstructorArgs([[$cmd]])->getMock(); + $process->expects($this->once()) + ->method('isSuccessful') + ->willReturn(false); + + $process->expects($this->never()) + ->method('getOutput'); + + $process->expects($this->never()) + ->method('getErrorOutput'); + + $process->expects($this->once()) + ->method('getExitCode') + ->willReturn($exitCode); + + $process->expects($this->once()) + ->method('getExitCodeText') + ->willReturn($exitText); + + $process->expects($this->once()) + ->method('isOutputDisabled') + ->willReturn(true); + + $process->expects($this->once()) + ->method('getWorkingDirectory') + ->willReturn($workingDirectory); + + $exception = new ProcessFailedException($process); + + $this->assertEquals( + "The command \"$cmd\" failed.\n\nExit Code: $exitCode($exitText)\n\nWorking directory: {$workingDirectory}", + str_replace("'php'", 'php', $exception->getMessage()) + ); + } +} diff --git a/vendor/symfony/process/Tests/ProcessTest.php b/vendor/symfony/process/Tests/ProcessTest.php new file mode 100644 index 000000000..7338e4e46 --- /dev/null +++ b/vendor/symfony/process/Tests/ProcessTest.php @@ -0,0 +1,1552 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Process\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\Exception\InvalidArgumentException; +use Symfony\Component\Process\Exception\LogicException; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Exception\ProcessSignaledException; +use Symfony\Component\Process\Exception\ProcessTimedOutException; +use Symfony\Component\Process\Exception\RuntimeException; +use Symfony\Component\Process\InputStream; +use Symfony\Component\Process\PhpExecutableFinder; +use Symfony\Component\Process\Pipes\PipesInterface; +use Symfony\Component\Process\Process; + +/** + * @author Robert Schönthal + */ +class ProcessTest extends TestCase +{ + private static $phpBin; + private static $process; + private static $sigchild; + + public static function setUpBeforeClass(): void + { + $phpBin = new PhpExecutableFinder(); + self::$phpBin = getenv('SYMFONY_PROCESS_PHP_TEST_BINARY') ?: ('phpdbg' === \PHP_SAPI ? 'php' : $phpBin->find()); + + ob_start(); + phpinfo(\INFO_GENERAL); + self::$sigchild = false !== strpos(ob_get_clean(), '--enable-sigchild'); + } + + protected function tearDown(): void + { + if (self::$process) { + self::$process->stop(0); + self::$process = null; + } + } + + public function testInvalidCwd() + { + $this->expectException(RuntimeException::class); + $this->expectExceptionMessageMatches('/The provided cwd ".*" does not exist\./'); + try { + // Check that it works fine if the CWD exists + $cmd = new Process(['echo', 'test'], __DIR__); + $cmd->run(); + } catch (\Exception $e) { + $this->fail($e); + } + + $cmd = new Process(['echo', 'test'], __DIR__.'/notfound/'); + $cmd->run(); + } + + public function testThatProcessDoesNotThrowWarningDuringRun() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('This test is transient on Windows'); + } + @trigger_error('Test Error', \E_USER_NOTICE); + $process = $this->getProcessForCode('sleep(3)'); + $process->run(); + $actualError = error_get_last(); + $this->assertEquals('Test Error', $actualError['message']); + $this->assertEquals(\E_USER_NOTICE, $actualError['type']); + } + + public function testNegativeTimeoutFromConstructor() + { + $this->expectException(InvalidArgumentException::class); + $this->getProcess('', null, null, null, -1); + } + + public function testNegativeTimeoutFromSetter() + { + $this->expectException(InvalidArgumentException::class); + $p = $this->getProcess(''); + $p->setTimeout(-1); + } + + public function testFloatAndNullTimeout() + { + $p = $this->getProcess(''); + + $p->setTimeout(10); + $this->assertSame(10.0, $p->getTimeout()); + + $p->setTimeout(null); + $this->assertNull($p->getTimeout()); + + $p->setTimeout(0.0); + $this->assertNull($p->getTimeout()); + } + + /** + * @requires extension pcntl + */ + public function testStopWithTimeoutIsActuallyWorking() + { + $p = $this->getProcess([self::$phpBin, __DIR__.'/NonStopableProcess.php', 30]); + $p->start(); + + while ($p->isRunning() && false === strpos($p->getOutput(), 'received')) { + usleep(1000); + } + + if (!$p->isRunning()) { + throw new \LogicException('Process is not running: '.$p->getErrorOutput()); + } + + $start = microtime(true); + $p->stop(0.1); + + $p->wait(); + + $this->assertLessThan(15, microtime(true) - $start); + } + + public function testWaitUntilSpecificOutput() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestIncomplete('This test is too transient on Windows, help wanted to improve it'); + } + + $p = $this->getProcess([self::$phpBin, __DIR__.'/KillableProcessWithOutput.php']); + $p->start(); + + $start = microtime(true); + + $completeOutput = ''; + $result = $p->waitUntil(function ($type, $output) use (&$completeOutput) { + return false !== strpos($completeOutput .= $output, 'One more'); + }); + $this->assertTrue($result); + $this->assertLessThan(20, microtime(true) - $start); + $this->assertStringStartsWith("First iteration output\nSecond iteration output\nOne more", $completeOutput); + $p->stop(); + } + + public function testWaitUntilCanReturnFalse() + { + $p = $this->getProcess('echo foo'); + $p->start(); + $this->assertFalse($p->waitUntil(function () { return false; })); + } + + public function testAllOutputIsActuallyReadOnTermination() + { + // this code will result in a maximum of 2 reads of 8192 bytes by calling + // start() and isRunning(). by the time getOutput() is called the process + // has terminated so the internal pipes array is already empty. normally + // the call to start() will not read any data as the process will not have + // generated output, but this is non-deterministic so we must count it as + // a possibility. therefore we need 2 * PipesInterface::CHUNK_SIZE plus + // another byte which will never be read. + $expectedOutputSize = PipesInterface::CHUNK_SIZE * 2 + 2; + + $code = sprintf('echo str_repeat(\'*\', %d);', $expectedOutputSize); + $p = $this->getProcessForCode($code); + + $p->start(); + + // Don't call Process::run nor Process::wait to avoid any read of pipes + $h = new \ReflectionProperty($p, 'process'); + $h->setAccessible(true); + $h = $h->getValue($p); + $s = @proc_get_status($h); + + while (!empty($s['running'])) { + usleep(1000); + $s = proc_get_status($h); + } + + $o = $p->getOutput(); + + $this->assertEquals($expectedOutputSize, \strlen($o)); + } + + public function testCallbacksAreExecutedWithStart() + { + $process = $this->getProcess('echo foo'); + $process->start(function ($type, $buffer) use (&$data) { + $data .= $buffer; + }); + + $process->wait(); + + $this->assertSame('foo'.\PHP_EOL, $data); + } + + /** + * tests results from sub processes. + * + * @dataProvider responsesCodeProvider + */ + public function testProcessResponses($expected, $getter, $code) + { + $p = $this->getProcessForCode($code); + $p->run(); + + $this->assertSame($expected, $p->$getter()); + } + + /** + * tests results from sub processes. + * + * @dataProvider pipesCodeProvider + */ + public function testProcessPipes($code, $size) + { + $expected = str_repeat(str_repeat('*', 1024), $size).'!'; + $expectedLength = (1024 * $size) + 1; + + $p = $this->getProcessForCode($code); + $p->setInput($expected); + $p->run(); + + $this->assertEquals($expectedLength, \strlen($p->getOutput())); + $this->assertEquals($expectedLength, \strlen($p->getErrorOutput())); + } + + /** + * @dataProvider pipesCodeProvider + */ + public function testSetStreamAsInput($code, $size) + { + $expected = str_repeat(str_repeat('*', 1024), $size).'!'; + $expectedLength = (1024 * $size) + 1; + + $stream = fopen('php://temporary', 'w+'); + fwrite($stream, $expected); + rewind($stream); + + $p = $this->getProcessForCode($code); + $p->setInput($stream); + $p->run(); + + fclose($stream); + + $this->assertEquals($expectedLength, \strlen($p->getOutput())); + $this->assertEquals($expectedLength, \strlen($p->getErrorOutput())); + } + + public function testLiveStreamAsInput() + { + $stream = fopen('php://memory', 'r+'); + fwrite($stream, 'hello'); + rewind($stream); + + $p = $this->getProcessForCode('stream_copy_to_stream(STDIN, STDOUT);'); + $p->setInput($stream); + $p->start(function ($type, $data) use ($stream) { + if ('hello' === $data) { + fclose($stream); + } + }); + $p->wait(); + + $this->assertSame('hello', $p->getOutput()); + } + + public function testSetInputWhileRunningThrowsAnException() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Input can not be set while the process is running.'); + $process = $this->getProcessForCode('sleep(30);'); + $process->start(); + try { + $process->setInput('foobar'); + $process->stop(); + $this->fail('A LogicException should have been raised.'); + } catch (LogicException $e) { + } + $process->stop(); + + throw $e; + } + + /** + * @dataProvider provideInvalidInputValues + */ + public function testInvalidInput($value) + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('"Symfony\Component\Process\Process::setInput" only accepts strings, Traversable objects or stream resources.'); + $process = $this->getProcess('foo'); + $process->setInput($value); + } + + public function provideInvalidInputValues() + { + return [ + [[]], + [new NonStringifiable()], + ]; + } + + /** + * @dataProvider provideInputValues + */ + public function testValidInput($expected, $value) + { + $process = $this->getProcess('foo'); + $process->setInput($value); + $this->assertSame($expected, $process->getInput()); + } + + public function provideInputValues() + { + return [ + [null, null], + ['24.5', 24.5], + ['input data', 'input data'], + ]; + } + + public function chainedCommandsOutputProvider() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + return [ + ["2 \r\n2\r\n", '&&', '2'], + ]; + } + + return [ + ["1\n1\n", ';', '1'], + ["2\n2\n", '&&', '2'], + ]; + } + + /** + * @dataProvider chainedCommandsOutputProvider + */ + public function testChainedCommandsOutput($expected, $operator, $input) + { + $process = $this->getProcess(sprintf('echo %s %s echo %s', $input, $operator, $input)); + $process->run(); + $this->assertEquals($expected, $process->getOutput()); + } + + public function testCallbackIsExecutedForOutput() + { + $p = $this->getProcessForCode('echo \'foo\';'); + + $called = false; + $p->run(function ($type, $buffer) use (&$called) { + $called = 'foo' === $buffer; + }); + + $this->assertTrue($called, 'The callback should be executed with the output'); + } + + public function testCallbackIsExecutedForOutputWheneverOutputIsDisabled() + { + $p = $this->getProcessForCode('echo \'foo\';'); + $p->disableOutput(); + + $called = false; + $p->run(function ($type, $buffer) use (&$called) { + $called = 'foo' === $buffer; + }); + + $this->assertTrue($called, 'The callback should be executed with the output'); + } + + public function testGetErrorOutput() + { + $p = $this->getProcessForCode('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }'); + + $p->run(); + $this->assertEquals(3, preg_match_all('/ERROR/', $p->getErrorOutput(), $matches)); + } + + public function testFlushErrorOutput() + { + $p = $this->getProcessForCode('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }'); + + $p->run(); + $p->clearErrorOutput(); + $this->assertEmpty($p->getErrorOutput()); + } + + /** + * @dataProvider provideIncrementalOutput + */ + public function testIncrementalOutput($getOutput, $getIncrementalOutput, $uri) + { + $lock = tempnam(sys_get_temp_dir(), __FUNCTION__); + + $p = $this->getProcessForCode('file_put_contents($s = \''.$uri.'\', \'foo\'); flock(fopen('.var_export($lock, true).', \'r\'), LOCK_EX); file_put_contents($s, \'bar\');'); + + $h = fopen($lock, 'w'); + flock($h, \LOCK_EX); + + $p->start(); + + foreach (['foo', 'bar'] as $s) { + while (false === strpos($p->$getOutput(), $s)) { + usleep(1000); + } + + $this->assertSame($s, $p->$getIncrementalOutput()); + $this->assertSame('', $p->$getIncrementalOutput()); + + flock($h, \LOCK_UN); + } + + fclose($h); + } + + public function provideIncrementalOutput() + { + return [ + ['getOutput', 'getIncrementalOutput', 'php://stdout'], + ['getErrorOutput', 'getIncrementalErrorOutput', 'php://stderr'], + ]; + } + + public function testGetOutput() + { + $p = $this->getProcessForCode('$n = 0; while ($n < 3) { echo \' foo \'; $n++; }'); + + $p->run(); + $this->assertEquals(3, preg_match_all('/foo/', $p->getOutput(), $matches)); + } + + public function testFlushOutput() + { + $p = $this->getProcessForCode('$n=0;while ($n<3) {echo \' foo \';$n++;}'); + + $p->run(); + $p->clearOutput(); + $this->assertEmpty($p->getOutput()); + } + + public function testZeroAsOutput() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + // see http://stackoverflow.com/questions/7105433/windows-batch-echo-without-new-line + $p = $this->getProcess('echo | set /p dummyName=0'); + } else { + $p = $this->getProcess('printf 0'); + } + + $p->run(); + $this->assertSame('0', $p->getOutput()); + } + + public function testExitCodeCommandFailed() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows does not support POSIX exit code'); + } + + // such command run in bash return an exitcode 127 + $process = $this->getProcess('nonexistingcommandIhopeneversomeonewouldnameacommandlikethis'); + $process->run(); + + $this->assertGreaterThan(0, $process->getExitCode()); + } + + public function testTTYCommand() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows does not have /dev/tty support'); + } + + if (!Process::isTtySupported()) { + $this->markTestSkipped('There is no TTY support'); + } + + $process = $this->getProcess('echo "foo" >> /dev/null && '.$this->getProcessForCode('usleep(100000);')->getCommandLine()); + $process->setTty(true); + $process->start(); + $this->assertTrue($process->isRunning()); + $process->wait(); + + $this->assertSame(Process::STATUS_TERMINATED, $process->getStatus()); + } + + public function testTTYCommandExitCode() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows does have /dev/tty support'); + } + + if (!Process::isTtySupported()) { + $this->markTestSkipped('There is no TTY support'); + } + + $process = $this->getProcess('echo "foo" >> /dev/null'); + $process->setTty(true); + $process->run(); + + $this->assertTrue($process->isSuccessful()); + } + + public function testTTYInWindowsEnvironment() + { + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('TTY mode is not supported on Windows platform.'); + if ('\\' !== \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('This test is for Windows platform only'); + } + + $process = $this->getProcess('echo "foo" >> /dev/null'); + $process->setTty(false); + $process->setTty(true); + } + + public function testExitCodeTextIsNullWhenExitCodeIsNull() + { + $process = $this->getProcess(''); + $this->assertNull($process->getExitCodeText()); + } + + public function testPTYCommand() + { + if (!Process::isPtySupported()) { + $this->markTestSkipped('PTY is not supported on this operating system.'); + } + + $process = $this->getProcess('echo "foo"'); + $process->setPty(true); + $process->run(); + + $this->assertSame(Process::STATUS_TERMINATED, $process->getStatus()); + $this->assertEquals("foo\r\n", $process->getOutput()); + } + + public function testMustRun() + { + $process = $this->getProcess('echo foo'); + + $this->assertSame($process, $process->mustRun()); + $this->assertEquals('foo'.\PHP_EOL, $process->getOutput()); + } + + public function testSuccessfulMustRunHasCorrectExitCode() + { + $process = $this->getProcess('echo foo')->mustRun(); + $this->assertEquals(0, $process->getExitCode()); + } + + public function testMustRunThrowsException() + { + $this->expectException(ProcessFailedException::class); + $process = $this->getProcess('exit 1'); + $process->mustRun(); + } + + public function testExitCodeText() + { + $process = $this->getProcess(''); + $r = new \ReflectionObject($process); + $p = $r->getProperty('exitcode'); + $p->setAccessible(true); + + $p->setValue($process, 2); + $this->assertEquals('Misuse of shell builtins', $process->getExitCodeText()); + } + + public function testStartIsNonBlocking() + { + $process = $this->getProcessForCode('usleep(500000);'); + $start = microtime(true); + $process->start(); + $end = microtime(true); + $this->assertLessThan(0.4, $end - $start); + $process->stop(); + } + + public function testUpdateStatus() + { + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertGreaterThan(0, \strlen($process->getOutput())); + } + + public function testGetExitCodeIsNullOnStart() + { + $process = $this->getProcessForCode('usleep(100000);'); + $this->assertNull($process->getExitCode()); + $process->start(); + $this->assertNull($process->getExitCode()); + $process->wait(); + $this->assertEquals(0, $process->getExitCode()); + } + + public function testGetExitCodeIsNullOnWhenStartingAgain() + { + $process = $this->getProcessForCode('usleep(100000);'); + $process->run(); + $this->assertEquals(0, $process->getExitCode()); + $process->start(); + $this->assertNull($process->getExitCode()); + $process->wait(); + $this->assertEquals(0, $process->getExitCode()); + } + + public function testGetExitCode() + { + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertSame(0, $process->getExitCode()); + } + + public function testStatus() + { + $process = $this->getProcessForCode('usleep(100000);'); + $this->assertFalse($process->isRunning()); + $this->assertFalse($process->isStarted()); + $this->assertFalse($process->isTerminated()); + $this->assertSame(Process::STATUS_READY, $process->getStatus()); + $process->start(); + $this->assertTrue($process->isRunning()); + $this->assertTrue($process->isStarted()); + $this->assertFalse($process->isTerminated()); + $this->assertSame(Process::STATUS_STARTED, $process->getStatus()); + $process->wait(); + $this->assertFalse($process->isRunning()); + $this->assertTrue($process->isStarted()); + $this->assertTrue($process->isTerminated()); + $this->assertSame(Process::STATUS_TERMINATED, $process->getStatus()); + } + + public function testStop() + { + $process = $this->getProcessForCode('sleep(31);'); + $process->start(); + $this->assertTrue($process->isRunning()); + $process->stop(); + $this->assertFalse($process->isRunning()); + } + + public function testIsSuccessful() + { + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertTrue($process->isSuccessful()); + } + + public function testIsSuccessfulOnlyAfterTerminated() + { + $process = $this->getProcessForCode('usleep(100000);'); + $process->start(); + + $this->assertFalse($process->isSuccessful()); + + $process->wait(); + + $this->assertTrue($process->isSuccessful()); + } + + public function testIsNotSuccessful() + { + $process = $this->getProcessForCode('throw new \Exception(\'BOUM\');'); + $process->run(); + $this->assertFalse($process->isSuccessful()); + } + + public function testProcessIsNotSignaled() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows does not support POSIX signals'); + } + + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertFalse($process->hasBeenSignaled()); + } + + public function testProcessWithoutTermSignal() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows does not support POSIX signals'); + } + + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertEquals(0, $process->getTermSignal()); + } + + public function testProcessIsSignaledIfStopped() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('Windows does not support POSIX signals'); + } + + $process = $this->getProcessForCode('sleep(32);'); + $process->start(); + $process->stop(); + $this->assertTrue($process->hasBeenSignaled()); + $this->assertEquals(15, $process->getTermSignal()); // SIGTERM + } + + public function testProcessThrowsExceptionWhenExternallySignaled() + { + $this->expectException(ProcessSignaledException::class); + $this->expectExceptionMessage('The process has been signaled with signal "9".'); + if (!\function_exists('posix_kill')) { + $this->markTestSkipped('Function posix_kill is required.'); + } + + if (self::$sigchild) { + $this->markTestSkipped('PHP is compiled with --enable-sigchild.'); + } + + $process = $this->getProcessForCode('sleep(32.1);'); + $process->start(); + posix_kill($process->getPid(), 9); // SIGKILL + + $process->wait(); + } + + public function testRestart() + { + $process1 = $this->getProcessForCode('echo getmypid();'); + $process1->run(); + $process2 = $process1->restart(); + + $process2->wait(); // wait for output + + // Ensure that both processed finished and the output is numeric + $this->assertFalse($process1->isRunning()); + $this->assertFalse($process2->isRunning()); + $this->assertIsNumeric($process1->getOutput()); + $this->assertIsNumeric($process2->getOutput()); + + // Ensure that restart returned a new process by check that the output is different + $this->assertNotEquals($process1->getOutput(), $process2->getOutput()); + } + + public function testRunProcessWithTimeout() + { + $this->expectException(ProcessTimedOutException::class); + $this->expectExceptionMessage('exceeded the timeout of 0.1 seconds.'); + $process = $this->getProcessForCode('sleep(30);'); + $process->setTimeout(0.1); + $start = microtime(true); + try { + $process->run(); + $this->fail('A RuntimeException should have been raised'); + } catch (RuntimeException $e) { + } + + $this->assertLessThan(15, microtime(true) - $start); + + throw $e; + } + + public function testIterateOverProcessWithTimeout() + { + $this->expectException(ProcessTimedOutException::class); + $this->expectExceptionMessage('exceeded the timeout of 0.1 seconds.'); + $process = $this->getProcessForCode('sleep(30);'); + $process->setTimeout(0.1); + $start = microtime(true); + try { + $process->start(); + foreach ($process as $buffer); + $this->fail('A RuntimeException should have been raised'); + } catch (RuntimeException $e) { + } + + $this->assertLessThan(15, microtime(true) - $start); + + throw $e; + } + + public function testCheckTimeoutOnNonStartedProcess() + { + $process = $this->getProcess('echo foo'); + $this->assertNull($process->checkTimeout()); + } + + public function testCheckTimeoutOnTerminatedProcess() + { + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertNull($process->checkTimeout()); + } + + public function testCheckTimeoutOnStartedProcess() + { + $this->expectException(ProcessTimedOutException::class); + $this->expectExceptionMessage('exceeded the timeout of 0.1 seconds.'); + $process = $this->getProcessForCode('sleep(33);'); + $process->setTimeout(0.1); + + $process->start(); + $start = microtime(true); + + try { + while ($process->isRunning()) { + $process->checkTimeout(); + usleep(100000); + } + $this->fail('A ProcessTimedOutException should have been raised'); + } catch (ProcessTimedOutException $e) { + } + + $this->assertLessThan(15, microtime(true) - $start); + + throw $e; + } + + public function testIdleTimeout() + { + $process = $this->getProcessForCode('sleep(34);'); + $process->setTimeout(60); + $process->setIdleTimeout(0.1); + + try { + $process->run(); + + $this->fail('A timeout exception was expected.'); + } catch (ProcessTimedOutException $e) { + $this->assertTrue($e->isIdleTimeout()); + $this->assertFalse($e->isGeneralTimeout()); + $this->assertEquals(0.1, $e->getExceededTimeout()); + } + } + + public function testIdleTimeoutNotExceededWhenOutputIsSent() + { + $process = $this->getProcessForCode('while (true) {echo \'foo \'; usleep(1000);}'); + $process->setTimeout(1); + $process->start(); + + while (false === strpos($process->getOutput(), 'foo')) { + usleep(1000); + } + + $process->setIdleTimeout(0.5); + + try { + $process->wait(); + $this->fail('A timeout exception was expected.'); + } catch (ProcessTimedOutException $e) { + $this->assertTrue($e->isGeneralTimeout(), 'A general timeout is expected.'); + $this->assertFalse($e->isIdleTimeout(), 'No idle timeout is expected.'); + $this->assertEquals(1, $e->getExceededTimeout()); + } + } + + public function testStartAfterATimeout() + { + $this->expectException(ProcessTimedOutException::class); + $this->expectExceptionMessage('exceeded the timeout of 0.1 seconds.'); + $process = $this->getProcessForCode('sleep(35);'); + $process->setTimeout(0.1); + + try { + $process->run(); + $this->fail('A ProcessTimedOutException should have been raised.'); + } catch (ProcessTimedOutException $e) { + } + $this->assertFalse($process->isRunning()); + $process->start(); + $this->assertTrue($process->isRunning()); + $process->stop(0); + + throw $e; + } + + public function testGetPid() + { + $process = $this->getProcessForCode('sleep(36);'); + $process->start(); + $this->assertGreaterThan(0, $process->getPid()); + $process->stop(0); + } + + public function testGetPidIsNullBeforeStart() + { + $process = $this->getProcess('foo'); + $this->assertNull($process->getPid()); + } + + public function testGetPidIsNullAfterRun() + { + $process = $this->getProcess('echo foo'); + $process->run(); + $this->assertNull($process->getPid()); + } + + /** + * @requires extension pcntl + */ + public function testSignal() + { + $process = $this->getProcess([self::$phpBin, __DIR__.'/SignalListener.php']); + $process->start(); + + while (false === strpos($process->getOutput(), 'Caught')) { + usleep(1000); + } + $process->signal(\SIGUSR1); + $process->wait(); + + $this->assertEquals('Caught SIGUSR1', $process->getOutput()); + } + + /** + * @requires extension pcntl + */ + public function testExitCodeIsAvailableAfterSignal() + { + $process = $this->getProcess('sleep 4'); + $process->start(); + $process->signal(\SIGKILL); + + while ($process->isRunning()) { + usleep(10000); + } + + $this->assertFalse($process->isRunning()); + $this->assertTrue($process->hasBeenSignaled()); + $this->assertFalse($process->isSuccessful()); + $this->assertEquals(137, $process->getExitCode()); + } + + public function testSignalProcessNotRunning() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Can not send signal on a non running process.'); + $process = $this->getProcess('foo'); + $process->signal(1); // SIGHUP + } + + /** + * @dataProvider provideMethodsThatNeedARunningProcess + */ + public function testMethodsThatNeedARunningProcess($method) + { + $process = $this->getProcess('foo'); + + $this->expectException(LogicException::class); + $this->expectExceptionMessage(sprintf('Process must be started before calling "%s()".', $method)); + + $process->{$method}(); + } + + public function provideMethodsThatNeedARunningProcess() + { + return [ + ['getOutput'], + ['getIncrementalOutput'], + ['getErrorOutput'], + ['getIncrementalErrorOutput'], + ['wait'], + ]; + } + + /** + * @dataProvider provideMethodsThatNeedATerminatedProcess + */ + public function testMethodsThatNeedATerminatedProcess($method) + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Process must be terminated before calling'); + $process = $this->getProcessForCode('sleep(37);'); + $process->start(); + try { + $process->{$method}(); + $process->stop(0); + $this->fail('A LogicException must have been thrown'); + } catch (\Exception $e) { + } + $process->stop(0); + + throw $e; + } + + public function provideMethodsThatNeedATerminatedProcess() + { + return [ + ['hasBeenSignaled'], + ['getTermSignal'], + ['hasBeenStopped'], + ['getStopSignal'], + ]; + } + + public function testWrongSignal() + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $this->markTestSkipped('POSIX signals do not work on Windows'); + } + + $this->expectException(RuntimeException::class); + + $process = $this->getProcessForCode('sleep(38);'); + $process->start(); + try { + $process->signal(-4); + $this->fail('A RuntimeException must have been thrown'); + } finally { + $process->stop(0); + } + } + + public function testDisableOutputDisablesTheOutput() + { + $p = $this->getProcess('foo'); + $this->assertFalse($p->isOutputDisabled()); + $p->disableOutput(); + $this->assertTrue($p->isOutputDisabled()); + $p->enableOutput(); + $this->assertFalse($p->isOutputDisabled()); + } + + public function testDisableOutputWhileRunningThrowsException() + { + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Disabling output while the process is running is not possible.'); + $p = $this->getProcessForCode('sleep(39);'); + $p->start(); + $p->disableOutput(); + } + + public function testEnableOutputWhileRunningThrowsException() + { + $this->expectException(RuntimeException::class); + $this->expectExceptionMessage('Enabling output while the process is running is not possible.'); + $p = $this->getProcessForCode('sleep(40);'); + $p->disableOutput(); + $p->start(); + $p->enableOutput(); + } + + public function testEnableOrDisableOutputAfterRunDoesNotThrowException() + { + $p = $this->getProcess('echo foo'); + $p->disableOutput(); + $p->run(); + $p->enableOutput(); + $p->disableOutput(); + $this->assertTrue($p->isOutputDisabled()); + } + + public function testDisableOutputWhileIdleTimeoutIsSet() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Output can not be disabled while an idle timeout is set.'); + $process = $this->getProcess('foo'); + $process->setIdleTimeout(1); + $process->disableOutput(); + } + + public function testSetIdleTimeoutWhileOutputIsDisabled() + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('timeout can not be set while the output is disabled.'); + $process = $this->getProcess('foo'); + $process->disableOutput(); + $process->setIdleTimeout(1); + } + + public function testSetNullIdleTimeoutWhileOutputIsDisabled() + { + $process = $this->getProcess('foo'); + $process->disableOutput(); + $this->assertSame($process, $process->setIdleTimeout(null)); + } + + /** + * @dataProvider provideOutputFetchingMethods + */ + public function testGetOutputWhileDisabled($fetchMethod) + { + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Output has been disabled.'); + $p = $this->getProcessForCode('sleep(41);'); + $p->disableOutput(); + $p->start(); + $p->{$fetchMethod}(); + } + + public function provideOutputFetchingMethods() + { + return [ + ['getOutput'], + ['getIncrementalOutput'], + ['getErrorOutput'], + ['getIncrementalErrorOutput'], + ]; + } + + public function testStopTerminatesProcessCleanly() + { + $process = $this->getProcessForCode('echo 123; sleep(42);'); + $process->run(function () use ($process) { + $process->stop(); + }); + $this->assertTrue(true, 'A call to stop() is not expected to cause wait() to throw a RuntimeException'); + } + + public function testKillSignalTerminatesProcessCleanly() + { + $process = $this->getProcessForCode('echo 123; sleep(43);'); + $process->run(function () use ($process) { + $process->signal(9); // SIGKILL + }); + $this->assertTrue(true, 'A call to signal() is not expected to cause wait() to throw a RuntimeException'); + } + + public function testTermSignalTerminatesProcessCleanly() + { + $process = $this->getProcessForCode('echo 123; sleep(44);'); + $process->run(function () use ($process) { + $process->signal(15); // SIGTERM + }); + $this->assertTrue(true, 'A call to signal() is not expected to cause wait() to throw a RuntimeException'); + } + + public function responsesCodeProvider() + { + return [ + //expected output / getter / code to execute + // [1,'getExitCode','exit(1);'], + // [true,'isSuccessful','exit();'], + ['output', 'getOutput', 'echo \'output\';'], + ]; + } + + public function pipesCodeProvider() + { + $variations = [ + 'fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);', + 'include \''.__DIR__.'/PipeStdinInStdoutStdErrStreamSelect.php\';', + ]; + + if ('\\' === \DIRECTORY_SEPARATOR) { + // Avoid XL buffers on Windows because of https://bugs.php.net/65650 + $sizes = [1, 2, 4, 8]; + } else { + $sizes = [1, 16, 64, 1024, 4096]; + } + + $codes = []; + foreach ($sizes as $size) { + foreach ($variations as $code) { + $codes[] = [$code, $size]; + } + } + + return $codes; + } + + /** + * @dataProvider provideVariousIncrementals + */ + public function testIncrementalOutputDoesNotRequireAnotherCall($stream, $method) + { + $process = $this->getProcessForCode('$n = 0; while ($n < 3) { file_put_contents(\''.$stream.'\', $n, 1); $n++; usleep(1000); }', null, null, null, null); + $process->start(); + $result = ''; + $limit = microtime(true) + 3; + $expected = '012'; + + while ($result !== $expected && microtime(true) < $limit) { + $result .= $process->$method(); + } + + $this->assertSame($expected, $result); + $process->stop(); + } + + public function provideVariousIncrementals() + { + return [ + ['php://stdout', 'getIncrementalOutput'], + ['php://stderr', 'getIncrementalErrorOutput'], + ]; + } + + public function testIteratorInput() + { + $input = function () { + yield 'ping'; + yield 'pong'; + }; + + $process = $this->getProcessForCode('stream_copy_to_stream(STDIN, STDOUT);', null, null, $input()); + $process->run(); + $this->assertSame('pingpong', $process->getOutput()); + } + + public function testSimpleInputStream() + { + $input = new InputStream(); + + $process = $this->getProcessForCode('echo \'ping\'; echo fread(STDIN, 4); echo fread(STDIN, 4);'); + $process->setInput($input); + + $process->start(function ($type, $data) use ($input) { + if ('ping' === $data) { + $input->write('pang'); + } elseif (!$input->isClosed()) { + $input->write('pong'); + $input->close(); + } + }); + + $process->wait(); + $this->assertSame('pingpangpong', $process->getOutput()); + } + + public function testInputStreamWithCallable() + { + $i = 0; + $stream = fopen('php://memory', 'w+'); + $stream = function () use ($stream, &$i) { + if ($i < 3) { + rewind($stream); + fwrite($stream, ++$i); + rewind($stream); + + return $stream; + } + + return null; + }; + + $input = new InputStream(); + $input->onEmpty($stream); + $input->write($stream()); + + $process = $this->getProcessForCode('echo fread(STDIN, 3);'); + $process->setInput($input); + $process->start(function ($type, $data) use ($input) { + $input->close(); + }); + + $process->wait(); + $this->assertSame('123', $process->getOutput()); + } + + public function testInputStreamWithGenerator() + { + $input = new InputStream(); + $input->onEmpty(function ($input) { + yield 'pong'; + $input->close(); + }); + + $process = $this->getProcessForCode('stream_copy_to_stream(STDIN, STDOUT);'); + $process->setInput($input); + $process->start(); + $input->write('ping'); + $process->wait(); + $this->assertSame('pingpong', $process->getOutput()); + } + + public function testInputStreamOnEmpty() + { + $i = 0; + $input = new InputStream(); + $input->onEmpty(function () use (&$i) { ++$i; }); + + $process = $this->getProcessForCode('echo 123; echo fread(STDIN, 1); echo 456;'); + $process->setInput($input); + $process->start(function ($type, $data) use ($input) { + if ('123' === $data) { + $input->close(); + } + }); + $process->wait(); + + $this->assertSame(0, $i, 'InputStream->onEmpty callback should be called only when the input *becomes* empty'); + $this->assertSame('123456', $process->getOutput()); + } + + public function testIteratorOutput() + { + $input = new InputStream(); + + $process = $this->getProcessForCode('fwrite(STDOUT, 123); fwrite(STDERR, 234); flush(); usleep(10000); fwrite(STDOUT, fread(STDIN, 3)); fwrite(STDERR, 456);'); + $process->setInput($input); + $process->start(); + $output = []; + + foreach ($process as $type => $data) { + $output[] = [$type, $data]; + break; + } + $expectedOutput = [ + [$process::OUT, '123'], + ]; + $this->assertSame($expectedOutput, $output); + + $input->write(345); + + foreach ($process as $type => $data) { + $output[] = [$type, $data]; + } + + $this->assertSame('', $process->getOutput()); + $this->assertFalse($process->isRunning()); + + $expectedOutput = [ + [$process::OUT, '123'], + [$process::ERR, '234'], + [$process::OUT, '345'], + [$process::ERR, '456'], + ]; + $this->assertSame($expectedOutput, $output); + } + + public function testNonBlockingNorClearingIteratorOutput() + { + $input = new InputStream(); + + $process = $this->getProcessForCode('fwrite(STDOUT, fread(STDIN, 3));'); + $process->setInput($input); + $process->start(); + $output = []; + + foreach ($process->getIterator($process::ITER_NON_BLOCKING | $process::ITER_KEEP_OUTPUT) as $type => $data) { + $output[] = [$type, $data]; + break; + } + $expectedOutput = [ + [$process::OUT, ''], + ]; + $this->assertSame($expectedOutput, $output); + + $input->write(123); + + foreach ($process->getIterator($process::ITER_NON_BLOCKING | $process::ITER_KEEP_OUTPUT) as $type => $data) { + if ('' !== $data) { + $output[] = [$type, $data]; + } + } + + $this->assertSame('123', $process->getOutput()); + $this->assertFalse($process->isRunning()); + + $expectedOutput = [ + [$process::OUT, ''], + [$process::OUT, '123'], + ]; + $this->assertSame($expectedOutput, $output); + } + + public function testChainedProcesses() + { + $p1 = $this->getProcessForCode('fwrite(STDERR, 123); fwrite(STDOUT, 456);'); + $p2 = $this->getProcessForCode('stream_copy_to_stream(STDIN, STDOUT);'); + $p2->setInput($p1); + + $p1->start(); + $p2->run(); + + $this->assertSame('123', $p1->getErrorOutput()); + $this->assertSame('', $p1->getOutput()); + $this->assertSame('', $p2->getErrorOutput()); + $this->assertSame('456', $p2->getOutput()); + } + + public function testSetBadEnv() + { + $process = $this->getProcess('echo hello'); + $process->setEnv(['bad%%' => '123']); + + $process->run(); + + $this->assertSame('hello'.\PHP_EOL, $process->getOutput()); + $this->assertSame('', $process->getErrorOutput()); + } + + public function testEnvBackupDoesNotDeleteExistingVars() + { + putenv('existing_var=foo'); + $_ENV['existing_var'] = 'foo'; + $process = $this->getProcess('php -r "echo getenv(\'new_test_var\');"'); + $process->setEnv(['existing_var' => 'bar', 'new_test_var' => 'foo']); + + $process->run(); + + $this->assertSame('foo', $process->getOutput()); + $this->assertSame('foo', getenv('existing_var')); + $this->assertFalse(getenv('new_test_var')); + + putenv('existing_var'); + unset($_ENV['existing_var']); + } + + public function testEnvIsInherited() + { + $process = $this->getProcessForCode('echo serialize($_SERVER);', null, ['BAR' => 'BAZ', 'EMPTY' => '']); + + putenv('FOO=BAR'); + $_ENV['FOO'] = 'BAR'; + + $process->run(); + + $expected = ['BAR' => 'BAZ', 'EMPTY' => '', 'FOO' => 'BAR']; + $env = array_intersect_key(unserialize($process->getOutput()), $expected); + + $this->assertEquals($expected, $env); + + putenv('FOO'); + unset($_ENV['FOO']); + } + + public function testGetCommandLine() + { + $p = new Process(['/usr/bin/php']); + + $expected = '\\' === \DIRECTORY_SEPARATOR ? '"/usr/bin/php"' : "'/usr/bin/php'"; + $this->assertSame($expected, $p->getCommandLine()); + } + + /** + * @dataProvider provideEscapeArgument + */ + public function testEscapeArgument($arg) + { + $p = new Process([self::$phpBin, '-r', 'echo $argv[1];', $arg]); + $p->run(); + + $this->assertSame((string) $arg, $p->getOutput()); + } + + public function testRawCommandLine() + { + $p = Process::fromShellCommandline(sprintf('"%s" -r %s "a" "" "b"', self::$phpBin, escapeshellarg('print_r($argv);'))); + $p->run(); + + $expected = "Array\n(\n [0] => -\n [1] => a\n [2] => \n [3] => b\n)\n"; + $this->assertSame($expected, str_replace('Standard input code', '-', $p->getOutput())); + } + + public function provideEscapeArgument() + { + yield ['a"b%c%']; + yield ['a"b^c^']; + yield ["a\nb'c"]; + yield ['a^b c!']; + yield ["a!b\tc"]; + yield ['a\\\\"\\"']; + yield ['éÉèÈàÀöä']; + yield [null]; + yield [1]; + yield [1.1]; + } + + public function testPreparedCommand() + { + $p = Process::fromShellCommandline('echo "${:abc}"DEF'); + $p->run(null, ['abc' => 'ABC']); + + $this->assertSame('ABCDEF', rtrim($p->getOutput())); + } + + public function testPreparedCommandMulti() + { + $p = Process::fromShellCommandline('echo "${:abc}""${:def}"'); + $p->run(null, ['abc' => 'ABC', 'def' => 'DEF']); + + $this->assertSame('ABCDEF', rtrim($p->getOutput())); + } + + public function testPreparedCommandWithQuoteInIt() + { + $p = Process::fromShellCommandline('php -r "${:code}" "${:def}"'); + $p->run(null, ['code' => 'echo $argv[1];', 'def' => '"DEF"']); + + $this->assertSame('"DEF"', rtrim($p->getOutput())); + } + + public function testPreparedCommandWithMissingValue() + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Command line is missing a value for parameter "abc": echo "${:abc}"'); + $p = Process::fromShellCommandline('echo "${:abc}"'); + $p->run(null, ['bcd' => 'BCD']); + } + + public function testPreparedCommandWithNoValues() + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Command line is missing a value for parameter "abc": echo "${:abc}"'); + $p = Process::fromShellCommandline('echo "${:abc}"'); + $p->run(null, []); + } + + public function testEnvArgument() + { + $env = ['FOO' => 'Foo', 'BAR' => 'Bar']; + $cmd = '\\' === \DIRECTORY_SEPARATOR ? 'echo !FOO! !BAR! !BAZ!' : 'echo $FOO $BAR $BAZ'; + $p = Process::fromShellCommandline($cmd, null, $env); + $p->run(null, ['BAR' => 'baR', 'BAZ' => 'baZ']); + + $this->assertSame('Foo baR baZ', rtrim($p->getOutput())); + $this->assertSame($env, $p->getEnv()); + } + + public function testWaitStoppedDeadProcess() + { + $process = $this->getProcess(self::$phpBin.' '.__DIR__.'/ErrorProcessInitiator.php -e '.self::$phpBin); + $process->start(); + $process->setTimeout(2); + $process->wait(); + $this->assertFalse($process->isRunning()); + } + + /** + * @param string|array $commandline + * @param mixed $input + */ + private function getProcess($commandline, string $cwd = null, array $env = null, $input = null, ?int $timeout = 60): Process + { + if (\is_string($commandline)) { + $process = Process::fromShellCommandline($commandline, $cwd, $env, $input, $timeout); + } else { + $process = new Process($commandline, $cwd, $env, $input, $timeout); + } + + if (self::$process) { + self::$process->stop(0); + } + + return self::$process = $process; + } + + private function getProcessForCode(string $code, string $cwd = null, array $env = null, $input = null, ?int $timeout = 60): Process + { + return $this->getProcess([self::$phpBin, '-r', $code], $cwd, $env, $input, $timeout); + } +} + +class NonStringifiable +{ +} diff --git a/vendor/symfony/process/Tests/SignalListener.php b/vendor/symfony/process/Tests/SignalListener.php new file mode 100644 index 000000000..618be7405 --- /dev/null +++ b/vendor/symfony/process/Tests/SignalListener.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +pcntl_signal(\SIGUSR1, function () { echo 'SIGUSR1'; exit; }); + +echo 'Caught '; + +$n = 0; + +while ($n++ < 400) { + usleep(10000); + pcntl_signal_dispatch(); +} diff --git a/vendor/symfony/process/Tests/ThreeSecondProcess.php b/vendor/symfony/process/Tests/ThreeSecondProcess.php new file mode 100644 index 000000000..e483b4b90 --- /dev/null +++ b/vendor/symfony/process/Tests/ThreeSecondProcess.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +echo 'Worker started'; +sleep(3); +echo 'Worker done'; diff --git a/vendor/symfony/process/phpunit.xml.dist b/vendor/symfony/process/phpunit.xml.dist new file mode 100644 index 000000000..c32f25101 --- /dev/null +++ b/vendor/symfony/process/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Tests + ./vendor + + + +