Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!Gpsysh/.editorconfignuIwroot = true [*] indent_style = space indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] trim_trailing_whitespace = false [Makefile] indent_style = tab PK!e{} psysh/MakefilenuIwPSYSH_SRC = bin src box.json.dist composer.json build/stub PSYSH_SRC_FILES = $(shell find src -type f -name "*.php") VERSION = $(shell git describe --tag --always --dirty=-dev) COMPOSER_OPTS = --no-interaction --no-progress --verbose COMPOSER_REQUIRE_OPTS = $(COMPOSER_OPTS) --no-update COMPOSER_UPDATE_OPTS = $(COMPOSER_OPTS) --prefer-stable --no-dev --classmap-authoritative --prefer-dist # Commands .PHONY: help clean build dist .DEFAULT_GOAL := help help: @echo "\033[33mUsage:\033[0m\n make TARGET\n\n\033[33mTargets:\033[0m" @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-7s\033[0m %s\n", $$1, $$2}' clean: ## Clean all created artifacts rm -rf build/* rm -rf dist/* rm -rf vendor-bin/*/vendor/ build: ## Compile PHARs build: build/psysh/psysh build/psysh-compat/psysh build/psysh-php54/psysh build/psysh-php54-compat/psysh dist: ## Build tarballs for distribution dist: dist/psysh-$(VERSION).tar.gz dist/psysh-$(VERSION)-compat.tar.gz dist/psysh-$(VERSION)-php54.tar.gz dist/psysh-$(VERSION)-php54-compat.tar.gz # All the composer stuffs composer.lock: composer.json composer install touch $@ vendor/autoload.php: composer.lock composer install touch $@ vendor/bin/box: vendor/autoload.php composer bin box install touch $@ # Lots of PHARs build/stub: bin/build-stub bin/psysh LICENSE bin/build-stub build/psysh: $(PSYSH_SRC) $(PSYSH_SRC_FILES) rm -rf $@ || true mkdir $@ cp -R $(PSYSH_SRC) $@/ composer config --working-dir $@ platform.php 7.0 composer require --working-dir $@ $(COMPOSER_REQUIRE_OPTS) php:'>=7.0.0' composer update --working-dir $@ $(COMPOSER_UPDATE_OPTS) build/psysh-compat: $(PSYSH_SRC) $(PSYSH_SRC_FILES) rm -rf $@ || true mkdir $@ cp -R $(PSYSH_SRC) $@/ composer config --working-dir $@ platform.php 7.0 composer require --working-dir $@ $(COMPOSER_REQUIRE_OPTS) php:'>=7.0.0' composer require --working-dir $@ $(COMPOSER_REQUIRE_OPTS) symfony/polyfill-iconv symfony/polyfill-mbstring hoa/console composer update --working-dir $@ $(COMPOSER_UPDATE_OPTS) build/psysh-php54: $(PSYSH_SRC) $(PSYSH_SRC_FILES) rm -rf $@ || true mkdir $@ cp -R $(PSYSH_SRC) $@/ composer config --working-dir $@ platform.php 5.4 composer update --working-dir $@ $(COMPOSER_UPDATE_OPTS) build/psysh-php54-compat: $(PSYSH_SRC) $(PSYSH_SRC_FILES) rm -rf $@ || true mkdir $@ cp -R $(PSYSH_SRC) $@/ composer config --working-dir $@ platform.php 5.4 composer require --working-dir $@ $(COMPOSER_REQUIRE_OPTS) symfony/polyfill-iconv symfony/polyfill-mbstring hoa/console:^2.15 composer update --working-dir $@ $(COMPOSER_UPDATE_OPTS) build/%/psysh: vendor/bin/box build/% vendor/bin/box compile --working-dir $(dir $@) # Dist packages dist/psysh-$(VERSION).tar.gz: build/psysh/psysh @mkdir -p $(@D) tar -C $(dir $<) -czf $@ $(notdir $<) dist/psysh-$(VERSION)-%.tar.gz: build/psysh-%/psysh @mkdir -p $(@D) tar -C $(dir $<) -czf $@ $(notdir $<) PK!uupsysh/README.mdnuIw# PsySH PsySH is a runtime developer console, interactive debugger and [REPL](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop) for PHP. Learn more at [psysh.org](http://psysh.org/) and [in the manual](https://github.com/bobthecow/psysh/wiki/Home). [![Package version](https://img.shields.io/packagist/v/psy/psysh.svg?style=flat-square)](https://packagist.org/packages/psy/psysh) [![Monthly downloads](http://img.shields.io/packagist/dm/psy/psysh.svg?style=flat-square)](https://packagist.org/packages/psy/psysh) [![Made out of awesome](https://img.shields.io/badge/made_out_of_awesome-✓-brightgreen.svg?style=flat-square)](http://psysh.org) [![Build status](https://img.shields.io/travis/bobthecow/psysh/master.svg?style=flat-square)](http://travis-ci.org/bobthecow/psysh) [![StyleCI](https://styleci.io/repos/4549925/shield)](https://styleci.io/repos/4549925) ## [PsySH manual](https://github.com/bobthecow/psysh/wiki/Home) ### [💾 Installation](https://github.com/bobthecow/psysh/wiki/Installation) * [📕 PHP manual installation](https://github.com/bobthecow/psysh/wiki/PHP-manual) * Windows ### [🖥 Usage](https://github.com/bobthecow/psysh/wiki/Usage) * [✨ Magic variables](https://github.com/bobthecow/psysh/wiki/Magic-variables) * [⏳ Managing history](https://github.com/bobthecow/psysh/wiki/History) * [💲 System shell integration](https://github.com/bobthecow/psysh/wiki/Shell-integration) * [🎥 Tutorials & guides](https://github.com/bobthecow/psysh/wiki/Tutorials) ### [📢 Commands](https://github.com/bobthecow/psysh/wiki/Commands) ### [🛠 Configuration](https://github.com/bobthecow/psysh/wiki/Configuration) * [🎛 Config options](https://github.com/bobthecow/psysh/wiki/Config-options) * [📄 Sample config file](https://github.com/bobthecow/psysh/wiki/Sample-config) ### [🔌 Integrations](https://github.com/bobthecow/psysh/wiki/Integrations) PK!yC>> psysh/LICENSEnuIwThe MIT License (MIT) Copyright (c) 2012-2018 Justin Hileman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK!;;psysh/phpunit.xml.distnuIw ./test ./src PK!5__psysh/.travis.ymlnuIwlanguage: php sudo: false matrix: include: - php: 5.4 dist: trusty - php: 5.4 env: 'COMPOSER_FLAGS="--prefer-lowest --prefer-stable"' dist: trusty - php: 5.5 dist: trusty - php: 5.6 - php: 7.0 - php: 7.1 - php: 7.2 - php: hhvm dist: trusty allow_failures: - php: 5.4 env: 'COMPOSER_FLAGS="--prefer-lowest --prefer-stable"' - php: hhvm fast_finish: true install: travis_retry composer update --no-interaction $COMPOSER_FLAGS script: - vendor/bin/phpunit --verbose --coverage-clover=coverage.xml - '[[ $TRAVIS_PHP_VERSION = 7.2* ]] && make build -j 4 || true' after_success: - bash <(curl -s https://codecov.io/bash) before_deploy: make dist -j 4 deploy: provider: releases api_key: secure: LL8koDM1xDqzF9t0URHvmMPyWjojyd4PeZ7IW7XYgyvD6n1H6GYrVAeKCh5wfUKFbwHoa9s5AAn6pLzra00bODVkPTmUH+FSMWz9JKLw9ODAn8HvN7C+IooxmeClGHFZc0TfHfya8/D1E9C1iXtGGEoE/GqtaYq/z0C1DLpO0OU= file_glob: true file: dist/psysh-*.tar.gz skip_cleanup: true on: tags: true repo: bobthecow/psysh condition: $TRAVIS_PHP_VERSION = 7.2* PK!^pss"psysh/vendor-bin/box/composer.jsonnuIw{ "minimum-stability": "dev", "prefer-stable": true, "require": { "humbug/box": "^3.1" } } PK!_-VV"psysh/vendor-bin/box/composer.locknuIw{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "d98ffe050f0ba4e81c2d1a98ca945200", "packages": [ { "name": "amphp/amp", "version": "v2.0.7", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", "reference": "d561cc9736bc18dd94a2fc9cdae98b616bd92c43" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/amp/zipball/d561cc9736bc18dd94a2fc9cdae98b616bd92c43", "reference": "d561cc9736bc18dd94a2fc9cdae98b616bd92c43", "shasum": "" }, "require": { "php": ">=7" }, "require-dev": { "amphp/phpunit-util": "^1", "friendsofphp/php-cs-fixer": "^2.3", "phpstan/phpstan": "^0.8.5", "phpunit/phpunit": "^6.0.9", "react/promise": "^2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { "Amp\\": "lib" }, "files": [ "lib/functions.php", "lib/Internal/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bob Weinand", "email": "bobwei9@hotmail.com" }, { "name": "Niklas Keller", "email": "me@kelunik.com" }, { "name": "Daniel Lowrey", "email": "rdlowrey@php.net" }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" } ], "description": "A non-blocking concurrency framework for PHP applications.", "homepage": "http://amphp.org/amp", "keywords": [ "async", "asynchronous", "awaitable", "concurrency", "event", "event-loop", "future", "non-blocking", "promise" ], "time": "2018-04-30T20:49:57+00:00" }, { "name": "amphp/byte-stream", "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/amphp/byte-stream.git", "reference": "1b75b122e6f069e7d102eef065dc192119d99ca7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/byte-stream/zipball/1b75b122e6f069e7d102eef065dc192119d99ca7", "reference": "1b75b122e6f069e7d102eef065dc192119d99ca7", "shasum": "" }, "require": { "amphp/amp": "^2" }, "require-dev": { "amphp/phpunit-util": "^1", "friendsofphp/php-cs-fixer": "^2.3", "phpunit/phpunit": "^6" }, "type": "library", "autoload": { "psr-4": { "Amp\\ByteStream\\": "lib" }, "files": [ "lib/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Niklas Keller", "email": "me@kelunik.com" }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" } ], "description": "A stream abstraction to make working with non-blocking I/O simple.", "homepage": "http://amphp.org/byte-stream", "keywords": [ "amp", "amphp", "async", "io", "non-blocking", "stream" ], "time": "2018-04-04T05:33:09+00:00" }, { "name": "amphp/parallel", "version": "v0.2.5", "source": { "type": "git", "url": "https://github.com/amphp/parallel.git", "reference": "732694688461936bec02c0ccf020dfee10c4f7ee" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/parallel/zipball/732694688461936bec02c0ccf020dfee10c4f7ee", "reference": "732694688461936bec02c0ccf020dfee10c4f7ee", "shasum": "" }, "require": { "amphp/amp": "^2", "amphp/byte-stream": "^1.2", "amphp/parser": "^1", "amphp/process": "^0.2 || ^0.3", "amphp/sync": "^1.0.1" }, "require-dev": { "amphp/phpunit-util": "^1", "friendsofphp/php-cs-fixer": "^2.3", "phpunit/phpunit": "^6" }, "suggest": { "ext-pthreads": "Required for thread contexts" }, "type": "library", "autoload": { "psr-4": { "Amp\\Parallel\\": "lib" }, "files": [ "lib/Worker/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Stephen Coakley", "email": "me@stephencoakley.com" }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" } ], "description": "Parallel processing component for Amp.", "homepage": "https://github.com/amphp/parallel", "keywords": [ "async", "asynchronous", "concurrent", "multi-processing", "multi-threading" ], "time": "2018-03-21T14:37:51+00:00" }, { "name": "amphp/parallel-functions", "version": "v0.1.2", "source": { "type": "git", "url": "https://github.com/amphp/parallel-functions.git", "reference": "999ba8a00adaf4d1fd3a7cb40bf7e565e507ff48" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/parallel-functions/zipball/999ba8a00adaf4d1fd3a7cb40bf7e565e507ff48", "reference": "999ba8a00adaf4d1fd3a7cb40bf7e565e507ff48", "shasum": "" }, "require": { "amphp/amp": "^2.0.3", "amphp/parallel": "^0.1.8 || ^0.2", "opis/closure": "^3.0.7", "php": ">=7" }, "require-dev": { "amphp/phpunit-util": "^1.0", "friendsofphp/php-cs-fixer": "^2.9", "phpunit/phpunit": "^6.5" }, "type": "library", "autoload": { "psr-4": { "Amp\\ParallelFunctions\\": "src" }, "files": [ "src/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Niklas Keller", "email": "me@kelunik.com" } ], "description": "Parallel processing made simple.", "time": "2017-12-17T18:33:29+00:00" }, { "name": "amphp/parser", "version": "v1.0.0", "source": { "type": "git", "url": "https://github.com/amphp/parser.git", "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/parser/zipball/f83e68f03d5b8e8e0365b8792985a7f341c57ae1", "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1", "shasum": "" }, "require": { "php": ">=7" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.3", "phpunit/phpunit": "^6" }, "type": "library", "autoload": { "psr-4": { "Amp\\Parser\\": "lib" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Niklas Keller", "email": "me@kelunik.com" }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" } ], "description": "A generator parser to make streaming parsers simple.", "homepage": "https://github.com/amphp/parser", "keywords": [ "async", "non-blocking", "parser", "stream" ], "time": "2017-06-06T05:29:10+00:00" }, { "name": "amphp/process", "version": "v0.3.3", "source": { "type": "git", "url": "https://github.com/amphp/process.git", "reference": "b795d20a7f6d5a0637128a02be613f520f1705fc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/process/zipball/b795d20a7f6d5a0637128a02be613f520f1705fc", "reference": "b795d20a7f6d5a0637128a02be613f520f1705fc", "shasum": "" }, "require": { "amphp/amp": "^2", "amphp/byte-stream": "^1", "php": ">=7" }, "require-dev": { "amphp/phpunit-util": "^1", "friendsofphp/php-cs-fixer": "^2.3", "phpunit/phpunit": "^6" }, "type": "library", "autoload": { "psr-4": { "Amp\\Process\\": "lib" }, "files": [ "lib/constants.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bob Weinand", "email": "bobwei9@hotmail.com" }, { "name": "Niklas Keller", "email": "me@kelunik.com" }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" } ], "description": "Asynchronous process manager.", "homepage": "https://github.com/amphp/process", "time": "2018-04-08T18:55:42+00:00" }, { "name": "amphp/sync", "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/amphp/sync.git", "reference": "a1d8f244eb19e3e2a96abc4686cebc80995bbc90" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/amphp/sync/zipball/a1d8f244eb19e3e2a96abc4686cebc80995bbc90", "reference": "a1d8f244eb19e3e2a96abc4686cebc80995bbc90", "shasum": "" }, "require": { "amphp/amp": "^2" }, "require-dev": { "amphp/phpunit-util": "^1", "friendsofphp/php-cs-fixer": "^2.3", "phpunit/phpunit": "^6" }, "type": "library", "autoload": { "psr-4": { "Amp\\Sync\\": "lib" }, "files": [ "lib/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Stephen Coakley", "email": "me@stephencoakley.com" }, { "name": "Aaron Piotrowski", "email": "aaron@trowski.com" } ], "description": "Mutex, Semaphore, and other synchronization tools for Amp.", "homepage": "https://github.com/amphp/sync", "keywords": [ "async", "asynchronous", "mutex", "semaphore", "synchronization" ], "time": "2017-11-29T21:48:53+00:00" }, { "name": "beberlei/assert", "version": "v2.9.5", "source": { "type": "git", "url": "https://github.com/beberlei/assert.git", "reference": "c07fe163d6a3b3e4b1275981ec004397954afa89" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/beberlei/assert/zipball/c07fe163d6a3b3e4b1275981ec004397954afa89", "reference": "c07fe163d6a3b3e4b1275981ec004397954afa89", "shasum": "" }, "require": { "ext-mbstring": "*", "php": ">=5.3" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.1.1", "phpunit/phpunit": "^4.8.35|^5.7" }, "type": "library", "autoload": { "psr-4": { "Assert\\": "lib/Assert" }, "files": [ "lib/Assert/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-2-Clause" ], "authors": [ { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de", "role": "Lead Developer" }, { "name": "Richard Quadling", "email": "rquadling@gmail.com", "role": "Collaborator" } ], "description": "Thin assertion library for input validation in business models.", "keywords": [ "assert", "assertion", "validation" ], "time": "2018-04-16T11:18:27+00:00" }, { "name": "composer/ca-bundle", "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169", "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", "php": "^5.3.2 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5", "psr/log": "^1.0", "symfony/process": "^2.5 || ^3.0 || ^4.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\CaBundle\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", "keywords": [ "cabundle", "cacert", "certificate", "ssl", "tls" ], "time": "2018-03-29T19:57:20+00:00" }, { "name": "composer/composer", "version": "1.6.5", "source": { "type": "git", "url": "https://github.com/composer/composer.git", "reference": "b184a92419cc9a9c4c6a09db555a94d441cb11c9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/composer/zipball/b184a92419cc9a9c4c6a09db555a94d441cb11c9", "reference": "b184a92419cc9a9c4c6a09db555a94d441cb11c9", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", "composer/semver": "^1.0", "composer/spdx-licenses": "^1.2", "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", "php": "^5.3.2 || ^7.0", "psr/log": "^1.0", "seld/cli-prompt": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", "symfony/console": "^2.7 || ^3.0 || ^4.0", "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", "symfony/finder": "^2.7 || ^3.0 || ^4.0", "symfony/process": "^2.7 || ^3.0 || ^4.0" }, "conflict": { "symfony/console": "2.8.38" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7", "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", "ext-zip": "Enabling the zip extension allows you to unzip archives", "ext-zlib": "Allow gzip compression of HTTP requests" }, "bin": [ "bin/composer" ], "type": "library", "extra": { "branch-alias": { "dev-master": "1.6-dev" } }, "autoload": { "psr-4": { "Composer\\": "src/Composer" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http://www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.", "homepage": "https://getcomposer.org/", "keywords": [ "autoload", "dependency", "package" ], "time": "2018-05-04T09:44:59+00:00" }, { "name": "composer/semver", "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.5 || ^5.0.5", "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\Semver\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http://www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" }, { "name": "Rob Bast", "email": "rob.bast@gmail.com", "homepage": "http://robbast.nl" } ], "description": "Semver library that offers utilities, version constraint parsing and validation.", "keywords": [ "semantic", "semver", "validation", "versioning" ], "time": "2016-08-30T16:08:34+00:00" }, { "name": "composer/spdx-licenses", "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/cb17687e9f936acd7e7245ad3890f953770dec1b", "reference": "cb17687e9f936acd7e7245ad3890f953770dec1b", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5", "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Composer\\Spdx\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nils Adermann", "email": "naderman@naderman.de", "homepage": "http://www.naderman.de" }, { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" }, { "name": "Rob Bast", "email": "rob.bast@gmail.com", "homepage": "http://robbast.nl" } ], "description": "SPDX licenses list and validation library.", "keywords": [ "license", "spdx", "validator" ], "time": "2018-04-30T10:33:04+00:00" }, { "name": "composer/xdebug-handler", "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", "reference": "c919dc6c62e221fc6406f861ea13433c0aa24f08" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/c919dc6c62e221fc6406f861ea13433c0aa24f08", "reference": "c919dc6c62e221fc6406f861ea13433c0aa24f08", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0", "psr/log": "^1.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" }, "type": "library", "autoload": { "psr-4": { "Composer\\XdebugHandler\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "John Stevenson", "email": "john-stevenson@blueyonder.co.uk" } ], "description": "Restarts a process without xdebug.", "keywords": [ "Xdebug", "performance" ], "time": "2018-04-11T15:42:36+00:00" }, { "name": "doctrine/annotations", "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "php": "^7.1" }, "require-dev": { "doctrine/cache": "1.*", "phpunit/phpunit": "^6.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.6.x-dev" } }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Roman Borschel", "email": "roman@code-factory.org" }, { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, { "name": "Jonathan Wage", "email": "jonwage@gmail.com" }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" } ], "description": "Docblock Annotations Parser", "homepage": "http://www.doctrine-project.org", "keywords": [ "annotations", "docblock", "parser" ], "time": "2017-12-06T07:11:42+00:00" }, { "name": "doctrine/lexer", "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", "shasum": "" }, "require": { "php": ">=5.3.2" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-0": { "Doctrine\\Common\\Lexer\\": "lib/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Roman Borschel", "email": "roman@code-factory.org" }, { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" } ], "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", "homepage": "http://www.doctrine-project.org", "keywords": [ "lexer", "parser" ], "time": "2014-09-09T13:34:57+00:00" }, { "name": "herrera-io/annotations", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/kherge-abandoned/php-annotations.git", "reference": "7d8b9a536da7f12aad8de7f28b2cb5266bde8da1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/kherge-abandoned/php-annotations/zipball/7d8b9a536da7f12aad8de7f28b2cb5266bde8da1", "reference": "7d8b9a536da7f12aad8de7f28b2cb5266bde8da1", "shasum": "" }, "require": { "doctrine/annotations": "~1.0", "php": ">=5.3.3" }, "require-dev": { "herrera-io/phpunit-test-case": "1.*", "phpunit/phpunit": "3.7.*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "psr-0": { "Herrera\\Annotations": "src/lib" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Kevin Herrera", "email": "kevin@herrera.io", "homepage": "http://kevin.herrera.io" } ], "description": "A tokenizer for Doctrine annotations.", "homepage": "https://github.com/herrera-io/php-annotations", "keywords": [ "annotations", "doctrine", "tokenizer" ], "abandoned": true, "time": "2014-02-03T17:34:08+00:00" }, { "name": "humbug/box", "version": "3.0.0-alpha.5", "source": { "type": "git", "url": "https://github.com/humbug/box.git", "reference": "26b3f481e3b375f55c0644f501b831f7c05d8058" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/humbug/box/zipball/26b3f481e3b375f55c0644f501b831f7c05d8058", "reference": "26b3f481e3b375f55c0644f501b831f7c05d8058", "shasum": "" }, "require": { "amphp/parallel-functions": "^0.1.2", "beberlei/assert": "^2.8", "composer/composer": "^1.6", "composer/xdebug-handler": "^1.1.0", "ext-phar": "*", "herrera-io/annotations": "~1.0", "humbug/php-scoper": "^1.0@dev", "justinrainbow/json-schema": "^5.2", "nikic/iter": "^1.6", "php": "^7.1", "phpseclib/phpseclib": "~2.0", "seld/jsonlint": "^1.6", "symfony/console": "^3.4 || ^4.0", "symfony/filesystem": "^3.4 || ^4.0", "symfony/finder": "^3.4 || ^4.0", "symfony/var-dumper": "^3.4 || ^4.0", "webmozart/path-util": "^2.3" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.2", "infection/infection": "^0.8", "mikey179/vfsstream": "^1.1", "phpunit/phpunit": "^7.0" }, "suggest": { "ext-openssl": "To accelerate private key generation." }, "bin": [ "bin/box" ], "type": "library", "extra": { "branch-alias": { "dev-master": "3.x-dev" }, "bamarni-bin": { "bin-links": false } }, "autoload": { "psr-4": { "KevinGH\\Box\\": "src" }, "files": [ "src/FileSystem/file_system.php", "src/functions.php" ], "exclude-from-classmap": [ "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Kevin Herrera", "email": "kevin@herrera.io", "homepage": "http://kevin.herrera.io" }, { "name": "Théo Fidry", "email": "theo.fidry@gmail.com" } ], "description": "Fast, zero config application bundler with PHARs.", "keywords": [ "phar" ], "time": "2018-05-04T22:04:10+00:00" }, { "name": "humbug/php-scoper", "version": "dev-master", "source": { "type": "git", "url": "https://github.com/humbug/php-scoper.git", "reference": "450fe36a7457847d0cb431e7379b5df9d05992a4" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/humbug/php-scoper/zipball/450fe36a7457847d0cb431e7379b5df9d05992a4", "reference": "450fe36a7457847d0cb431e7379b5df9d05992a4", "shasum": "" }, "require": { "nikic/php-parser": "^3.0", "ocramius/package-versions": "^1.1", "padraic/phar-updater": "^1.0", "php": "^7.1", "roave/better-reflection": "^2.0", "symfony/console": "^3.2 || ^4.0", "symfony/filesystem": "^3.2 || ^4.0", "symfony/finder": "^3.2 || ^4.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.1", "phpunit/phpunit": "^6.1" }, "bin": [ "bin/php-scoper" ], "type": "library", "extra": { "bamarni-bin": { "bin-links": false }, "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "files": [ "src/functions.php" ], "psr-4": { "Humbug\\PhpScoper\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" }, { "name": "Théo Fidry", "email": "theo.fidry@gmail.com" }, { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com" } ], "description": "Prefixes all PHP namespaces in a file or directory.", "time": "2018-04-25T21:59:07+00:00" }, { "name": "justinrainbow/json-schema", "version": "5.2.7", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", "reference": "8560d4314577199ba51bf2032f02cd1315587c23" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8560d4314577199ba51bf2032f02cd1315587c23", "reference": "8560d4314577199ba51bf2032f02cd1315587c23", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.1", "json-schema/json-schema-test-suite": "1.2.0", "phpunit/phpunit": "^4.8.35" }, "bin": [ "bin/validate-json" ], "type": "library", "extra": { "branch-alias": { "dev-master": "5.0.x-dev" } }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bruno Prieto Reis", "email": "bruno.p.reis@gmail.com" }, { "name": "Justin Rainbow", "email": "justin.rainbow@gmail.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch" }, { "name": "Robert Schönthal", "email": "seroscho@googlemail.com" } ], "description": "A library to validate a json schema.", "homepage": "https://github.com/justinrainbow/json-schema", "keywords": [ "json", "schema" ], "time": "2018-02-14T22:26:30+00:00" }, { "name": "nikic/iter", "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/nikic/iter.git", "reference": "fed36b417ea93fe9b4b7cb2e2abf98d91092564c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/iter/zipball/fed36b417ea93fe9b4b7cb2e2abf98d91092564c", "reference": "fed36b417ea93fe9b4b7cb2e2abf98d91092564c", "shasum": "" }, "require": { "php": ">=5.5.0" }, "require-dev": { "phpunit/phpunit": "~4.0|~5.0" }, "type": "library", "autoload": { "files": [ "src/bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov", "email": "nikic@php.net" } ], "description": "Iteration primitives using generators", "keywords": [ "functional", "generator", "iterator" ], "time": "2017-11-10T22:56:03+00:00" }, { "name": "nikic/php-parser", "version": "v3.1.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.5" }, "require-dev": { "phpunit/phpunit": "~4.0|~5.0" }, "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov" } ], "description": "A PHP parser written in PHP", "keywords": [ "parser", "php" ], "time": "2018-02-28T20:30:58+00:00" }, { "name": "ocramius/package-versions", "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/Ocramius/PackageVersions.git", "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/4489d5002c49d55576fa0ba786f42dbb009be46f", "reference": "4489d5002c49d55576fa0ba786f42dbb009be46f", "shasum": "" }, "require": { "composer-plugin-api": "^1.0.0", "php": "^7.1.0" }, "require-dev": { "composer/composer": "^1.6.3", "ext-zip": "*", "infection/infection": "^0.7.1", "phpunit/phpunit": "^7.0.0" }, "type": "composer-plugin", "extra": { "class": "PackageVersions\\Installer", "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { "PackageVersions\\": "src/PackageVersions" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com" } ], "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "time": "2018-02-05T13:05:30+00:00" }, { "name": "opis/closure", "version": "3.0.12", "source": { "type": "git", "url": "https://github.com/opis/closure.git", "reference": "507a28d15e79258d404ba76e73976ba895d0eb11" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/opis/closure/zipball/507a28d15e79258d404ba76e73976ba895d0eb11", "reference": "507a28d15e79258d404ba76e73976ba895d0eb11", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { "jeremeamia/superclosure": "^2.0", "phpunit/phpunit": "^4.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0.x-dev" } }, "autoload": { "psr-4": { "Opis\\Closure\\": "src/" }, "files": [ "functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marius Sarca", "email": "marius.sarca@gmail.com" } ], "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", "homepage": "http://www.opis.io/closure", "keywords": [ "anonymous functions", "closure", "function", "serializable", "serialization", "serialize" ], "time": "2018-02-23T08:08:14+00:00" }, { "name": "padraic/humbug_get_contents", "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/humbug/file_get_contents.git", "reference": "dcb086060c9dd6b2f51d8f7a895500307110b7a7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/humbug/file_get_contents/zipball/dcb086060c9dd6b2f51d8f7a895500307110b7a7", "reference": "dcb086060c9dd6b2f51d8f7a895500307110b7a7", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", "ext-openssl": "*", "php": "^5.3 || ^7.0 || ^7.1 || ^7.2" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.1", "mikey179/vfsstream": "^1.6", "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5" }, "type": "library", "extra": { "bamarni-bin": { "bin-links": false }, "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { "Humbug\\": "src/" }, "files": [ "src/function.php", "src/functions.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Padraic Brady", "email": "padraic.brady@gmail.com", "homepage": "http://blog.astrumfutura.com" }, { "name": "Théo Fidry", "email": "theo.fidry@gmail.com" } ], "description": "Secure wrapper for accessing HTTPS resources with file_get_contents for PHP 5.3+", "homepage": "https://github.com/padraic/file_get_contents", "keywords": [ "download", "file_get_contents", "http", "https", "ssl", "tls" ], "time": "2018-02-12T18:47:17+00:00" }, { "name": "padraic/phar-updater", "version": "v1.0.6", "source": { "type": "git", "url": "https://github.com/humbug/phar-updater.git", "reference": "d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/humbug/phar-updater/zipball/d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1", "reference": "d01d3b8f26e541ac9b9eeba1e18d005d852f7ff1", "shasum": "" }, "require": { "padraic/humbug_get_contents": "^1.0", "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { "Humbug\\SelfUpdate\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", "homepage": "http://blog.astrumfutura.com" } ], "description": "A thing to make PHAR self-updating easy and secure.", "keywords": [ "humbug", "phar", "self-update", "update" ], "time": "2018-03-30T12:52:15+00:00" }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "shasum": "" }, "require": { "php": ">=5.5" }, "require-dev": { "phpunit/phpunit": "^4.6" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ "src" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "homepage": "http://www.phpdoc.org", "keywords": [ "FQSEN", "phpDocumentor", "phpdoc", "reflection", "static analysis" ], "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "reference": "94fd0001232e47129dd3504189fa1c7225010d08" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", "reference": "94fd0001232e47129dd3504189fa1c7225010d08", "shasum": "" }, "require": { "php": "^7.0", "phpdocumentor/reflection-common": "^1.0.0", "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { "doctrine/instantiator": "~1.0.5", "mockery/mockery": "^1.0", "phpunit/phpunit": "^6.4" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "time": "2017-11-30T07:14:17+00:00" }, { "name": "phpdocumentor/type-resolver", "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", "shasum": "" }, "require": { "php": "^5.5 || ^7.0", "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { "mockery/mockery": "^0.9.4", "phpunit/phpunit": "^5.2||^4.8.24" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpseclib/phpseclib", "version": "2.0.11", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/7053f06f91b3de78e143d430e55a8f7889efc08b", "reference": "7053f06f91b3de78e143d430e55a8f7889efc08b", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { "phing/phing": "~2.7", "phpunit/phpunit": "^4.8.35|^5.7|^6.0", "sami/sami": "~2.0", "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." }, "type": "library", "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" ], "time": "2018-04-15T16:55:05+00:00" }, { "name": "psr/log", "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", "shasum": "" }, "require": { "php": ">=5.3.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "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" ], "time": "2016-10-10T12:19:37+00:00" }, { "name": "roave/better-reflection", "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/Roave/BetterReflection.git", "reference": "efc45b50cb52d5eeaacab15741376e981e28738b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Roave/BetterReflection/zipball/efc45b50cb52d5eeaacab15741376e981e28738b", "reference": "efc45b50cb52d5eeaacab15741376e981e28738b", "shasum": "" }, "require": { "nikic/php-parser": "^3.1.1", "php": ">=7.1.0,<7.3.0", "phpdocumentor/reflection-docblock": "^4.1.1", "phpdocumentor/type-resolver": "^0.4.0", "roave/signature": "^1.0" }, "require-dev": { "phpunit/phpunit": "^6.3.0" }, "suggest": { "composer/composer": "Required to use the ComposerSourceLocator" }, "type": "library", "autoload": { "psr-4": { "Roave\\BetterReflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "http://ocramius.github.io/" }, { "name": "James Titcumb", "email": "james@asgrim.com", "homepage": "https://github.com/asgrim" }, { "name": "Gary Hockin", "email": "gary@roave.com", "homepage": "https://github.com/geeh" }, { "name": "Jaroslav Hanslík", "email": "kukulich@kukulich.cz", "homepage": "https://github.com/kukulich" } ], "description": "Better Reflection - an improved code reflection API", "time": "2018-02-05T08:08:57+00:00" }, { "name": "roave/signature", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/Roave/Signature.git", "reference": "bed4ecbdd7f312ab6bb39561ac191f520bcee386" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Roave/Signature/zipball/bed4ecbdd7f312ab6bb39561ac191f520bcee386", "reference": "bed4ecbdd7f312ab6bb39561ac191f520bcee386", "shasum": "" }, "require": { "php": "^7.0|^7.1" }, "require-dev": { "phpunit/phpunit": "^5.6" }, "type": "library", "autoload": { "psr-4": { "Roave\\Signature\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Sign and verify stuff", "time": "2017-02-17T13:53:21+00:00" }, { "name": "seld/cli-prompt", "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/Seldaek/cli-prompt.git", "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/a19a7376a4689d4d94cab66ab4f3c816019ba8dd", "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd", "shasum": "" }, "require": { "php": ">=5.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Seld\\CliPrompt\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be" } ], "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type", "keywords": [ "cli", "console", "hidden", "input", "prompt" ], "time": "2017-03-18T11:32:45+00:00" }, { "name": "seld/jsonlint", "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/d15f59a67ff805a44c50ea0516d2341740f81a38", "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38", "shasum": "" }, "require": { "php": "^5.3 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "bin": [ "bin/jsonlint" ], "type": "library", "autoload": { "psr-4": { "Seld\\JsonLint\\": "src/Seld/JsonLint/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", "homepage": "http://seld.be" } ], "description": "JSON Linter", "keywords": [ "json", "linter", "parser", "validator" ], "time": "2018-01-24T12:46:19+00:00" }, { "name": "seld/phar-utils", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a", "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a", "shasum": "" }, "require": { "php": ">=5.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Seld\\PharUtils\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be" } ], "description": "PHAR file format utilities, for when PHP phars you up", "keywords": [ "phra" ], "time": "2015-10-13T18:44:15+00:00" }, { "name": "symfony/console", "version": "v4.0.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", "reference": "3e820bc2c520a87ca209ad8fa961c97f42e0b4ae" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/console/zipball/3e820bc2c520a87ca209ad8fa961c97f42e0b4ae", "reference": "3e820bc2c520a87ca209ad8fa961c97f42e0b4ae", "shasum": "" }, "require": { "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/dependency-injection": "<3.4", "symfony/process": "<3.3" }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log-implementation": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Console Component", "homepage": "https://symfony.com", "time": "2018-04-30T01:23:47+00:00" }, { "name": "symfony/filesystem", "version": "v4.0.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", "reference": "5d2d655b2c72fc4d9bf7e9bf14f72a447b940f21" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/filesystem/zipball/5d2d655b2c72fc4d9bf7e9bf14f72a447b940f21", "reference": "5d2d655b2c72fc4d9bf7e9bf14f72a447b940f21", "shasum": "" }, "require": { "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", "time": "2018-02-22T10:50:29+00:00" }, { "name": "symfony/finder", "version": "v4.0.9", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", "reference": "ca27c02b7a3fef4828c998c2ff9ba7aae1641c49" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/finder/zipball/ca27c02b7a3fef4828c998c2ff9ba7aae1641c49", "reference": "ca27c02b7a3fef4828c998c2ff9ba7aae1641c49", "shasum": "" }, "require": { "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", "time": "2018-04-04T05:10:37+00:00" }, { "name": "symfony/polyfill-mbstring", "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "3296adf6a6454a050679cde90f95350ad604b171" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171", "reference": "3296adf6a6454a050679cde90f95350ad604b171", "shasum": "" }, "require": { "php": ">=5.3.3" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ], "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/polyfill-php72", "version": "v1.8.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46", "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46", "shasum": "" }, "require": { "php": ">=5.3.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.8-dev" } }, "autoload": { "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "time": "2018-04-26T10:06:28+00:00" }, { "name": "symfony/process", "version": "v4.0.9", "source": { "type": "git", "url": "https://github.com/symfony/process.git", "reference": "d7dc1ee5dfe9f732cb1bba7310f5b99f2b7a6d25" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/d7dc1ee5dfe9f732cb1bba7310f5b99f2b7a6d25", "reference": "d7dc1ee5dfe9f732cb1bba7310f5b99f2b7a6d25", "shasum": "" }, "require": { "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "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": "Symfony Process Component", "homepage": "https://symfony.com", "time": "2018-04-03T05:24:00+00:00" }, { "name": "symfony/var-dumper", "version": "v4.0.9", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", "reference": "3c34cf3f4bbac9e003d9325225e9ef1a49180a18" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3c34cf3f4bbac9e003d9325225e9ef1a49180a18", "reference": "3c34cf3f4bbac9e003d9325225e9ef1a49180a18", "shasum": "" }, "require": { "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php72": "~1.5" }, "conflict": { "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" }, "require-dev": { "ext-iconv": "*", "twig/twig": "~1.34|~2.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", "ext-intl": "To show region name in time zone dump" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "files": [ "Resources/functions/dump.php" ], "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony mechanism for exploring and dumping PHP variables", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], "time": "2018-04-26T16:12:06+00:00" }, { "name": "webmozart/assert", "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { "php": "^5.3.3 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.6", "sebastian/version": "^1.0.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.3-dev" } }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ "assert", "check", "validate" ], "time": "2018-01-29T19:49:41+00:00" }, { "name": "webmozart/path-util", "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/path-util.git", "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/webmozart/path-util/zipball/d939f7edc24c9a1bb9c0dee5cb05d8e859490725", "reference": "d939f7edc24c9a1bb9c0dee5cb05d8e859490725", "shasum": "" }, "require": { "php": ">=5.3.3", "webmozart/assert": "~1.0" }, "require-dev": { "phpunit/phpunit": "^4.6", "sebastian/version": "^1.0.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.3-dev" } }, "autoload": { "psr-4": { "Webmozart\\PathUtil\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "A robust cross-platform utility for normalizing, comparing and modifying file paths.", "time": "2015-12-17T08:42:14+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "dev", "stability-flags": { "humbug/box": 15 }, "prefer-stable": true, "prefer-lowest": false, "platform": [], "platform-dev": [] } PK!|psysh/composer.jsonnuIw{ "name": "psy/psysh", "description": "An interactive shell for modern PHP.", "type": "library", "keywords": ["console", "interactive", "shell", "repl"], "homepage": "http://psysh.org", "license": "MIT", "authors": [ { "name": "Justin Hileman", "email": "justin@justinhileman.info", "homepage": "http://justinhileman.com" } ], "require": { "php": ">=5.4.0", "ext-json": "*", "ext-tokenizer": "*", "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0", "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0", "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0", "dnoegel/php-xdg-base-dir": "0.1.*", "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*" }, "require-dev": { "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0", "hoa/console": "~2.15|~3.16", "bamarni/composer-bin-plugin": "^1.2" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", "ext-pdo-sqlite": "The doc command requires SQLite to work.", "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." }, "autoload": { "files": ["src/functions.php"], "psr-4": { "Psy\\": "src/" } }, "autoload-dev": { "psr-4": { "Psy\\Test\\": "test/" } }, "bin": ["bin/psysh"], "extra": { "branch-alias": { "dev-develop": "0.9.x-dev" } } } PK!Vpsysh/bin/psyshnu̗#!/usr/bin/env php $arg) { if ($arg === '--cwd') { if ($i >= count($argv) - 1) { echo 'Missing --cwd argument.' . PHP_EOL; exit(1); } $cwd = $argv[$i + 1]; break; } if (preg_match('/^--cwd=/', $arg)) { $cwd = substr($arg, 6); break; } } // Or fall back to the actual cwd if (!isset($cwd)) { $cwd = getcwd(); } $cwd = str_replace('\\', '/', $cwd); $chunks = explode('/', $cwd); while (!empty($chunks)) { $path = implode('/', $chunks); // Find composer.json if (is_file($path . '/composer.json')) { if ($cfg = json_decode(file_get_contents($path . '/composer.json'), true)) { if (isset($cfg['name']) && $cfg['name'] === 'psy/psysh') { // We're inside the psysh project. Let's use the local // Composer autoload. if (is_file($path . '/vendor/autoload.php')) { require $path . '/vendor/autoload.php'; } return; } } } // Or a composer.lock if (is_file($path . '/composer.lock')) { if ($cfg = json_decode(file_get_contents($path . '/composer.lock'), true)) { foreach (array_merge($cfg['packages'], $cfg['packages-dev']) as $pkg) { if (isset($pkg['name']) && $pkg['name'] === 'psy/psysh') { // We're inside a project which requires psysh. We'll // use the local Composer autoload. if (is_file($path . '/vendor/autoload.php')) { require $path . '/vendor/autoload.php'; } return; } } } } array_pop($chunks); } }); // We didn't find an autoloader for a local version, so use the autoloader that // came with this script. if (!class_exists('Psy\Shell')) { /* <<< */ if (is_file(__DIR__ . '/../vendor/autoload.php')) { require __DIR__ . '/../vendor/autoload.php'; } elseif (is_file(__DIR__ . '/../../../autoload.php')) { require __DIR__ . '/../../../autoload.php'; } else { echo 'PsySH dependencies not found, be sure to run `composer install`.' . PHP_EOL; echo 'See https://getcomposer.org to get Composer.' . PHP_EOL; exit(1); } /* >>> */ } // If the psysh binary was included directly, assume they just wanted an // autoloader and bail early. // // Keep this PHP 5.3 code around for a while in case someone is using a globally // installed psysh as a bin launcher for older local versions. if (version_compare(PHP_VERSION, '5.3.6', '<')) { $trace = debug_backtrace(); } elseif (version_compare(PHP_VERSION, '5.4.0', '<')) { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); } else { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); } if (Psy\Shell::isIncluded($trace)) { unset($trace); return; } // Clean up after ourselves. unset($trace); // If the local version is too old, we can't do this if (!function_exists('Psy\bin')) { $argv = $_SERVER['argv']; $first = array_shift($argv); if (preg_match('/php(\.exe)?$/', $first)) { array_shift($argv); } array_unshift($argv, 'vendor/bin/psysh'); echo 'A local PsySH dependency was found, but it cannot be loaded. Please update to' . PHP_EOL; echo 'the latest version, or run the local copy directly, e.g.:' . PHP_EOL; echo PHP_EOL; echo ' ' . implode(' ', $argv) . PHP_EOL; exit(1); } // And go! call_user_func(Psy\bin()); PK!psysh/bin/build-stubnuȯ#!/usr/bin/env php >> \*/}sm', $autoload, $content); $content = preg_replace('/\\(c\\) .*?with this source code./sm', $license, $content); $content .= '__HALT_COMPILER();'; @mkdir(dirname(__DIR__) . '/build'); file_put_contents(dirname(__DIR__) . '/build/stub', $content); PK! y psysh/.php_csnuIwin(__DIR__) ->name('.php_cs') ->name('build-manual') ->name('build-phar') ->exclude('build-vendor'); $header = <<setRules(array( '@Symfony' => true, 'array_syntax' => array('syntax' => 'short'), 'binary_operator_spaces' => false, 'concat_space' => array('spacing' => 'one'), 'header_comment' => array('header' => $header), 'increment_style' => array('style' => 'post'), 'method_argument_space' => array('keep_multiple_spaces_after_comma' => true), 'ordered_imports' => true, 'pre_increment' => false, 'yoda_style' => false, )) ->setFinder($finder); PK!1$psysh/.phan/config.phpnuIw [ 'src/', 'vendor/dnoegel/php-xdg-base-dir/src/', 'vendor/doctrine/instantiator/src/', 'vendor/hoa/console/', 'vendor/jakub-onderka/php-console-color/src/', 'vendor/jakub-onderka/php-console-highlighter/src/', 'vendor/nikic/php-parser/lib/', 'vendor/phpdocumentor/reflection-docblock/', 'vendor/symfony/console/', 'vendor/symfony/filesystem/', 'vendor/symfony/finder/', 'vendor/symfony/var-dumper/', ], // A directory list that defines files that will be excluded // from static analysis, but whose class and method // information should be included. // // Generally, you'll want to include the directories for // third-party code (such as "vendor/") in this list. // // n.b.: If you'd like to parse but not analyze 3rd // party code, directories containing that code // should be added to both the `directory_list` // and `exclude_analysis_directory_list` arrays. "exclude_analysis_directory_list" => [ 'vendor/' ], ]; PK!gpsysh/.github/CONTRIBUTING.mdnuIw## Code style Please make your code look like the other code in the project. PsySH follows [PSR-1](http://php-fig.org/psr/psr-1/) and [PSR-2](http://php-fig.org/psr/psr-2/). The easiest way to do make sure you're following the coding standard is to [install `php-cs-fixer`](https://github.com/friendsofphp/php-cs-fixer) and run `php-cs-fixer fix` before committing. ## Branching model Please branch off and send pull requests to the `develop` branch. PK!9Zههpsysh/src/Configuration.phpnuIwsetColorMode(self::COLOR_MODE_AUTO); // explicit configFile option if (isset($config['configFile'])) { $this->configFile = $config['configFile']; } elseif ($configFile = \getenv('PSYSH_CONFIG')) { $this->configFile = $configFile; } // legacy baseDir option if (isset($config['baseDir'])) { $msg = "The 'baseDir' configuration option is deprecated; " . "please specify 'configDir' and 'dataDir' options instead"; throw new DeprecatedException($msg); } unset($config['configFile'], $config['baseDir']); // go go gadget, config! $this->loadConfig($config); $this->init(); } /** * Initialize the configuration. * * This checks for the presence of Readline and Pcntl extensions. * * If a config file is available, it will be loaded and merged with the current config. * * If no custom config file was specified and a local project config file * is available, it will be loaded and merged with the current config. */ public function init() { // feature detection $this->hasReadline = \function_exists('readline'); $this->hasPcntl = \function_exists('pcntl_signal') && \function_exists('posix_getpid'); if ($configFile = $this->getConfigFile()) { $this->loadConfigFile($configFile); } if (!$this->configFile && $localConfig = $this->getLocalConfigFile()) { $this->loadConfigFile($localConfig); } } /** * Get the current PsySH config file. * * If a `configFile` option was passed to the Configuration constructor, * this file will be returned. If not, all possible config directories will * be searched, and the first `config.php` or `rc.php` file which exists * will be returned. * * If you're trying to decide where to put your config file, pick * * ~/.config/psysh/config.php * * @return string */ public function getConfigFile() { if (isset($this->configFile)) { return $this->configFile; } $files = ConfigPaths::getConfigFiles(['config.php', 'rc.php'], $this->configDir); if (!empty($files)) { if ($this->warnOnMultipleConfigs && \count($files) > 1) { $msg = \sprintf('Multiple configuration files found: %s. Using %s', \implode($files, ', '), $files[0]); \trigger_error($msg, E_USER_NOTICE); } return $files[0]; } } /** * Get the local PsySH config file. * * Searches for a project specific config file `.psysh.php` in the current * working directory. * * @return string */ public function getLocalConfigFile() { $localConfig = \getcwd() . '/.psysh.php'; if (@\is_file($localConfig)) { return $localConfig; } } /** * Load configuration values from an array of options. * * @param array $options */ public function loadConfig(array $options) { foreach (self::$AVAILABLE_OPTIONS as $option) { if (isset($options[$option])) { $method = 'set' . \ucfirst($option); $this->$method($options[$option]); } } // legacy `tabCompletion` option if (isset($options['tabCompletion'])) { $msg = '`tabCompletion` is deprecated; use `useTabCompletion` instead.'; @\trigger_error($msg, E_USER_DEPRECATED); $this->setUseTabCompletion($options['tabCompletion']); } foreach (['commands', 'matchers', 'casters'] as $option) { if (isset($options[$option])) { $method = 'add' . \ucfirst($option); $this->$method($options[$option]); } } // legacy `tabCompletionMatchers` option if (isset($options['tabCompletionMatchers'])) { $msg = '`tabCompletionMatchers` is deprecated; use `matchers` instead.'; @\trigger_error($msg, E_USER_DEPRECATED); $this->addMatchers($options['tabCompletionMatchers']); } } /** * Load a configuration file (default: `$HOME/.config/psysh/config.php`). * * This configuration instance will be available to the config file as $config. * The config file may directly manipulate the configuration, or may return * an array of options which will be merged with the current configuration. * * @throws \InvalidArgumentException if the config file returns a non-array result * * @param string $file */ public function loadConfigFile($file) { $__psysh_config_file__ = $file; $load = function ($config) use ($__psysh_config_file__) { $result = require $__psysh_config_file__; if ($result !== 1) { return $result; } }; $result = $load($this); if (!empty($result)) { if (\is_array($result)) { $this->loadConfig($result); } else { throw new \InvalidArgumentException('Psy Shell configuration must return an array of options'); } } } /** * Set files to be included by default at the start of each shell session. * * @param array $includes */ public function setDefaultIncludes(array $includes = []) { $this->defaultIncludes = $includes; } /** * Get files to be included by default at the start of each shell session. * * @return array */ public function getDefaultIncludes() { return $this->defaultIncludes ?: []; } /** * Set the shell's config directory location. * * @param string $dir */ public function setConfigDir($dir) { $this->configDir = (string) $dir; } /** * Get the current configuration directory, if any is explicitly set. * * @return string */ public function getConfigDir() { return $this->configDir; } /** * Set the shell's data directory location. * * @param string $dir */ public function setDataDir($dir) { $this->dataDir = (string) $dir; } /** * Get the current data directory, if any is explicitly set. * * @return string */ public function getDataDir() { return $this->dataDir; } /** * Set the shell's temporary directory location. * * @param string $dir */ public function setRuntimeDir($dir) { $this->runtimeDir = (string) $dir; } /** * Get the shell's temporary directory location. * * Defaults to `/psysh` inside the system's temp dir unless explicitly * overridden. * * @return string */ public function getRuntimeDir() { if (!isset($this->runtimeDir)) { $this->runtimeDir = ConfigPaths::getRuntimeDir(); } if (!\is_dir($this->runtimeDir)) { \mkdir($this->runtimeDir, 0700, true); } return $this->runtimeDir; } /** * Set the readline history file path. * * @param string $file */ public function setHistoryFile($file) { $this->historyFile = ConfigPaths::touchFileWithMkdir($file); } /** * Get the readline history file path. * * Defaults to `/history` inside the shell's base config dir unless * explicitly overridden. * * @return string */ public function getHistoryFile() { if (isset($this->historyFile)) { return $this->historyFile; } $files = ConfigPaths::getConfigFiles(['psysh_history', 'history'], $this->configDir); if (!empty($files)) { if ($this->warnOnMultipleConfigs && \count($files) > 1) { $msg = \sprintf('Multiple history files found: %s. Using %s', \implode($files, ', '), $files[0]); \trigger_error($msg, E_USER_NOTICE); } $this->setHistoryFile($files[0]); } else { // fallback: create our own history file $dir = $this->configDir ?: ConfigPaths::getCurrentConfigDir(); $this->setHistoryFile($dir . '/psysh_history'); } return $this->historyFile; } /** * Set the readline max history size. * * @param int $value */ public function setHistorySize($value) { $this->historySize = (int) $value; } /** * Get the readline max history size. * * @return int */ public function getHistorySize() { return $this->historySize; } /** * Sets whether readline erases old duplicate history entries. * * @param bool $value */ public function setEraseDuplicates($value) { $this->eraseDuplicates = (bool) $value; } /** * Get whether readline erases old duplicate history entries. * * @return bool */ public function getEraseDuplicates() { return $this->eraseDuplicates; } /** * Get a temporary file of type $type for process $pid. * * The file will be created inside the current temporary directory. * * @see self::getRuntimeDir * * @param string $type * @param int $pid * * @return string Temporary file name */ public function getTempFile($type, $pid) { return \tempnam($this->getRuntimeDir(), $type . '_' . $pid . '_'); } /** * Get a filename suitable for a FIFO pipe of $type for process $pid. * * The pipe will be created inside the current temporary directory. * * @param string $type * @param int $pid * * @return string Pipe name */ public function getPipe($type, $pid) { return \sprintf('%s/%s_%s', $this->getRuntimeDir(), $type, $pid); } /** * Check whether this PHP instance has Readline available. * * @return bool True if Readline is available */ public function hasReadline() { return $this->hasReadline; } /** * Enable or disable Readline usage. * * @param bool $useReadline */ public function setUseReadline($useReadline) { $this->useReadline = (bool) $useReadline; } /** * Check whether to use Readline. * * If `setUseReadline` as been set to true, but Readline is not actually * available, this will return false. * * @return bool True if the current Shell should use Readline */ public function useReadline() { return isset($this->useReadline) ? ($this->hasReadline && $this->useReadline) : $this->hasReadline; } /** * Set the Psy Shell readline service. * * @param Readline $readline */ public function setReadline(Readline $readline) { $this->readline = $readline; } /** * Get the Psy Shell readline service. * * By default, this service uses (in order of preference): * * * GNU Readline * * Libedit * * A transient array-based readline emulation. * * @return Readline */ public function getReadline() { if (!isset($this->readline)) { $className = $this->getReadlineClass(); $this->readline = new $className( $this->getHistoryFile(), $this->getHistorySize(), $this->getEraseDuplicates() ); } return $this->readline; } /** * Get the appropriate Readline implementation class name. * * @see self::getReadline * * @return string */ private function getReadlineClass() { if ($this->useReadline()) { if (GNUReadline::isSupported()) { return 'Psy\Readline\GNUReadline'; } elseif (Libedit::isSupported()) { return 'Psy\Readline\Libedit'; } elseif (HoaConsole::isSupported()) { return 'Psy\Readline\HoaConsole'; } } return 'Psy\Readline\Transient'; } /** * Enable or disable bracketed paste. * * Note that this only works with readline (not libedit) integration for now. * * @param bool $useBracketedPaste */ public function setUseBracketedPaste($useBracketedPaste) { $this->useBracketedPaste = (bool) $useBracketedPaste; } /** * Check whether to use bracketed paste with readline. * * When this works, it's magical. Tabs in pastes don't try to autcomplete. * Newlines in paste don't execute code until you get to the end. It makes * readline act like you'd expect when pasting. * * But it often (usually?) does not work. And when it doesn't, it just spews * escape codes all over the place and generally makes things ugly :( * * If `useBracketedPaste` has been set to true, but the current readline * implementation is anything besides GNU readline, this will return false. * * @return bool True if the shell should use bracketed paste */ public function useBracketedPaste() { // For now, only the GNU readline implementation supports bracketed paste. $supported = ($this->getReadlineClass() === 'Psy\Readline\GNUReadline'); return $supported && $this->useBracketedPaste; // @todo mebbe turn this on by default some day? // return isset($this->useBracketedPaste) ? ($supported && $this->useBracketedPaste) : $supported; } /** * Check whether this PHP instance has Pcntl available. * * @return bool True if Pcntl is available */ public function hasPcntl() { return $this->hasPcntl; } /** * Enable or disable Pcntl usage. * * @param bool $usePcntl */ public function setUsePcntl($usePcntl) { $this->usePcntl = (bool) $usePcntl; } /** * Check whether to use Pcntl. * * If `setUsePcntl` has been set to true, but Pcntl is not actually * available, this will return false. * * @return bool True if the current Shell should use Pcntl */ public function usePcntl() { return isset($this->usePcntl) ? ($this->hasPcntl && $this->usePcntl) : $this->hasPcntl; } /** * Enable or disable strict requirement of semicolons. * * @see self::requireSemicolons() * * @param bool $requireSemicolons */ public function setRequireSemicolons($requireSemicolons) { $this->requireSemicolons = (bool) $requireSemicolons; } /** * Check whether to require semicolons on all statements. * * By default, PsySH will automatically insert semicolons at the end of * statements if they're missing. To strictly require semicolons, set * `requireSemicolons` to true. * * @return bool */ public function requireSemicolons() { return $this->requireSemicolons; } /** * Enable or disable Unicode in PsySH specific output. * * Note that this does not disable Unicode output in general, it just makes * it so PsySH won't output any itself. * * @param bool $useUnicode */ public function setUseUnicode($useUnicode) { $this->useUnicode = (bool) $useUnicode; } /** * Check whether to use Unicode in PsySH specific output. * * Note that this does not disable Unicode output in general, it just makes * it so PsySH won't output any itself. * * @return bool */ public function useUnicode() { if (isset($this->useUnicode)) { return $this->useUnicode; } // @todo detect `chsh` != 65001 on Windows and return false return true; } /** * Set the error logging level. * * @see self::errorLoggingLevel * * @param bool $errorLoggingLevel */ public function setErrorLoggingLevel($errorLoggingLevel) { $this->errorLoggingLevel = (E_ALL | E_STRICT) & $errorLoggingLevel; } /** * Get the current error logging level. * * By default, PsySH will automatically log all errors, regardless of the * current `error_reporting` level. Additionally, if the `error_reporting` * level warrants, an ErrorException will be thrown. * * Set `errorLoggingLevel` to 0 to prevent logging non-thrown errors. Set it * to any valid error_reporting value to log only errors which match that * level. * * http://php.net/manual/en/function.error-reporting.php * * @return int */ public function errorLoggingLevel() { return $this->errorLoggingLevel; } /** * Set a CodeCleaner service instance. * * @param CodeCleaner $cleaner */ public function setCodeCleaner(CodeCleaner $cleaner) { $this->cleaner = $cleaner; } /** * Get a CodeCleaner service instance. * * If none has been explicitly defined, this will create a new instance. * * @return CodeCleaner */ public function getCodeCleaner() { if (!isset($this->cleaner)) { $this->cleaner = new CodeCleaner(); } return $this->cleaner; } /** * Enable or disable tab completion. * * @param bool $useTabCompletion */ public function setUseTabCompletion($useTabCompletion) { $this->useTabCompletion = (bool) $useTabCompletion; } /** * @deprecated Call `setUseTabCompletion` instead * * @param bool $useTabCompletion */ public function setTabCompletion($useTabCompletion) { $this->setUseTabCompletion($useTabCompletion); } /** * Check whether to use tab completion. * * If `setUseTabCompletion` has been set to true, but readline is not * actually available, this will return false. * * @return bool True if the current Shell should use tab completion */ public function useTabCompletion() { return isset($this->useTabCompletion) ? ($this->hasReadline && $this->useTabCompletion) : $this->hasReadline; } /** * @deprecated Call `useTabCompletion` instead * * @return bool */ public function getTabCompletion() { return $this->useTabCompletion(); } /** * Set the Shell Output service. * * @param ShellOutput $output */ public function setOutput(ShellOutput $output) { $this->output = $output; } /** * Get a Shell Output service instance. * * If none has been explicitly provided, this will create a new instance * with VERBOSITY_NORMAL and the output page supplied by self::getPager * * @see self::getPager * * @return ShellOutput */ public function getOutput() { if (!isset($this->output)) { $this->output = new ShellOutput( OutputInterface::VERBOSITY_NORMAL, $this->getOutputDecorated(), null, $this->getPager() ); } return $this->output; } /** * Get the decoration (i.e. color) setting for the Shell Output service. * * @return null|bool 3-state boolean corresponding to the current color mode */ public function getOutputDecorated() { if ($this->colorMode() === self::COLOR_MODE_AUTO) { return; } elseif ($this->colorMode() === self::COLOR_MODE_FORCED) { return true; } elseif ($this->colorMode() === self::COLOR_MODE_DISABLED) { return false; } } /** * Set the OutputPager service. * * If a string is supplied, a ProcOutputPager will be used which shells out * to the specified command. * * @throws \InvalidArgumentException if $pager is not a string or OutputPager instance * * @param string|OutputPager $pager */ public function setPager($pager) { if ($pager && !\is_string($pager) && !$pager instanceof OutputPager) { throw new \InvalidArgumentException('Unexpected pager instance'); } $this->pager = $pager; } /** * Get an OutputPager instance or a command for an external Proc pager. * * If no Pager has been explicitly provided, and Pcntl is available, this * will default to `cli.pager` ini value, falling back to `which less`. * * @return string|OutputPager */ public function getPager() { if (!isset($this->pager) && $this->usePcntl()) { if ($pager = \ini_get('cli.pager')) { // use the default pager $this->pager = $pager; } elseif ($less = \exec('which less 2>/dev/null')) { // check for the presence of less... $this->pager = $less . ' -R -S -F -X'; } } return $this->pager; } /** * Set the Shell AutoCompleter service. * * @param AutoCompleter $autoCompleter */ public function setAutoCompleter(AutoCompleter $autoCompleter) { $this->autoCompleter = $autoCompleter; } /** * Get an AutoCompleter service instance. * * @return AutoCompleter */ public function getAutoCompleter() { if (!isset($this->autoCompleter)) { $this->autoCompleter = new AutoCompleter(); } return $this->autoCompleter; } /** * @deprecated Nothing should be using this anymore * * @return array */ public function getTabCompletionMatchers() { return []; } /** * Add tab completion matchers to the AutoCompleter. * * This will buffer new matchers in the event that the Shell has not yet * been instantiated. This allows the user to specify matchers in their * config rc file, despite the fact that their file is needed in the Shell * constructor. * * @param array $matchers */ public function addMatchers(array $matchers) { $this->newMatchers = \array_merge($this->newMatchers, $matchers); if (isset($this->shell)) { $this->doAddMatchers(); } } /** * Internal method for adding tab completion matchers. This will set any new * matchers once a Shell is available. */ private function doAddMatchers() { if (!empty($this->newMatchers)) { $this->shell->addMatchers($this->newMatchers); $this->newMatchers = []; } } /** * @deprecated Use `addMatchers` instead * * @param array $matchers */ public function addTabCompletionMatchers(array $matchers) { $this->addMatchers($matchers); } /** * Add commands to the Shell. * * This will buffer new commands in the event that the Shell has not yet * been instantiated. This allows the user to specify commands in their * config rc file, despite the fact that their file is needed in the Shell * constructor. * * @param array $commands */ public function addCommands(array $commands) { $this->newCommands = \array_merge($this->newCommands, $commands); if (isset($this->shell)) { $this->doAddCommands(); } } /** * Internal method for adding commands. This will set any new commands once * a Shell is available. */ private function doAddCommands() { if (!empty($this->newCommands)) { $this->shell->addCommands($this->newCommands); $this->newCommands = []; } } /** * Set the Shell backreference and add any new commands to the Shell. * * @param Shell $shell */ public function setShell(Shell $shell) { $this->shell = $shell; $this->doAddCommands(); $this->doAddMatchers(); } /** * Set the PHP manual database file. * * This file should be an SQLite database generated from the phpdoc source * with the `bin/build_manual` script. * * @param string $filename */ public function setManualDbFile($filename) { $this->manualDbFile = (string) $filename; } /** * Get the current PHP manual database file. * * @return string Default: '~/.local/share/psysh/php_manual.sqlite' */ public function getManualDbFile() { if (isset($this->manualDbFile)) { return $this->manualDbFile; } $files = ConfigPaths::getDataFiles(['php_manual.sqlite'], $this->dataDir); if (!empty($files)) { if ($this->warnOnMultipleConfigs && \count($files) > 1) { $msg = \sprintf('Multiple manual database files found: %s. Using %s', \implode($files, ', '), $files[0]); \trigger_error($msg, E_USER_NOTICE); } return $this->manualDbFile = $files[0]; } } /** * Get a PHP manual database connection. * * @return \PDO */ public function getManualDb() { if (!isset($this->manualDb)) { $dbFile = $this->getManualDbFile(); if (\is_file($dbFile)) { try { $this->manualDb = new \PDO('sqlite:' . $dbFile); } catch (\PDOException $e) { if ($e->getMessage() === 'could not find driver') { throw new RuntimeException('SQLite PDO driver not found', 0, $e); } else { throw $e; } } } } return $this->manualDb; } /** * Add an array of casters definitions. * * @param array $casters */ public function addCasters(array $casters) { $this->getPresenter()->addCasters($casters); } /** * Get the Presenter service. * * @return Presenter */ public function getPresenter() { if (!isset($this->presenter)) { $this->presenter = new Presenter($this->getOutput()->getFormatter(), $this->forceArrayIndexes()); } return $this->presenter; } /** * Enable or disable warnings on multiple configuration or data files. * * @see self::warnOnMultipleConfigs() * * @param bool $warnOnMultipleConfigs */ public function setWarnOnMultipleConfigs($warnOnMultipleConfigs) { $this->warnOnMultipleConfigs = (bool) $warnOnMultipleConfigs; } /** * Check whether to warn on multiple configuration or data files. * * By default, PsySH will use the file with highest precedence, and will * silently ignore all others. With this enabled, a warning will be emitted * (but not an exception thrown) if multiple configuration or data files * are found. * * This will default to true in a future release, but is false for now. * * @return bool */ public function warnOnMultipleConfigs() { return $this->warnOnMultipleConfigs; } /** * Set the current color mode. * * @param string $colorMode */ public function setColorMode($colorMode) { $validColorModes = [ self::COLOR_MODE_AUTO, self::COLOR_MODE_FORCED, self::COLOR_MODE_DISABLED, ]; if (\in_array($colorMode, $validColorModes)) { $this->colorMode = $colorMode; } else { throw new \InvalidArgumentException('invalid color mode: ' . $colorMode); } } /** * Get the current color mode. * * @return string */ public function colorMode() { return $this->colorMode; } /** * Set an update checker service instance. * * @param Checker $checker */ public function setChecker(Checker $checker) { $this->checker = $checker; } /** * Get an update checker service instance. * * If none has been explicitly defined, this will create a new instance. * * @return Checker */ public function getChecker() { if (!isset($this->checker)) { $interval = $this->getUpdateCheck(); switch ($interval) { case Checker::ALWAYS: $this->checker = new GitHubChecker(); break; case Checker::DAILY: case Checker::WEEKLY: case Checker::MONTHLY: $checkFile = $this->getUpdateCheckCacheFile(); if ($checkFile === false) { $this->checker = new NoopChecker(); } else { $this->checker = new IntervalChecker($checkFile, $interval); } break; case Checker::NEVER: $this->checker = new NoopChecker(); break; } } return $this->checker; } /** * Get the current update check interval. * * One of 'always', 'daily', 'weekly', 'monthly' or 'never'. If none is * explicitly set, default to 'weekly'. * * @return string */ public function getUpdateCheck() { return isset($this->updateCheck) ? $this->updateCheck : Checker::WEEKLY; } /** * Set the update check interval. * * @throws \InvalidArgumentDescription if the update check interval is unknown * * @param string $interval */ public function setUpdateCheck($interval) { $validIntervals = [ Checker::ALWAYS, Checker::DAILY, Checker::WEEKLY, Checker::MONTHLY, Checker::NEVER, ]; if (!\in_array($interval, $validIntervals)) { throw new \InvalidArgumentException('invalid update check interval: ' . $interval); } $this->updateCheck = $interval; } /** * Get a cache file path for the update checker. * * @return string|false Return false if config file/directory is not writable */ public function getUpdateCheckCacheFile() { $dir = $this->configDir ?: ConfigPaths::getCurrentConfigDir(); return ConfigPaths::touchFileWithMkdir($dir . '/update_check.json'); } /** * Set the startup message. * * @param string $message */ public function setStartupMessage($message) { $this->startupMessage = $message; } /** * Get the startup message. * * @return string|null */ public function getStartupMessage() { return $this->startupMessage; } /** * Set the prompt. * * @param string $prompt */ public function setPrompt($prompt) { $this->prompt = $prompt; } /** * Get the prompt. * * @return string */ public function getPrompt() { return $this->prompt; } /** * Get the force array indexes. * * @return bool */ public function forceArrayIndexes() { return $this->forceArrayIndexes; } /** * Set the force array indexes. * * @param bool $forceArrayIndexes */ public function setForceArrayIndexes($forceArrayIndexes) { $this->forceArrayIndexes = $forceArrayIndexes; } } PK! psysh/src/ExecutionClosure.phpnuIwsetClosure($__psysh__, function () use ($__psysh__) { try { // Restore execution scope variables \extract($__psysh__->getScopeVariables(false)); // Buffer stdout; we'll need it later \ob_start([$__psysh__, 'writeStdout'], 1); // Convert all errors to exceptions \set_error_handler([$__psysh__, 'handleError']); // Evaluate the current code buffer $_ = eval($__psysh__->onExecute($__psysh__->flushCode() ?: ExecutionClosure::NOOP_INPUT)); } catch (\Throwable $_e) { // Clean up on our way out. \restore_error_handler(); if (\ob_get_level() > 0) { \ob_end_clean(); } throw $_e; } catch (\Exception $_e) { // Clean up on our way out. \restore_error_handler(); if (\ob_get_level() > 0) { \ob_end_clean(); } throw $_e; } // Won't be needing this anymore \restore_error_handler(); // Flush stdout (write to shell output, plus save to magic variable) \ob_end_flush(); // Save execution scope variables for next time $__psysh__->setScopeVariables(\get_defined_vars()); return $_; }); } /** * Set the closure instance. * * @param Shell $psysh * @param \Closure $closure */ protected function setClosure(Shell $shell, \Closure $closure) { if (self::shouldBindClosure()) { $that = $shell->getBoundObject(); if (\is_object($that)) { $closure = $closure->bindTo($that, \get_class($that)); } else { $closure = $closure->bindTo(null, $shell->getBoundClass()); } } $this->closure = $closure; } /** * Go go gadget closure. * * @return mixed */ public function execute() { $closure = $this->closure; return $closure(); } /** * Decide whether to bind the execution closure. * * @return bool */ protected static function shouldBindClosure() { // skip binding on HHVM < 3.5.0 // see https://github.com/facebook/hhvm/issues/1203 if (\defined('HHVM_VERSION')) { return \version_compare(HHVM_VERSION, '3.5.0', '>='); } return true; } } PK!A[-N0N0psysh/src/functions.phpnuIwsetScopeVariables($vars); // Show a couple of lines of call context for the debug session. // // @todo come up with a better way of doing this which doesn't involve injecting input :-P if ($sh->has('whereami')) { $sh->addInput('whereami -n2', true); } if (\is_string($bindTo)) { $sh->setBoundClass($bindTo); } elseif ($bindTo !== null) { $sh->setBoundObject($bindTo); } $sh->run(); return $sh->getScopeVariables(false); } } if (!\function_exists('Psy\info')) { /** * Get a bunch of debugging info about the current PsySH environment and * configuration. * * If a Configuration param is passed, that configuration is stored and * used for the current shell session, and no debugging info is returned. * * @param Configuration|null $config * * @return array|null */ function info(Configuration $config = null) { static $lastConfig; if ($config !== null) { $lastConfig = $config; return; } $xdg = new Xdg(); $home = \rtrim(\str_replace('\\', '/', $xdg->getHomeDir()), '/'); $homePattern = '#^' . \preg_quote($home, '#') . '/#'; $prettyPath = function ($path) use ($homePattern) { if (\is_string($path)) { return \preg_replace($homePattern, '~/', $path); } else { return $path; } }; $config = $lastConfig ?: new Configuration(); $core = [ 'PsySH version' => Shell::VERSION, 'PHP version' => PHP_VERSION, 'OS' => PHP_OS, 'default includes' => $config->getDefaultIncludes(), 'require semicolons' => $config->requireSemicolons(), 'error logging level' => $config->errorLoggingLevel(), 'config file' => [ 'default config file' => $prettyPath($config->getConfigFile()), 'local config file' => $prettyPath($config->getLocalConfigFile()), 'PSYSH_CONFIG env' => $prettyPath(\getenv('PSYSH_CONFIG')), ], // 'config dir' => $config->getConfigDir(), // 'data dir' => $config->getDataDir(), // 'runtime dir' => $config->getRuntimeDir(), ]; // Use an explicit, fresh update check here, rather than relying on whatever is in $config. $checker = new GitHubChecker(); $updateAvailable = null; $latest = null; try { $updateAvailable = !$checker->isLatest(); $latest = $checker->getLatest(); } catch (\Exception $e) { } $updates = [ 'update available' => $updateAvailable, 'latest release version' => $latest, 'update check interval' => $config->getUpdateCheck(), 'update cache file' => $prettyPath($config->getUpdateCheckCacheFile()), ]; if ($config->hasReadline()) { $info = \readline_info(); $readline = [ 'readline available' => true, 'readline enabled' => $config->useReadline(), 'readline service' => \get_class($config->getReadline()), ]; if (isset($info['library_version'])) { $readline['readline library'] = $info['library_version']; } if (isset($info['readline_name']) && $info['readline_name'] !== '') { $readline['readline name'] = $info['readline_name']; } } else { $readline = [ 'readline available' => false, ]; } $pcntl = [ 'pcntl available' => \function_exists('pcntl_signal'), 'posix available' => \function_exists('posix_getpid'), ]; $disabledFuncs = \array_map('trim', \explode(',', \ini_get('disable_functions'))); if (\in_array('pcntl_signal', $disabledFuncs) || \in_array('pcntl_fork', $disabledFuncs)) { $pcntl['pcntl disabled'] = true; } $history = [ 'history file' => $prettyPath($config->getHistoryFile()), 'history size' => $config->getHistorySize(), 'erase duplicates' => $config->getEraseDuplicates(), ]; $docs = [ 'manual db file' => $prettyPath($config->getManualDbFile()), 'sqlite available' => true, ]; try { if ($db = $config->getManualDb()) { if ($q = $db->query('SELECT * FROM meta;')) { $q->setFetchMode(\PDO::FETCH_KEY_PAIR); $meta = $q->fetchAll(); foreach ($meta as $key => $val) { switch ($key) { case 'built_at': $d = new \DateTime('@' . $val); $val = $d->format(\DateTime::RFC2822); break; } $key = 'db ' . \str_replace('_', ' ', $key); $docs[$key] = $val; } } else { $docs['db schema'] = '0.1.0'; } } } catch (Exception\RuntimeException $e) { if ($e->getMessage() === 'SQLite PDO driver not found') { $docs['sqlite available'] = false; } else { throw $e; } } $autocomplete = [ 'tab completion enabled' => $config->useTabCompletion(), 'custom matchers' => \array_map('get_class', $config->getTabCompletionMatchers()), 'bracketed paste' => $config->useBracketedPaste(), ]; // Shenanigans, but totally justified. if ($shell = Sudo::fetchProperty($config, 'shell')) { $core['loop listeners'] = \array_map('get_class', Sudo::fetchProperty($shell, 'loopListeners')); $core['commands'] = \array_map('get_class', $shell->all()); $autocomplete['custom matchers'] = \array_map('get_class', Sudo::fetchProperty($shell, 'matchers')); } // @todo Show Presenter / custom casters. return \array_merge($core, \compact('updates', 'pcntl', 'readline', 'history', 'docs', 'autocomplete')); } } if (!\function_exists('Psy\bin')) { /** * `psysh` command line executable. * * @return \Closure */ function bin() { return function () { $usageException = null; $input = new ArgvInput(); try { $input->bind(new InputDefinition([ new InputOption('help', 'h', InputOption::VALUE_NONE), new InputOption('config', 'c', InputOption::VALUE_REQUIRED), new InputOption('version', 'v', InputOption::VALUE_NONE), new InputOption('cwd', null, InputOption::VALUE_REQUIRED), new InputOption('color', null, InputOption::VALUE_NONE), new InputOption('no-color', null, InputOption::VALUE_NONE), new InputArgument('include', InputArgument::IS_ARRAY), ])); } catch (\RuntimeException $e) { $usageException = $e; } $config = []; // Handle --config if ($configFile = $input->getOption('config')) { $config['configFile'] = $configFile; } // Handle --color and --no-color if ($input->getOption('color') && $input->getOption('no-color')) { $usageException = new \RuntimeException('Using both "--color" and "--no-color" options is invalid'); } elseif ($input->getOption('color')) { $config['colorMode'] = Configuration::COLOR_MODE_FORCED; } elseif ($input->getOption('no-color')) { $config['colorMode'] = Configuration::COLOR_MODE_DISABLED; } $shell = new Shell(new Configuration($config)); // Handle --help if ($usageException !== null || $input->getOption('help')) { if ($usageException !== null) { echo $usageException->getMessage() . PHP_EOL . PHP_EOL; } $version = $shell->getVersion(); $name = \basename(\reset($_SERVER['argv'])); echo <<getOption('version')) { echo $shell->getVersion() . PHP_EOL; exit(0); } // Pass additional arguments to Shell as 'includes' $shell->setIncludes($input->getArgument('include')); try { // And go! $shell->run(); } catch (\Exception $e) { echo $e->getMessage() . PHP_EOL; // @todo this triggers the "exited unexpectedly" logic in the // ForkingLoop, so we can't exit(1) after starting the shell... // fix this :) // exit(1); } }; } } PK!OOpsysh/src/Shell.phpnuIwrun(); * * @author Justin Hileman */ class Shell extends Application { const VERSION = 'v0.9.12'; const PROMPT = '>>> '; const BUFF_PROMPT = '... '; const REPLAY = '--> '; const RETVAL = '=> '; private $config; private $cleaner; private $output; private $readline; private $inputBuffer; private $code; private $codeBuffer; private $codeBufferOpen; private $codeStack; private $stdoutBuffer; private $context; private $includes; private $loop; private $outputWantsNewline = false; private $prompt; private $loopListeners; private $autoCompleter; private $matchers = []; private $commandsMatcher; private $lastExecSuccess = true; /** * Create a new Psy Shell. * * @param Configuration $config (default: null) */ public function __construct(Configuration $config = null) { $this->config = $config ?: new Configuration(); $this->cleaner = $this->config->getCodeCleaner(); $this->loop = new ExecutionLoop(); $this->context = new Context(); $this->includes = []; $this->readline = $this->config->getReadline(); $this->inputBuffer = []; $this->codeStack = []; $this->stdoutBuffer = ''; $this->loopListeners = $this->getDefaultLoopListeners(); parent::__construct('Psy Shell', self::VERSION); $this->config->setShell($this); // Register the current shell session's config with \Psy\info \Psy\info($this->config); } /** * Check whether the first thing in a backtrace is an include call. * * This is used by the psysh bin to decide whether to start a shell on boot, * or to simply autoload the library. */ public static function isIncluded(array $trace) { return isset($trace[0]['function']) && \in_array($trace[0]['function'], ['require', 'include', 'require_once', 'include_once']); } /** * Invoke a Psy Shell from the current context. * * @see Psy\debug * @deprecated will be removed in 1.0. Use \Psy\debug instead * * @param array $vars Scope variables from the calling context (default: array()) * @param object|string $bindTo Bound object ($this) or class (self) value for the shell * * @return array Scope variables from the debugger session */ public static function debug(array $vars = [], $bindTo = null) { return \Psy\debug($vars, $bindTo); } /** * Adds a command object. * * {@inheritdoc} * * @param BaseCommand $command A Symfony Console Command object * * @return BaseCommand The registered command */ public function add(BaseCommand $command) { if ($ret = parent::add($command)) { if ($ret instanceof ContextAware) { $ret->setContext($this->context); } if ($ret instanceof PresenterAware) { $ret->setPresenter($this->config->getPresenter()); } if (isset($this->commandsMatcher)) { $this->commandsMatcher->setCommands($this->all()); } } return $ret; } /** * Gets the default input definition. * * @return InputDefinition An InputDefinition instance */ protected function getDefaultInputDefinition() { return new InputDefinition([ new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message.'), ]); } /** * Gets the default commands that should always be available. * * @return array An array of default Command instances */ protected function getDefaultCommands() { $sudo = new Command\SudoCommand(); $sudo->setReadline($this->readline); $hist = new Command\HistoryCommand(); $hist->setReadline($this->readline); return [ new Command\HelpCommand(), new Command\ListCommand(), new Command\DumpCommand(), new Command\DocCommand(), new Command\ShowCommand($this->config->colorMode()), new Command\WtfCommand($this->config->colorMode()), new Command\WhereamiCommand($this->config->colorMode()), new Command\ThrowUpCommand(), new Command\TimeitCommand(), new Command\TraceCommand(), new Command\BufferCommand(), new Command\ClearCommand(), new Command\EditCommand($this->config->getRuntimeDir()), // new Command\PsyVersionCommand(), $sudo, $hist, new Command\ExitCommand(), ]; } /** * @return array */ protected function getDefaultMatchers() { // Store the Commands Matcher for later. If more commands are added, // we'll update the Commands Matcher too. $this->commandsMatcher = new Matcher\CommandsMatcher($this->all()); return [ $this->commandsMatcher, new Matcher\KeywordsMatcher(), new Matcher\VariablesMatcher(), new Matcher\ConstantsMatcher(), new Matcher\FunctionsMatcher(), new Matcher\ClassNamesMatcher(), new Matcher\ClassMethodsMatcher(), new Matcher\ClassAttributesMatcher(), new Matcher\ObjectMethodsMatcher(), new Matcher\ObjectAttributesMatcher(), new Matcher\ClassMethodDefaultParametersMatcher(), new Matcher\ObjectMethodDefaultParametersMatcher(), new Matcher\FunctionDefaultParametersMatcher(), ]; } /** * @deprecated Nothing should use this anymore */ protected function getTabCompletionMatchers() { @\trigger_error('getTabCompletionMatchers is no longer used', E_USER_DEPRECATED); } /** * Gets the default command loop listeners. * * @return array An array of Execution Loop Listener instances */ protected function getDefaultLoopListeners() { $listeners = []; if (ProcessForker::isSupported() && $this->config->usePcntl()) { $listeners[] = new ProcessForker(); } if (RunkitReloader::isSupported()) { $listeners[] = new RunkitReloader(); } return $listeners; } /** * Add tab completion matchers. * * @param array $matchers */ public function addMatchers(array $matchers) { $this->matchers = \array_merge($this->matchers, $matchers); if (isset($this->autoCompleter)) { $this->addMatchersToAutoCompleter($matchers); } } /** * @deprecated Call `addMatchers` instead * * @param array $matchers */ public function addTabCompletionMatchers(array $matchers) { $this->addMatchers($matchers); } /** * Set the Shell output. * * @param OutputInterface $output */ public function setOutput(OutputInterface $output) { $this->output = $output; } /** * Runs the current application. * * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * * @return int 0 if everything went fine, or an error code */ public function run(InputInterface $input = null, OutputInterface $output = null) { $this->initializeTabCompletion(); if ($input === null && !isset($_SERVER['argv'])) { $input = new ArgvInput([]); } if ($output === null) { $output = $this->config->getOutput(); } try { return parent::run($input, $output); } catch (\Exception $e) { $this->writeException($e); } return 1; } /** * Runs the current application. * * @throws Exception if thrown via the `throw-up` command * * @param InputInterface $input An Input instance * @param OutputInterface $output An Output instance * * @return int 0 if everything went fine, or an error code */ public function doRun(InputInterface $input, OutputInterface $output) { $this->setOutput($output); $this->resetCodeBuffer(); $this->setAutoExit(false); $this->setCatchExceptions(false); $this->readline->readHistory(); $this->output->writeln($this->getHeader()); $this->writeVersionInfo(); $this->writeStartupMessage(); try { $this->beforeRun(); $this->loop->run($this); $this->afterRun(); } catch (ThrowUpException $e) { throw $e->getPrevious(); } catch (BreakException $e) { // The ProcessForker throws a BreakException to finish the main thread. return; } } /** * Read user input. * * This will continue fetching user input until the code buffer contains * valid code. * * @throws BreakException if user hits Ctrl+D */ public function getInput() { $this->codeBufferOpen = false; do { // reset output verbosity (in case it was altered by a subcommand) $this->output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); $input = $this->readline(); /* * Handle Ctrl+D. It behaves differently in different cases: * * 1) In an expression, like a function or "if" block, clear the input buffer * 2) At top-level session, behave like the exit command */ if ($input === false) { $this->output->writeln(''); if ($this->hasCode()) { $this->resetCodeBuffer(); } else { throw new BreakException('Ctrl+D'); } } // handle empty input if (\trim($input) === '' && !$this->codeBufferOpen) { continue; } $input = $this->onInput($input); // If the input isn't in an open string or comment, check for commands to run. if ($this->hasCommand($input) && !$this->inputInOpenStringOrComment($input)) { $this->addHistory($input); $this->runCommand($input); continue; } $this->addCode($input); } while (!$this->hasValidCode()); } /** * Check whether the code buffer (plus current input) is in an open string or comment. * * @param string $input current line of input * * @return bool true if the input is in an open string or comment */ private function inputInOpenStringOrComment($input) { if (!$this->hasCode()) { return; } $code = $this->codeBuffer; \array_push($code, $input); $tokens = @\token_get_all('loopListeners as $listener) { $listener->beforeRun($this); } } /** * Run execution loop listeners at the start of each loop. */ public function beforeLoop() { foreach ($this->loopListeners as $listener) { $listener->beforeLoop($this); } } /** * Run execution loop listeners on user input. * * @param string $input * * @return string */ public function onInput($input) { foreach ($this->loopListeners as $listeners) { if (($return = $listeners->onInput($this, $input)) !== null) { $input = $return; } } return $input; } /** * Run execution loop listeners on code to be executed. * * @param string $code * * @return string */ public function onExecute($code) { foreach ($this->loopListeners as $listener) { if (($return = $listener->onExecute($this, $code)) !== null) { $code = $return; } } return $code; } /** * Run execution loop listeners after each loop. */ public function afterLoop() { foreach ($this->loopListeners as $listener) { $listener->afterLoop($this); } } /** * Run execution loop listers after the shell session. */ protected function afterRun() { foreach ($this->loopListeners as $listener) { $listener->afterRun($this); } } /** * Set the variables currently in scope. * * @param array $vars */ public function setScopeVariables(array $vars) { $this->context->setAll($vars); } /** * Return the set of variables currently in scope. * * @param bool $includeBoundObject Pass false to exclude 'this'. If you're * passing the scope variables to `extract` * in PHP 7.1+, you _must_ exclude 'this' * * @return array Associative array of scope variables */ public function getScopeVariables($includeBoundObject = true) { $vars = $this->context->getAll(); if (!$includeBoundObject) { unset($vars['this']); } return $vars; } /** * Return the set of magic variables currently in scope. * * @param bool $includeBoundObject Pass false to exclude 'this'. If you're * passing the scope variables to `extract` * in PHP 7.1+, you _must_ exclude 'this' * * @return array Associative array of magic scope variables */ public function getSpecialScopeVariables($includeBoundObject = true) { $vars = $this->context->getSpecialVariables(); if (!$includeBoundObject) { unset($vars['this']); } return $vars; } /** * Return the set of variables currently in scope which differ from the * values passed as $currentVars. * * This is used inside the Execution Loop Closure to pick up scope variable * changes made by commands while the loop is running. * * @param array $currentVars * * @return array Associative array of scope variables which differ from $currentVars */ public function getScopeVariablesDiff(array $currentVars) { $newVars = []; foreach ($this->getScopeVariables(false) as $key => $value) { if (!array_key_exists($key, $currentVars) || $currentVars[$key] !== $value) { $newVars[$key] = $value; } } return $newVars; } /** * Get the set of unused command-scope variable names. * * @return array Array of unused variable names */ public function getUnusedCommandScopeVariableNames() { return $this->context->getUnusedCommandScopeVariableNames(); } /** * Get the set of variable names currently in scope. * * @return array Array of variable names */ public function getScopeVariableNames() { return \array_keys($this->context->getAll()); } /** * Get a scope variable value by name. * * @param string $name * * @return mixed */ public function getScopeVariable($name) { return $this->context->get($name); } /** * Set the bound object ($this variable) for the interactive shell. * * @param object|null $boundObject */ public function setBoundObject($boundObject) { $this->context->setBoundObject($boundObject); } /** * Get the bound object ($this variable) for the interactive shell. * * @return object|null */ public function getBoundObject() { return $this->context->getBoundObject(); } /** * Set the bound class (self) for the interactive shell. * * @param string|null $boundClass */ public function setBoundClass($boundClass) { $this->context->setBoundClass($boundClass); } /** * Get the bound class (self) for the interactive shell. * * @return string|null */ public function getBoundClass() { return $this->context->getBoundClass(); } /** * Add includes, to be parsed and executed before running the interactive shell. * * @param array $includes */ public function setIncludes(array $includes = []) { $this->includes = $includes; } /** * Get PHP files to be parsed and executed before running the interactive shell. * * @return array */ public function getIncludes() { return \array_merge($this->config->getDefaultIncludes(), $this->includes); } /** * Check whether this shell's code buffer contains code. * * @return bool True if the code buffer contains code */ public function hasCode() { return !empty($this->codeBuffer); } /** * Check whether the code in this shell's code buffer is valid. * * If the code is valid, the code buffer should be flushed and evaluated. * * @return bool True if the code buffer content is valid */ protected function hasValidCode() { return !$this->codeBufferOpen && $this->code !== false; } /** * Add code to the code buffer. * * @param string $code * @param bool $silent */ public function addCode($code, $silent = false) { try { // Code lines ending in \ keep the buffer open if (\substr(\rtrim($code), -1) === '\\') { $this->codeBufferOpen = true; $code = \substr(\rtrim($code), 0, -1); } else { $this->codeBufferOpen = false; } $this->codeBuffer[] = $silent ? new SilentInput($code) : $code; $this->code = $this->cleaner->clean($this->codeBuffer, $this->config->requireSemicolons()); } catch (\Exception $e) { // Add failed code blocks to the readline history. $this->addCodeBufferToHistory(); throw $e; } } /** * Set the code buffer. * * This is mostly used by `Shell::execute`. Any existing code in the input * buffer is pushed onto a stack and will come back after this new code is * executed. * * @throws \InvalidArgumentException if $code isn't a complete statement * * @param string $code * @param bool $silent */ private function setCode($code, $silent = false) { if ($this->hasCode()) { $this->codeStack[] = [$this->codeBuffer, $this->codeBufferOpen, $this->code]; } $this->resetCodeBuffer(); try { $this->addCode($code, $silent); } catch (\Throwable $e) { $this->popCodeStack(); throw $e; } catch (\Exception $e) { $this->popCodeStack(); throw $e; } if (!$this->hasValidCode()) { $this->popCodeStack(); throw new \InvalidArgumentException('Unexpected end of input'); } } /** * Get the current code buffer. * * This is useful for commands which manipulate the buffer. * * @return array */ public function getCodeBuffer() { return $this->codeBuffer; } /** * Run a Psy Shell command given the user input. * * @throws InvalidArgumentException if the input is not a valid command * * @param string $input User input string * * @return mixed Who knows? */ protected function runCommand($input) { $command = $this->getCommand($input); if (empty($command)) { throw new \InvalidArgumentException('Command not found: ' . $input); } $input = new ShellInput(\str_replace('\\', '\\\\', \rtrim($input, " \t\n\r\0\x0B;"))); if ($input->hasParameterOption(['--help', '-h'])) { $helpCommand = $this->get('help'); $helpCommand->setCommand($command); return $helpCommand->run($input, $this->output); } return $command->run($input, $this->output); } /** * Reset the current code buffer. * * This should be run after evaluating user input, catching exceptions, or * on demand by commands such as BufferCommand. */ public function resetCodeBuffer() { $this->codeBuffer = []; $this->code = false; } /** * Inject input into the input buffer. * * This is useful for commands which want to replay history. * * @param string|array $input * @param bool $silent */ public function addInput($input, $silent = false) { foreach ((array) $input as $line) { $this->inputBuffer[] = $silent ? new SilentInput($line) : $line; } } /** * Flush the current (valid) code buffer. * * If the code buffer is valid, resets the code buffer and returns the * current code. * * @return string PHP code buffer contents */ public function flushCode() { if ($this->hasValidCode()) { $this->addCodeBufferToHistory(); $code = $this->code; $this->popCodeStack(); return $code; } } /** * Reset the code buffer and restore any code pushed during `execute` calls. */ private function popCodeStack() { $this->resetCodeBuffer(); if (empty($this->codeStack)) { return; } list($codeBuffer, $codeBufferOpen, $code) = \array_pop($this->codeStack); $this->codeBuffer = $codeBuffer; $this->codeBufferOpen = $codeBufferOpen; $this->code = $code; } /** * (Possibly) add a line to the readline history. * * Like Bash, if the line starts with a space character, it will be omitted * from history. Note that an entire block multi-line code input will be * omitted iff the first line begins with a space. * * Additionally, if a line is "silent", i.e. it was initially added with the * silent flag, it will also be omitted. * * @param string|SilentInput $line */ private function addHistory($line) { if ($line instanceof SilentInput) { return; } // Skip empty lines and lines starting with a space if (\trim($line) !== '' && \substr($line, 0, 1) !== ' ') { $this->readline->addHistory($line); } } /** * Filter silent input from code buffer, write the rest to readline history. */ private function addCodeBufferToHistory() { $codeBuffer = \array_filter($this->codeBuffer, function ($line) { return !$line instanceof SilentInput; }); $this->addHistory(\implode("\n", $codeBuffer)); } /** * Get the current evaluation scope namespace. * * @see CodeCleaner::getNamespace * * @return string Current code namespace */ public function getNamespace() { if ($namespace = $this->cleaner->getNamespace()) { return \implode('\\', $namespace); } } /** * Write a string to stdout. * * This is used by the shell loop for rendering output from evaluated code. * * @param string $out * @param int $phase Output buffering phase */ public function writeStdout($out, $phase = PHP_OUTPUT_HANDLER_END) { $isCleaning = $phase & PHP_OUTPUT_HANDLER_CLEAN; // Incremental flush if ($out !== '' && !$isCleaning) { $this->output->write($out, false, OutputInterface::OUTPUT_RAW); $this->outputWantsNewline = (\substr($out, -1) !== "\n"); $this->stdoutBuffer .= $out; } // Output buffering is done! if ($phase & PHP_OUTPUT_HANDLER_END) { // Write an extra newline if stdout didn't end with one if ($this->outputWantsNewline) { $this->output->writeln(\sprintf('', $this->config->useUnicode() ? '⏎' : '\\n')); $this->outputWantsNewline = false; } // Save the stdout buffer as $__out if ($this->stdoutBuffer !== '') { $this->context->setLastStdout($this->stdoutBuffer); $this->stdoutBuffer = ''; } } } /** * Write a return value to stdout. * * The return value is formatted or pretty-printed, and rendered in a * visibly distinct manner (in this case, as cyan). * * @see self::presentValue * * @param mixed $ret */ public function writeReturnValue($ret) { $this->lastExecSuccess = true; if ($ret instanceof NoReturnValue) { return; } $this->context->setReturnValue($ret); $ret = $this->presentValue($ret); $indent = \str_repeat(' ', \strlen(static::RETVAL)); $this->output->writeln(static::RETVAL . \str_replace(PHP_EOL, PHP_EOL . $indent, $ret)); } /** * Renders a caught Exception. * * Exceptions are formatted according to severity. ErrorExceptions which were * warnings or Strict errors aren't rendered as harshly as real errors. * * Stores $e as the last Exception in the Shell Context. * * @param \Exception $e An exception instance */ public function writeException(\Exception $e) { $this->lastExecSuccess = false; $this->context->setLastException($e); $this->output->writeln($this->formatException($e)); $this->resetCodeBuffer(); } /** * Check whether the last exec was successful. * * Returns true if a return value was logged rather than an exception. * * @return bool */ public function getLastExecSuccess() { return $this->lastExecSuccess; } /** * Helper for formatting an exception for writeException(). * * @todo extract this to somewhere it makes more sense * * @param \Exception $e * * @return string */ public function formatException(\Exception $e) { $message = $e->getMessage(); if (!$e instanceof PsyException) { if ($message === '') { $message = \get_class($e); } else { $message = \sprintf('%s with message \'%s\'', \get_class($e), $message); } } $message = \preg_replace( "#(\\w:)?(/\\w+)*/src/Execution(?:Loop)?Closure.php\(\d+\) : eval\(\)'d code#", "eval()'d code", \str_replace('\\', '/', $message) ); $message = \str_replace(" in eval()'d code", ' in Psy Shell code', $message); $severity = ($e instanceof \ErrorException) ? $this->getSeverity($e) : 'error'; return \sprintf('<%s>%s', $severity, OutputFormatter::escape($message), $severity); } /** * Helper for getting an output style for the given ErrorException's level. * * @param \ErrorException $e * * @return string */ protected function getSeverity(\ErrorException $e) { $severity = $e->getSeverity(); if ($severity & \error_reporting()) { switch ($severity) { case E_WARNING: case E_NOTICE: case E_CORE_WARNING: case E_COMPILE_WARNING: case E_USER_WARNING: case E_USER_NOTICE: case E_STRICT: return 'warning'; default: return 'error'; } } else { // Since this is below the user's reporting threshold, it's always going to be a warning. return 'warning'; } } /** * Execute code in the shell execution context. * * @param string $code * @param bool $throwExceptions * * @return mixed */ public function execute($code, $throwExceptions = false) { $this->setCode($code, true); $closure = new ExecutionClosure($this); if ($throwExceptions) { return $closure->execute(); } try { return $closure->execute(); } catch (\TypeError $_e) { $this->writeException(TypeErrorException::fromTypeError($_e)); } catch (\Error $_e) { $this->writeException(ErrorException::fromError($_e)); } catch (\Exception $_e) { $this->writeException($_e); } } /** * Helper for throwing an ErrorException. * * This allows us to: * * set_error_handler(array($psysh, 'handleError')); * * Unlike ErrorException::throwException, this error handler respects the * current error_reporting level; i.e. it logs warnings and notices, but * doesn't throw an exception unless it's above the current error_reporting * threshold. This should probably only be used in the inner execution loop * of the shell, as most of the time a thrown exception is much more useful. * * If the error type matches the `errorLoggingLevel` config, it will be * logged as well, regardless of the `error_reporting` level. * * @see \Psy\Exception\ErrorException::throwException * @see \Psy\Shell::writeException * * @throws \Psy\Exception\ErrorException depending on the current error_reporting level * * @param int $errno Error type * @param string $errstr Message * @param string $errfile Filename * @param int $errline Line number */ public function handleError($errno, $errstr, $errfile, $errline) { if ($errno & \error_reporting()) { ErrorException::throwException($errno, $errstr, $errfile, $errline); } elseif ($errno & $this->config->errorLoggingLevel()) { // log it and continue... $this->writeException(new ErrorException($errstr, 0, $errno, $errfile, $errline)); } } /** * Format a value for display. * * @see Presenter::present * * @param mixed $val * * @return string Formatted value */ protected function presentValue($val) { return $this->config->getPresenter()->present($val); } /** * Get a command (if one exists) for the current input string. * * @param string $input * * @return null|BaseCommand */ protected function getCommand($input) { $input = new StringInput($input); if ($name = $input->getFirstArgument()) { return $this->get($name); } } /** * Check whether a command is set for the current input string. * * @param string $input * * @return bool True if the shell has a command for the given input */ protected function hasCommand($input) { if (\preg_match('/([^\s]+?)(?:\s|$)/A', \ltrim($input), $match)) { return $this->has($match[1]); } return false; } /** * Get the current input prompt. * * @return string */ protected function getPrompt() { if ($this->hasCode()) { return static::BUFF_PROMPT; } return $this->config->getPrompt() ?: static::PROMPT; } /** * Read a line of user input. * * This will return a line from the input buffer (if any exist). Otherwise, * it will ask the user for input. * * If readline is enabled, this delegates to readline. Otherwise, it's an * ugly `fgets` call. * * @return string One line of user input */ protected function readline() { if (!empty($this->inputBuffer)) { $line = \array_shift($this->inputBuffer); if (!$line instanceof SilentInput) { $this->output->writeln(\sprintf('', static::REPLAY, OutputFormatter::escape($line))); } return $line; } if ($bracketedPaste = $this->config->useBracketedPaste()) { \printf("\e[?2004h"); // Enable bracketed paste } $line = $this->readline->readline($this->getPrompt()); if ($bracketedPaste) { \printf("\e[?2004l"); // ... and disable it again } return $line; } /** * Get the shell output header. * * @return string */ protected function getHeader() { return \sprintf('', $this->getVersion()); } /** * Get the current version of Psy Shell. * * @return string */ public function getVersion() { $separator = $this->config->useUnicode() ? '—' : '-'; return \sprintf('Psy Shell %s (PHP %s %s %s)', self::VERSION, PHP_VERSION, $separator, PHP_SAPI); } /** * Get a PHP manual database instance. * * @return \PDO|null */ public function getManualDb() { return $this->config->getManualDb(); } /** * @deprecated Tab completion is provided by the AutoCompleter service */ protected function autocomplete($text) { @\trigger_error('Tab completion is provided by the AutoCompleter service', E_USER_DEPRECATED); } /** * Initialize tab completion matchers. * * If tab completion is enabled this adds tab completion matchers to the * auto completer and sets context if needed. */ protected function initializeTabCompletion() { if (!$this->config->useTabCompletion()) { return; } $this->autoCompleter = $this->config->getAutoCompleter(); // auto completer needs shell to be linked to configuration because of // the context aware matchers $this->addMatchersToAutoCompleter($this->getDefaultMatchers()); $this->addMatchersToAutoCompleter($this->matchers); $this->autoCompleter->activate(); } /** * Add matchers to the auto completer, setting context if needed. * * @param array $matchers */ private function addMatchersToAutoCompleter(array $matchers) { foreach ($matchers as $matcher) { if ($matcher instanceof ContextAware) { $matcher->setContext($this->context); } $this->autoCompleter->addMatcher($matcher); } } /** * @todo Implement self-update * @todo Implement prompt to start update * * @return void|string */ protected function writeVersionInfo() { if (PHP_SAPI !== 'cli') { return; } try { $client = $this->config->getChecker(); if (!$client->isLatest()) { $this->output->writeln(\sprintf('New version is available (current: %s, latest: %s)', self::VERSION, $client->getLatest())); } } catch (\InvalidArgumentException $e) { $this->output->writeln($e->getMessage()); } } /** * Write a startup message if set. */ protected function writeStartupMessage() { $message = $this->config->getStartupMessage(); if ($message !== null && $message !== '') { $this->output->writeln($message); } } } PK!G^/P'psysh/src/Command/PsyVersionCommand.phpnuIwsetName('version') ->setDefinition([]) ->setDescription('Show Psy Shell version.') ->setHelp('Show Psy Shell version.'); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln($this->getApplication()->getVersion()); return 0; } } PK!ً["""psysh/src/Command/TraceCommand.phpnuIwfilter = new FilterOptions(); parent::__construct($name); } /** * {@inheritdoc} */ protected function configure() { list($grep, $insensitive, $invert) = FilterOptions::getOptions(); $this ->setName('trace') ->setDefinition([ new InputOption('include-psy', 'p', InputOption::VALUE_NONE, 'Include Psy in the call stack.'), new InputOption('num', 'n', InputOption::VALUE_REQUIRED, 'Only include NUM lines.'), $grep, $insensitive, $invert, ]) ->setDescription('Show the current call stack.') ->setHelp( <<<'HELP' Show the current call stack. Optionally, include PsySH in the call stack by passing the --include-psy option. e.g. > trace -n10 > trace --include-psy HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->filter->bind($input); $trace = $this->getBacktrace(new \Exception(), $input->getOption('num'), $input->getOption('include-psy')); $output->page($trace, ShellOutput::NUMBER_LINES); return 0; } /** * Get a backtrace for an exception. * * Optionally limit the number of rows to include with $count, and exclude * Psy from the trace. * * @param \Exception $e The exception with a backtrace * @param int $count (default: PHP_INT_MAX) * @param bool $includePsy (default: true) * * @return array Formatted stacktrace lines */ protected function getBacktrace(\Exception $e, $count = null, $includePsy = true) { if ($cwd = \getcwd()) { $cwd = \rtrim($cwd, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; } if ($count === null) { $count = PHP_INT_MAX; } $lines = []; $trace = $e->getTrace(); \array_unshift($trace, [ 'function' => '', 'file' => $e->getFile() !== null ? $e->getFile() : 'n/a', 'line' => $e->getLine() !== null ? $e->getLine() : 'n/a', 'args' => [], ]); if (!$includePsy) { for ($i = \count($trace) - 1; $i >= 0; $i--) { $thing = isset($trace[$i]['class']) ? $trace[$i]['class'] : $trace[$i]['function']; if (\preg_match('/\\\\?Psy\\\\/', $thing)) { $trace = \array_slice($trace, $i + 1); break; } } } for ($i = 0, $count = \min($count, \count($trace)); $i < $count; $i++) { $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; $function = $trace[$i]['function']; $file = isset($trace[$i]['file']) ? $this->replaceCwd($cwd, $trace[$i]['file']) : 'n/a'; $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; // Leave execution loop out of the `eval()'d code` lines if (\preg_match("#/src/Execution(?:Loop)?Closure.php\(\d+\) : eval\(\)'d code$#", \str_replace('\\', '/', $file))) { $file = "eval()'d code"; } // Skip any lines that don't match our filter options if (!$this->filter->match(\sprintf('%s%s%s() at %s:%s', $class, $type, $function, $file, $line))) { continue; } $lines[] = \sprintf( ' %s%s%s() at %s:%s', OutputFormatter::escape($class), OutputFormatter::escape($type), OutputFormatter::escape($function), OutputFormatter::escape($file), OutputFormatter::escape($line) ); } return $lines; } /** * Replace the given directory from the start of a filepath. * * @param string $cwd * @param string $file * * @return string */ private function replaceCwd($cwd, $file) { if ($cwd === false) { return $file; } else { return \preg_replace('/^' . \preg_quote($cwd, '/') . '/', '', $file); } } } PK!Њ !psysh/src/Command/DumpCommand.phpnuIwpresenter = $presenter; } /** * {@inheritdoc} */ protected function configure() { $this ->setName('dump') ->setDefinition([ new CodeArgument('target', CodeArgument::REQUIRED, 'A target object or primitive to dump.'), new InputOption('depth', '', InputOption::VALUE_REQUIRED, 'Depth to parse.', 10), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Include private and protected methods and properties.'), ]) ->setDescription('Dump an object or primitive.') ->setHelp( <<<'HELP' Dump an object or primitive. This is like var_dump but way awesomer. e.g. >>> dump $_ >>> dump $someVar >>> dump $stuff->getAll() HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $depth = $input->getOption('depth'); $target = $this->resolveCode($input->getArgument('target')); $output->page($this->presenter->present($target, $depth, $input->getOption('all') ? Presenter::VERBOSE : 0)); if (\is_object($target)) { $this->setCommandScopeVariables(new \ReflectionObject($target)); } return 0; } /** * @deprecated Use `resolveCode` instead * * @param string $name * * @return mixed */ protected function resolveTarget($name) { @\trigger_error('`resolveTarget` is deprecated; use `resolveCode` instead.', E_USER_DEPRECATED); return $this->resolveCode($name); } } PK! A7  9psysh/src/Command/ListCommand/ClassConstantEnumerator.phpnuIwgetOption('constants')) { return; } $noInherit = $input->getOption('no-inherit'); $constants = $this->prepareConstants($this->getConstants($reflector, $noInherit)); if (empty($constants)) { return; } $ret = []; $ret[$this->getKindLabel($reflector)] = $constants; return $ret; } /** * Get defined constants for the given class or object Reflector. * * @param \Reflector $reflector * @param bool $noInherit Exclude inherited constants * * @return array */ protected function getConstants(\Reflector $reflector, $noInherit = false) { $className = $reflector->getName(); $constants = []; foreach ($reflector->getConstants() as $name => $constant) { $constReflector = ReflectionClassConstant::create($reflector->name, $name); if ($noInherit && $constReflector->getDeclaringClass()->getName() !== $className) { continue; } $constants[$name] = $constReflector; } \ksort($constants, SORT_NATURAL | SORT_FLAG_CASE); return $constants; } /** * Prepare formatted constant array. * * @param array $constants * * @return array */ protected function prepareConstants(array $constants) { // My kingdom for a generator. $ret = []; foreach ($constants as $name => $constant) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => self::IS_CONSTANT, 'value' => $this->presentRef($constant->getValue()), ]; } } return $ret; } /** * Get a label for the particular kind of "class" represented. * * @param \ReflectionClass $reflector * * @return string */ protected function getKindLabel(\ReflectionClass $reflector) { if ($reflector->isInterface()) { return 'Interface Constants'; } elseif (\method_exists($reflector, 'isTrait') && $reflector->isTrait()) { return 'Trait Constants'; } else { return 'Class Constants'; } } } PK!ۥp- 4psysh/src/Command/ListCommand/FunctionEnumerator.phpnuIwgetOption('functions')) { return; } if ($input->getOption('user')) { $label = 'User Functions'; $functions = $this->getFunctions('user'); } elseif ($input->getOption('internal')) { $label = 'Internal Functions'; $functions = $this->getFunctions('internal'); } else { $label = 'Functions'; $functions = $this->getFunctions(); } $functions = $this->prepareFunctions($functions); if (empty($functions)) { return; } $ret = []; $ret[$label] = $functions; return $ret; } /** * Get defined functions. * * Optionally limit functions to "user" or "internal" functions. * * @param null|string $type "user" or "internal" (default: both) * * @return array */ protected function getFunctions($type = null) { $funcs = \get_defined_functions(); if ($type) { return $funcs[$type]; } else { return \array_merge($funcs['internal'], $funcs['user']); } } /** * Prepare formatted function array. * * @param array $functions * * @return array */ protected function prepareFunctions(array $functions) { \natcasesort($functions); // My kingdom for a generator. $ret = []; foreach ($functions as $name) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => self::IS_FUNCTION, 'value' => $this->presentSignature($name), ]; } } return $ret; } } PK!PT 1psysh/src/Command/ListCommand/ClassEnumerator.phpnuIwgetOption('user'); $internal = $input->getOption('internal'); $ret = []; // only list classes, interfaces and traits if we are specifically asked if ($input->getOption('classes')) { $ret = \array_merge($ret, $this->filterClasses('Classes', \get_declared_classes(), $internal, $user)); } if ($input->getOption('interfaces')) { $ret = \array_merge($ret, $this->filterClasses('Interfaces', \get_declared_interfaces(), $internal, $user)); } if ($input->getOption('traits')) { $ret = \array_merge($ret, $this->filterClasses('Traits', \get_declared_traits(), $internal, $user)); } return \array_map([$this, 'prepareClasses'], \array_filter($ret)); } /** * Filter a list of classes, interfaces or traits. * * If $internal or $user is defined, results will be limited to internal or * user-defined classes as appropriate. * * @param string $key * @param array $classes * @param bool $internal * @param bool $user * * @return array */ protected function filterClasses($key, $classes, $internal, $user) { $ret = []; if ($internal) { $ret['Internal ' . $key] = \array_filter($classes, function ($class) { $refl = new \ReflectionClass($class); return $refl->isInternal(); }); } if ($user) { $ret['User ' . $key] = \array_filter($classes, function ($class) { $refl = new \ReflectionClass($class); return !$refl->isInternal(); }); } if (!$user && !$internal) { $ret[$key] = $classes; } return $ret; } /** * Prepare formatted class array. * * @param array $classes * * @return array */ protected function prepareClasses(array $classes) { \natcasesort($classes); // My kingdom for a generator. $ret = []; foreach ($classes as $name) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => self::IS_CLASS, 'value' => $this->presentSignature($name), ]; } } return $ret; } } PK!+!:psysh/src/Command/ListCommand/GlobalVariableEnumerator.phpnuIwgetOption('globals')) { return; } $globals = $this->prepareGlobals($this->getGlobals()); if (empty($globals)) { return; } return [ 'Global Variables' => $globals, ]; } /** * Get defined global variables. * * @return array */ protected function getGlobals() { global $GLOBALS; $names = \array_keys($GLOBALS); \natcasesort($names); $ret = []; foreach ($names as $name) { $ret[$name] = $GLOBALS[$name]; } return $ret; } /** * Prepare formatted global variable array. * * @param array $globals * * @return array */ protected function prepareGlobals($globals) { // My kingdom for a generator. $ret = []; foreach ($globals as $name => $value) { if ($this->showItem($name)) { $fname = '$' . $name; $ret[$fname] = [ 'name' => $fname, 'style' => self::IS_GLOBAL, 'value' => $this->presentRef($value), ]; } } return $ret; } } PK!k  4psysh/src/Command/ListCommand/ConstantEnumerator.phpnuIwgetOption('constants')) { return; } $user = $input->getOption('user'); $internal = $input->getOption('internal'); $category = $input->getOption('category'); $ret = []; if ($user) { $ret['User Constants'] = $this->getConstants('user'); } if ($internal) { $ret['Interal Constants'] = $this->getConstants('internal'); } if ($category) { $label = \ucfirst($category) . ' Constants'; $ret[$label] = $this->getConstants($category); } if (!$user && !$internal && !$category) { $ret['Constants'] = $this->getConstants(); } return \array_map([$this, 'prepareConstants'], \array_filter($ret)); } /** * Get defined constants. * * Optionally restrict constants to a given category, e.g. "date". If the * category is "internal", include all non-user-defined constants. * * @param string $category * * @return array */ protected function getConstants($category = null) { if (!$category) { return \get_defined_constants(); } $consts = \get_defined_constants(true); if ($category === 'internal') { unset($consts['user']); return \call_user_func_array('array_merge', $consts); } return isset($consts[$category]) ? $consts[$category] : []; } /** * Prepare formatted constant array. * * @param array $constants * * @return array */ protected function prepareConstants(array $constants) { // My kingdom for a generator. $ret = []; $names = \array_keys($constants); \natcasesort($names); foreach ($names as $name) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => self::IS_CONSTANT, 'value' => $this->presentRef($constants[$name]), ]; } } return $ret; } } PK!4psysh/src/Command/ListCommand/PropertyEnumerator.phpnuIwgetOption('properties')) { return; } $showAll = $input->getOption('all'); $noInherit = $input->getOption('no-inherit'); $properties = $this->prepareProperties($this->getProperties($showAll, $reflector, $noInherit), $target); if (empty($properties)) { return; } $ret = []; $ret[$this->getKindLabel($reflector)] = $properties; return $ret; } /** * Get defined properties for the given class or object Reflector. * * @param bool $showAll Include private and protected properties * @param \Reflector $reflector * @param bool $noInherit Exclude inherited properties * * @return array */ protected function getProperties($showAll, \Reflector $reflector, $noInherit = false) { $className = $reflector->getName(); $properties = []; foreach ($reflector->getProperties() as $property) { if ($noInherit && $property->getDeclaringClass()->getName() !== $className) { continue; } if ($showAll || $property->isPublic()) { $properties[$property->getName()] = $property; } } \ksort($properties, SORT_NATURAL | SORT_FLAG_CASE); return $properties; } /** * Prepare formatted property array. * * @param array $properties * * @return array */ protected function prepareProperties(array $properties, $target = null) { // My kingdom for a generator. $ret = []; foreach ($properties as $name => $property) { if ($this->showItem($name)) { $fname = '$' . $name; $ret[$fname] = [ 'name' => $fname, 'style' => $this->getVisibilityStyle($property), 'value' => $this->presentValue($property, $target), ]; } } return $ret; } /** * Get a label for the particular kind of "class" represented. * * @param \ReflectionClass $reflector * * @return string */ protected function getKindLabel(\ReflectionClass $reflector) { if ($reflector->isInterface()) { return 'Interface Properties'; } elseif (\method_exists($reflector, 'isTrait') && $reflector->isTrait()) { return 'Trait Properties'; } else { return 'Class Properties'; } } /** * Get output style for the given property's visibility. * * @param \ReflectionProperty $property * * @return string */ private function getVisibilityStyle(\ReflectionProperty $property) { if ($property->isPublic()) { return self::IS_PUBLIC; } elseif ($property->isProtected()) { return self::IS_PROTECTED; } else { return self::IS_PRIVATE; } } /** * Present the $target's current value for a reflection property. * * @param \ReflectionProperty $property * @param mixed $target * * @return string */ protected function presentValue(\ReflectionProperty $property, $target) { // If $target is a class, trait or interface (try to) get the default // value for the property. if (!\is_object($target)) { try { $refl = new \ReflectionClass($target); $props = $refl->getDefaultProperties(); if (\array_key_exists($property->name, $props)) { $suffix = $property->isStatic() ? '' : ' '; return $this->presentRef($props[$property->name]) . $suffix; } } catch (\Exception $e) { // Well, we gave it a shot. } return ''; } $property->setAccessible(true); $value = $property->getValue($target); return $this->presentRef($value); } } PK! 4psysh/src/Command/ListCommand/VariableEnumerator.phpnuIwcontext = $context; parent::__construct($presenter); } /** * {@inheritdoc} */ protected function listItems(InputInterface $input, \Reflector $reflector = null, $target = null) { // only list variables when no Reflector is present. if ($reflector !== null || $target !== null) { return; } // only list variables if we are specifically asked if (!$input->getOption('vars')) { return; } $showAll = $input->getOption('all'); $variables = $this->prepareVariables($this->getVariables($showAll)); if (empty($variables)) { return; } return [ 'Variables' => $variables, ]; } /** * Get scope variables. * * @param bool $showAll Include special variables (e.g. $_) * * @return array */ protected function getVariables($showAll) { $scopeVars = $this->context->getAll(); \uksort($scopeVars, function ($a, $b) { $aIndex = \array_search($a, self::$specialNames); $bIndex = \array_search($b, self::$specialNames); if ($aIndex !== false) { if ($bIndex !== false) { return $aIndex - $bIndex; } return 1; } if ($bIndex !== false) { return -1; } return \strnatcasecmp($a, $b); }); $ret = []; foreach ($scopeVars as $name => $val) { if (!$showAll && \in_array($name, self::$specialNames)) { continue; } $ret[$name] = $val; } return $ret; } /** * Prepare formatted variable array. * * @param array $variables * * @return array */ protected function prepareVariables(array $variables) { // My kingdom for a generator. $ret = []; foreach ($variables as $name => $val) { if ($this->showItem($name)) { $fname = '$' . $name; $ret[$fname] = [ 'name' => $fname, 'style' => \in_array($name, self::$specialNames) ? self::IS_PRIVATE : self::IS_PUBLIC, 'value' => $this->presentRef($val), ]; } } return $ret; } } PK!MY^^5psysh/src/Command/ListCommand/InterfaceEnumerator.phpnuIwgetOption('interfaces')) { return; } $interfaces = $this->prepareInterfaces(\get_declared_interfaces()); if (empty($interfaces)) { return; } return [ 'Interfaces' => $interfaces, ]; } /** * Prepare formatted interface array. * * @param array $interfaces * * @return array */ protected function prepareInterfaces(array $interfaces) { \natcasesort($interfaces); // My kingdom for a generator. $ret = []; foreach ($interfaces as $name) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => self::IS_CLASS, 'value' => $this->presentSignature($name), ]; } } return $ret; } } PK!qH2psysh/src/Command/ListCommand/MethodEnumerator.phpnuIwgetOption('methods')) { return; } $showAll = $input->getOption('all'); $noInherit = $input->getOption('no-inherit'); $methods = $this->prepareMethods($this->getMethods($showAll, $reflector, $noInherit)); if (empty($methods)) { return; } $ret = []; $ret[$this->getKindLabel($reflector)] = $methods; return $ret; } /** * Get defined methods for the given class or object Reflector. * * @param bool $showAll Include private and protected methods * @param \Reflector $reflector * @param bool $noInherit Exclude inherited methods * * @return array */ protected function getMethods($showAll, \Reflector $reflector, $noInherit = false) { $className = $reflector->getName(); $methods = []; foreach ($reflector->getMethods() as $name => $method) { if ($noInherit && $method->getDeclaringClass()->getName() !== $className) { continue; } if ($showAll || $method->isPublic()) { $methods[$method->getName()] = $method; } } \ksort($methods, SORT_NATURAL | SORT_FLAG_CASE); return $methods; } /** * Prepare formatted method array. * * @param array $methods * * @return array */ protected function prepareMethods(array $methods) { // My kingdom for a generator. $ret = []; foreach ($methods as $name => $method) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => $this->getVisibilityStyle($method), 'value' => $this->presentSignature($method), ]; } } return $ret; } /** * Get a label for the particular kind of "class" represented. * * @param \ReflectionClass $reflector * * @return string */ protected function getKindLabel(\ReflectionClass $reflector) { if ($reflector->isInterface()) { return 'Interface Methods'; } elseif (\method_exists($reflector, 'isTrait') && $reflector->isTrait()) { return 'Trait Methods'; } else { return 'Class Methods'; } } /** * Get output style for the given method's visibility. * * @param \ReflectionMethod $method * * @return string */ private function getVisibilityStyle(\ReflectionMethod $method) { if ($method->isPublic()) { return self::IS_PUBLIC; } elseif ($method->isProtected()) { return self::IS_PROTECTED; } else { return self::IS_PRIVATE; } } } PK!.1psysh/src/Command/ListCommand/TraitEnumerator.phpnuIwgetOption('traits')) { return; } $traits = $this->prepareTraits(\get_declared_traits()); if (empty($traits)) { return; } return [ 'Traits' => $traits, ]; } /** * Prepare formatted trait array. * * @param array $traits * * @return array */ protected function prepareTraits(array $traits) { \natcasesort($traits); // My kingdom for a generator. $ret = []; foreach ($traits as $name) { if ($this->showItem($name)) { $ret[$name] = [ 'name' => $name, 'style' => self::IS_CLASS, 'value' => $this->presentSignature($name), ]; } } return $ret; } } PK!`v  ,psysh/src/Command/ListCommand/Enumerator.phpnuIwfilter = new FilterOptions(); $this->presenter = $presenter; } /** * Return a list of categorized things with the given input options and target. * * @param InputInterface $input * @param \Reflector $reflector * @param mixed $target * * @return array */ public function enumerate(InputInterface $input, \Reflector $reflector = null, $target = null) { $this->filter->bind($input); return $this->listItems($input, $reflector, $target); } /** * Enumerate specific items with the given input options and target. * * Implementing classes should return an array of arrays: * * [ * 'Constants' => [ * 'FOO' => [ * 'name' => 'FOO', * 'style' => 'public', * 'value' => '123', * ], * ], * ] * * @param InputInterface $input * @param \Reflector $reflector * @param mixed $target * * @return array */ abstract protected function listItems(InputInterface $input, \Reflector $reflector = null, $target = null); protected function showItem($name) { return $this->filter->match($name); } protected function presentRef($value) { return $this->presenter->presentRef($value); } protected function presentSignature($target) { // This might get weird if the signature is actually for a reflector. Hrm. if (!$target instanceof \Reflector) { $target = Mirror::get($target); } return SignatureFormatter::format($target); } } PK!W[<<!psysh/src/Command/ExitCommand.phpnuIwsetName('exit') ->setAliases(['quit', 'q']) ->setDefinition([]) ->setDescription('End the current session and return to caller.') ->setHelp( <<<'HELP' End the current session and return to caller. e.g. >>> exit HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { throw new BreakException('Goodbye'); } } PK!ӕ psysh/src/Command/DocCommand.phpnuIwsetName('doc') ->setAliases(['rtfm', 'man']) ->setDefinition([ new CodeArgument('target', CodeArgument::REQUIRED, 'Function, class, instance, constant, method or property to document.'), ]) ->setDescription('Read the documentation for an object, class, constant, method or property.') ->setHelp( <<>>> doc preg_replace >>> doc Psy\Shell >>> doc Psy\Shell::debug >>> \$s = new Psy\Shell >>> doc \$s->run HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $value = $input->getArgument('target'); if (ReflectionLanguageConstruct::isLanguageConstruct($value)) { $reflector = new ReflectionLanguageConstruct($value); $doc = $this->getManualDocById($value); } else { list($target, $reflector) = $this->getTargetAndReflector($value); $doc = $this->getManualDoc($reflector) ?: DocblockFormatter::format($reflector); } $db = $this->getApplication()->getManualDb(); $output->page(function ($output) use ($reflector, $doc, $db) { $output->writeln(SignatureFormatter::format($reflector)); $output->writeln(''); if (empty($doc) && !$db) { $output->writeln('PHP manual not found'); $output->writeln(' To document core PHP functionality, download the PHP reference manual:'); $output->writeln(' https://github.com/bobthecow/psysh/wiki/PHP-manual'); } else { $output->writeln($doc); } }); // Set some magic local variables $this->setCommandScopeVariables($reflector); return 0; } private function getManualDoc($reflector) { switch (\get_class($reflector)) { case 'ReflectionClass': case 'ReflectionObject': case 'ReflectionFunction': $id = $reflector->name; break; case 'ReflectionMethod': $id = $reflector->class . '::' . $reflector->name; break; case 'ReflectionProperty': $id = $reflector->class . '::$' . $reflector->name; break; case 'ReflectionClassConstant': case 'Psy\Reflection\ReflectionClassConstant': // @todo this is going to collide with ReflectionMethod ids // someday... start running the query by id + type if the DB // supports it. $id = $reflector->class . '::' . $reflector->name; break; case 'Psy\Reflection\ReflectionConstant_': $id = $reflector->name; break; default: return false; } return $this->getManualDocById($id); } private function getManualDocById($id) { if ($db = $this->getApplication()->getManualDb()) { return $db ->query(\sprintf('SELECT doc FROM php_manual WHERE id = %s', $db->quote($id))) ->fetchColumn(0); } } } PK!1??%psysh/src/Command/WhereamiCommand.phpnuIwcolorMode = $colorMode ?: Configuration::COLOR_MODE_AUTO; $this->backtrace = \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); parent::__construct(); } /** * {@inheritdoc} */ protected function configure() { $this ->setName('whereami') ->setDefinition([ new InputOption('num', 'n', InputOption::VALUE_OPTIONAL, 'Number of lines before and after.', '5'), ]) ->setDescription('Show where you are in the code.') ->setHelp( <<<'HELP' Show where you are in the code. Optionally, include how many lines before and after you want to display. e.g. > whereami > whereami -n10 HELP ); } /** * Obtains the correct stack frame in the full backtrace. * * @return array */ protected function trace() { foreach (\array_reverse($this->backtrace) as $stackFrame) { if ($this->isDebugCall($stackFrame)) { return $stackFrame; } } return \end($this->backtrace); } private static function isDebugCall(array $stackFrame) { $class = isset($stackFrame['class']) ? $stackFrame['class'] : null; $function = isset($stackFrame['function']) ? $stackFrame['function'] : null; return ($class === null && $function === 'Psy\debug') || ($class === 'Psy\Shell' && \in_array($function, ['__construct', 'debug'])); } /** * Determine the file and line based on the specific backtrace. * * @return array */ protected function fileInfo() { $stackFrame = $this->trace(); if (\preg_match('/eval\(/', $stackFrame['file'])) { \preg_match_all('/([^\(]+)\((\d+)/', $stackFrame['file'], $matches); $file = $matches[1][0]; $line = (int) $matches[2][0]; } else { $file = $stackFrame['file']; $line = $stackFrame['line']; } return \compact('file', 'line'); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $info = $this->fileInfo(); $num = $input->getOption('num'); $factory = new ConsoleColorFactory($this->colorMode); $colors = $factory->getConsoleColor(); $highlighter = new Highlighter($colors); $contents = \file_get_contents($info['file']); $output->startPaging(); $output->writeln(''); $output->writeln(\sprintf('From %s:%s:', $this->replaceCwd($info['file']), $info['line'])); $output->writeln(''); $output->write($highlighter->getCodeSnippet($contents, $info['line'], $num, $num), false, OutputInterface::OUTPUT_RAW); $output->stopPaging(); return 0; } /** * Replace the given directory from the start of a filepath. * * @param string $file * * @return string */ private function replaceCwd($file) { $cwd = \getcwd(); if ($cwd === false) { return $file; } $cwd = \rtrim($cwd, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; return \preg_replace('/^' . \preg_quote($cwd, '/') . '/', '', $file); } } PK!z0_$psysh/src/Command/HistoryCommand.phpnuIwfilter = new FilterOptions(); parent::__construct($name); } /** * Set the Shell's Readline service. * * @param Readline $readline */ public function setReadline(Readline $readline) { $this->readline = $readline; } /** * {@inheritdoc} */ protected function configure() { list($grep, $insensitive, $invert) = FilterOptions::getOptions(); $this ->setName('history') ->setAliases(['hist']) ->setDefinition([ new InputOption('show', 's', InputOption::VALUE_REQUIRED, 'Show the given range of lines.'), new InputOption('head', 'H', InputOption::VALUE_REQUIRED, 'Display the first N items.'), new InputOption('tail', 'T', InputOption::VALUE_REQUIRED, 'Display the last N items.'), $grep, $insensitive, $invert, new InputOption('no-numbers', 'N', InputOption::VALUE_NONE, 'Omit line numbers.'), new InputOption('save', '', InputOption::VALUE_REQUIRED, 'Save history to a file.'), new InputOption('replay', '', InputOption::VALUE_NONE, 'Replay.'), new InputOption('clear', '', InputOption::VALUE_NONE, 'Clear the history.'), ]) ->setDescription('Show the Psy Shell history.') ->setHelp( <<<'HELP' Show, search, save or replay the Psy Shell history. e.g. >>> history --grep /[bB]acon/ >>> history --show 0..10 --replay >>> history --clear >>> history --tail 1000 --save somefile.txt HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateOnlyOne($input, ['show', 'head', 'tail']); $this->validateOnlyOne($input, ['save', 'replay', 'clear']); $history = $this->getHistorySlice( $input->getOption('show'), $input->getOption('head'), $input->getOption('tail') ); $highlighted = false; $this->filter->bind($input); if ($this->filter->hasFilter()) { $matches = []; $highlighted = []; foreach ($history as $i => $line) { if ($this->filter->match($line, $matches)) { if (isset($matches[0])) { $chunks = \explode($matches[0], $history[$i]); $chunks = \array_map([__CLASS__, 'escape'], $chunks); $glue = \sprintf('%s', self::escape($matches[0])); $highlighted[$i] = \implode($glue, $chunks); } } else { unset($history[$i]); } } } if ($save = $input->getOption('save')) { $output->writeln(\sprintf('Saving history in %s...', $save)); \file_put_contents($save, \implode(PHP_EOL, $history) . PHP_EOL); $output->writeln('History saved.'); } elseif ($input->getOption('replay')) { if (!($input->getOption('show') || $input->getOption('head') || $input->getOption('tail'))) { throw new \InvalidArgumentException('You must limit history via --head, --tail or --show before replaying'); } $count = \count($history); $output->writeln(\sprintf('Replaying %d line%s of history', $count, ($count !== 1) ? 's' : '')); $this->getApplication()->addInput($history); } elseif ($input->getOption('clear')) { $this->clearHistory(); $output->writeln('History cleared.'); } else { $type = $input->getOption('no-numbers') ? 0 : ShellOutput::NUMBER_LINES; if (!$highlighted) { $type = $type | OutputInterface::OUTPUT_RAW; } $output->page($highlighted ?: $history, $type); } return 0; } /** * Extract a range from a string. * * @param string $range * * @return array [ start, end ] */ private function extractRange($range) { if (\preg_match('/^\d+$/', $range)) { return [$range, $range + 1]; } $matches = []; if ($range !== '..' && \preg_match('/^(\d*)\.\.(\d*)$/', $range, $matches)) { $start = $matches[1] ? \intval($matches[1]) : 0; $end = $matches[2] ? \intval($matches[2]) + 1 : PHP_INT_MAX; return [$start, $end]; } throw new \InvalidArgumentException('Unexpected range: ' . $range); } /** * Retrieve a slice of the readline history. * * @param string $show * @param string $head * @param string $tail * * @return array A slilce of history */ private function getHistorySlice($show, $head, $tail) { $history = $this->readline->listHistory(); // don't show the current `history` invocation \array_pop($history); if ($show) { list($start, $end) = $this->extractRange($show); $length = $end - $start; } elseif ($head) { if (!\preg_match('/^\d+$/', $head)) { throw new \InvalidArgumentException('Please specify an integer argument for --head'); } $start = 0; $length = \intval($head); } elseif ($tail) { if (!\preg_match('/^\d+$/', $tail)) { throw new \InvalidArgumentException('Please specify an integer argument for --tail'); } $start = \count($history) - $tail; $length = \intval($tail) + 1; } else { return $history; } return \array_slice($history, $start, $length, true); } /** * Validate that only one of the given $options is set. * * @param InputInterface $input * @param array $options */ private function validateOnlyOne(InputInterface $input, array $options) { $count = 0; foreach ($options as $opt) { if ($input->getOption($opt)) { $count++; } } if ($count > 1) { throw new \InvalidArgumentException('Please specify only one of --' . \implode(', --', $options)); } } /** * Clear the readline history. */ private function clearHistory() { $this->readline->clearHistory(); } public static function escape($string) { return OutputFormatter::escape($string); } } PK!##"psysh/src/Command/ClearCommand.phpnuIwsetName('clear') ->setDefinition([]) ->setDescription('Clear the Psy Shell screen.') ->setHelp( <<<'HELP' Clear the Psy Shell screen. Pro Tip: If your PHP has readline support, you should be able to use ctrl+l too! HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $output->write(\sprintf('%c[2J%c[0;0f', 27, 27)); return 0; } } PK!#psysh/src/Command/TimeitCommand.phpnuIwCommand took %.6f seconds to complete.'; const AVG_RESULT_MSG = 'Command took %.6f seconds on average (%.6f median; %.6f total) to complete.'; private static $start = null; private static $times = []; private $parser; private $traverser; private $printer; /** * {@inheritdoc} */ public function __construct($name = null) { $parserFactory = new ParserFactory(); $this->parser = $parserFactory->createParser(); $this->traverser = new NodeTraverser(); $this->traverser->addVisitor(new TimeitVisitor()); $this->printer = new Printer(); parent::__construct($name); } /** * {@inheritdoc} */ protected function configure() { $this ->setName('timeit') ->setDefinition([ new InputOption('num', 'n', InputOption::VALUE_REQUIRED, 'Number of iterations.'), new CodeArgument('code', CodeArgument::REQUIRED, 'Code to execute.'), ]) ->setDescription('Profiles with a timer.') ->setHelp( <<<'HELP' Time profiling for functions and commands. e.g. >>> timeit sleep(1) >>> timeit -n1000 $closure() HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $code = $input->getArgument('code'); $num = $input->getOption('num') ?: 1; $shell = $this->getApplication(); $instrumentedCode = $this->instrumentCode($code); self::$times = []; for ($i = 0; $i < $num; $i++) { $_ = $shell->execute($instrumentedCode); $this->ensureEndMarked(); } $shell->writeReturnValue($_); $times = self::$times; self::$times = []; if ($num === 1) { $output->writeln(\sprintf(self::RESULT_MSG, $times[0])); } else { $total = \array_sum($times); \rsort($times); $median = $times[\round($num / 2)]; $output->writeln(\sprintf(self::AVG_RESULT_MSG, $total / $num, $median, $total)); } return 0; } /** * Internal method for marking the start of timeit execution. * * A static call to this method will be injected at the start of the timeit * input code to instrument the call. We will use the saved start time to * more accurately calculate time elapsed during execution. */ public static function markStart() { self::$start = \microtime(true); } /** * Internal method for marking the end of timeit execution. * * A static call to this method is injected by TimeitVisitor at the end * of the timeit input code to instrument the call. * * Note that this accepts an optional $ret parameter, which is used to pass * the return value of the last statement back out of timeit. This saves us * a bunch of code rewriting shenanigans. * * @param mixed $ret * * @return mixed it just passes $ret right back */ public static function markEnd($ret = null) { self::$times[] = \microtime(true) - self::$start; self::$start = null; return $ret; } /** * Ensure that the end of code execution was marked. * * The end *should* be marked in the instrumented code, but just in case * we'll add a fallback here. */ private function ensureEndMarked() { if (self::$start !== null) { self::markEnd(); } } /** * Instrument code for timeit execution. * * This inserts `markStart` and `markEnd` calls to ensure that (reasonably) * accurate times are recorded for just the code being executed. * * @param string $code * * @return string */ private function instrumentCode($code) { return $this->printer->prettyPrint($this->traverser->traverse($this->parse($code))); } /** * Lex and parse a string of code into statements. * * @param string $code * * @return array Statements */ private function parse($code) { $code = 'parser->parse($code); } catch (\PhpParser\Error $e) { if (\strpos($e->getMessage(), 'unexpected EOF') === false) { throw $e; } // If we got an unexpected EOF, let's try it again with a semicolon. return $this->parser->parse($code . ';'); } } } PK!3"psysh/src/Command/ParseCommand.phpnuIwparserFactory = new ParserFactory(); $this->parsers = []; parent::__construct($name); } /** * ContextAware interface. * * @param Context $context */ public function setContext(Context $context) { $this->context = $context; } /** * PresenterAware interface. * * @param Presenter $presenter */ public function setPresenter(Presenter $presenter) { $this->presenter = clone $presenter; $this->presenter->addCasters([ 'PhpParser\Node' => function (Node $node, array $a) { $a = [ Caster::PREFIX_VIRTUAL . 'type' => $node->getType(), Caster::PREFIX_VIRTUAL . 'attributes' => $node->getAttributes(), ]; foreach ($node->getSubNodeNames() as $name) { $a[Caster::PREFIX_VIRTUAL . $name] = $node->$name; } return $a; }, ]); } /** * {@inheritdoc} */ protected function configure() { $definition = [ new CodeArgument('code', CodeArgument::REQUIRED, 'PHP code to parse.'), new InputOption('depth', '', InputOption::VALUE_REQUIRED, 'Depth to parse.', 10), ]; if ($this->parserFactory->hasKindsSupport()) { $msg = 'One of PhpParser\\ParserFactory constants: ' . \implode(', ', ParserFactory::getPossibleKinds()) . " (default is based on current interpreter's version)."; $defaultKind = $this->parserFactory->getDefaultKind(); $definition[] = new InputOption('kind', '', InputOption::VALUE_REQUIRED, $msg, $defaultKind); } $this ->setName('parse') ->setDefinition($definition) ->setDescription('Parse PHP code and show the abstract syntax tree.') ->setHelp( <<<'HELP' Parse PHP code and show the abstract syntax tree. This command is used in the development of PsySH. Given a string of PHP code, it pretty-prints the PHP Parser parse tree. See https://github.com/nikic/PHP-Parser It prolly won't be super useful for most of you, but it's here if you want to play. HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $code = $input->getArgument('code'); if (\strpos('parserFactory->hasKindsSupport() ? $input->getOption('kind') : null; $depth = $input->getOption('depth'); $nodes = $this->parse($this->getParser($parserKind), $code); $output->page($this->presenter->present($nodes, $depth)); $this->context->setReturnValue($nodes); return 0; } /** * Lex and parse a string of code into statements. * * @param Parser $parser * @param string $code * * @return array Statements */ private function parse(Parser $parser, $code) { try { return $parser->parse($code); } catch (\PhpParser\Error $e) { if (\strpos($e->getMessage(), 'unexpected EOF') === false) { throw $e; } // If we got an unexpected EOF, let's try it again with a semicolon. return $parser->parse($code . ';'); } } /** * Get (or create) the Parser instance. * * @param string|null $kind One of Psy\ParserFactory constants (only for PHP parser 2.0 and above) * * @return Parser */ private function getParser($kind = null) { if (!\array_key_exists($kind, $this->parsers)) { $this->parsers[$kind] = $this->parserFactory->createParser($kind); } return $this->parsers[$kind]; } } PK!^@%%!psysh/src/Command/ShowCommand.phpnuIwcolorMode = $colorMode ?: Configuration::COLOR_MODE_AUTO; parent::__construct(); } /** * {@inheritdoc} */ protected function configure() { $this ->setName('show') ->setDefinition([ new CodeArgument('target', CodeArgument::OPTIONAL, 'Function, class, instance, constant, method or property to show.'), new InputOption('ex', null, InputOption::VALUE_OPTIONAL, 'Show last exception context. Optionally specify a stack index.', 1), ]) ->setDescription('Show the code for an object, class, constant, method or property.') ->setHelp( <<cat --ex defaults to showing the lines surrounding the location of the last exception. Invoking it more than once travels up the exception's stack trace, and providing a number shows the context of the given index of the trace. e.g. >>> show \$myObject >>> show Psy\Shell::debug >>> show --ex >>> show --ex 3 HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { // n.b. As far as I can tell, InputInterface doesn't want to tell me // whether an option with an optional value was actually passed. If you // call `$input->getOption('ex')`, it will return the default, both when // `--ex` is specified with no value, and when `--ex` isn't specified at // all. // // So we're doing something sneaky here. If we call `getOptions`, it'll // return the default value when `--ex` is not present, and `null` if // `--ex` is passed with no value. /shrug $opts = $input->getOptions(); // Strict comparison to `1` (the default value) here, because `--ex 1` // will come in as `"1"`. Now we can tell the difference between // "no --ex present", because it's the integer 1, "--ex with no value", // because it's `null`, and "--ex 1", because it's the string "1". if ($opts['ex'] !== 1) { if ($input->getArgument('target')) { throw new \InvalidArgumentException('Too many arguments (supply either "target" or "--ex")'); } $this->writeExceptionContext($input, $output); return 0; } if ($input->getArgument('target')) { $this->writeCodeContext($input, $output); return 0; } throw new RuntimeException('Not enough arguments (missing: "target")'); } private function writeCodeContext(InputInterface $input, OutputInterface $output) { list($target, $reflector) = $this->getTargetAndReflector($input->getArgument('target')); // Set some magic local variables $this->setCommandScopeVariables($reflector); try { $output->page(CodeFormatter::format($reflector, $this->colorMode), OutputInterface::OUTPUT_RAW); } catch (RuntimeException $e) { $output->writeln(SignatureFormatter::format($reflector)); throw $e; } } private function writeExceptionContext(InputInterface $input, OutputInterface $output) { $exception = $this->context->getLastException(); if ($exception !== $this->lastException) { $this->lastException = null; $this->lastExceptionIndex = null; } $opts = $input->getOptions(); if ($opts['ex'] === null) { if ($this->lastException && $this->lastExceptionIndex !== null) { $index = $this->lastExceptionIndex + 1; } else { $index = 0; } } else { $index = \max(0, \intval($input->getOption('ex')) - 1); } $trace = $exception->getTrace(); \array_unshift($trace, [ 'file' => $exception->getFile(), 'line' => $exception->getLine(), ]); if ($index >= \count($trace)) { $index = 0; } $this->lastException = $exception; $this->lastExceptionIndex = $index; $output->writeln($this->getApplication()->formatException($exception)); $output->writeln('--'); $this->writeTraceLine($output, $trace, $index); $this->writeTraceCodeSnippet($output, $trace, $index); $this->setCommandScopeVariablesFromContext($trace[$index]); } private function writeTraceLine(OutputInterface $output, array $trace, $index) { $file = isset($trace[$index]['file']) ? $this->replaceCwd($trace[$index]['file']) : 'n/a'; $line = isset($trace[$index]['line']) ? $trace[$index]['line'] : 'n/a'; $output->writeln(\sprintf( 'From %s:%d at level %d of backtrace (of %d).', OutputFormatter::escape($file), OutputFormatter::escape($line), $index + 1, \count($trace) )); } private function replaceCwd($file) { if ($cwd = \getcwd()) { $cwd = \rtrim($cwd, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; } if ($cwd === false) { return $file; } else { return \preg_replace('/^' . \preg_quote($cwd, '/') . '/', '', $file); } } private function writeTraceCodeSnippet(OutputInterface $output, array $trace, $index) { if (!isset($trace[$index]['file'])) { return; } $file = $trace[$index]['file']; if ($fileAndLine = $this->extractEvalFileAndLine($file)) { list($file, $line) = $fileAndLine; } else { if (!isset($trace[$index]['line'])) { return; } $line = $trace[$index]['line']; } if (\is_file($file)) { $code = @\file_get_contents($file); } if (empty($code)) { return; } $output->write($this->getHighlighter()->getCodeSnippet($code, $line, 5, 5), false, OutputInterface::OUTPUT_RAW); } private function getHighlighter() { if (!$this->highlighter) { $factory = new ConsoleColorFactory($this->colorMode); $this->highlighter = new Highlighter($factory->getConsoleColor()); } return $this->highlighter; } private function setCommandScopeVariablesFromContext(array $context) { $vars = []; if (isset($context['class'])) { $vars['__class'] = $context['class']; if (isset($context['function'])) { $vars['__method'] = $context['function']; } try { $refl = new \ReflectionClass($context['class']); if ($namespace = $refl->getNamespaceName()) { $vars['__namespace'] = $namespace; } } catch (\Exception $e) { // oh well } } elseif (isset($context['function'])) { $vars['__function'] = $context['function']; try { $refl = new \ReflectionFunction($context['function']); if ($namespace = $refl->getNamespaceName()) { $vars['__namespace'] = $namespace; } } catch (\Exception $e) { // oh well } } if (isset($context['file'])) { $file = $context['file']; if ($fileAndLine = $this->extractEvalFileAndLine($file)) { list($file, $line) = $fileAndLine; } elseif (isset($context['line'])) { $line = $context['line']; } if (\is_file($file)) { $vars['__file'] = $file; if (isset($line)) { $vars['__line'] = $line; } $vars['__dir'] = \dirname($file); } } $this->context->setCommandScopeVariables($vars); } private function extractEvalFileAndLine($file) { if (\preg_match('/(.*)\\((\\d+)\\) : eval\\(\\)\'d code$/', $file, $matches)) { return [$matches[1], $matches[2]]; } } } PK!-0 !psysh/src/Command/HelpCommand.phpnuIwsetName('help') ->setAliases(['?']) ->setDefinition([ new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name.', null), ]) ->setDescription('Show a list of commands. Type `help [foo]` for information about [foo].') ->setHelp('My. How meta.'); } /** * Helper for setting a subcommand to retrieve help for. * * @param Command $command */ public function setCommand($command) { $this->command = $command; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if ($this->command !== null) { // help for an individual command $output->page($this->command->asText()); $this->command = null; } elseif ($name = $input->getArgument('command_name')) { // help for an individual command $output->page($this->getApplication()->get($name)->asText()); } else { // list available commands $commands = $this->getApplication()->all(); $table = $this->getTable($output); foreach ($commands as $name => $command) { if ($name !== $command->getName()) { continue; } if ($command->getAliases()) { $aliases = \sprintf('Aliases: %s', \implode(', ', $command->getAliases())); } else { $aliases = ''; } $table->addRow([ \sprintf('%s', $name), $command->getDescription(), $aliases, ]); } $output->startPaging(); if ($table instanceof TableHelper) { $table->render($output); } else { $table->render(); } $output->stopPaging(); } return 0; } } PK!Mpsysh/src/Command/Command.phpnuIwUsage:', ' ' . $this->getSynopsis(), '', ]; if ($this->getAliases()) { $messages[] = $this->aliasesAsText(); } if ($this->getArguments()) { $messages[] = $this->argumentsAsText(); } if ($this->getOptions()) { $messages[] = $this->optionsAsText(); } if ($help = $this->getProcessedHelp()) { $messages[] = 'Help:'; $messages[] = ' ' . \str_replace("\n", "\n ", $help) . "\n"; } return \implode("\n", $messages); } /** * {@inheritdoc} */ private function getArguments() { $hidden = $this->getHiddenArguments(); return \array_filter($this->getNativeDefinition()->getArguments(), function ($argument) use ($hidden) { return !\in_array($argument->getName(), $hidden); }); } /** * These arguments will be excluded from help output. * * @return array */ protected function getHiddenArguments() { return ['command']; } /** * {@inheritdoc} */ private function getOptions() { $hidden = $this->getHiddenOptions(); return \array_filter($this->getNativeDefinition()->getOptions(), function ($option) use ($hidden) { return !\in_array($option->getName(), $hidden); }); } /** * These options will be excluded from help output. * * @return array */ protected function getHiddenOptions() { return ['verbose']; } /** * Format command aliases as text.. * * @return string */ private function aliasesAsText() { return 'Aliases: ' . \implode(', ', $this->getAliases()) . '' . PHP_EOL; } /** * Format command arguments as text. * * @return string */ private function argumentsAsText() { $max = $this->getMaxWidth(); $messages = []; $arguments = $this->getArguments(); if (!empty($arguments)) { $messages[] = 'Arguments:'; foreach ($arguments as $argument) { if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { $default = \sprintf(' (default: %s)', $this->formatDefaultValue($argument->getDefault())); } else { $default = ''; } $description = \str_replace("\n", "\n" . \str_pad('', $max + 2, ' '), $argument->getDescription()); $messages[] = \sprintf(" %-${max}s %s%s", $argument->getName(), $description, $default); } $messages[] = ''; } return \implode(PHP_EOL, $messages); } /** * Format options as text. * * @return string */ private function optionsAsText() { $max = $this->getMaxWidth(); $messages = []; $options = $this->getOptions(); if ($options) { $messages[] = 'Options:'; foreach ($options as $option) { if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { $default = \sprintf(' (default: %s)', $this->formatDefaultValue($option->getDefault())); } else { $default = ''; } $multiple = $option->isArray() ? ' (multiple values allowed)' : ''; $description = \str_replace("\n", "\n" . \str_pad('', $max + 2, ' '), $option->getDescription()); $optionMax = $max - \strlen($option->getName()) - 2; $messages[] = \sprintf( " %s %-${optionMax}s%s%s%s", '--' . $option->getName(), $option->getShortcut() ? \sprintf('(-%s) ', $option->getShortcut()) : '', $description, $default, $multiple ); } $messages[] = ''; } return \implode(PHP_EOL, $messages); } /** * Calculate the maximum padding width for a set of lines. * * @return int */ private function getMaxWidth() { $max = 0; foreach ($this->getOptions() as $option) { $nameLength = \strlen($option->getName()) + 2; if ($option->getShortcut()) { $nameLength += \strlen($option->getShortcut()) + 3; } $max = \max($max, $nameLength); } foreach ($this->getArguments() as $argument) { $max = \max($max, \strlen($argument->getName())); } return ++$max; } /** * Format an option default as text. * * @param mixed $default * * @return string */ private function formatDefaultValue($default) { if (\is_array($default) && $default === \array_values($default)) { return \sprintf("array('%s')", \implode("', '", $default)); } return \str_replace("\n", '', \var_export($default, true)); } /** * Get a Table instance. * * Falls back to legacy TableHelper. * * @return Table|TableHelper */ protected function getTable(OutputInterface $output) { if (!\class_exists('Symfony\Component\Console\Helper\Table')) { return $this->getTableHelper(); } $style = new TableStyle(); $style ->setVerticalBorderChar(' ') ->setHorizontalBorderChar('') ->setCrossingChar(''); $table = new Table($output); return $table ->setRows([]) ->setStyle($style); } /** * Legacy fallback for getTable. * * @return TableHelper */ protected function getTableHelper() { $table = $this->getApplication()->getHelperSet()->get('table'); return $table ->setRows([]) ->setLayout(TableHelper::LAYOUT_BORDERLESS) ->setHorizontalBorderChar('') ->setCrossingChar(''); } } PK!3;&&!psysh/src/Command/ListCommand.phpnuIwpresenter = $presenter; } /** * {@inheritdoc} */ protected function configure() { list($grep, $insensitive, $invert) = FilterOptions::getOptions(); $this ->setName('ls') ->setAliases(['list', 'dir']) ->setDefinition([ new CodeArgument('target', CodeArgument::OPTIONAL, 'A target class or object to list.'), new InputOption('vars', '', InputOption::VALUE_NONE, 'Display variables.'), new InputOption('constants', 'c', InputOption::VALUE_NONE, 'Display defined constants.'), new InputOption('functions', 'f', InputOption::VALUE_NONE, 'Display defined functions.'), new InputOption('classes', 'k', InputOption::VALUE_NONE, 'Display declared classes.'), new InputOption('interfaces', 'I', InputOption::VALUE_NONE, 'Display declared interfaces.'), new InputOption('traits', 't', InputOption::VALUE_NONE, 'Display declared traits.'), new InputOption('no-inherit', '', InputOption::VALUE_NONE, 'Exclude inherited methods, properties and constants.'), new InputOption('properties', 'p', InputOption::VALUE_NONE, 'Display class or object properties (public properties by default).'), new InputOption('methods', 'm', InputOption::VALUE_NONE, 'Display class or object methods (public methods by default).'), $grep, $insensitive, $invert, new InputOption('globals', 'g', InputOption::VALUE_NONE, 'Include global variables.'), new InputOption('internal', 'n', InputOption::VALUE_NONE, 'Limit to internal functions and classes.'), new InputOption('user', 'u', InputOption::VALUE_NONE, 'Limit to user-defined constants, functions and classes.'), new InputOption('category', 'C', InputOption::VALUE_REQUIRED, 'Limit to constants in a specific category (e.g. "date").'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Include private and protected methods and properties.'), new InputOption('long', 'l', InputOption::VALUE_NONE, 'List in long format: includes class names and method signatures.'), ]) ->setDescription('List local, instance or class variables, methods and constants.') ->setHelp( <<<'HELP' List variables, constants, classes, interfaces, traits, functions, methods, and properties. Called without options, this will return a list of variables currently in scope. If a target object is provided, list properties, constants and methods of that target. If a class, interface or trait name is passed instead, list constants and methods on that class. e.g. >>> ls >>> ls $foo >>> ls -k --grep mongo -i >>> ls -al ReflectionClass >>> ls --constants --category date >>> ls -l --functions --grep /^array_.*/ >>> ls -l --properties new DateTime() HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->validateInput($input); $this->initEnumerators(); $method = $input->getOption('long') ? 'writeLong' : 'write'; if ($target = $input->getArgument('target')) { list($target, $reflector) = $this->getTargetAndReflector($target); } else { $reflector = null; } // @todo something cleaner than this :-/ if ($input->getOption('long')) { $output->startPaging(); } foreach ($this->enumerators as $enumerator) { $this->$method($output, $enumerator->enumerate($input, $reflector, $target)); } if ($input->getOption('long')) { $output->stopPaging(); } // Set some magic local variables if ($reflector !== null) { $this->setCommandScopeVariables($reflector); } return 0; } /** * Initialize Enumerators. */ protected function initEnumerators() { if (!isset($this->enumerators)) { $mgr = $this->presenter; $this->enumerators = [ new ClassConstantEnumerator($mgr), new ClassEnumerator($mgr), new ConstantEnumerator($mgr), new FunctionEnumerator($mgr), new GlobalVariableEnumerator($mgr), new PropertyEnumerator($mgr), new MethodEnumerator($mgr), new VariableEnumerator($mgr, $this->context), ]; } } /** * Write the list items to $output. * * @param OutputInterface $output * @param null|array $result List of enumerated items */ protected function write(OutputInterface $output, array $result = null) { if ($result === null) { return; } foreach ($result as $label => $items) { $names = \array_map([$this, 'formatItemName'], $items); $output->writeln(\sprintf('%s: %s', $label, \implode(', ', $names))); } } /** * Write the list items to $output. * * Items are listed one per line, and include the item signature. * * @param OutputInterface $output * @param null|array $result List of enumerated items */ protected function writeLong(OutputInterface $output, array $result = null) { if ($result === null) { return; } $table = $this->getTable($output); foreach ($result as $label => $items) { $output->writeln(''); $output->writeln(\sprintf('%s:', $label)); $table->setRows([]); foreach ($items as $item) { $table->addRow([$this->formatItemName($item), $item['value']]); } if ($table instanceof TableHelper) { $table->render($output); } else { $table->render(); } } } /** * Format an item name given its visibility. * * @param array $item * * @return string */ private function formatItemName($item) { return \sprintf('<%s>%s', $item['style'], OutputFormatter::escape($item['name']), $item['style']); } /** * Validate that input options make sense, provide defaults when called without options. * * @throws RuntimeException if options are inconsistent * * @param InputInterface $input */ private function validateInput(InputInterface $input) { if (!$input->getArgument('target')) { // if no target is passed, there can be no properties or methods foreach (['properties', 'methods', 'no-inherit'] as $option) { if ($input->getOption($option)) { throw new RuntimeException('--' . $option . ' does not make sense without a specified target'); } } foreach (['globals', 'vars', 'constants', 'functions', 'classes', 'interfaces', 'traits'] as $option) { if ($input->getOption($option)) { return; } } // default to --vars if no other options are passed $input->setOption('vars', true); } else { // if a target is passed, classes, functions, etc don't make sense foreach (['vars', 'globals', 'functions', 'classes', 'interfaces', 'traits'] as $option) { if ($input->getOption($option)) { throw new RuntimeException('--' . $option . ' does not make sense with a specified target'); } } foreach (['constants', 'properties', 'methods'] as $option) { if ($input->getOption($option)) { return; } } // default to --constants --properties --methods if no other options are passed $input->setOption('constants', true); $input->setOption('properties', true); $input->setOption('methods', true); } } } PK! MM!psysh/src/Command/EditCommand.phpnuIwruntimeDir = $runtimeDir; } protected function configure() { $this ->setName('edit') ->setDefinition([ new InputArgument('file', InputArgument::OPTIONAL, 'The file to open for editing. If this is not given, edits a temporary file.', null), new InputOption( 'exec', 'e', InputOption::VALUE_NONE, 'Execute the file content after editing. This is the default when a file name argument is not given.', null ), new InputOption( 'no-exec', 'E', InputOption::VALUE_NONE, 'Do not execute the file content after editing. This is the default when a file name argument is given.', null ), ]) ->setDescription('Open an external editor. Afterwards, get produced code in input buffer.') ->setHelp('Set the EDITOR environment variable to something you\'d like to use.'); } /** * @param InputInterface $input * @param OutputInterface $output * * @throws \InvalidArgumentException when both exec and no-exec flags are given or if a given variable is not found in the current context * @throws \UnexpectedValueException if file_get_contents on the edited file returns false instead of a string */ protected function execute(InputInterface $input, OutputInterface $output) { if ($input->getOption('exec') && $input->getOption('no-exec')) { throw new \InvalidArgumentException('The --exec and --no-exec flags are mutually exclusive'); } $filePath = $this->extractFilePath($input->getArgument('file')); $execute = $this->shouldExecuteFile( $input->getOption('exec'), $input->getOption('no-exec'), $filePath ); $shouldRemoveFile = false; if ($filePath === null) { $filePath = \tempnam($this->runtimeDir, 'psysh-edit-command'); $shouldRemoveFile = true; } $editedContent = $this->editFile($filePath, $shouldRemoveFile); if ($execute) { $this->getApplication()->addInput($editedContent); } return 0; } /** * @param bool $execOption * @param bool $noExecOption * @param string|null $filePath * * @return bool */ private function shouldExecuteFile($execOption, $noExecOption, $filePath) { if ($execOption) { return true; } if ($noExecOption) { return false; } // By default, code that is edited is executed if there was no given input file path return $filePath === null; } /** * @param string|null $fileArgument * * @return string|null The file path to edit, null if the input was null, or the value of the referenced variable * * @throws \InvalidArgumentException If the variable is not found in the current context */ private function extractFilePath($fileArgument) { // If the file argument was a variable, get it from the context if ($fileArgument !== null && \strlen($fileArgument) > 0 && $fileArgument[0] === '$') { $fileArgument = $this->context->get(\preg_replace('/^\$/', '', $fileArgument)); } return $fileArgument; } /** * @param string $filePath * @param string $shouldRemoveFile * * @return string * * @throws \UnexpectedValueException if file_get_contents on $filePath returns false instead of a string */ private function editFile($filePath, $shouldRemoveFile) { $escapedFilePath = \escapeshellarg($filePath); $pipes = []; $proc = \proc_open((\getenv('EDITOR') ?: 'nano') . " {$escapedFilePath}", [STDIN, STDOUT, STDERR], $pipes); \proc_close($proc); $editedContent = @\file_get_contents($filePath); if ($shouldRemoveFile) { @\unlink($filePath); } if ($editedContent === false) { throw new \UnexpectedValueException("Reading {$filePath} returned false"); } return $editedContent; } /** * Set the Context reference. * * @param Context $context */ public function setContext(Context $context) { $this->context = $context; } } PK!aB!psysh/src/Command/SudoCommand.phpnuIwparser = $parserFactory->createParser(); $this->traverser = new NodeTraverser(); $this->traverser->addVisitor(new SudoVisitor()); $this->printer = new Printer(); parent::__construct($name); } /** * Set the Shell's Readline service. * * @param Readline $readline */ public function setReadline(Readline $readline) { $this->readline = $readline; } /** * {@inheritdoc} */ protected function configure() { $this ->setName('sudo') ->setDefinition([ new CodeArgument('code', CodeArgument::REQUIRED, 'Code to execute.'), ]) ->setDescription('Evaluate PHP code, bypassing visibility restrictions.') ->setHelp( <<<'HELP' Evaluate PHP code, bypassing visibility restrictions. e.g. >>> $sekret->whisper("hi") PHP error: Call to private method Sekret::whisper() from context '' on line 1 >>> sudo $sekret->whisper("hi") => "hi" >>> $sekret->word PHP error: Cannot access private property Sekret::$word on line 1 >>> sudo $sekret->word => "hi" >>> $sekret->word = "please" PHP error: Cannot access private property Sekret::$word on line 1 >>> sudo $sekret->word = "please" => "please" HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $code = $input->getArgument('code'); // special case for !! if ($code === '!!') { $history = $this->readline->listHistory(); if (\count($history) < 2) { throw new \InvalidArgumentException('No previous command to replay'); } $code = $history[\count($history) - 2]; } if (\strpos('traverser->traverse($this->parse($code)); $sudoCode = $this->printer->prettyPrint($nodes); $shell = $this->getApplication(); $shell->addCode($sudoCode, !$shell->hasCode()); return 0; } /** * Lex and parse a string of code into statements. * * @param string $code * * @return array Statements */ private function parse($code) { try { return $this->parser->parse($code); } catch (\PhpParser\Error $e) { if (\strpos($e->getMessage(), 'unexpected EOF') === false) { throw $e; } // If we got an unexpected EOF, let's try it again with a semicolon. return $this->parser->parse($code . ';'); } } } PK!N2>#psysh/src/Command/BufferCommand.phpnuIwsetName('buffer') ->setAliases(['buf']) ->setDefinition([ new InputOption('clear', '', InputOption::VALUE_NONE, 'Clear the current buffer.'), ]) ->setDescription('Show (or clear) the contents of the code input buffer.') ->setHelp( <<<'HELP' Show the contents of the code buffer for the current multi-line expression. Optionally, clear the buffer by passing the --clear option. HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $buf = $this->getApplication()->getCodeBuffer(); if ($input->getOption('clear')) { $this->getApplication()->resetCodeBuffer(); $output->writeln($this->formatLines($buf, 'urgent'), ShellOutput::NUMBER_LINES); } else { $output->writeln($this->formatLines($buf), ShellOutput::NUMBER_LINES); } return 0; } /** * A helper method for wrapping buffer lines in `` and `` formatter strings. * * @param array $lines * @param string $type (default: 'return') * * @return array Formatted strings */ protected function formatLines(array $lines, $type = 'return') { $template = \sprintf('<%s>%%s', $type, $type); return \array_map(function ($line) use ($template) { return \sprintf($template, $line); }, $lines); } } PK!RTT psysh/src/Command/WtfCommand.phpnuIwcontext = $context; } /** * {@inheritdoc} */ protected function configure() { list($grep, $insensitive, $invert) = FilterOptions::getOptions(); $this ->setName('wtf') ->setAliases(['last-exception', 'wtf?']) ->setDefinition([ new InputArgument('incredulity', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Number of lines to show.'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show entire backtrace.'), $grep, $insensitive, $invert, ]) ->setDescription('Show the backtrace of the most recent exception.') ->setHelp( <<<'HELP' Shows a few lines of the backtrace of the most recent exception. If you want to see more lines, add more question marks or exclamation marks: e.g. >>> wtf ? >>> wtf ?!???!?!? To see the entire backtrace, pass the -a/--all flag: e.g. >>> wtf -a HELP ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $this->filter->bind($input); $incredulity = \implode('', $input->getArgument('incredulity')); if (\strlen(\preg_replace('/[\\?!]/', '', $incredulity))) { throw new \InvalidArgumentException('Incredulity must include only "?" and "!"'); } $exception = $this->context->getLastException(); $count = $input->getOption('all') ? PHP_INT_MAX : \max(3, \pow(2, \strlen($incredulity) + 1)); $shell = $this->getApplication(); $output->startPaging(); do { $traceCount = \count($exception->getTrace()); $showLines = $count; // Show the whole trace if we'd only be hiding a few lines if ($traceCount < \max($count * 1.2, $count + 2)) { $showLines = PHP_INT_MAX; } $trace = $this->getBacktrace($exception, $showLines); $moreLines = $traceCount - \count($trace); $output->writeln($shell->formatException($exception)); $output->writeln('--'); $output->write($trace, true, ShellOutput::NUMBER_LINES); $output->writeln(''); if ($moreLines > 0) { $output->writeln(\sprintf( '', $moreLines )); $output->writeln(''); } } while ($exception = $exception->getPrevious()); $output->stopPaging(); return 0; } } PK!T%%'psysh/src/Command/ReflectingCommand.phpnuIw)(\w+)$/'; /** * Context instance (for ContextAware interface). * * @var Context */ protected $context; /** * ContextAware interface. * * @param Context $context */ public function setContext(Context $context) { $this->context = $context; } /** * Get the target for a value. * * @throws \InvalidArgumentException when the value specified can't be resolved * * @param string $valueName Function, class, variable, constant, method or property name * * @return array (class or instance name, member name, kind) */ protected function getTarget($valueName) { $valueName = \trim($valueName); $matches = []; switch (true) { case \preg_match(self::CLASS_OR_FUNC, $valueName, $matches): return [$this->resolveName($matches[0], true), null, 0]; case \preg_match(self::CLASS_MEMBER, $valueName, $matches): return [$this->resolveName($matches[1]), $matches[2], Mirror::CONSTANT | Mirror::METHOD]; case \preg_match(self::CLASS_STATIC, $valueName, $matches): return [$this->resolveName($matches[1]), $matches[2], Mirror::STATIC_PROPERTY | Mirror::PROPERTY]; case \preg_match(self::INSTANCE_MEMBER, $valueName, $matches): if ($matches[2] === '->') { $kind = Mirror::METHOD | Mirror::PROPERTY; } else { $kind = Mirror::CONSTANT | Mirror::METHOD; } return [$this->resolveObject($matches[1]), $matches[3], $kind]; default: return [$this->resolveObject($valueName), null, 0]; } } /** * Resolve a class or function name (with the current shell namespace). * * @throws ErrorException when `self` or `static` is used in a non-class scope * * @param string $name * @param bool $includeFunctions (default: false) * * @return string */ protected function resolveName($name, $includeFunctions = false) { $shell = $this->getApplication(); // While not *technically* 100% accurate, let's treat `self` and `static` as equivalent. if (\in_array(\strtolower($name), ['self', 'static'])) { if ($boundClass = $shell->getBoundClass()) { return $boundClass; } if ($boundObject = $shell->getBoundObject()) { return \get_class($boundObject); } $msg = \sprintf('Cannot use "%s" when no class scope is active', \strtolower($name)); throw new ErrorException($msg, 0, E_USER_ERROR, "eval()'d code", 1); } if (\substr($name, 0, 1) === '\\') { return $name; } if ($namespace = $shell->getNamespace()) { $fullName = $namespace . '\\' . $name; if (\class_exists($fullName) || \interface_exists($fullName) || ($includeFunctions && \function_exists($fullName))) { return $fullName; } } return $name; } /** * Get a Reflector and documentation for a function, class or instance, constant, method or property. * * @param string $valueName Function, class, variable, constant, method or property name * * @return array (value, Reflector) */ protected function getTargetAndReflector($valueName) { list($value, $member, $kind) = $this->getTarget($valueName); return [$value, Mirror::get($value, $member, $kind)]; } /** * Resolve code to a value in the current scope. * * @throws RuntimeException when the code does not return a value in the current scope * * @param string $code * * @return mixed Variable value */ protected function resolveCode($code) { try { $value = $this->getApplication()->execute($code, true); } catch (\Exception $e) { // Swallow all exceptions? } if (!isset($value) || $value instanceof NoReturnValue) { throw new RuntimeException('Unknown target: ' . $code); } return $value; } /** * Resolve code to an object in the current scope. * * @throws RuntimeException when the code resolves to a non-object value * * @param string $code * * @return object Variable instance */ private function resolveObject($code) { $value = $this->resolveCode($code); if (!\is_object($value)) { throw new RuntimeException('Unable to inspect a non-object'); } return $value; } /** * @deprecated Use `resolveCode` instead * * @param string $name * * @return mixed Variable instance */ protected function resolveInstance($name) { @\trigger_error('`resolveInstance` is deprecated; use `resolveCode` instead.', E_USER_DEPRECATED); return $this->resolveCode($name); } /** * Get a variable from the current shell scope. * * @param string $name * * @return mixed */ protected function getScopeVariable($name) { return $this->context->get($name); } /** * Get all scope variables from the current shell scope. * * @return array */ protected function getScopeVariables() { return $this->context->getAll(); } /** * Given a Reflector instance, set command-scope variables in the shell * execution context. This is used to inject magic $__class, $__method and * $__file variables (as well as a handful of others). * * @param \Reflector $reflector */ protected function setCommandScopeVariables(\Reflector $reflector) { $vars = []; switch (\get_class($reflector)) { case 'ReflectionClass': case 'ReflectionObject': $vars['__class'] = $reflector->name; if ($reflector->inNamespace()) { $vars['__namespace'] = $reflector->getNamespaceName(); } break; case 'ReflectionMethod': $vars['__method'] = \sprintf('%s::%s', $reflector->class, $reflector->name); $vars['__class'] = $reflector->class; $classReflector = $reflector->getDeclaringClass(); if ($classReflector->inNamespace()) { $vars['__namespace'] = $classReflector->getNamespaceName(); } break; case 'ReflectionFunction': $vars['__function'] = $reflector->name; if ($reflector->inNamespace()) { $vars['__namespace'] = $reflector->getNamespaceName(); } break; case 'ReflectionGenerator': $funcReflector = $reflector->getFunction(); $vars['__function'] = $funcReflector->name; if ($funcReflector->inNamespace()) { $vars['__namespace'] = $funcReflector->getNamespaceName(); } if ($fileName = $reflector->getExecutingFile()) { $vars['__file'] = $fileName; $vars['__line'] = $reflector->getExecutingLine(); $vars['__dir'] = \dirname($fileName); } break; case 'ReflectionProperty': case 'ReflectionClassConstant': case 'Psy\Reflection\ReflectionClassConstant': $classReflector = $reflector->getDeclaringClass(); $vars['__class'] = $classReflector->name; if ($classReflector->inNamespace()) { $vars['__namespace'] = $classReflector->getNamespaceName(); } // no line for these, but this'll do if ($fileName = $reflector->getDeclaringClass()->getFileName()) { $vars['__file'] = $fileName; $vars['__dir'] = \dirname($fileName); } break; case 'Psy\Reflection\ReflectionConstant_': if ($reflector->inNamespace()) { $vars['__namespace'] = $reflector->getNamespaceName(); } break; } if ($reflector instanceof \ReflectionClass || $reflector instanceof \ReflectionFunctionAbstract) { if ($fileName = $reflector->getFileName()) { $vars['__file'] = $fileName; $vars['__line'] = $reflector->getStartLine(); $vars['__dir'] = \dirname($fileName); } } $this->context->setCommandScopeVariables($vars); } } PK!9hTT1psysh/src/Command/TimeitCommand/TimeitVisitor.phpnuIwfunctionDepth = 0; } /** * {@inheritdoc} */ public function enterNode(Node $node) { // keep track of nested function-like nodes, because they can have // returns statements... and we don't want to call markEnd for those. if ($node instanceof FunctionLike) { $this->functionDepth++; return; } // replace any top-level `return` statements with a `markEnd` call if ($this->functionDepth === 0 && $node instanceof Return_) { return new Return_($this->getEndCall($node->expr), $node->getAttributes()); } } /** * {@inheritdoc} */ public function leaveNode(Node $node) { if ($node instanceof FunctionLike) { $this->functionDepth--; } } /** * {@inheritdoc} */ public function afterTraverse(array $nodes) { // prepend a `markStart` call \array_unshift($nodes, $this->maybeExpression($this->getStartCall())); // append a `markEnd` call (wrapping the final node, if it's an expression) $last = $nodes[\count($nodes) - 1]; if ($last instanceof Expr) { \array_pop($nodes); $nodes[] = $this->getEndCall($last); } elseif ($last instanceof Expression) { \array_pop($nodes); $nodes[] = new Expression($this->getEndCall($last->expr), $last->getAttributes()); } elseif ($last instanceof Return_) { // nothing to do here, we're already ending with a return call } else { $nodes[] = $this->maybeExpression($this->getEndCall()); } return $nodes; } /** * Get PhpParser AST nodes for a `markStart` call. * * @return PhpParser\Node\Expr\StaticCall */ private function getStartCall() { return new StaticCall(new FullyQualifiedName('Psy\Command\TimeitCommand'), 'markStart'); } /** * Get PhpParser AST nodes for a `markEnd` call. * * Optionally pass in a return value. * * @param Expr|null $arg * * @return PhpParser\Node\Expr\StaticCall */ private function getEndCall(Expr $arg = null) { if ($arg === null) { $arg = NoReturnValue::create(); } return new StaticCall(new FullyQualifiedName('Psy\Command\TimeitCommand'), 'markEnd', [new Arg($arg)]); } /** * Compatibility shim for PHP Parser 3.x. * * Wrap $expr in a PhpParser\Node\Stmt\Expression if the class exists. * * @param PhpParser\Node $expr * @param array $attrs * * @return PhpParser\Node\Expr|PhpParser\Node\Stmt\Expression */ private function maybeExpression($expr, $attrs = []) { return \class_exists('PhpParser\Node\Stmt\Expression') ? new Expression($expr, $attrs) : $expr; } } PK!Odp$psysh/src/Command/ThrowUpCommand.phpnuIwparser = $parserFactory->createParser(); $this->printer = new Printer(); parent::__construct($name); } /** * ContextAware interface. * * @param Context $context */ public function setContext(Context $context) { $this->context = $context; } /** * {@inheritdoc} */ protected function configure() { $this ->setName('throw-up') ->setDefinition([ new CodeArgument('exception', CodeArgument::OPTIONAL, 'Exception or Error to throw.'), ]) ->setDescription('Throw an exception or error out of the Psy Shell.') ->setHelp( <<<'HELP' Throws an exception or error out of the current the Psy Shell instance. By default it throws the most recent exception. e.g. >>> throw-up >>> throw-up $e >>> throw-up new Exception('WHEEEEEE!') >>> throw-up "bye!" HELP ); } /** * {@inheritdoc} * * @throws InvalidArgumentException if there is no exception to throw */ protected function execute(InputInterface $input, OutputInterface $output) { $args = $this->prepareArgs($input->getArgument('exception')); $throwStmt = new Throw_(new StaticCall(new FullyQualifiedName(self::THROW_CLASS), 'fromThrowable', $args)); $throwCode = $this->printer->prettyPrint([$throwStmt]); $shell = $this->getApplication(); $shell->addCode($throwCode, !$shell->hasCode()); return 0; } /** * Parse the supplied command argument. * * If no argument was given, this falls back to `$_e` * * @throws InvalidArgumentException if there is no exception to throw * * @param string $code * * @return Arg[] */ private function prepareArgs($code = null) { if (!$code) { // Default to last exception if nothing else was supplied return [new Arg(new Variable('_e'))]; } if (\strpos('parse($code); if (\count($nodes) !== 1) { throw new \InvalidArgumentException('No idea how to throw this'); } $node = $nodes[0]; // Make this work for PHP Parser v3.x $expr = isset($node->expr) ? $node->expr : $node; $args = [new Arg($expr, false, false, $node->getAttributes())]; // Allow throwing via a string, e.g. `throw-up "SUP"` if ($expr instanceof String_) { return [new New_(new FullyQualifiedName('Exception'), $args)]; } return $args; } /** * Lex and parse a string of code into statements. * * @param string $code * * @return array Statements */ private function parse($code) { try { return $this->parser->parse($code); } catch (\PhpParser\Error $e) { if (\strpos($e->getMessage(), 'unexpected EOF') === false) { throw $e; } // If we got an unexpected EOF, let's try it again with a semicolon. return $this->parser->parse($code . ';'); } } } PK!B psysh/src/VarDumper/Dumper.phpnuIw '\0', "\t" => '\t', "\n" => '\n', "\v" => '\v', "\f" => '\f', "\r" => '\r', "\033" => '\e', ]; public function __construct(OutputFormatter $formatter, $forceArrayIndexes = false) { $this->formatter = $formatter; $this->forceArrayIndexes = $forceArrayIndexes; parent::__construct(); $this->setColors(false); } /** * {@inheritdoc} */ public function enterHash(Cursor $cursor, $type, $class, $hasChild) { if (Cursor::HASH_INDEXED === $type || Cursor::HASH_ASSOC === $type) { $class = 0; } parent::enterHash($cursor, $type, $class, $hasChild); } /** * {@inheritdoc} */ protected function dumpKey(Cursor $cursor) { if ($this->forceArrayIndexes || Cursor::HASH_INDEXED !== $cursor->hashType) { parent::dumpKey($cursor); } } protected function style($style, $value, $attr = []) { if ('ref' === $style) { $value = \strtr($value, '@', '#'); } $styled = ''; $map = self::$controlCharsMap; $cchr = $this->styles['cchr']; $chunks = \preg_split(self::$controlCharsRx, $value, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach ($chunks as $chunk) { if (\preg_match(self::$onlyControlCharsRx, $chunk)) { $chars = ''; $i = 0; do { $chars .= isset($map[$chunk[$i]]) ? $map[$chunk[$i]] : \sprintf('\x%02X', \ord($chunk[$i])); } while (isset($chunk[++$i])); $chars = $this->formatter->escape($chars); $styled .= "<{$cchr}>{$chars}"; } else { $styled .= $this->formatter->escape($chunk); } } $style = $this->styles[$style]; return "<{$style}>{$styled}"; } /** * {@inheritdoc} */ protected function dumpLine($depth, $endOfValue = false) { if ($endOfValue && 0 < $depth) { $this->line .= ','; } $this->line = $this->formatter->format($this->line); parent::dumpLine($depth, $endOfValue); } } PK!jmmpsysh/src/VarDumper/Cloner.phpnuIwfilter = $filter; return parent::cloneVar($var, $filter); } /** * {@inheritdoc} */ protected function castResource(Stub $stub, $isNested) { return Caster::EXCLUDE_VERBOSE & $this->filter ? [] : parent::castResource($stub, $isNested); } } PK!ޥխ&psysh/src/VarDumper/PresenterAware.phpnuIw 'number', 'const' => 'const', 'str' => 'string', 'cchr' => 'default', 'note' => 'class', 'ref' => 'default', 'public' => 'public', 'protected' => 'protected', 'private' => 'private', 'meta' => 'comment', 'key' => 'comment', 'index' => 'number', ]; public function __construct(OutputFormatter $formatter, $forceArrayIndexes = false) { // Work around https://github.com/symfony/symfony/issues/23572 $oldLocale = \setlocale(LC_NUMERIC, 0); \setlocale(LC_NUMERIC, 'C'); $this->dumper = new Dumper($formatter, $forceArrayIndexes); $this->dumper->setStyles($this->styles); // Now put the locale back \setlocale(LC_NUMERIC, $oldLocale); $this->cloner = new Cloner(); $this->cloner->addCasters(['*' => function ($obj, array $a, Stub $stub, $isNested, $filter = 0) { if ($filter || $isNested) { if ($obj instanceof \Exception) { $a = Caster::filter($a, Caster::EXCLUDE_NOT_IMPORTANT | Caster::EXCLUDE_EMPTY, $this->exceptionsImportants); } else { $a = Caster::filter($a, Caster::EXCLUDE_PROTECTED | Caster::EXCLUDE_PRIVATE); } } return $a; }]); } /** * Register casters. * * @see http://symfony.com/doc/current/components/var_dumper/advanced.html#casters * * @param callable[] $casters A map of casters */ public function addCasters(array $casters) { $this->cloner->addCasters($casters); } /** * Present a reference to the value. * * @param mixed $value * * @return string */ public function presentRef($value) { return $this->present($value, 0); } /** * Present a full representation of the value. * * If $depth is 0, the value will be presented as a ref instead. * * @param mixed $value * @param int $depth (default: null) * @param int $options One of Presenter constants * * @return string */ public function present($value, $depth = null, $options = 0) { $data = $this->cloner->cloneVar($value, !($options & self::VERBOSE) ? Caster::EXCLUDE_VERBOSE : 0); if (null !== $depth) { $data = $data->withMaxDepth($depth); } // Work around https://github.com/symfony/symfony/issues/23572 $oldLocale = \setlocale(LC_NUMERIC, 0); \setlocale(LC_NUMERIC, 'C'); $output = ''; $this->dumper->dump($data, function ($line, $depth) use (&$output) { if ($depth >= 0) { if ('' !== $output) { $output .= PHP_EOL; } $output .= \str_repeat(' ', $depth) . $line; } }); // Now put the locale back \setlocale(LC_NUMERIC, $oldLocale); return OutputFormatter::escape($output); } } PK!f "psysh/src/ExecutionLoopClosure.phpnuIwsetClosure($__psysh__, function () use ($__psysh__) { // Restore execution scope variables \extract($__psysh__->getScopeVariables(false)); do { $__psysh__->beforeLoop(); try { $__psysh__->getInput(); try { // Pull in any new execution scope variables if ($__psysh__->getLastExecSuccess()) { \extract($__psysh__->getScopeVariablesDiff(\get_defined_vars())); } // Buffer stdout; we'll need it later \ob_start([$__psysh__, 'writeStdout'], 1); // Convert all errors to exceptions \set_error_handler([$__psysh__, 'handleError']); // Evaluate the current code buffer $_ = eval($__psysh__->onExecute($__psysh__->flushCode() ?: ExecutionClosure::NOOP_INPUT)); } catch (\Throwable $_e) { // Clean up on our way out. \restore_error_handler(); if (\ob_get_level() > 0) { \ob_end_clean(); } throw $_e; } catch (\Exception $_e) { // Clean up on our way out. \restore_error_handler(); if (\ob_get_level() > 0) { \ob_end_clean(); } throw $_e; } // Won't be needing this anymore \restore_error_handler(); // Flush stdout (write to shell output, plus save to magic variable) \ob_end_flush(); // Save execution scope variables for next time $__psysh__->setScopeVariables(\get_defined_vars()); $__psysh__->writeReturnValue($_); } catch (BreakException $_e) { $__psysh__->writeException($_e); return; } catch (ThrowUpException $_e) { $__psysh__->writeException($_e); throw $_e; } catch (\TypeError $_e) { $__psysh__->writeException(TypeErrorException::fromTypeError($_e)); } catch (\Error $_e) { $__psysh__->writeException(ErrorException::fromError($_e)); } catch (\Exception $_e) { $__psysh__->writeException($_e); } $__psysh__->afterLoop(); } while (true); }); } } PK!L,,psysh/src/ExecutionLoop/AbstractListener.phpnuIwparser = $parserFactory->createParser(); } /** * Reload code on input. * * @param Shell $shell * @param string $input */ public function onInput(Shell $shell, $input) { $this->reload($shell); } /** * Look through included files and update anything with a new timestamp. * * @param Shell $shell */ private function reload(Shell $shell) { \clearstatcache(); $modified = []; foreach (\get_included_files() as $file) { $timestamp = \filemtime($file); if (!isset($this->timestamps[$file])) { $this->timestamps[$file] = $timestamp; continue; } if ($this->timestamps[$file] === $timestamp) { continue; } if (!$this->lintFile($file)) { $msg = \sprintf('Modified file "%s" could not be reloaded', $file); $shell->writeException(new ParseErrorException($msg)); continue; } $modified[] = $file; $this->timestamps[$file] = $timestamp; } // switch (count($modified)) { // case 0: // return; // case 1: // printf("Reloading modified file: \"%s\"\n", str_replace(getcwd(), '.', $file)); // break; // default: // printf("Reloading %d modified files\n", count($modified)); // break; // } foreach ($modified as $file) { runkit_import($file, ( RUNKIT_IMPORT_FUNCTIONS | RUNKIT_IMPORT_CLASSES | RUNKIT_IMPORT_CLASS_METHODS | RUNKIT_IMPORT_CLASS_CONSTS | RUNKIT_IMPORT_CLASS_PROPS | RUNKIT_IMPORT_OVERRIDE )); } } /** * Should this file be re-imported? * * Use PHP-Parser to ensure that the file is valid PHP. * * @param string $file * * @return bool */ private function lintFile($file) { // first try to parse it try { $this->parser->parse(\file_get_contents($file)); } catch (\Exception $e) { return false; } return true; } } PK!CԖ)psysh/src/ExecutionLoop/ProcessForker.phpnuIw 0) { // This is the main thread. We'll just wait for a while. // We won't be needing this one. \fclose($up); // Wait for a return value from the loop process. $read = [$down]; $write = null; $except = null; do { $n = @\stream_select($read, $write, $except, null); if ($n === 0) { throw new \RuntimeException('Process timed out waiting for execution loop'); } if ($n === false) { $err = \error_get_last(); if (!isset($err['message']) || \stripos($err['message'], 'interrupted system call') === false) { $msg = $err['message'] ? \sprintf('Error waiting for execution loop: %s', $err['message']) : 'Error waiting for execution loop'; throw new \RuntimeException($msg); } } } while ($n < 1); $content = \stream_get_contents($down); \fclose($down); if ($content) { $shell->setScopeVariables(@\unserialize($content)); } throw new BreakException('Exiting main thread'); } // This is the child process. It's going to do all the work. if (\function_exists('setproctitle')) { setproctitle('psysh (loop)'); } // We won't be needing this one. \fclose($down); // Save this; we'll need to close it in `afterRun` $this->up = $up; } /** * Create a savegame at the start of each loop iteration. * * @param Shell $shell */ public function beforeLoop(Shell $shell) { $this->createSavegame(); } /** * Clean up old savegames at the end of each loop iteration. * * @param Shell $shell */ public function afterLoop(Shell $shell) { // if there's an old savegame hanging around, let's kill it. if (isset($this->savegame)) { \posix_kill($this->savegame, SIGKILL); \pcntl_signal_dispatch(); } } /** * After the REPL session ends, send the scope variables back up to the main * thread (if this is a child thread). * * @param Shell $shell */ public function afterRun(Shell $shell) { // We're a child thread. Send the scope variables back up to the main thread. if (isset($this->up)) { \fwrite($this->up, $this->serializeReturn($shell->getScopeVariables(false))); \fclose($this->up); \posix_kill(\posix_getpid(), SIGKILL); } } /** * Create a savegame fork. * * The savegame contains the current execution state, and can be resumed in * the event that the worker dies unexpectedly (for example, by encountering * a PHP fatal error). */ private function createSavegame() { // the current process will become the savegame $this->savegame = \posix_getpid(); $pid = \pcntl_fork(); if ($pid < 0) { throw new \RuntimeException('Unable to create savegame fork'); } elseif ($pid > 0) { // we're the savegame now... let's wait and see what happens \pcntl_waitpid($pid, $status); // worker exited cleanly, let's bail if (!\pcntl_wexitstatus($status)) { \posix_kill(\posix_getpid(), SIGKILL); } // worker didn't exit cleanly, we'll need to have another go $this->createSavegame(); } } /** * Serialize all serializable return values. * * A naïve serialization will run into issues if there is a Closure or * SimpleXMLElement (among other things) in scope when exiting the execution * loop. We'll just ignore these unserializable classes, and serialize what * we can. * * @param array $return * * @return string */ private function serializeReturn(array $return) { $serializable = []; foreach ($return as $key => $value) { // No need to return magic variables if (Context::isSpecialVariableName($key)) { continue; } // Resources and Closures don't error, but they don't serialize well either. if (\is_resource($value) || $value instanceof \Closure) { continue; } try { @\serialize($value); $serializable[$key] = $value; } catch (\Throwable $e) { // we'll just ignore this one... } catch (\Exception $e) { // and this one too... // @todo remove this once we don't support PHP 5.x anymore :) } } return @\serialize($serializable); } } PK!e,psysh/src/VersionUpdater/IntervalChecker.phpnuIwcacheFile = $cacheFile; $this->interval = $interval; } public function fetchLatestRelease() { // Read the cached file $cached = \json_decode(@\file_get_contents($this->cacheFile, false)); if ($cached && isset($cached->last_check) && isset($cached->release)) { $now = new \DateTime(); $lastCheck = new \DateTime($cached->last_check); if ($lastCheck >= $now->sub($this->getDateInterval())) { return $cached->release; } } // Fall back to fetching from GitHub $release = parent::fetchLatestRelease(); if ($release && isset($release->tag_name)) { $this->updateCache($release); } return $release; } private function getDateInterval() { switch ($this->interval) { case Checker::DAILY: return new \DateInterval('P1D'); case Checker::WEEKLY: return new \DateInterval('P1W'); case Checker::MONTHLY: return new \DateInterval('P1M'); } } private function updateCache($release) { $data = [ 'last_check' => \date(DATE_ATOM), 'release' => $release, ]; \file_put_contents($this->cacheFile, \json_encode($data)); } } PK!E)/..$psysh/src/VersionUpdater/Checker.phpnuIwgetLatest(), '>='); } /** * @return string */ public function getLatest() { if (!isset($this->latest)) { $this->setLatest($this->getVersionFromTag()); } return $this->latest; } /** * @param string $version */ public function setLatest($version) { $this->latest = $version; } /** * @return string|null */ private function getVersionFromTag() { $contents = $this->fetchLatestRelease(); if (!$contents || !isset($contents->tag_name)) { throw new \InvalidArgumentException('Unable to check for updates'); } $this->setLatest($contents->tag_name); return $this->getLatest(); } /** * Set to public to make testing easier. * * @return mixed */ public function fetchLatestRelease() { $context = \stream_context_create([ 'http' => [ 'user_agent' => 'PsySH/' . Shell::VERSION, 'timeout' => 3, ], ]); \set_error_handler(function () { // Just ignore all errors with this. The checker will throw an exception // if it doesn't work :) }); $result = @\file_get_contents(self::URL, false, $context); \restore_error_handler(); return \json_decode($result); } } PK!ΐM6]](psysh/src/VersionUpdater/NoopChecker.phpnuIwhasConstant($member)) { return ReflectionClassConstant::create($value, $member); } elseif ($filter & self::METHOD && $class->hasMethod($member)) { return $class->getMethod($member); } elseif ($filter & self::PROPERTY && $class->hasProperty($member)) { return $class->getProperty($member); } elseif ($filter & self::STATIC_PROPERTY && $class->hasProperty($member) && $class->getProperty($member)->isStatic()) { return $class->getProperty($member); } else { throw new RuntimeException(\sprintf( 'Unknown member %s on class %s', $member, \is_object($value) ? \get_class($value) : $value )); } } /** * Get a ReflectionClass (or ReflectionObject) if possible. * * @throws \InvalidArgumentException if $value is not a class name or instance * * @param mixed $value * * @return \ReflectionClass */ private static function getClass($value) { if (\is_object($value)) { return new \ReflectionObject($value); } if (!\is_string($value)) { throw new \InvalidArgumentException('Mirror expects an object or class'); } elseif (!\class_exists($value) && !\interface_exists($value) && !\trait_exists($value)) { throw new \InvalidArgumentException('Unknown class or function: ' . $value); } return new \ReflectionClass($value); } } PK!P2psysh/src/Util/Json.phpnuIw * @author Justin Hileman */ class Docblock { /** * Tags in the docblock that have a whitespace-delimited number of parameters * (such as `@param type var desc` and `@return type desc`) and the names of * those parameters. * * @var array */ public static $vectors = [ 'throws' => ['type', 'desc'], 'param' => ['type', 'var', 'desc'], 'return' => ['type', 'desc'], ]; protected $reflector; /** * The description of the symbol. * * @var string */ public $desc; /** * The tags defined in the docblock. * * The array has keys which are the tag names (excluding the @) and values * that are arrays, each of which is an entry for the tag. * * In the case where the tag name is defined in {@see DocBlock::$vectors} the * value within the tag-value array is an array in itself with keys as * described by {@see DocBlock::$vectors}. * * @var array */ public $tags; /** * The entire DocBlock comment that was parsed. * * @var string */ public $comment; /** * Docblock constructor. * * @param \Reflector $reflector */ public function __construct(\Reflector $reflector) { $this->reflector = $reflector; $this->setComment($reflector->getDocComment()); } /** * Set and parse the docblock comment. * * @param string $comment The docblock */ protected function setComment($comment) { $this->desc = ''; $this->tags = []; $this->comment = $comment; $this->parseComment($comment); } /** * Find the length of the docblock prefix. * * @param array $lines * * @return int Prefix length */ protected static function prefixLength(array $lines) { // find only lines with interesting things $lines = \array_filter($lines, function ($line) { return \substr($line, \strspn($line, "* \t\n\r\0\x0B")); }); // if we sort the lines, we only have to compare two items \sort($lines); $first = \reset($lines); $last = \end($lines); // find the longest common substring $count = \min(\strlen($first), \strlen($last)); for ($i = 0; $i < $count; $i++) { if ($first[$i] !== $last[$i]) { return $i; } } return $count; } /** * Parse the comment into the component parts and set the state of the object. * * @param string $comment The docblock */ protected function parseComment($comment) { // Strip the opening and closing tags of the docblock $comment = \substr($comment, 3, -2); // Split into arrays of lines $comment = \array_filter(\preg_split('/\r?\n\r?/', $comment)); // Trim asterisks and whitespace from the beginning and whitespace from the end of lines $prefixLength = self::prefixLength($comment); $comment = \array_map(function ($line) use ($prefixLength) { return \rtrim(\substr($line, $prefixLength)); }, $comment); // Group the lines together by @tags $blocks = []; $b = -1; foreach ($comment as $line) { if (self::isTagged($line)) { $b++; $blocks[] = []; } elseif ($b === -1) { $b = 0; $blocks[] = []; } $blocks[$b][] = $line; } // Parse the blocks foreach ($blocks as $block => $body) { $body = \trim(\implode("\n", $body)); if ($block === 0 && !self::isTagged($body)) { // This is the description block $this->desc = $body; } else { // This block is tagged $tag = \substr(self::strTag($body), 1); $body = \ltrim(\substr($body, \strlen($tag) + 2)); if (isset(self::$vectors[$tag])) { // The tagged block is a vector $count = \count(self::$vectors[$tag]); if ($body) { $parts = \preg_split('/\s+/', $body, $count); } else { $parts = []; } // Default the trailing values $parts = \array_pad($parts, $count, null); // Store as a mapped array $this->tags[$tag][] = \array_combine(self::$vectors[$tag], $parts); } else { // The tagged block is only text $this->tags[$tag][] = $body; } } } } /** * Whether or not a docblock contains a given @tag. * * @param string $tag The name of the @tag to check for * * @return bool */ public function hasTag($tag) { return \is_array($this->tags) && \array_key_exists($tag, $this->tags); } /** * The value of a tag. * * @param string $tag * * @return array */ public function tag($tag) { return $this->hasTag($tag) ? $this->tags[$tag] : null; } /** * Whether or not a string begins with a @tag. * * @param string $str * * @return bool */ public static function isTagged($str) { return isset($str[1]) && $str[0] === '@' && !\preg_match('/[^A-Za-z]/', $str[1]); } /** * The tag at the beginning of a string. * * @param string $str * * @return string|null */ public static function strTag($str) { if (\preg_match('/^@[a-z0-9_]+/', $str, $matches)) { return $matches[0]; } } } PK!-R psysh/src/Util/Str.phpnuIwcolorMode = $colorMode; } /** * Get a `ConsoleColor` instance configured according to the given color * mode. * * @return ConsoleColor */ public function getConsoleColor() { if ($this->colorMode === Configuration::COLOR_MODE_AUTO) { return $this->getDefaultConsoleColor(); } elseif ($this->colorMode === Configuration::COLOR_MODE_FORCED) { return $this->getForcedConsoleColor(); } elseif ($this->colorMode === Configuration::COLOR_MODE_DISABLED) { return $this->getDisabledConsoleColor(); } } private function getDefaultConsoleColor() { $color = new ConsoleColor(); $color->addTheme(Highlighter::LINE_NUMBER, ['blue']); $color->addTheme(Highlighter::TOKEN_KEYWORD, ['yellow']); $color->addTheme(Highlighter::TOKEN_STRING, ['green']); $color->addTheme(Highlighter::TOKEN_COMMENT, ['dark_gray']); return $color; } private function getForcedConsoleColor() { $color = $this->getDefaultConsoleColor(); $color->setForceStyle(true); return $color; } private function getDisabledConsoleColor() { $color = new ConsoleColor(); $color->addTheme(Highlighter::TOKEN_STRING, ['none']); $color->addTheme(Highlighter::TOKEN_COMMENT, ['none']); $color->addTheme(Highlighter::TOKEN_KEYWORD, ['none']); $color->addTheme(Highlighter::TOKEN_DEFAULT, ['none']); $color->addTheme(Highlighter::TOKEN_HTML, ['none']); $color->addTheme(Highlighter::ACTUAL_LINE_MARK, ['none']); $color->addTheme(Highlighter::LINE_NUMBER, ['none']); return $color; } } PK!tokenPairs = $this->tokenize($input); } /** * {@inheritdoc} * * @throws \InvalidArgumentException if $definition has CodeArgument before the final argument position */ public function bind(InputDefinition $definition) { $hasCodeArgument = false; if ($definition->getArgumentCount() > 0) { $args = $definition->getArguments(); $lastArg = \array_pop($args); foreach ($args as $arg) { if ($arg instanceof CodeArgument) { $msg = \sprintf('Unexpected CodeArgument before the final position: %s', $arg->getName()); throw new \InvalidArgumentException($msg); } } if ($lastArg instanceof CodeArgument) { $hasCodeArgument = true; } } $this->hasCodeArgument = $hasCodeArgument; return parent::bind($definition); } /** * Tokenizes a string. * * The version of this on StringInput is good, but doesn't handle code * arguments if they're at all complicated. This does :) * * @param string $input The input to tokenize * * @return array An array of token/rest pairs * * @throws \InvalidArgumentException When unable to parse input (should never happen) */ private function tokenize($input) { $tokens = []; $length = \strlen($input); $cursor = 0; while ($cursor < $length) { if (\preg_match('/\s+/A', $input, $match, null, $cursor)) { } elseif (\preg_match('/([^="\'\s]+?)(=?)(' . StringInput::REGEX_QUOTED_STRING . '+)/A', $input, $match, null, $cursor)) { $tokens[] = [ $match[1] . $match[2] . \stripcslashes(\str_replace(['"\'', '\'"', '\'\'', '""'], '', \substr($match[3], 1, \strlen($match[3]) - 2))), \stripcslashes(\substr($input, $cursor)), ]; } elseif (\preg_match('/' . StringInput::REGEX_QUOTED_STRING . '/A', $input, $match, null, $cursor)) { $tokens[] = [ \stripcslashes(\substr($match[0], 1, \strlen($match[0]) - 2)), \stripcslashes(\substr($input, $cursor)), ]; } elseif (\preg_match('/' . StringInput::REGEX_STRING . '/A', $input, $match, null, $cursor)) { $tokens[] = [ \stripcslashes($match[1]), \stripcslashes(\substr($input, $cursor)), ]; } else { // should never happen // @codeCoverageIgnoreStart throw new \InvalidArgumentException(\sprintf('Unable to parse input near "... %s ..."', \substr($input, $cursor, 10))); // @codeCoverageIgnoreEnd } $cursor += \strlen($match[0]); } return $tokens; } /** * Same as parent, but with some bonus handling for code arguments. */ protected function parse() { $parseOptions = true; $this->parsed = $this->tokenPairs; while (null !== $tokenPair = \array_shift($this->parsed)) { // token is what you'd expect. rest is the remainder of the input // string, including token, and will be used if this is a code arg. list($token, $rest) = $tokenPair; if ($parseOptions && '' === $token) { $this->parseShellArgument($token, $rest); } elseif ($parseOptions && '--' === $token) { $parseOptions = false; } elseif ($parseOptions && 0 === \strpos($token, '--')) { $this->parseLongOption($token); } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { $this->parseShortOption($token); } else { $this->parseShellArgument($token, $rest); } } } /** * Parses an argument, with bonus handling for code arguments. * * @param string $token The current token * @param string $rest The remaining unparsed input, including the current token * * @throws \RuntimeException When too many arguments are given */ private function parseShellArgument($token, $rest) { $c = \count($this->arguments); // if input is expecting another argument, add it if ($this->definition->hasArgument($c)) { $arg = $this->definition->getArgument($c); if ($arg instanceof CodeArgument) { // When we find a code argument, we're done parsing. Add the // remaining input to the current argument and call it a day. $this->parsed = []; $this->arguments[$arg->getName()] = $rest; } else { $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; } return; } // (copypasta) // // @codeCoverageIgnoreStart // if last argument isArray(), append token to last argument if ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { $arg = $this->definition->getArgument($c - 1); $this->arguments[$arg->getName()][] = $token; return; } // unexpected argument $all = $this->definition->getArguments(); if (\count($all)) { throw new \RuntimeException(\sprintf('Too many arguments, expected arguments "%s".', \implode('" "', \array_keys($all)))); } throw new \RuntimeException(\sprintf('No arguments expected, got "%s".', $token)); // @codeCoverageIgnoreEnd } // Everything below this is copypasta from ArgvInput private methods // @codeCoverageIgnoreStart /** * Parses a short option. * * @param string $token The current token */ private function parseShortOption($token) { $name = \substr($token, 1); if (\strlen($name) > 1) { if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { // an option with a value (with no space) $this->addShortOption($name[0], \substr($name, 1)); } else { $this->parseShortOptionSet($name); } } else { $this->addShortOption($name, null); } } /** * Parses a short option set. * * @param string $name The current token * * @throws \RuntimeException When option given doesn't exist */ private function parseShortOptionSet($name) { $len = \strlen($name); for ($i = 0; $i < $len; $i++) { if (!$this->definition->hasShortcut($name[$i])) { throw new \RuntimeException(\sprintf('The "-%s" option does not exist.', $name[$i])); } $option = $this->definition->getOptionForShortcut($name[$i]); if ($option->acceptValue()) { $this->addLongOption($option->getName(), $i === $len - 1 ? null : \substr($name, $i + 1)); break; } else { $this->addLongOption($option->getName(), null); } } } /** * Parses a long option. * * @param string $token The current token */ private function parseLongOption($token) { $name = \substr($token, 2); if (false !== $pos = \strpos($name, '=')) { if (0 === \strlen($value = \substr($name, $pos + 1))) { // if no value after "=" then substr() returns "" since php7 only, false before // see http://php.net/manual/fr/migration70.incompatible.php#119151 if (PHP_VERSION_ID < 70000 && false === $value) { $value = ''; } \array_unshift($this->parsed, [$value, null]); } $this->addLongOption(\substr($name, 0, $pos), $value); } else { $this->addLongOption($name, null); } } /** * Adds a short option value. * * @param string $shortcut The short option key * @param mixed $value The value for the option * * @throws \RuntimeException When option given doesn't exist */ private function addShortOption($shortcut, $value) { if (!$this->definition->hasShortcut($shortcut)) { throw new \RuntimeException(\sprintf('The "-%s" option does not exist.', $shortcut)); } $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); } /** * Adds a long option value. * * @param string $name The long option key * @param mixed $value The value for the option * * @throws \RuntimeException When option given doesn't exist */ private function addLongOption($name, $value) { if (!$this->definition->hasOption($name)) { throw new \RuntimeException(\sprintf('The "--%s" option does not exist.', $name)); } $option = $this->definition->getOption($name); if (null !== $value && !$option->acceptValue()) { throw new \RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name)); } if (\in_array($value, ['', null], true) && $option->acceptValue() && \count($this->parsed)) { // if option accepts an optional or mandatory argument // let's see if there is one provided $next = \array_shift($this->parsed); $nextToken = $next[0]; if ((isset($nextToken[0]) && '-' !== $nextToken[0]) || \in_array($nextToken, ['', null], true)) { $value = $nextToken; } else { \array_unshift($this->parsed, $next); } } if (null === $value) { if ($option->isValueRequired()) { throw new \RuntimeException(\sprintf('The "--%s" option requires a value.', $name)); } if (!$option->isArray() && !$option->isValueOptional()) { $value = true; } } if ($option->isArray()) { $this->options[$name][] = $value; } else { $this->options[$name] = $value; } } // @codeCoverageIgnoreEnd } PK! 66!psysh/src/Input/FilterOptions.phpnuIwvalidateInput($input); if (!$pattern = $input->getOption('grep')) { $this->filter = false; return; } if (!$this->stringIsRegex($pattern)) { $pattern = '/' . \preg_quote($pattern, '/') . '/'; } if ($insensitive = $input->getOption('insensitive')) { $pattern .= 'i'; } $this->validateRegex($pattern); $this->filter = true; $this->pattern = $pattern; $this->insensitive = $insensitive; $this->invert = $input->getOption('invert'); } /** * Check whether the bound input has filter options. * * @return bool */ public function hasFilter() { return $this->filter; } /** * Check whether a string matches the current filter options. * * @param string $string * @param array $matches * * @return bool */ public function match($string, array &$matches = null) { return $this->filter === false || (\preg_match($this->pattern, $string, $matches) xor $this->invert); } /** * Validate that grep, invert and insensitive input options are consistent. * * @param InputInterface $input * * @return bool */ private function validateInput(InputInterface $input) { if (!$input->getOption('grep')) { foreach (['invert', 'insensitive'] as $option) { if ($input->getOption($option)) { throw new RuntimeException('--' . $option . ' does not make sense without --grep'); } } } } /** * Check whether a string appears to be a regular expression. * * @param string $string * * @return bool */ private function stringIsRegex($string) { return \substr($string, 0, 1) === '/' && \substr($string, -1) === '/' && \strlen($string) >= 3; } /** * Validate that $pattern is a valid regular expression. * * @param string $pattern * * @return bool */ private function validateRegex($pattern) { \set_error_handler(['Psy\Exception\ErrorException', 'throwException']); try { \preg_match($pattern, ''); } catch (ErrorException $e) { \restore_error_handler(); throw new RuntimeException(\str_replace('preg_match(): ', 'Invalid regular expression: ', $e->getRawMessage())); } \restore_error_handler(); } } PK!F psysh/src/Input/CodeArgument.phpnuIwinputString = $inputString; } /** * To. String. * * @return string */ public function __toString() { return $this->inputString; } } PK!GƘll5psysh/src/CodeCleaner/CallTimePassByReferencePass.phpnuIw */ class CallTimePassByReferencePass extends CodeCleanerPass { const EXCEPTION_MESSAGE = 'Call-time pass-by-reference has been removed'; /** * Validate of use call-time pass-by-reference. * * @throws RuntimeException if the user used call-time pass-by-reference * * @param Node $node */ public function enterNode(Node $node) { if (!$node instanceof FuncCall && !$node instanceof MethodCall && !$node instanceof StaticCall) { return; } foreach ($node->args as $arg) { if ($arg->byRef) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); } } } } PK!tc ;;-psysh/src/CodeCleaner/FunctionContextPass.phpnuIwfunctionDepth = 0; } public function enterNode(Node $node) { if ($node instanceof FunctionLike) { $this->functionDepth++; return; } // node is inside function context if ($this->functionDepth !== 0) { return; } // It causes fatal error. if ($node instanceof Yield_) { $msg = 'The "yield" expression can only be used inside a function'; throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } /** * @param \PhpParser\Node $node */ public function leaveNode(Node $node) { if ($node instanceof FunctionLike) { $this->functionDepth--; } } } PK![P0P0,psysh/src/CodeCleaner/ValidClassNamePass.phpnuIwatLeastPhp55 = \version_compare(PHP_VERSION, '5.5', '>='); } /** * Validate class, interface and trait definitions. * * Validate them upon entering the node, so that we know about their * presence and can validate constant fetches and static calls in class or * trait methods. * * @param Node $node */ public function enterNode(Node $node) { parent::enterNode($node); if (self::isConditional($node)) { $this->conditionalScopes++; } else { // @todo add an "else" here which adds a runtime check for instances where we can't tell // whether a class is being redefined by static analysis alone. if ($this->conditionalScopes === 0) { if ($node instanceof Class_) { $this->validateClassStatement($node); } elseif ($node instanceof Interface_) { $this->validateInterfaceStatement($node); } elseif ($node instanceof Trait_) { $this->validateTraitStatement($node); } } } } /** * Validate `new` expressions, class constant fetches, and static calls. * * @throws FatalErrorException if a class, interface or trait is referenced which does not exist * @throws FatalErrorException if a class extends something that is not a class * @throws FatalErrorException if a class implements something that is not an interface * @throws FatalErrorException if an interface extends something that is not an interface * @throws FatalErrorException if a class, interface or trait redefines an existing class, interface or trait name * * @param Node $node */ public function leaveNode(Node $node) { if (self::isConditional($node)) { $this->conditionalScopes--; } elseif ($node instanceof New_) { $this->validateNewExpression($node); } elseif ($node instanceof ClassConstFetch) { $this->validateClassConstFetchExpression($node); } elseif ($node instanceof StaticCall) { $this->validateStaticCallExpression($node); } } private static function isConditional(Node $node) { return $node instanceof If_ || $node instanceof While_ || $node instanceof Do_ || $node instanceof Switch_; } /** * Validate a class definition statement. * * @param Class_ $stmt */ protected function validateClassStatement(Class_ $stmt) { $this->ensureCanDefine($stmt, self::CLASS_TYPE); if (isset($stmt->extends)) { $this->ensureClassExists($this->getFullyQualifiedName($stmt->extends), $stmt); } $this->ensureInterfacesExist($stmt->implements, $stmt); } /** * Validate an interface definition statement. * * @param Interface_ $stmt */ protected function validateInterfaceStatement(Interface_ $stmt) { $this->ensureCanDefine($stmt, self::INTERFACE_TYPE); $this->ensureInterfacesExist($stmt->extends, $stmt); } /** * Validate a trait definition statement. * * @param Trait_ $stmt */ protected function validateTraitStatement(Trait_ $stmt) { $this->ensureCanDefine($stmt, self::TRAIT_TYPE); } /** * Validate a `new` expression. * * @param New_ $stmt */ protected function validateNewExpression(New_ $stmt) { // if class name is an expression or an anonymous class, give it a pass for now if (!$stmt->class instanceof Expr && !$stmt->class instanceof Class_) { $this->ensureClassExists($this->getFullyQualifiedName($stmt->class), $stmt); } } /** * Validate a class constant fetch expression's class. * * @param ClassConstFetch $stmt */ protected function validateClassConstFetchExpression(ClassConstFetch $stmt) { // there is no need to check exists for ::class const for php 5.5 or newer if (\strtolower($stmt->name) === 'class' && $this->atLeastPhp55) { return; } // if class name is an expression, give it a pass for now if (!$stmt->class instanceof Expr) { $this->ensureClassOrInterfaceExists($this->getFullyQualifiedName($stmt->class), $stmt); } } /** * Validate a class constant fetch expression's class. * * @param StaticCall $stmt */ protected function validateStaticCallExpression(StaticCall $stmt) { // if class name is an expression, give it a pass for now if (!$stmt->class instanceof Expr) { $this->ensureMethodExists($this->getFullyQualifiedName($stmt->class), $stmt->name, $stmt); } } /** * Ensure that no class, interface or trait name collides with a new definition. * * @throws FatalErrorException * * @param Stmt $stmt * @param string $scopeType */ protected function ensureCanDefine(Stmt $stmt, $scopeType = self::CLASS_TYPE) { $name = $this->getFullyQualifiedName($stmt->name); // check for name collisions $errorType = null; if ($this->classExists($name)) { $errorType = self::CLASS_TYPE; } elseif ($this->interfaceExists($name)) { $errorType = self::INTERFACE_TYPE; } elseif ($this->traitExists($name)) { $errorType = self::TRAIT_TYPE; } if ($errorType !== null) { throw $this->createError(\sprintf('%s named %s already exists', \ucfirst($errorType), $name), $stmt); } // Store creation for the rest of this code snippet so we can find local // issue too $this->currentScope[\strtolower($name)] = $scopeType; } /** * Ensure that a referenced class exists. * * @throws FatalErrorException * * @param string $name * @param Stmt $stmt */ protected function ensureClassExists($name, $stmt) { if (!$this->classExists($name)) { throw $this->createError(\sprintf('Class \'%s\' not found', $name), $stmt); } } /** * Ensure that a referenced class _or interface_ exists. * * @throws FatalErrorException * * @param string $name * @param Stmt $stmt */ protected function ensureClassOrInterfaceExists($name, $stmt) { if (!$this->classExists($name) && !$this->interfaceExists($name)) { throw $this->createError(\sprintf('Class \'%s\' not found', $name), $stmt); } } /** * Ensure that a referenced class _or trait_ exists. * * @throws FatalErrorException * * @param string $name * @param Stmt $stmt */ protected function ensureClassOrTraitExists($name, $stmt) { if (!$this->classExists($name) && !$this->traitExists($name)) { throw $this->createError(\sprintf('Class \'%s\' not found', $name), $stmt); } } /** * Ensure that a statically called method exists. * * @throws FatalErrorException * * @param string $class * @param string $name * @param Stmt $stmt */ protected function ensureMethodExists($class, $name, $stmt) { $this->ensureClassOrTraitExists($class, $stmt); // let's pretend all calls to self, parent and static are valid if (\in_array(\strtolower($class), ['self', 'parent', 'static'])) { return; } // ... and all calls to classes defined right now if ($this->findInScope($class) === self::CLASS_TYPE) { return; } // if method name is an expression, give it a pass for now if ($name instanceof Expr) { return; } if (!\method_exists($class, $name) && !\method_exists($class, '__callStatic')) { throw $this->createError(\sprintf('Call to undefined method %s::%s()', $class, $name), $stmt); } } /** * Ensure that a referenced interface exists. * * @throws FatalErrorException * * @param Interface_[] $interfaces * @param Stmt $stmt */ protected function ensureInterfacesExist($interfaces, $stmt) { foreach ($interfaces as $interface) { /** @var string $name */ $name = $this->getFullyQualifiedName($interface); if (!$this->interfaceExists($name)) { throw $this->createError(\sprintf('Interface \'%s\' not found', $name), $stmt); } } } /** * Get a symbol type key for storing in the scope name cache. * * @deprecated No longer used. Scope type should be passed into ensureCanDefine directly. * @codeCoverageIgnore * * @param Stmt $stmt * * @return string */ protected function getScopeType(Stmt $stmt) { if ($stmt instanceof Class_) { return self::CLASS_TYPE; } elseif ($stmt instanceof Interface_) { return self::INTERFACE_TYPE; } elseif ($stmt instanceof Trait_) { return self::TRAIT_TYPE; } } /** * Check whether a class exists, or has been defined in the current code snippet. * * Gives `self`, `static` and `parent` a free pass. * * @param string $name * * @return bool */ protected function classExists($name) { // Give `self`, `static` and `parent` a pass. This will actually let // some errors through, since we're not checking whether the keyword is // being used in a class scope. if (\in_array(\strtolower($name), ['self', 'static', 'parent'])) { return true; } return \class_exists($name) || $this->findInScope($name) === self::CLASS_TYPE; } /** * Check whether an interface exists, or has been defined in the current code snippet. * * @param string $name * * @return bool */ protected function interfaceExists($name) { return \interface_exists($name) || $this->findInScope($name) === self::INTERFACE_TYPE; } /** * Check whether a trait exists, or has been defined in the current code snippet. * * @param string $name * * @return bool */ protected function traitExists($name) { return \trait_exists($name) || $this->findInScope($name) === self::TRAIT_TYPE; } /** * Find a symbol in the current code snippet scope. * * @param string $name * * @return string|null */ protected function findInScope($name) { $name = \strtolower($name); if (isset($this->currentScope[$name])) { return $this->currentScope[$name]; } } /** * Error creation factory. * * @param string $msg * @param Stmt $stmt * * @return FatalErrorException */ protected function createError($msg, $stmt) { return new FatalErrorException($msg, 0, E_ERROR, null, $stmt->getLine()); } } PK!iRp p 'psysh/src/CodeCleaner/NamespacePass.phpnuIwcleaner = $cleaner; } /** * If this is a standalone namespace line, remember it for later. * * Otherwise, apply remembered namespaces to the code until a new namespace * is encountered. * * @param array $nodes */ public function beforeTraverse(array $nodes) { if (empty($nodes)) { return $nodes; } $last = \end($nodes); if ($last instanceof Namespace_) { $kind = $last->getAttribute('kind'); // Treat all namespace statements pre-PHP-Parser v3.1.2 as "open", // even though we really have no way of knowing. if ($kind === null || $kind === Namespace_::KIND_SEMICOLON) { // Save the current namespace for open namespaces $this->setNamespace($last->name); } else { // Clear the current namespace after a braced namespace $this->setNamespace(null); } return $nodes; } return $this->namespace ? [new Namespace_($this->namespace, $nodes)] : $nodes; } /** * Remember the namespace and (re)set the namespace on the CodeCleaner as * well. * * @param null|Name $namespace */ private function setNamespace($namespace) { $this->namespace = $namespace; $this->cleaner->setNamespace($namespace === null ? null : $namespace->parts); } } PK!Xgn[R R )psysh/src/CodeCleaner/CalledClassPass.phpnuIwinClass = false; } /** * @throws ErrorException if get_class or get_called_class is called without an object from outside a class * * @param Node $node */ public function enterNode(Node $node) { if ($node instanceof Class_ || $node instanceof Trait_) { $this->inClass = true; } elseif ($node instanceof FuncCall && !$this->inClass) { // We'll give any args at all (besides null) a pass. // Technically we should be checking whether the args are objects, but this will do for now. // // @todo switch this to actually validate args when we get context-aware code cleaner passes. if (!empty($node->args) && !$this->isNull($node->args[0])) { return; } // We'll ignore name expressions as well (things like `$foo()`) if (!($node->name instanceof Name)) { return; } $name = \strtolower($node->name); if (\in_array($name, ['get_class', 'get_called_class'])) { $msg = \sprintf('%s() called without object from outside a class', $name); throw new ErrorException($msg, 0, E_USER_WARNING, null, $node->getLine()); } } } /** * @param Node $node */ public function leaveNode(Node $node) { if ($node instanceof Class_) { $this->inClass = false; } } private function isNull(Node $node) { return $node->value instanceof ConstFetch && \strtolower($node->value->name) === 'null'; } } PK!5,  1psysh/src/CodeCleaner/PassableByReferencePass.phpnuIwname instanceof Expr || $node->name instanceof Variable) { return; } $name = (string) $node->name; if ($name === 'array_multisort') { return $this->validateArrayMultisort($node); } try { $refl = new \ReflectionFunction($name); } catch (\ReflectionException $e) { // Well, we gave it a shot! return; } foreach ($refl->getParameters() as $key => $param) { if (\array_key_exists($key, $node->args)) { $arg = $node->args[$key]; if ($param->isPassedByReference() && !$this->isPassableByReference($arg)) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); } } } } } private function isPassableByReference(Node $arg) { // FuncCall, MethodCall and StaticCall are all PHP _warnings_ not fatal errors, so we'll let // PHP handle those ones :) return $arg->value instanceof ClassConstFetch || $arg->value instanceof PropertyFetch || $arg->value instanceof Variable || $arg->value instanceof FuncCall || $arg->value instanceof MethodCall || $arg->value instanceof StaticCall; } /** * Because array_multisort has a problematic signature... * * The argument order is all sorts of wonky, and whether something is passed * by reference or not depends on the values of the two arguments before it. * We'll do a good faith attempt at validating this, but err on the side of * permissive. * * This is why you don't design languages where core code and extensions can * implement APIs that wouldn't be possible in userland code. * * @throws FatalErrorException for clearly invalid arguments * * @param Node $node */ private function validateArrayMultisort(Node $node) { $nonPassable = 2; // start with 2 because the first one has to be passable by reference foreach ($node->args as $arg) { if ($this->isPassableByReference($arg)) { $nonPassable = 0; } elseif (++$nonPassable > 2) { // There can be *at most* two non-passable-by-reference args in a row. This is about // as close as we can get to validating the arguments for this function :-/ throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); } } } } PK!׌ "psysh/src/CodeCleaner/ListPass.phpnuIwatLeastPhp71 = \version_compare(PHP_VERSION, '7.1', '>='); } /** * Validate use of list assignment. * * @throws ParseErrorException if the user used empty with anything but a variable * * @param Node $node */ public function enterNode(Node $node) { if (!$node instanceof Assign) { return; } if (!$node->var instanceof Array_ && !$node->var instanceof List_) { return; } if (!$this->atLeastPhp71 && $node->var instanceof Array_) { $msg = "syntax error, unexpected '='"; throw new ParseErrorException($msg, $node->expr->getLine()); } // Polyfill for PHP-Parser 2.x $items = isset($node->var->items) ? $node->var->items : $node->var->vars; if ($items === [] || $items === [null]) { throw new ParseErrorException('Cannot use empty list', $node->var->getLine()); } $itemFound = false; foreach ($items as $item) { if ($item === null) { continue; } $itemFound = true; // List_->$vars in PHP-Parser 2.x is Variable instead of ArrayItem. if (!$this->atLeastPhp71 && $item instanceof ArrayItem && $item->key !== null) { $msg = 'Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting \',\' or \')\''; throw new ParseErrorException($msg, $item->key->getLine()); } if (!self::isValidArrayItem($item)) { $msg = 'Assignments can only happen to writable values'; throw new ParseErrorException($msg, $item->getLine()); } } if (!$itemFound) { throw new ParseErrorException('Cannot use empty list'); } } /** * Validate whether a given item in an array is valid for short assignment. * * @param Expr $item * * @return bool */ private static function isValidArrayItem(Expr $item) { $value = ($item instanceof ArrayItem) ? $item->value : $item; while ($value instanceof ArrayDimFetch || $value instanceof PropertyFetch) { $value = $value->var; } // We just kind of give up if it's a method call. We can't tell if it's // valid via static analysis. return $value instanceof Variable || $value instanceof MethodCall || $value instanceof FuncCall; } } PK! /psysh/src/CodeCleaner/ValidFunctionNamePass.phpnuIwconditionalScopes++; } elseif ($node instanceof Function_) { $name = $this->getFullyQualifiedName($node->name); // @todo add an "else" here which adds a runtime check for instances where we can't tell // whether a function is being redefined by static analysis alone. if ($this->conditionalScopes === 0) { if (\function_exists($name) || isset($this->currentScope[\strtolower($name)])) { $msg = \sprintf('Cannot redeclare %s()', $name); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } $this->currentScope[\strtolower($name)] = true; } } /** * Validate that function calls will succeed. * * @throws FatalErrorException if a function is redefined * @throws FatalErrorException if the function name is a string (not an expression) and is not defined * * @param Node $node */ public function leaveNode(Node $node) { if (self::isConditional($node)) { $this->conditionalScopes--; } elseif ($node instanceof FuncCall) { // if function name is an expression or a variable, give it a pass for now. $name = $node->name; if (!$name instanceof Expr && !$name instanceof Variable) { $shortName = \implode('\\', $name->parts); $fullName = $this->getFullyQualifiedName($name); $inScope = isset($this->currentScope[\strtolower($fullName)]); if (!$inScope && !\function_exists($shortName) && !\function_exists($fullName)) { $message = \sprintf('Call to undefined function %s()', $name); throw new FatalErrorException($message, 0, E_ERROR, null, $node->getLine()); } } } } private static function isConditional(Node $node) { return $node instanceof If_ || $node instanceof While_ || $node instanceof Do_ || $node instanceof Switch_; } } PK!ˢ-psysh/src/CodeCleaner/LeavePsyshAlonePass.phpnuIwname === '__psysh__') { throw new RuntimeException('Don\'t mess with $__psysh__; bad things will happen'); } } } PK!WU?@@,psysh/src/CodeCleaner/NamespaceAwarePass.phpnuIwnamespace = []; $this->currentScope = []; } /** * @todo should this be final? Extending classes should be sure to either use * leaveNode or call parent::enterNode() when overloading * * @param Node $node */ public function enterNode(Node $node) { if ($node instanceof Namespace_) { $this->namespace = isset($node->name) ? $node->name->parts : []; } } /** * Get a fully-qualified name (class, function, interface, etc). * * @param mixed $name * * @return string */ protected function getFullyQualifiedName($name) { if ($name instanceof FullyQualifiedName) { return \implode('\\', $name->parts); } elseif ($name instanceof Name) { $name = $name->parts; } elseif (!\is_array($name)) { $name = [$name]; } return \implode('\\', \array_merge($this->namespace, $name)); } } PK!!+22(psysh/src/CodeCleaner/InstanceOfPass.phpnuIw */ class InstanceOfPass extends CodeCleanerPass { const EXCEPTION_MSG = 'instanceof expects an object instance, constant given'; /** * Validate that the instanceof statement does not receive a scalar value or a non-class constant. * * @throws FatalErrorException if a scalar or a non-class constant is given * * @param Node $node */ public function enterNode(Node $node) { if (!$node instanceof Instanceof_) { return; } if (($node->expr instanceof Scalar && !$node->expr instanceof Encapsed) || $node->expr instanceof ConstFetch) { throw new FatalErrorException(self::EXCEPTION_MSG, 0, E_ERROR, null, $node->getLine()); } } } PK!>+psysh/src/CodeCleaner/AbstractClassPass.phpnuIwclass = $node; $this->abstractMethods = []; } elseif ($node instanceof ClassMethod) { if ($node->isAbstract()) { $name = \sprintf('%s::%s', $this->class->name, $node->name); $this->abstractMethods[] = $name; if ($node->stmts !== null) { $msg = \sprintf('Abstract function %s cannot contain body', $name); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } } } /** * @throws RuntimeException if the node is a non-abstract class with abstract methods * * @param Node $node */ public function leaveNode(Node $node) { if ($node instanceof Class_) { $count = \count($this->abstractMethods); if ($count > 0 && !$node->isAbstract()) { $msg = \sprintf( 'Class %s contains %d abstract method%s must therefore be declared abstract or implement the remaining methods (%s)', $node->name, $count, ($count === 1) ? '' : 's', \implode(', ', $this->abstractMethods) ); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } } } PK!¡_)psysh/src/CodeCleaner/CodeCleanerPass.phpnuIwgetAttributes()); } elseif ($node instanceof File) { return new String_('', $node->getAttributes()); } } } PK! :psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.phpnuIw */ class FunctionReturnInWriteContextPass extends CodeCleanerPass { const PHP55_MESSAGE = 'Cannot use isset() on the result of a function call (you can use "null !== func()" instead)'; const EXCEPTION_MESSAGE = "Can't use function return value in write context"; private $atLeastPhp55; public function __construct() { $this->atLeastPhp55 = \version_compare(PHP_VERSION, '5.5', '>='); } /** * Validate that the functions are used correctly. * * @throws FatalErrorException if a function is passed as an argument reference * @throws FatalErrorException if a function is used as an argument in the isset * @throws FatalErrorException if a function is used as an argument in the empty, only for PHP < 5.5 * @throws FatalErrorException if a value is assigned to a function * * @param Node $node */ public function enterNode(Node $node) { if ($node instanceof Array_ || $this->isCallNode($node)) { $items = $node instanceof Array_ ? $node->items : $node->args; foreach ($items as $item) { if ($item && $item->byRef && $this->isCallNode($item->value)) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); } } } elseif ($node instanceof Isset_ || $node instanceof Unset_) { foreach ($node->vars as $var) { if (!$this->isCallNode($var)) { continue; } $msg = ($node instanceof Isset_ && $this->atLeastPhp55) ? self::PHP55_MESSAGE : self::EXCEPTION_MESSAGE; throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } elseif ($node instanceof Empty_ && !$this->atLeastPhp55 && $this->isCallNode($node->expr)) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); // @codeCoverageIgnore } elseif ($node instanceof Assign && $this->isCallNode($node->var)) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); } } private function isCallNode(Node $node) { return $node instanceof FuncCall || $node instanceof MethodCall || $node instanceof StaticCall; } } PK!#А,psysh/src/CodeCleaner/ImplicitReturnPass.phpnuIwaddImplicitReturn($nodes); } /** * @param array $nodes * * @return array */ private function addImplicitReturn(array $nodes) { // If nodes is empty, it can't have a return value. if (empty($nodes)) { return [new Return_(NoReturnValue::create())]; } $last = \end($nodes); // Special case a few types of statements to add an implicit return // value (even though they technically don't have any return value) // because showing a return value in these instances is useful and not // very surprising. if ($last instanceof If_) { $last->stmts = $this->addImplicitReturn($last->stmts); foreach ($last->elseifs as $elseif) { $elseif->stmts = $this->addImplicitReturn($elseif->stmts); } if ($last->else) { $last->else->stmts = $this->addImplicitReturn($last->else->stmts); } } elseif ($last instanceof Switch_) { foreach ($last->cases as $case) { // only add an implicit return to cases which end in break $caseLast = \end($case->stmts); if ($caseLast instanceof Break_) { $case->stmts = $this->addImplicitReturn(\array_slice($case->stmts, 0, -1)); $case->stmts[] = $caseLast; } } } elseif ($last instanceof Expr && !($last instanceof Exit_)) { // @codeCoverageIgnoreStart $nodes[\count($nodes) - 1] = new Return_($last, [ 'startLine' => $last->getLine(), 'endLine' => $last->getLine(), ]); // @codeCoverageIgnoreEnd } elseif ($last instanceof Expression && !($last->expr instanceof Exit_)) { // For PHP Parser 4.x $nodes[\count($nodes) - 1] = new Return_($last->expr, [ 'startLine' => $last->getLine(), 'endLine' => $last->getLine(), ]); } elseif ($last instanceof Namespace_) { $last->stmts = $this->addImplicitReturn($last->stmts); } // Return a "no return value" for all non-expression statements, so that // PsySH can suppress the `null` that `eval()` returns otherwise. // // Note that statements special cased above (if/elseif/else, switch) // _might_ implicitly return a value before this catch-all return is // reached. // // We're not adding a fallback return after namespace statements, // because code outside namespace statements doesn't really work, and // there's already an implicit return in the namespace statement anyway. if (self::isNonExpressionStmt($last)) { $nodes[] = new Return_(NoReturnValue::create()); } return $nodes; } /** * Check whether a given node is a non-expression statement. * * As of PHP Parser 4.x, Expressions are now instances of Stmt as well, so * we'll exclude them here. * * @param Node $node * * @return bool */ private static function isNonExpressionStmt(Node $node) { return $node instanceof Stmt && !$node instanceof Expression && !$node instanceof Return_ && !$node instanceof Namespace_; } } PK!.8 +psysh/src/CodeCleaner/ValidConstantPass.phpnuIwname->parts) > 1) { $name = $this->getFullyQualifiedName($node->name); if (!\defined($name)) { $msg = \sprintf('Undefined constant %s', $name); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } elseif ($node instanceof ClassConstFetch) { $this->validateClassConstFetchExpression($node); } } /** * Validate a class constant fetch expression. * * @throws FatalErrorException if a class constant is not defined * * @param ClassConstFetch $stmt */ protected function validateClassConstFetchExpression(ClassConstFetch $stmt) { // For PHP Parser 4.x $constName = $stmt->name instanceof Identifier ? $stmt->name->toString() : $stmt->name; // give the `class` pseudo-constant a pass if ($constName === 'class') { return; } // if class name is an expression, give it a pass for now if (!$stmt->class instanceof Expr) { $className = $this->getFullyQualifiedName($stmt->class); // if the class doesn't exist, don't throw an exception… it might be // defined in the same line it's used or something stupid like that. if (\class_exists($className) || \interface_exists($className)) { $refl = new \ReflectionClass($className); if (!$refl->hasConstant($constName)) { $constType = \class_exists($className) ? 'Class' : 'Interface'; $msg = \sprintf('%s constant \'%s::%s\' not found', $constType, $className, $constName); throw new FatalErrorException($msg, 0, E_ERROR, null, $stmt->getLine()); } } } } } PK!oW0psysh/src/CodeCleaner/AssignThisVariablePass.phpnuIw */ class AssignThisVariablePass extends CodeCleanerPass { /** * Validate that the user input does not assign the `$this` variable. * * @throws RuntimeException if the user assign the `$this` variable * * @param Node $node */ public function enterNode(Node $node) { if ($node instanceof Assign && $node->var instanceof Variable && $node->var->name === 'this') { throw new FatalErrorException('Cannot re-assign $this', 0, E_ERROR, null, $node->getLine()); } } } PK!S )psysh/src/CodeCleaner/LoopContextPass.phpnuIwloopDepth = 0; } /** * @throws FatalErrorException if the node is a break or continue in a non-loop or switch context * @throws FatalErrorException if the node is trying to break out of more nested structures than exist * @throws FatalErrorException if the node is a break or continue and has a non-numeric argument * @throws FatalErrorException if the node is a break or continue and has an argument less than 1 * * @param Node $node */ public function enterNode(Node $node) { switch (true) { case $node instanceof Do_: case $node instanceof For_: case $node instanceof Foreach_: case $node instanceof Switch_: case $node instanceof While_: $this->loopDepth++; break; case $node instanceof Break_: case $node instanceof Continue_: $operator = $node instanceof Break_ ? 'break' : 'continue'; if ($this->loopDepth === 0) { $msg = \sprintf("'%s' not in the 'loop' or 'switch' context", $operator); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } if ($node->num instanceof LNumber || $node->num instanceof DNumber) { $num = $node->num->value; if ($node->num instanceof DNumber || $num < 1) { $msg = \sprintf("'%s' operator accepts only positive numbers", $operator); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } if ($num > $this->loopDepth) { $msg = \sprintf("Cannot '%s' %d levels", $operator, $num); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } elseif ($node->num) { $msg = \sprintf("'%s' operator with non-constant operand is no longer supported", $operator); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } break; } } /** * @param Node $node */ public function leaveNode(Node $node) { switch (true) { case $node instanceof Do_: case $node instanceof For_: case $node instanceof Foreach_: case $node instanceof Switch_: case $node instanceof While_: $this->loopDepth--; break; } } } PK!jHs )psysh/src/CodeCleaner/StrictTypesPass.phpnuIwatLeastPhp7 = \version_compare(PHP_VERSION, '7.0', '>='); } /** * If this is a standalone strict types declaration, remember it for later. * * Otherwise, apply remembered strict types declaration to to the code until * a new declaration is encountered. * * @throws FatalErrorException if an invalid `strict_types` declaration is found * * @param array $nodes */ public function beforeTraverse(array $nodes) { if (!$this->atLeastPhp7) { return; // @codeCoverageIgnore } $prependStrictTypes = $this->strictTypes; foreach ($nodes as $key => $node) { if ($node instanceof Declare_) { foreach ($node->declares as $declare) { // For PHP Parser 4.x $declareKey = $declare->key instanceof Identifier ? $declare->key->toString() : $declare->key; if ($declareKey === 'strict_types') { $value = $declare->value; if (!$value instanceof LNumber || ($value->value !== 0 && $value->value !== 1)) { throw new FatalErrorException(self::EXCEPTION_MESSAGE, 0, E_ERROR, null, $node->getLine()); } $this->strictTypes = $value->value === 1; } } } } if ($prependStrictTypes) { $first = \reset($nodes); if (!$first instanceof Declare_) { $declare = new Declare_([new DeclareDeclare('strict_types', new LNumber(1))]); \array_unshift($nodes, $declare); } } return $nodes; } } PK!4bK %psysh/src/CodeCleaner/RequirePass.phpnuIwisRequireNode($origNode)) { return; } $node = clone $origNode; /* * rewrite * * $foo = require $bar * * to * * $foo = require \Psy\CodeCleaner\RequirePass::resolve($bar) */ $node->expr = new StaticCall( new FullyQualifiedName('Psy\CodeCleaner\RequirePass'), 'resolve', [new Arg($origNode->expr), new Arg(new LNumber($origNode->getLine()))], $origNode->getAttributes() ); return $node; } /** * Runtime validation that $file can be resolved as an include path. * * If $file can be resolved, return $file. Otherwise throw a fatal error exception. * * @throws FatalErrorException when unable to resolve include path for $file * @throws ErrorException if $file is empty and E_WARNING is included in error_reporting level * * @param string $file * @param int $lineNumber Line number of the original require expression * * @return string Exactly the same as $file */ public static function resolve($file, $lineNumber = null) { $file = (string) $file; if ($file === '') { // @todo Shell::handleError would be better here, because we could // fake the file and line number, but we can't call it statically. // So we're duplicating some of the logics here. if (E_WARNING & \error_reporting()) { ErrorException::throwException(E_WARNING, 'Filename cannot be empty', null, $lineNumber); } // @todo trigger an error as fallback? this is pretty ugly… // trigger_error('Filename cannot be empty', E_USER_WARNING); } if ($file === '' || !\stream_resolve_include_path($file)) { $msg = \sprintf("Failed opening required '%s'", $file); throw new FatalErrorException($msg, 0, E_ERROR, null, $lineNumber); } return $file; } private function isRequireNode(Node $node) { return $node instanceof Include_ && \in_array($node->type, self::$requireTypes); } } PK!la&"psysh/src/CodeCleaner/ExitPass.phpnuIwname) === \strtolower($this->lastNamespace)) { $this->aliases = $this->lastAliases; } } } /** * If this statement is a namespace, forget all the aliases we had. * * If it's a use statement, remember the alias for later. Otherwise, apply * remembered aliases to the code. * * @param Node $node */ public function leaveNode(Node $node) { if ($node instanceof Use_) { // Store a reference to every "use" statement, because we'll need // them in a bit. foreach ($node->uses as $use) { $alias = $use->alias ?: \end($use->name->parts); $this->aliases[\strtolower($alias)] = $use->name; } return NodeTraverser::REMOVE_NODE; } elseif ($node instanceof GroupUse) { // Expand every "use" statement in the group into a full, standalone // "use" and store 'em with the others. foreach ($node->uses as $use) { $alias = $use->alias ?: \end($use->name->parts); $this->aliases[\strtolower($alias)] = Name::concat($node->prefix, $use->name, [ 'startLine' => $node->prefix->getAttribute('startLine'), 'endLine' => $use->name->getAttribute('endLine'), ]); } return NodeTraverser::REMOVE_NODE; } elseif ($node instanceof Namespace_) { // Start fresh, since we're done with this namespace. $this->lastNamespace = $node->name; $this->lastAliases = $this->aliases; $this->aliases = []; } else { foreach ($node as $name => $subNode) { if ($subNode instanceof Name) { // Implicitly thunk all aliases. if ($replacement = $this->findAlias($subNode)) { $node->$name = $replacement; } } } return $node; } } /** * Find class/namespace aliases. * * @param Name $name * * @return FullyQualifiedName|null */ private function findAlias(Name $name) { $that = \strtolower($name); foreach ($this->aliases as $alias => $prefix) { if ($that === $alias) { return new FullyQualifiedName($prefix->toString()); } elseif (\substr($that, 0, \strlen($alias) + 1) === $alias . '\\') { return new FullyQualifiedName($prefix->toString() . \substr($name, \strlen($alias))); } } } } PK!LZyy'psysh/src/CodeCleaner/NoReturnValue.phpnuIw */ class ValidConstructorPass extends CodeCleanerPass { private $namespace; public function beforeTraverse(array $nodes) { $this->namespace = []; } /** * Validate that the constructor is not static and does not have a return type. * * @throws FatalErrorException the constructor function is static * @throws FatalErrorException the constructor function has a return type * * @param Node $node */ public function enterNode(Node $node) { if ($node instanceof Namespace_) { $this->namespace = isset($node->name) ? $node->name->parts : []; } elseif ($node instanceof Class_) { $constructor = null; foreach ($node->stmts as $stmt) { if ($stmt instanceof ClassMethod) { // If we find a new-style constructor, no need to look for the old-style if ('__construct' === \strtolower($stmt->name)) { $this->validateConstructor($stmt, $node); return; } // We found a possible old-style constructor (unless there is also a __construct method) if (empty($this->namespace) && \strtolower($node->name) === \strtolower($stmt->name)) { $constructor = $stmt; } } } if ($constructor) { $this->validateConstructor($constructor, $node); } } } /** * @throws FatalErrorException the constructor function is static * @throws FatalErrorException the constructor function has a return type * * @param Node $constructor * @param Node $classNode */ private function validateConstructor(Node $constructor, Node $classNode) { if ($constructor->isStatic()) { // For PHP Parser 4.x $className = $classNode->name instanceof Identifier ? $classNode->name->toString() : $classNode->name; $msg = \sprintf( 'Constructor %s::%s() cannot be static', \implode('\\', \array_merge($this->namespace, (array) $className)), $constructor->name ); throw new FatalErrorException($msg, 0, E_ERROR, null, $classNode->getLine()); } if (\method_exists($constructor, 'getReturnType') && $constructor->getReturnType()) { // For PHP Parser 4.x $className = $classNode->name instanceof Identifier ? $classNode->name->toString() : $classNode->name; $msg = \sprintf( 'Constructor %s::%s() cannot declare a return type', \implode('\\', \array_merge($this->namespace, (array) $className)), $constructor->name ); throw new FatalErrorException($msg, 0, E_ERROR, null, $classNode->getLine()); } } } PK!ѢW)psysh/src/CodeCleaner/LegacyEmptyPass.phpnuIwatLeastPhp55 = \version_compare(PHP_VERSION, '5.5', '>='); } /** * Validate use of empty in PHP < 5.5. * * @throws ParseErrorException if the user used empty with anything but a variable * * @param Node $node */ public function enterNode(Node $node) { if ($this->atLeastPhp55) { return; } if (!$node instanceof Empty_) { return; } if (!$node->expr instanceof Variable) { $msg = \sprintf('syntax error, unexpected %s', $this->getUnexpectedThing($node->expr)); throw new ParseErrorException($msg, $node->expr->getLine()); } } private function getUnexpectedThing(Node $node) { switch ($node->getType()) { case 'Scalar_String': case 'Scalar_LNumber': case 'Scalar_DNumber': return \json_encode($node->value); case 'Expr_ConstFetch': return (string) $node->name; default: return $node->getType(); } } } PK!D(psysh/src/CodeCleaner/FinalClassPass.phpnuIwfinalClasses = []; } /** * @throws RuntimeException if the node is a class that extends a final class * * @param Node $node */ public function enterNode(Node $node) { if ($node instanceof Class_) { if ($node->extends) { $extends = (string) $node->extends; if ($this->isFinalClass($extends)) { $msg = \sprintf('Class %s may not inherit from final class (%s)', $node->name, $extends); throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); } } if ($node->isFinal()) { $this->finalClasses[\strtolower($node->name)] = true; } } } /** * @param string $name Class name * * @return bool */ private function isFinalClass($name) { if (!\class_exists($name)) { return isset($this->finalClasses[\strtolower($name)]); } $refl = new \ReflectionClass($name); return $refl->isFinal(); } } PK!ȯHH0psysh/src/Reflection/ReflectionClassConstant.phpnuIwclass = $class; $this->name = $name; $constants = $class->getConstants(); if (!\array_key_exists($name, $constants)) { throw new \InvalidArgumentException('Unknown constant: ' . $name); } $this->value = $constants[$name]; } /** * Exports a reflection. * * @param string|object $class * @param string $name * @param bool $return pass true to return the export, as opposed to emitting it * * @return null|string */ public static function export($class, $name, $return = false) { $refl = new self($class, $name); $value = $refl->getValue(); $str = \sprintf('Constant [ public %s %s ] { %s }', \gettype($value), $refl->getName(), $value); if ($return) { return $str; } echo $str . "\n"; } /** * Gets the declaring class. * * @return \ReflectionClass */ public function getDeclaringClass() { $parent = $this->class; // Since we don't have real reflection constants, we can't see where // it's actually defined. Let's check for a constant that is also // available on the parent class which has exactly the same value. // // While this isn't _technically_ correct, it's prolly close enough. do { $class = $parent; $parent = $class->getParentClass(); } while ($parent && $parent->hasConstant($this->name) && $parent->getConstant($this->name) === $this->value); return $class; } /** * Get the constant's docblock. * * @return false */ public function getDocComment() { return false; } /** * Gets the class constant modifiers. * * Since this is only used for PHP < 7.1, we can just return "public". All * the fancier modifiers are only available on PHP versions which have their * own ReflectionClassConstant class :) * * @return int */ public function getModifiers() { return \ReflectionMethod::IS_PUBLIC; } /** * Gets the constant name. * * @return string */ public function getName() { return $this->name; } /** * Gets the value of the constant. * * @return mixed */ public function getValue() { return $this->value; } /** * Checks if class constant is private. * * @return bool false */ public function isPrivate() { return false; } /** * Checks if class constant is protected. * * @return bool false */ public function isProtected() { return false; } /** * Checks if class constant is public. * * @return bool true */ public function isPublic() { return true; } /** * To string. * * @return string */ public function __toString() { return $this->getName(); } /** * Gets the constant's file name. * * Currently returns null, because if it returns a file name the signature * formatter will barf. */ public function getFileName() { return; // return $this->class->getFileName(); } /** * Get the code start line. * * @throws \RuntimeException */ public function getStartLine() { throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)'); } /** * Get the code end line. * * @throws \RuntimeException */ public function getEndLine() { return $this->getStartLine(); } /** * Get a ReflectionClassConstant instance. * * In PHP >= 7.1, this will return a \ReflectionClassConstant from the * standard reflection library. For older PHP, it will return this polyfill. * * @param string|object $class * @param string $name * * @return ReflectionClassConstant|\ReflectionClassConstant */ public static function create($class, $name) { if (\class_exists('\\ReflectionClassConstant')) { return new \ReflectionClassConstant($class, $name); } return new self($class, $name); } } PK! qq=psysh/src/Reflection/ReflectionLanguageConstructParameter.phpnuIwfunction = $function; $this->parameter = $parameter; $this->opts = $opts; } /** * No class here. */ public function getClass() { return; } /** * Is the param an array? * * @return bool */ public function isArray() { return \array_key_exists('isArray', $this->opts) && $this->opts['isArray']; } /** * Get param default value. * * @return mixed */ public function getDefaultValue() { if ($this->isDefaultValueAvailable()) { return $this->opts['defaultValue']; } } /** * Get param name. * * @return string */ public function getName() { return $this->parameter; } /** * Is the param optional? * * @return bool */ public function isOptional() { return \array_key_exists('isOptional', $this->opts) && $this->opts['isOptional']; } /** * Does the param have a default value? * * @return bool */ public function isDefaultValueAvailable() { return \array_key_exists('defaultValue', $this->opts); } /** * Is the param passed by reference? * * (I don't think this is true for anything we need to fake a param for) * * @return bool */ public function isPassedByReference() { return \array_key_exists('isPassedByReference', $this->opts) && $this->opts['isPassedByReference']; } } PK!ן,psysh/src/Reflection/ReflectionConstant_.phpnuIwname = $name; if (!\defined($name) && !self::isMagicConstant($name)) { throw new \InvalidArgumentException('Unknown constant: ' . $name); } if (!self::isMagicConstant($name)) { $this->value = @\constant($name); } } /** * Exports a reflection. * * @param string $name * @param bool $return pass true to return the export, as opposed to emitting it * * @return null|string */ public static function export($name, $return = false) { $refl = new self($name); $value = $refl->getValue(); $str = \sprintf('Constant [ %s %s ] { %s }', \gettype($value), $refl->getName(), $value); if ($return) { return $str; } echo $str . "\n"; } public static function isMagicConstant($name) { return \in_array($name, self::$magicConstants); } /** * Get the constant's docblock. * * @return false */ public function getDocComment() { return false; } /** * Gets the constant name. * * @return string */ public function getName() { return $this->name; } /** * Gets the namespace name. * * Returns '' when the constant is not namespaced. * * @return string */ public function getNamespaceName() { if (!$this->inNamespace()) { return ''; } return \preg_replace('/\\\\[^\\\\]+$/', '', $this->name); } /** * Gets the value of the constant. * * @return mixed */ public function getValue() { return $this->value; } /** * Checks if this constant is defined in a namespace. * * @return bool */ public function inNamespace() { return \strpos($this->name, '\\') !== false; } /** * To string. * * @return string */ public function __toString() { return $this->getName(); } /** * Gets the constant's file name. * * Currently returns null, because if it returns a file name the signature * formatter will barf. */ public function getFileName() { return; // return $this->class->getFileName(); } /** * Get the code start line. * * @throws \RuntimeException */ public function getStartLine() { throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)'); } /** * Get the code end line. * * @throws \RuntimeException */ public function getEndLine() { return $this->getStartLine(); } } PK!/og+psysh/src/Reflection/ReflectionConstant.phpnuIw [ 'var' => [], '...' => [ 'isOptional' => true, 'defaultValue' => null, ], ], 'unset' => [ 'var' => [], '...' => [ 'isOptional' => true, 'defaultValue' => null, ], ], 'empty' => [ 'var' => [], ], 'echo' => [ 'arg1' => [], '...' => [ 'isOptional' => true, 'defaultValue' => null, ], ], 'print' => [ 'arg' => [], ], 'die' => [ 'status' => [ 'isOptional' => true, 'defaultValue' => 0, ], ], 'exit' => [ 'status' => [ 'isOptional' => true, 'defaultValue' => 0, ], ], ]; /** * Construct a ReflectionLanguageConstruct object. * * @param string $keyword */ public function __construct($keyword) { if (!self::isLanguageConstruct($keyword)) { throw new \InvalidArgumentException('Unknown language construct: ' . $keyword); } $this->keyword = $keyword; } /** * This can't (and shouldn't) do anything :). * * @throws \RuntimeException */ public static function export($name) { throw new \RuntimeException('Not yet implemented because it\'s unclear what I should do here :)'); } /** * Get language construct name. * * @return string */ public function getName() { return $this->keyword; } /** * None of these return references. * * @return bool */ public function returnsReference() { return false; } /** * Get language construct params. * * @return array */ public function getParameters() { $params = []; foreach (self::$languageConstructs[$this->keyword] as $parameter => $opts) { \array_push($params, new ReflectionLanguageConstructParameter($this->keyword, $parameter, $opts)); } return $params; } /** * Gets the file name from a language construct. * * (Hint: it always returns false) * * @return bool false */ public function getFileName() { return false; } /** * To string. * * @return string */ public function __toString() { return $this->getName(); } /** * Check whether keyword is a (known) language construct. * * @param string $keyword * * @return bool */ public static function isLanguageConstruct($keyword) { return \array_key_exists($keyword, self::$languageConstructs); } } PK!=u::psysh/src/ConfigPaths.phpnuIwgetConfigDirs()); } /** * Get potential home config directory paths. * * Returns `~/.psysh`, `%APPDATA%/PsySH` (when on Windows), and the * XDG Base Directory home config directory: * * http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html * * @return string[] */ public static function getHomeConfigDirs() { $xdg = new Xdg(); return self::getDirNames([$xdg->getHomeConfigDir()]); } /** * Get the current home config directory. * * Returns the highest precedence home config directory which actually * exists. If none of them exists, returns the highest precedence home * config directory (`%APPDATA%/PsySH` on Windows, `~/.config/psysh` * everywhere else). * * @see self::getHomeConfigDirs * * @return string */ public static function getCurrentConfigDir() { $configDirs = self::getHomeConfigDirs(); foreach ($configDirs as $configDir) { if (@\is_dir($configDir)) { return $configDir; } } return $configDirs[0]; } /** * Find real config files in config directories. * * @param string[] $names Config file names * @param string $configDir Optionally use a specific config directory * * @return string[] */ public static function getConfigFiles(array $names, $configDir = null) { $dirs = ($configDir === null) ? self::getConfigDirs() : [$configDir]; return self::getRealFiles($dirs, $names); } /** * Get potential data directory paths. * * If a `dataDir` option was explicitly set, returns an array containing * just that directory. * * Otherwise, it returns `~/.psysh` and all XDG Base Directory data directories: * * http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html * * @return string[] */ public static function getDataDirs() { $xdg = new Xdg(); return self::getDirNames($xdg->getDataDirs()); } /** * Find real data files in config directories. * * @param string[] $names Config file names * @param string $dataDir Optionally use a specific config directory * * @return string[] */ public static function getDataFiles(array $names, $dataDir = null) { $dirs = ($dataDir === null) ? self::getDataDirs() : [$dataDir]; return self::getRealFiles($dirs, $names); } /** * Get a runtime directory. * * Defaults to `/psysh` inside the system's temp dir. * * @return string */ public static function getRuntimeDir() { $xdg = new Xdg(); \set_error_handler(['Psy\Exception\ErrorException', 'throwException']); try { // XDG doesn't really work on Windows, sometimes complains about // permissions, sometimes tries to remove non-empty directories. // It's a bit flaky. So we'll give this a shot first... $runtimeDir = $xdg->getRuntimeDir(false); } catch (\Exception $e) { // Well. That didn't work. Fall back to a boring old folder in the // system temp dir. $runtimeDir = \sys_get_temp_dir(); } \restore_error_handler(); return \strtr($runtimeDir, '\\', '/') . '/psysh'; } private static function getDirNames(array $baseDirs) { $dirs = \array_map(function ($dir) { return \strtr($dir, '\\', '/') . '/psysh'; }, $baseDirs); // Add ~/.psysh if ($home = \getenv('HOME')) { $dirs[] = \strtr($home, '\\', '/') . '/.psysh'; } // Add some Windows specific ones :) if (\defined('PHP_WINDOWS_VERSION_MAJOR')) { if ($appData = \getenv('APPDATA')) { // AppData gets preference \array_unshift($dirs, \strtr($appData, '\\', '/') . '/PsySH'); } $dir = \strtr(\getenv('HOMEDRIVE') . '/' . \getenv('HOMEPATH'), '\\', '/') . '/.psysh'; if (!\in_array($dir, $dirs)) { $dirs[] = $dir; } } return $dirs; } private static function getRealFiles(array $dirNames, array $fileNames) { $files = []; foreach ($dirNames as $dir) { foreach ($fileNames as $name) { $file = $dir . '/' . $name; if (@\is_file($file)) { $files[] = $file; } } } return $files; } /** * Ensure that $file exists and is writable, make the parent directory if necessary. * * Generates E_USER_NOTICE error if either $file or its directory is not writable. * * @param string $file * * @return string|false Full path to $file, or false if file is not writable */ public static function touchFileWithMkdir($file) { if (\file_exists($file)) { if (\is_writable($file)) { return $file; } \trigger_error(\sprintf('Writing to %s is not allowed.', $file), E_USER_NOTICE); return false; } $dir = \dirname($file); if (!\is_dir($dir)) { // Just try making it and see if it works @\mkdir($dir, 0700, true); } if (!\is_dir($dir) || !\is_writable($dir)) { \trigger_error(\sprintf('Writing to %s is not allowed.', $dir), E_USER_NOTICE); return false; } \touch($file); return $file; } } PK!0))psysh/src/Sudo.phpnuIwproperty */ public static function fetchProperty($object, $property) { $refl = new \ReflectionObject($object); $prop = $refl->getProperty($property); $prop->setAccessible(true); return $prop->getValue($object); } /** * Assign the value of a property of an object, bypassing visibility restrictions. * * @param object $object * @param string $property property name * @param mixed $value * * @return mixed Value of $object->property */ public static function assignProperty($object, $property, $value) { $refl = new \ReflectionObject($object); $prop = $refl->getProperty($property); $prop->setAccessible(true); $prop->setValue($object, $value); return $value; } /** * Call a method on an object, bypassing visibility restrictions. * * @param object $object * @param string $method method name * @param mixed $args... * * @return mixed */ public static function callMethod($object, $method, $args = null) { $args = \func_get_args(); $object = \array_shift($args); $method = \array_shift($args); $refl = new \ReflectionObject($object); $reflMethod = $refl->getMethod($method); $reflMethod->setAccessible(true); return $reflMethod->invokeArgs($object, $args); } /** * Fetch a property of a class, bypassing visibility restrictions. * * @param string|object $class class name or instance * @param string $property property name * * @return mixed Value of $class::$property */ public static function fetchStaticProperty($class, $property) { $refl = new \ReflectionClass($class); $prop = $refl->getProperty($property); $prop->setAccessible(true); return $prop->getValue(); } /** * Assign the value of a static property of a class, bypassing visibility restrictions. * * @param string|object $class class name or instance * @param string $property property name * @param mixed $value * * @return mixed Value of $class::$property */ public static function assignStaticProperty($class, $property, $value) { $refl = new \ReflectionClass($class); $prop = $refl->getProperty($property); $prop->setAccessible(true); $prop->setValue($value); return $value; } /** * Call a static method on a class, bypassing visibility restrictions. * * @param string|object $class class name or instance * @param string $method method name * @param mixed $args... * * @return mixed */ public static function callStatic($class, $method, $args = null) { $args = \func_get_args(); $class = \array_shift($args); $method = \array_shift($args); $refl = new \ReflectionClass($class); $reflMethod = $refl->getMethod($method); $reflMethod->setAccessible(true); return $reflMethod->invokeArgs(null, $args); } /** * Fetch a class constant, bypassing visibility restrictions. * * @param string|object $class class name or instance * @param string $const constant name * * @return mixed */ public static function fetchClassConst($class, $const) { $refl = new \ReflectionClass($class); return $refl->getConstant($const); } } PK!NVz)psysh/src/Formatter/DocblockFormatter.phpnuIw 'info', 'var' => 'strong', ]; /** * Format a docblock. * * @param \Reflector $reflector * * @return string Formatted docblock */ public static function format(\Reflector $reflector) { $docblock = new Docblock($reflector); $chunks = []; if (!empty($docblock->desc)) { $chunks[] = 'Description:'; $chunks[] = self::indent(OutputFormatter::escape($docblock->desc), ' '); $chunks[] = ''; } if (!empty($docblock->tags)) { foreach ($docblock::$vectors as $name => $vector) { if (isset($docblock->tags[$name])) { $chunks[] = \sprintf('%s:', self::inflect($name)); $chunks[] = self::formatVector($vector, $docblock->tags[$name]); $chunks[] = ''; } } $tags = self::formatTags(\array_keys($docblock::$vectors), $docblock->tags); if (!empty($tags)) { $chunks[] = $tags; $chunks[] = ''; } } return \rtrim(\implode("\n", $chunks)); } /** * Format a docblock vector, for example, `@throws`, `@param`, or `@return`. * * @see DocBlock::$vectors * * @param array $vector * @param array $lines * * @return string */ private static function formatVector(array $vector, array $lines) { $template = [' ']; foreach ($vector as $type) { $max = 0; foreach ($lines as $line) { $chunk = $line[$type]; $cur = empty($chunk) ? 0 : \strlen($chunk) + 1; if ($cur > $max) { $max = $cur; } } $template[] = self::getVectorParamTemplate($type, $max); } $template = \implode(' ', $template); return \implode("\n", \array_map(function ($line) use ($template) { $escaped = \array_map(['Symfony\Component\Console\Formatter\OutputFormatter', 'escape'], $line); return \rtrim(\vsprintf($template, $escaped)); }, $lines)); } /** * Format docblock tags. * * @param array $skip Tags to exclude * @param array $tags Tags to format * * @return string formatted tags */ private static function formatTags(array $skip, array $tags) { $chunks = []; foreach ($tags as $name => $values) { if (\in_array($name, $skip)) { continue; } foreach ($values as $value) { $chunks[] = \sprintf('%s%s %s', self::inflect($name), empty($value) ? '' : ':', OutputFormatter::escape($value)); } $chunks[] = ''; } return \implode("\n", $chunks); } /** * Get a docblock vector template. * * @param string $type Vector type * @param int $max Pad width * * @return string */ private static function getVectorParamTemplate($type, $max) { if (!isset(self::$vectorParamTemplates[$type])) { return \sprintf('%%-%ds', $max); } return \sprintf('<%s>%%-%ds', self::$vectorParamTemplates[$type], $max, self::$vectorParamTemplates[$type]); } /** * Indent a string. * * @param string $text String to indent * @param string $indent (default: ' ') * * @return string */ private static function indent($text, $indent = ' ') { return $indent . \str_replace("\n", "\n" . $indent, $text); } /** * Convert underscored or whitespace separated words into sentence case. * * @param string $text * * @return string */ private static function inflect($text) { $words = \trim(\preg_replace('/[\s_-]+/', ' ', \preg_replace('/([a-z])([A-Z])/', '$1 $2', $text))); return \implode(' ', \array_map('ucfirst', \explode(' ', $words))); } } PK!]-!psysh/src/Formatter/Formatter.phpnuIwgetFileName()) { if (!\is_file($fileName)) { throw new RuntimeException('Source code unavailable'); } $file = \file_get_contents($fileName); $start = $reflector->getStartLine(); $end = $reflector->getEndLine() - $start; $factory = new ConsoleColorFactory($colorMode); $colors = $factory->getConsoleColor(); $highlighter = new Highlighter($colors); return $highlighter->getCodeSnippet($file, $start, 0, $end); } else { throw new RuntimeException('Source code unavailable'); } } /** * Check whether a Reflector instance is reflectable by this formatter. * * @param \Reflector $reflector * * @return bool */ private static function isReflectable(\Reflector $reflector) { return $reflector instanceof \ReflectionClass || $reflector instanceof \ReflectionFunctionAbstract; } } PK!b$$*psysh/src/Formatter/SignatureFormatter.phpnuIwgetName(); } /** * Print the method, property or class modifiers. * * @param \Reflector $reflector * * @return string Formatted modifiers */ private static function formatModifiers(\Reflector $reflector) { if ($reflector instanceof \ReflectionClass && $reflector->isTrait()) { // For some reason, PHP 5.x returns `abstract public` modifiers for // traits. Let's just ignore that business entirely. if (\version_compare(PHP_VERSION, '7.0.0', '<')) { return []; } } return \implode(' ', \array_map(function ($modifier) { return \sprintf('%s', $modifier); }, \Reflection::getModifierNames($reflector->getModifiers()))); } /** * Format a class signature. * * @param \ReflectionClass $reflector * * @return string Formatted signature */ private static function formatClass(\ReflectionClass $reflector) { $chunks = []; if ($modifiers = self::formatModifiers($reflector)) { $chunks[] = $modifiers; } if ($reflector->isTrait()) { $chunks[] = 'trait'; } else { $chunks[] = $reflector->isInterface() ? 'interface' : 'class'; } $chunks[] = \sprintf('%s', self::formatName($reflector)); if ($parent = $reflector->getParentClass()) { $chunks[] = 'extends'; $chunks[] = \sprintf('%s', $parent->getName()); } $interfaces = $reflector->getInterfaceNames(); if (!empty($interfaces)) { \sort($interfaces); $chunks[] = 'implements'; $chunks[] = \implode(', ', \array_map(function ($name) { return \sprintf('%s', $name); }, $interfaces)); } return \implode(' ', $chunks); } /** * Format a constant signature. * * @param ReflectionClassConstant|\ReflectionClassConstant $reflector * * @return string Formatted signature */ private static function formatClassConstant($reflector) { $value = $reflector->getValue(); $style = self::getTypeStyle($value); return \sprintf( 'const %s = <%s>%s', self::formatName($reflector), $style, OutputFormatter::escape(Json::encode($value)), $style ); } /** * Format a constant signature. * * @param ReflectionConstant_ $reflector * * @return string Formatted signature */ private static function formatConstant($reflector) { $value = $reflector->getValue(); $style = self::getTypeStyle($value); return \sprintf( 'define(%s, <%s>%s)', OutputFormatter::escape(Json::encode($reflector->getName())), $style, OutputFormatter::escape(Json::encode($value)), $style ); } /** * Helper for getting output style for a given value's type. * * @param mixed $value * * @return string */ private static function getTypeStyle($value) { if (\is_int($value) || \is_float($value)) { return 'number'; } elseif (\is_string($value)) { return 'string'; } elseif (\is_bool($value) || \is_null($value)) { return 'bool'; } else { return 'strong'; // @codeCoverageIgnore } } /** * Format a property signature. * * @param \ReflectionProperty $reflector * * @return string Formatted signature */ private static function formatProperty(\ReflectionProperty $reflector) { return \sprintf( '%s $%s', self::formatModifiers($reflector), $reflector->getName() ); } /** * Format a function signature. * * @param \ReflectionFunction $reflector * * @return string Formatted signature */ private static function formatFunction(\ReflectionFunctionAbstract $reflector) { return \sprintf( 'function %s%s(%s)', $reflector->returnsReference() ? '&' : '', self::formatName($reflector), \implode(', ', self::formatFunctionParams($reflector)) ); } /** * Format a method signature. * * @param \ReflectionMethod $reflector * * @return string Formatted signature */ private static function formatMethod(\ReflectionMethod $reflector) { return \sprintf( '%s %s', self::formatModifiers($reflector), self::formatFunction($reflector) ); } /** * Print the function params. * * @param \ReflectionFunctionAbstract $reflector * * @return array */ private static function formatFunctionParams(\ReflectionFunctionAbstract $reflector) { $params = []; foreach ($reflector->getParameters() as $param) { $hint = ''; try { if ($param->isArray()) { $hint = 'array '; } elseif ($class = $param->getClass()) { $hint = \sprintf('%s ', $class->getName()); } } catch (\Exception $e) { // sometimes we just don't know... // bad class names, or autoloaded classes that haven't been loaded yet, or whathaveyou. // come to think of it, the only time I've seen this is with the intl extension. // Hax: we'll try to extract it :P // @codeCoverageIgnoreStart $chunks = \explode('$' . $param->getName(), (string) $param); $chunks = \explode(' ', \trim($chunks[0])); $guess = \end($chunks); $hint = \sprintf('%s ', $guess); // @codeCoverageIgnoreEnd } if ($param->isOptional()) { if (!$param->isDefaultValueAvailable()) { $value = 'unknown'; $typeStyle = 'urgent'; } else { $value = $param->getDefaultValue(); $typeStyle = self::getTypeStyle($value); $value = \is_array($value) ? 'array()' : \is_null($value) ? 'null' : \var_export($value, true); } $default = \sprintf(' = <%s>%s', $typeStyle, OutputFormatter::escape($value), $typeStyle); } else { $default = ''; } $params[] = \sprintf( '%s%s$%s%s', $param->isPassedByReference() ? '&' : '', $hint, $param->getName(), $default ); } return $params; } } PK!6psysh/src/Readline/Readline.phpnuIwhistoryFile); if (!$history) { return []; } // libedit doesn't seem to support non-unix line separators. $history = \explode("\n", $history); // shift the history signature, ensure it's valid if (\array_shift($history) !== '_HiStOrY_V2_') { return []; } // decode the line $history = \array_map([$this, 'parseHistoryLine'], $history); // filter empty lines & comments return \array_values(\array_filter($history)); } /** * From GNUReadline (readline/histfile.c & readline/histexpand.c): * lines starting with "\0" are comments or timestamps; * if "\0" is found in an entry, * everything from it until the next line is a comment. * * @param string $line The history line to parse * * @return string | null */ protected function parseHistoryLine($line) { // empty line, comment or timestamp if (!$line || $line[0] === "\0") { return; } // if "\0" is found in an entry, then // everything from it until the end of line is a comment. if (($pos = \strpos($line, "\0")) !== false) { $line = \substr($line, 0, $pos); } return ($line !== '') ? Str::unvis($line) : null; } } PK! psysh/src/Readline/Transient.phpnuIwhistory = []; $this->historySize = $historySize; $this->eraseDups = $eraseDups; } /** * {@inheritdoc} */ public function addHistory($line) { if ($this->eraseDups) { if (($key = \array_search($line, $this->history)) !== false) { unset($this->history[$key]); } } $this->history[] = $line; if ($this->historySize > 0) { $histsize = \count($this->history); if ($histsize > $this->historySize) { $this->history = \array_slice($this->history, $histsize - $this->historySize); } } $this->history = \array_values($this->history); return true; } /** * {@inheritdoc} */ public function clearHistory() { $this->history = []; return true; } /** * {@inheritdoc} */ public function listHistory() { return $this->history; } /** * {@inheritdoc} */ public function readHistory() { return true; } /** * {@inheritdoc} * * @throws BreakException if user hits Ctrl+D * * @return string */ public function readline($prompt = null) { echo $prompt; return \rtrim(\fgets($this->getStdin()), "\n\r"); } /** * {@inheritdoc} */ public function redisplay() { // noop } /** * {@inheritdoc} */ public function writeHistory() { return true; } /** * Get a STDIN file handle. * * @throws BreakException if user hits Ctrl+D * * @return resource */ private function getStdin() { if (!isset($this->stdin)) { $this->stdin = \fopen('php://stdin', 'r'); } if (\feof($this->stdin)) { throw new BreakException('Ctrl+D'); } return $this->stdin; } } PK!47!psysh/src/Readline/HoaConsole.phpnuIwhoaReadline = new HoaReadline(); } /** * {@inheritdoc} */ public function addHistory($line) { $this->hoaReadline->addHistory($line); return true; } /** * {@inheritdoc} */ public function clearHistory() { $this->hoaReadline->clearHistory(); return true; } /** * {@inheritdoc} */ public function listHistory() { $i = 0; $list = []; while (($item = $this->hoaReadline->getHistory($i++)) !== null) { $list[] = $item; } return $list; } /** * {@inheritdoc} */ public function readHistory() { return true; } /** * {@inheritdoc} * * @throws BreakException if user hits Ctrl+D * * @return string */ public function readline($prompt = null) { return $this->hoaReadline->readLine($prompt); } /** * {@inheritdoc} */ public function redisplay() { // noop } /** * {@inheritdoc} */ public function writeHistory() { return true; } } PK!M,"psysh/src/Readline/GNUReadline.phpnuIwhistoryFile = ($historyFile !== null) ? $historyFile : false; $this->historySize = $historySize; $this->eraseDups = $eraseDups; } /** * {@inheritdoc} */ public function addHistory($line) { if ($res = \readline_add_history($line)) { $this->writeHistory(); } return $res; } /** * {@inheritdoc} */ public function clearHistory() { if ($res = \readline_clear_history()) { $this->writeHistory(); } return $res; } /** * {@inheritdoc} */ public function listHistory() { return readline_list_history(); } /** * {@inheritdoc} */ public function readHistory() { // Workaround PHP bug #69054 // // If open_basedir is set, readline_read_history() segfaults. This was fixed in 5.6.7: // // https://github.com/php/php-src/blob/423a057023ef3c00d2ffc16a6b43ba01d0f71796/NEWS#L19-L21 // if (\version_compare(PHP_VERSION, '5.6.7', '>=') || !\ini_get('open_basedir')) { \readline_read_history(); } \readline_clear_history(); return \readline_read_history($this->historyFile); } /** * {@inheritdoc} */ public function readline($prompt = null) { return \readline($prompt); } /** * {@inheritdoc} */ public function redisplay() { \readline_redisplay(); } /** * {@inheritdoc} */ public function writeHistory() { // We have to write history first, since it is used // by Libedit to list history if ($this->historyFile !== false) { $res = \readline_write_history($this->historyFile); } else { $res = true; } if (!$res || !$this->eraseDups && !$this->historySize > 0) { return $res; } $hist = $this->listHistory(); if (!$hist) { return true; } if ($this->eraseDups) { // flip-flip technique: removes duplicates, latest entries win. $hist = \array_flip(\array_flip($hist)); // sort on keys to get the order back \ksort($hist); } if ($this->historySize > 0) { $histsize = \count($hist); if ($histsize > $this->historySize) { $hist = \array_slice($hist, $histsize - $this->historySize); } } \readline_clear_history(); foreach ($hist as $line) { \readline_add_history($line); } if ($this->historyFile !== false) { return \readline_write_history($this->historyFile); } return true; } } PK!. &psysh/src/Exception/ErrorException.phpnuIwrawMessage = $message; if (!empty($filename) && \preg_match('{Psy[/\\\\]ExecutionLoop}', $filename)) { $filename = ''; } switch ($severity) { case E_STRICT: $type = 'Strict error'; break; case E_NOTICE: case E_USER_NOTICE: $type = 'Notice'; break; case E_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING: case E_USER_WARNING: $type = 'Warning'; break; case E_DEPRECATED: case E_USER_DEPRECATED: $type = 'Deprecated'; break; case E_RECOVERABLE_ERROR: $type = 'Recoverable fatal error'; break; default: $type = 'Error'; break; } $message = \sprintf('PHP %s: %s%s on line %d', $type, $message, $filename ? ' in ' . $filename : '', $lineno); parent::__construct($message, $code, $severity, $filename, $lineno, $previous); } /** * Get the raw (unformatted) message for this error. * * @return string */ public function getRawMessage() { return $this->rawMessage; } /** * Helper for throwing an ErrorException. * * This allows us to: * * set_error_handler(array('Psy\Exception\ErrorException', 'throwException')); * * @throws ErrorException * * @param int $errno Error type * @param string $errstr Message * @param string $errfile Filename * @param int $errline Line number */ public static function throwException($errno, $errstr, $errfile, $errline) { throw new self($errstr, 0, $errno, $errfile, $errline); } /** * Create an ErrorException from an Error. * * @param \Error $e * * @return ErrorException */ public static function fromError(\Error $e) { return new self($e->getMessage(), $e->getCode(), 1, $e->getFile(), $e->getLine(), $e); } } PK!PF+psysh/src/Exception/ParseErrorException.phpnuIwgetRawMessage(), $e->getStartLine()); } } PK!*SL(psysh/src/Exception/RuntimeException.phpnuIwrawMessage = $message; parent::__construct($message, $code, $previous); } /** * Return a raw (unformatted) version of the error message. * * @return string */ public function getRawMessage() { return $this->rawMessage; } } PK!4 1*psysh/src/Exception/TypeErrorException.phpnuIwrawMessage = $message; $message = \preg_replace('/, called in .*?: eval\\(\\)\'d code/', '', $message); parent::__construct(\sprintf('TypeError: %s', $message), $code); } /** * Get the raw (unformatted) message for this error. * * @return string */ public function getRawMessage() { return $this->rawMessage; } /** * Create a TypeErrorException from a TypeError. * * @param \TypeError $e * * @return TypeErrorException */ public static function fromTypeError(\TypeError $e) { return new self($e->getMessage(), $e->getCode()); } } PK!2S!psysh/src/Exception/Exception.phpnuIwrawMessage = $message; parent::__construct(\sprintf('Exit: %s', $message), $code, $previous); } /** * Return a raw (unformatted) version of the error message. * * @return string */ public function getRawMessage() { return $this->rawMessage; } /** * Throws BreakException. * * Since `throw` can not be inserted into arbitrary expressions, it wraps with function call. * * @throws BreakException */ public static function exitShell() { throw new self('Goodbye'); } } PK!hM+psysh/src/Exception/FatalErrorException.phpnuIwrawMessage = $message; $message = \sprintf('PHP Fatal error: %s in %s on line %d', $message, $filename ?: "eval()'d code", $lineno); parent::__construct($message, $code, $severity, $filename, $lineno, $previous); } /** * Return a raw (unformatted) version of the error message. * * @return string */ public function getRawMessage() { return $this->rawMessage; } } PK!&p税(psysh/src/Exception/ThrowUpException.phpnuIwgetMessage()); parent::__construct($message, $exception->getCode(), $exception); } /** * Return a raw (unformatted) version of the error message. * * @return string */ public function getRawMessage() { return $this->getPrevious()->getMessage(); } /** * Create a ThrowUpException from a Throwable. * * @param \Throwable $throwable * * @return ThrowUpException */ public static function fromThrowable($throwable) { if ($throwable instanceof \Error) { $throwable = ErrorException::fromError($throwable); } if (!$throwable instanceof \Exception) { throw new \InvalidArgumentException('throw-up can only throw Exceptions and Errors'); } return new self($throwable); } } PK!OK?   psysh/src/Output/ShellOutput.phpnuIwinitFormatters(); if ($pager === null) { $this->pager = new PassthruPager($this); } elseif (\is_string($pager)) { $this->pager = new ProcOutputPager($this, $pager); } elseif ($pager instanceof OutputPager) { $this->pager = $pager; } else { throw new \InvalidArgumentException('Unexpected pager parameter: ' . $pager); } } /** * Page multiple lines of output. * * The output pager is started * * If $messages is callable, it will be called, passing this output instance * for rendering. Otherwise, all passed $messages are paged to output. * * Upon completion, the output pager is flushed. * * @param string|array|\Closure $messages A string, array of strings or a callback * @param int $type (default: 0) */ public function page($messages, $type = 0) { if (\is_string($messages)) { $messages = (array) $messages; } if (!\is_array($messages) && !\is_callable($messages)) { throw new \InvalidArgumentException('Paged output requires a string, array or callback'); } $this->startPaging(); if (\is_callable($messages)) { $messages($this); } else { $this->write($messages, true, $type); } $this->stopPaging(); } /** * Start sending output to the output pager. */ public function startPaging() { $this->paging++; } /** * Stop paging output and flush the output pager. */ public function stopPaging() { $this->paging--; $this->closePager(); } /** * Writes a message to the output. * * Optionally, pass `$type | self::NUMBER_LINES` as the $type parameter to * number the lines of output. * * @throws \InvalidArgumentException When unknown output type is given * * @param string|array $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $type The type of output */ public function write($messages, $newline = false, $type = 0) { if ($this->getVerbosity() === self::VERBOSITY_QUIET) { return; } $messages = (array) $messages; if ($type & self::NUMBER_LINES) { $pad = \strlen((string) \count($messages)); $template = $this->isDecorated() ? ": %s" : "%{$pad}s: %s"; if ($type & self::OUTPUT_RAW) { $messages = \array_map(['Symfony\Component\Console\Formatter\OutputFormatter', 'escape'], $messages); } foreach ($messages as $i => $line) { $messages[$i] = \sprintf($template, $i, $line); } // clean this up for super. $type = $type & ~self::NUMBER_LINES & ~self::OUTPUT_RAW; } parent::write($messages, $newline, $type); } /** * Writes a message to the output. * * Handles paged output, or writes directly to the output stream. * * @param string $message A message to write to the output * @param bool $newline Whether to add a newline or not */ public function doWrite($message, $newline) { if ($this->paging > 0) { $this->pager->doWrite($message, $newline); } else { parent::doWrite($message, $newline); } } /** * Flush and close the output pager. */ private function closePager() { if ($this->paging <= 0) { $this->pager->close(); } } /** * Initialize output formatter styles. */ private function initFormatters() { $formatter = $this->getFormatter(); $formatter->setStyle('warning', new OutputFormatterStyle('black', 'yellow')); $formatter->setStyle('error', new OutputFormatterStyle('black', 'red', ['bold'])); $formatter->setStyle('aside', new OutputFormatterStyle('blue')); $formatter->setStyle('strong', new OutputFormatterStyle(null, null, ['bold'])); $formatter->setStyle('return', new OutputFormatterStyle('cyan')); $formatter->setStyle('urgent', new OutputFormatterStyle('red')); $formatter->setStyle('hidden', new OutputFormatterStyle('black')); // Visibility $formatter->setStyle('public', new OutputFormatterStyle(null, null, ['bold'])); $formatter->setStyle('protected', new OutputFormatterStyle('yellow')); $formatter->setStyle('private', new OutputFormatterStyle('red')); $formatter->setStyle('global', new OutputFormatterStyle('cyan', null, ['bold'])); $formatter->setStyle('const', new OutputFormatterStyle('cyan')); $formatter->setStyle('class', new OutputFormatterStyle('blue', null, ['underscore'])); $formatter->setStyle('function', new OutputFormatterStyle(null)); $formatter->setStyle('default', new OutputFormatterStyle(null)); // Types $formatter->setStyle('number', new OutputFormatterStyle('magenta')); $formatter->setStyle('string', new OutputFormatterStyle('green')); $formatter->setStyle('bool', new OutputFormatterStyle('cyan')); $formatter->setStyle('keyword', new OutputFormatterStyle('yellow')); $formatter->setStyle('comment', new OutputFormatterStyle('blue')); $formatter->setStyle('object', new OutputFormatterStyle('blue')); $formatter->setStyle('resource', new OutputFormatterStyle('yellow')); } } PK!,866 psysh/src/Output/OutputPager.phpnuIwstream = $output->getStream(); $this->cmd = $cmd; } /** * Writes a message to the output. * * @param string $message A message to write to the output * @param bool $newline Whether to add a newline or not * * @throws \RuntimeException When unable to write output (should never happen) */ public function doWrite($message, $newline) { $pipe = $this->getPipe(); if (false === @\fwrite($pipe, $message . ($newline ? PHP_EOL : ''))) { // @codeCoverageIgnoreStart // should never happen throw new \RuntimeException('Unable to write output'); // @codeCoverageIgnoreEnd } \fflush($pipe); } /** * Close the current pager process. */ public function close() { if (isset($this->pipe)) { \fclose($this->pipe); } if (isset($this->proc)) { $exit = \proc_close($this->proc); if ($exit !== 0) { throw new \RuntimeException('Error closing output stream'); } } unset($this->pipe, $this->proc); } /** * Get a pipe for paging output. * * If no active pager process exists, fork one and return its input pipe. */ private function getPipe() { if (!isset($this->pipe) || !isset($this->proc)) { $desc = [['pipe', 'r'], $this->stream, \fopen('php://stderr', 'w')]; $this->proc = \proc_open($this->cmd, $desc, $pipes); if (!\is_resource($this->proc)) { throw new \RuntimeException('Error opening output stream'); } $this->pipe = $pipes[0]; } return $this->pipe; } } PK!1|))"psysh/src/Output/PassthruPager.phpnuIwgetStream()); } /** * Close the current pager process. */ public function close() { // nothing to do here } } PK!d7 psysh/src/Context.phpnuIwreturnValue; case '_e': if (isset($this->lastException)) { return $this->lastException; } break; case '__out': if (isset($this->lastStdout)) { return $this->lastStdout; } break; case 'this': if (isset($this->boundObject)) { return $this->boundObject; } break; case '__function': case '__method': case '__class': case '__namespace': case '__file': case '__line': case '__dir': if (\array_key_exists($name, $this->commandScopeVariables)) { return $this->commandScopeVariables[$name]; } break; default: if (\array_key_exists($name, $this->scopeVariables)) { return $this->scopeVariables[$name]; } break; } throw new \InvalidArgumentException('Unknown variable: $' . $name); } /** * Get all defined variables. * * @return array */ public function getAll() { return \array_merge($this->scopeVariables, $this->getSpecialVariables()); } /** * Get all defined magic variables: $_, $_e, $__out, $__class, $__file, etc. * * @return array */ public function getSpecialVariables() { $vars = [ '_' => $this->returnValue, ]; if (isset($this->lastException)) { $vars['_e'] = $this->lastException; } if (isset($this->lastStdout)) { $vars['__out'] = $this->lastStdout; } if (isset($this->boundObject)) { $vars['this'] = $this->boundObject; } return \array_merge($vars, $this->commandScopeVariables); } /** * Set all scope variables. * * This method does *not* set any of the magic variables: $_, $_e, $__out, * $__class, $__file, etc. * * @param array $vars */ public function setAll(array $vars) { foreach (self::$specialNames as $key) { unset($vars[$key]); } foreach (self::$commandScopeNames as $key) { unset($vars[$key]); } $this->scopeVariables = $vars; } /** * Set the most recent return value. * * @param mixed $value */ public function setReturnValue($value) { $this->returnValue = $value; } /** * Get the most recent return value. * * @return mixed */ public function getReturnValue() { return $this->returnValue; } /** * Set the most recent Exception. * * @param \Exception $e */ public function setLastException(\Exception $e) { $this->lastException = $e; } /** * Get the most recent Exception. * * @throws \InvalidArgumentException If no Exception has been caught * * @return null|\Exception */ public function getLastException() { if (!isset($this->lastException)) { throw new \InvalidArgumentException('No most-recent exception'); } return $this->lastException; } /** * Set the most recent output from evaluated code. * * @param string $lastStdout */ public function setLastStdout($lastStdout) { $this->lastStdout = $lastStdout; } /** * Get the most recent output from evaluated code. * * @throws \InvalidArgumentException If no output has happened yet * * @return null|string */ public function getLastStdout() { if (!isset($this->lastStdout)) { throw new \InvalidArgumentException('No most-recent output'); } return $this->lastStdout; } /** * Set the bound object ($this variable) for the interactive shell. * * Note that this unsets the bound class, if any exists. * * @param object|null $boundObject */ public function setBoundObject($boundObject) { $this->boundObject = \is_object($boundObject) ? $boundObject : null; $this->boundClass = null; } /** * Get the bound object ($this variable) for the interactive shell. * * @return object|null */ public function getBoundObject() { return $this->boundObject; } /** * Set the bound class (self) for the interactive shell. * * Note that this unsets the bound object, if any exists. * * @param string|null $boundClass */ public function setBoundClass($boundClass) { $this->boundClass = (\is_string($boundClass) && $boundClass !== '') ? $boundClass : null; $this->boundObject = null; } /** * Get the bound class (self) for the interactive shell. * * @return string|null */ public function getBoundClass() { return $this->boundClass; } /** * Set command-scope magic variables: $__class, $__file, etc. * * @param array $commandScopeVariables */ public function setCommandScopeVariables(array $commandScopeVariables) { $vars = []; foreach ($commandScopeVariables as $key => $value) { // kind of type check if (\is_scalar($value) && \in_array($key, self::$commandScopeNames)) { $vars[$key] = $value; } } $this->commandScopeVariables = $vars; } /** * Get command-scope magic variables: $__class, $__file, etc. * * @return array */ public function getCommandScopeVariables() { return $this->commandScopeVariables; } /** * Get unused command-scope magic variables names: __class, __file, etc. * * This is used by the shell to unset old command-scope variables after a * new batch is set. * * @return array Array of unused variable names */ public function getUnusedCommandScopeVariableNames() { return \array_diff(self::$commandScopeNames, \array_keys($this->commandScopeVariables)); } /** * Check whether a variable name is a magic variable. * * @param string $name * * @return bool */ public static function isSpecialVariableName($name) { return \in_array($name, self::$specialNames) || \in_array($name, self::$commandScopeNames); } } PK!-d77psysh/src/ContextAware.phpnuIwloadIncludes($shell); $closure = new ExecutionLoopClosure($shell); $closure->execute(); } /** * Load user-defined includes. * * @param Shell $shell */ protected function loadIncludes(Shell $shell) { // Load user-defined includes $load = function (Shell $__psysh__) { \set_error_handler([$__psysh__, 'handleError']); foreach ($__psysh__->getIncludes() as $__psysh_include__) { try { include $__psysh_include__; } catch (\Error $_e) { $__psysh__->writeException(ErrorException::fromError($_e)); } catch (\Exception $_e) { $__psysh__->writeException($_e); } } \restore_error_handler(); unset($__psysh_include__); // Override any new local variables with pre-defined scope variables \extract($__psysh__->getScopeVariables(false)); // ... then add the whole mess of variables back. $__psysh__->setScopeVariables(\get_defined_vars()); }; $load($shell); } } PK!8psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.phpnuIw */ class MongoDatabaseMatcher extends AbstractContextAwareMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { // second token is the object operator \array_pop($tokens); } $objectToken = \array_pop($tokens); $objectName = \str_replace('$', '', $objectToken[1]); $object = $this->getVariable($objectName); if (!$object instanceof \MongoDB) { return []; } return \array_filter( $object->getCollectionNames(), function ($var) use ($input) { return AbstractMatcher::startsWith($input, $var); } ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($token, self::T_OBJECT_OPERATOR): case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR): return true; } return false; } } PK!WGC7psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.phpnuIw */ class ClassMethodsMatcher extends AbstractMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { // second token is the nekudotayim operator \array_pop($tokens); } $class = $this->getNamespaceAndClass($tokens); try { $reflection = new \ReflectionClass($class); } catch (\ReflectionException $re) { return []; } if (self::needCompleteClass($tokens[1])) { $methods = $reflection->getMethods(); } else { $methods = $reflection->getMethods(\ReflectionMethod::IS_STATIC); } $methods = \array_map(function (\ReflectionMethod $method) { return $method->getName(); }, $methods); return \array_map( function ($name) use ($class) { $chunks = \explode('\\', $class); $className = \array_pop($chunks); return $className . '::' . $name; }, \array_filter($methods, function ($method) use ($input) { return AbstractMatcher::startsWith($input, $method); }) ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($prevToken, self::T_DOUBLE_COLON) && self::tokenIs($token, self::T_STRING): case self::tokenIs($token, self::T_DOUBLE_COLON): return true; } return false; } } PK!U$&^ ^ 5psysh/src/TabCompletion/Matcher/ClassNamesMatcher.phpnuIw */ class ClassNamesMatcher extends AbstractMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $class = $this->getNamespaceAndClass($tokens); if (\strlen($class) > 0 && $class[0] === '\\') { $class = \substr($class, 1, \strlen($class)); } $quotedClass = \preg_quote($class); return \array_map( function ($className) use ($class) { // get the number of namespace separators $nsPos = \substr_count($class, '\\'); $pieces = \explode('\\', $className); //$methods = Mirror::get($class); return \implode('\\', \array_slice($pieces, $nsPos, \count($pieces))); }, \array_filter( \get_declared_classes(), function ($className) use ($quotedClass) { return AbstractMatcher::startsWith($quotedClass, $className); } ) ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); $blacklistedTokens = [ self::T_INCLUDE, self::T_INCLUDE_ONCE, self::T_REQUIRE, self::T_REQUIRE_ONCE, ]; switch (true) { case self::hasToken([$blacklistedTokens], $token): case self::hasToken([$blacklistedTokens], $prevToken): case \is_string($token) && $token === '$': return false; case self::hasToken([self::T_NEW, self::T_OPEN_TAG, self::T_NS_SEPARATOR, self::T_STRING], $prevToken): case self::hasToken([self::T_NEW, self::T_OPEN_TAG, self::T_NS_SEPARATOR], $token): case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $token): case self::isOperator($token): return true; } return false; } } PK!*G׎Dpsysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.phpnuIwgetParameters(); return $this->getDefaultParameterCompletion($parameters); } public function hasMatched(array $tokens) { $openBracket = \array_pop($tokens); if ($openBracket !== '(') { return false; } $functionName = \array_pop($tokens); if (!self::tokenIs($functionName, self::T_STRING)) { return false; } if (!\function_exists($functionName[1])) { return false; } return true; } } PK!,,?psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.phpnuIw */ abstract class AbstractContextAwareMatcher extends AbstractMatcher implements ContextAware { /** * Context instance (for ContextAware interface). * * @var Context */ protected $context; /** * ContextAware interface. * * @param Context $context */ public function setContext(Context $context) { $this->context = $context; } /** * Get a Context variable by name. * * @param string $var Variable name * * @return mixed */ protected function getVariable($var) { return $this->context->get($var); } /** * Get all variables in the current Context. * * @return array */ protected function getVariables() { return $this->context->getAll(); } } PK!NGeeGpsysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.phpnuIwgetNamespaceAndClass($tokens); try { $reflection = new \ReflectionClass($class); } catch (\ReflectionException $e) { // In this case the class apparently does not exist, so we can do nothing return []; } $methods = $reflection->getMethods(\ReflectionMethod::IS_STATIC); foreach ($methods as $method) { if ($method->getName() === $functionName[1]) { return $this->getDefaultParameterCompletion($method->getParameters()); } } return []; } public function hasMatched(array $tokens) { $openBracket = \array_pop($tokens); if ($openBracket !== '(') { return false; } $functionName = \array_pop($tokens); if (!self::tokenIs($functionName, self::T_STRING)) { return false; } $operator = \array_pop($tokens); if (!self::tokenIs($operator, self::T_DOUBLE_COLON)) { return false; } return true; } } PK!]  6psysh/src/TabCompletion/Matcher/MongoClientMatcher.phpnuIw */ class MongoClientMatcher extends AbstractContextAwareMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { // second token is the object operator \array_pop($tokens); } $objectToken = \array_pop($tokens); $objectName = \str_replace('$', '', $objectToken[1]); $object = $this->getVariable($objectName); if (!$object instanceof \MongoClient) { return []; } $list = $object->listDBs(); return \array_filter( \array_map(function ($info) { return $info['name']; }, $list['databases']), function ($var) use ($input) { return AbstractMatcher::startsWith($input, $var); } ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($token, self::T_OBJECT_OPERATOR): case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR): return true; } return false; } } PK!L?3\\3psysh/src/TabCompletion/Matcher/AbstractMatcher.phpnuIw */ abstract class AbstractMatcher { /** Syntax types */ const CONSTANT_SYNTAX = '^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$'; const VAR_SYNTAX = '^\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$'; const MISC_OPERATORS = '+-*/^|&'; /** Token values */ const T_OPEN_TAG = 'T_OPEN_TAG'; const T_VARIABLE = 'T_VARIABLE'; const T_OBJECT_OPERATOR = 'T_OBJECT_OPERATOR'; const T_DOUBLE_COLON = 'T_DOUBLE_COLON'; const T_NEW = 'T_NEW'; const T_CLONE = 'T_CLONE'; const T_NS_SEPARATOR = 'T_NS_SEPARATOR'; const T_STRING = 'T_STRING'; const T_WHITESPACE = 'T_WHITESPACE'; const T_AND_EQUAL = 'T_AND_EQUAL'; const T_BOOLEAN_AND = 'T_BOOLEAN_AND'; const T_BOOLEAN_OR = 'T_BOOLEAN_OR'; const T_ENCAPSED_AND_WHITESPACE = 'T_ENCAPSED_AND_WHITESPACE'; const T_REQUIRE = 'T_REQUIRE'; const T_REQUIRE_ONCE = 'T_REQUIRE_ONCE'; const T_INCLUDE = 'T_INCLUDE'; const T_INCLUDE_ONCE = 'T_INCLUDE_ONCE'; /** * Check whether this matcher can provide completions for $tokens. * * @param array $tokens Tokenized readline input * * @return bool */ public function hasMatched(array $tokens) { return false; } /** * Get current readline input word. * * @param array $tokens Tokenized readline input (see token_get_all) * * @return string */ protected function getInput(array $tokens) { $var = ''; $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { $var = $firstToken[1]; } return $var; } /** * Get current namespace and class (if any) from readline input. * * @param array $tokens Tokenized readline input (see token_get_all) * * @return string */ protected function getNamespaceAndClass($tokens) { $class = ''; while (self::hasToken( [self::T_NS_SEPARATOR, self::T_STRING], $token = \array_pop($tokens) )) { if (self::needCompleteClass($token)) { continue; } $class = $token[1] . $class; } return $class; } /** * Provide tab completion matches for readline input. * * @param array $tokens information substracted with get_token_all * @param array $info readline_info object * * @return array The matches resulting from the query */ abstract public function getMatches(array $tokens, array $info = []); /** * Check whether $word starts with $prefix. * * @param string $prefix * @param string $word * * @return bool */ public static function startsWith($prefix, $word) { return \preg_match(\sprintf('#^%s#', $prefix), $word); } /** * Check whether $token matches a given syntax pattern. * * @param mixed $token A PHP token (see token_get_all) * @param string $syntax A syntax pattern (default: variable pattern) * * @return bool */ public static function hasSyntax($token, $syntax = self::VAR_SYNTAX) { if (!\is_array($token)) { return false; } $regexp = \sprintf('#%s#', $syntax); return (bool) \preg_match($regexp, $token[1]); } /** * Check whether $token type is $which. * * @param string $which A PHP token type * @param mixed $token A PHP token (see token_get_all) * * @return bool */ public static function tokenIs($token, $which) { if (!\is_array($token)) { return false; } return \token_name($token[0]) === $which; } /** * Check whether $token is an operator. * * @param mixed $token A PHP token (see token_get_all) * * @return bool */ public static function isOperator($token) { if (!\is_string($token)) { return false; } return \strpos(self::MISC_OPERATORS, $token) !== false; } public static function needCompleteClass($token) { return \in_array($token[1], ['doc', 'ls', 'show']); } /** * Check whether $token type is present in $coll. * * @param array $coll A list of token types * @param mixed $token A PHP token (see token_get_all) * * @return bool */ public static function hasToken(array $coll, $token) { if (!\is_array($token)) { return false; } return \in_array(\token_name($token[0]), $coll); } } PK!3Hpsysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.phpnuIwgetVariable($objectName); $reflection = new \ReflectionObject($object); } catch (\InvalidArgumentException $e) { return []; } catch (\ReflectionException $e) { return []; } $methods = $reflection->getMethods(); foreach ($methods as $method) { if ($method->getName() === $functionName[1]) { return $this->getDefaultParameterCompletion($method->getParameters()); } } return []; } public function hasMatched(array $tokens) { $openBracket = \array_pop($tokens); if ($openBracket !== '(') { return false; } $functionName = \array_pop($tokens); if (!self::tokenIs($functionName, self::T_STRING)) { return false; } $operator = \array_pop($tokens); if (!self::tokenIs($operator, self::T_OBJECT_OPERATOR)) { return false; } return true; } } PK!8~~4psysh/src/TabCompletion/Matcher/FunctionsMatcher.phpnuIw */ class FunctionsMatcher extends AbstractMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $func = $this->getInput($tokens); $functions = \get_defined_functions(); $allFunctions = \array_merge($functions['user'], $functions['internal']); return \array_filter($allFunctions, function ($function) use ($func) { return AbstractMatcher::startsWith($func, $function); }); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($prevToken, self::T_NEW): return false; case self::hasToken([self::T_OPEN_TAG, self::T_STRING], $token): case self::isOperator($token): return true; } return false; } } PK!L++3psysh/src/TabCompletion/Matcher/KeywordsMatcher.phpnuIw */ class KeywordsMatcher extends AbstractMatcher { protected $keywords = [ 'array', 'clone', 'declare', 'die', 'echo', 'empty', 'eval', 'exit', 'include', 'include_once', 'isset', 'list', 'print', 'require', 'require_once', 'unset', ]; protected $mandatoryStartKeywords = [ 'die', 'echo', 'print', 'unset', ]; /** * Get all (completable) PHP keywords. * * @return array */ public function getKeywords() { return $this->keywords; } /** * Check whether $keyword is a (completable) PHP keyword. * * @param string $keyword * * @return bool */ public function isKeyword($keyword) { return \in_array($keyword, $this->keywords); } /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); return \array_filter($this->keywords, function ($keyword) use ($input) { return AbstractMatcher::startsWith($input, $keyword); }); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $token): // case is_string($token) && $token === '$': case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $prevToken) && self::tokenIs($token, self::T_STRING): case self::isOperator($token): return true; } return false; } } PK!8psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.phpnuIw */ class ObjectMethodsMatcher extends AbstractContextAwareMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { // second token is the object operator \array_pop($tokens); } $objectToken = \array_pop($tokens); if (!\is_array($objectToken)) { return []; } $objectName = \str_replace('$', '', $objectToken[1]); try { $object = $this->getVariable($objectName); } catch (InvalidArgumentException $e) { return []; } if (!\is_object($object)) { return []; } return \array_filter( \get_class_methods($object), function ($var) use ($input) { return AbstractMatcher::startsWith($input, $var) && // also check that we do not suggest invoking a super method(__construct, __wakeup, …) !AbstractMatcher::startsWith('__', $var); } ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($token, self::T_OBJECT_OPERATOR): case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR): return true; } return false; } } PK!uf7:psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.phpnuIw */ class ClassAttributesMatcher extends AbstractMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { // second token is the nekudotayim operator \array_pop($tokens); } $class = $this->getNamespaceAndClass($tokens); try { $reflection = new \ReflectionClass($class); } catch (\ReflectionException $re) { return []; } $vars = \array_merge( \array_map( function ($var) { return '$' . $var; }, \array_keys($reflection->getStaticProperties()) ), \array_keys($reflection->getConstants()) ); return \array_map( function ($name) use ($class) { $chunks = \explode('\\', $class); $className = \array_pop($chunks); return $className . '::' . $name; }, \array_filter( $vars, function ($var) use ($input) { return AbstractMatcher::startsWith($input, $var); } ) ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($prevToken, self::T_DOUBLE_COLON) && self::tokenIs($token, self::T_STRING): case self::tokenIs($token, self::T_DOUBLE_COLON): return true; } return false; } } PK!R7 3psysh/src/TabCompletion/Matcher/CommandsMatcher.phpnuIw */ class CommandsMatcher extends AbstractMatcher { /** @var string[] */ protected $commands = []; /** * CommandsMatcher constructor. * * @param Command[] $commands */ public function __construct(array $commands) { $this->setCommands($commands); } /** * Set Commands for completion. * * @param Command[] $commands */ public function setCommands(array $commands) { $names = []; foreach ($commands as $command) { $names = \array_merge([$command->getName()], $names); $names = \array_merge($command->getAliases(), $names); } $this->commands = $names; } /** * Check whether a command $name is defined. * * @param string $name * * @return bool */ protected function isCommand($name) { return \in_array($name, $this->commands); } /** * Check whether input matches a defined command. * * @param string $name * * @return bool */ protected function matchCommand($name) { foreach ($this->commands as $cmd) { if ($this->startsWith($name, $cmd)) { return true; } } return false; } /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); return \array_filter($this->commands, function ($command) use ($input) { return AbstractMatcher::startsWith($input, $command); }); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { /* $openTag */ \array_shift($tokens); $command = \array_shift($tokens); switch (true) { case self::tokenIs($command, self::T_STRING) && !$this->isCommand($command[1]) && $this->matchCommand($command[1]) && empty($tokens): return true; } return false; } } PK!pO(4psysh/src/TabCompletion/Matcher/VariablesMatcher.phpnuIw */ class VariablesMatcher extends AbstractContextAwareMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $var = \str_replace('$', '', $this->getInput($tokens)); return \array_filter(\array_keys($this->getVariables()), function ($variable) use ($var) { return AbstractMatcher::startsWith($var, $variable); }); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); switch (true) { case self::hasToken([self::T_OPEN_TAG, self::T_VARIABLE], $token): case \is_string($token) && $token === '$': case self::isOperator($token): return true; } return false; } } PK!\DD4psysh/src/TabCompletion/Matcher/ConstantsMatcher.phpnuIw */ class ConstantsMatcher extends AbstractMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $const = $this->getInput($tokens); return \array_filter(\array_keys(\get_defined_constants()), function ($constant) use ($const) { return AbstractMatcher::startsWith($const, $constant); }); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($prevToken, self::T_NEW): case self::tokenIs($prevToken, self::T_NS_SEPARATOR): return false; case self::hasToken([self::T_OPEN_TAG, self::T_STRING], $token): case self::isOperator($token): return true; } return false; } } PK!Kn?;psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.phpnuIw */ class ObjectAttributesMatcher extends AbstractContextAwareMatcher { /** * {@inheritdoc} */ public function getMatches(array $tokens, array $info = []) { $input = $this->getInput($tokens); $firstToken = \array_pop($tokens); if (self::tokenIs($firstToken, self::T_STRING)) { // second token is the object operator \array_pop($tokens); } $objectToken = \array_pop($tokens); if (!\is_array($objectToken)) { return []; } $objectName = \str_replace('$', '', $objectToken[1]); try { $object = $this->getVariable($objectName); } catch (InvalidArgumentException $e) { return []; } if (!\is_object($object)) { return []; } return \array_filter( \array_keys(\get_class_vars(\get_class($object))), function ($var) use ($input) { return AbstractMatcher::startsWith($input, $var); } ); } /** * {@inheritdoc} */ public function hasMatched(array $tokens) { $token = \array_pop($tokens); $prevToken = \array_pop($tokens); switch (true) { case self::tokenIs($token, self::T_OBJECT_OPERATOR): case self::tokenIs($prevToken, self::T_OBJECT_OPERATOR): return true; } return false; } } PK!֔wDpsysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.phpnuIwisDefaultValueAvailable()) { return []; } $defaultValue = $this->valueToShortString($parameter->getDefaultValue()); $parametersProcessed[] = "\${$parameter->getName()} = $defaultValue"; } if (empty($parametersProcessed)) { return []; } return [\implode(', ', $parametersProcessed) . ')']; } /** * Takes in the default value of a parameter and turns it into a * string representation that fits inline. * This is not 100% true to the original (newlines are inlined, for example). * * @param mixed $value * * @return string */ private function valueToShortString($value) { if (!\is_array($value)) { return \json_encode($value); } $chunks = []; $chunksSequential = []; $allSequential = true; foreach ($value as $key => $item) { $allSequential = $allSequential && \is_numeric($key) && $key === \count($chunksSequential); $keyString = $this->valueToShortString($key); $itemString = $this->valueToShortString($item); $chunks[] = "{$keyString} => {$itemString}"; $chunksSequential[] = $itemString; } $chunksToImplode = $allSequential ? $chunksSequential : $chunks; return '[' . \implode(', ', $chunksToImplode) . ']'; } } PK!kUw )psysh/src/TabCompletion/AutoCompleter.phpnuIw */ class AutoCompleter { /** @var Matcher\AbstractMatcher[] */ protected $matchers; /** * Register a tab completion Matcher. * * @param AbstractMatcher $matcher */ public function addMatcher(AbstractMatcher $matcher) { $this->matchers[] = $matcher; } /** * Activate readline tab completion. */ public function activate() { \readline_completion_function([&$this, 'callback']); } /** * Handle readline completion. * * @param string $input Readline current word * @param int $index Current word index * @param array $info readline_info() data * * @return array */ public function processCallback($input, $index, $info = []) { // Some (Windows?) systems provide incomplete `readline_info`, so let's // try to work around it. $line = $info['line_buffer']; if (isset($info['end'])) { $line = \substr($line, 0, $info['end']); } if ($line === '' && $input !== '') { $line = $input; } $tokens = \token_get_all('matchers as $matcher) { if ($matcher->hasMatched($tokens)) { $matches = \array_merge($matcher->getMatches($tokens), $matches); } } $matches = \array_unique($matches); return !empty($matches) ? $matches : ['']; } /** * The readline_completion_function callback handler. * * @see processCallback * * @param string $input * @param int $index * * @return array */ public function callback($input, $index) { return $this->processCallback($input, $index, \readline_info()); } /** * Remove readline callback handler on destruct. */ public function __destruct() { // PHP didn't implement the whole readline API when they first switched // to libedit. And they still haven't. if (\function_exists('readline_callback_handler_remove')) { \readline_callback_handler_remove(); } } } PK!.])])psysh/src/CodeCleaner.phpnuIwcreateParser(); } $this->parser = $parser; $this->printer = $printer ?: new Printer(); $this->traverser = $traverser ?: new NodeTraverser(); foreach ($this->getDefaultPasses() as $pass) { $this->traverser->addVisitor($pass); } } /** * Get default CodeCleaner passes. * * @return array */ private function getDefaultPasses() { $useStatementPass = new UseStatementPass(); $namespacePass = new NamespacePass($this); // Try to add implicit `use` statements and an implicit namespace, // based on the file in which the `debug` call was made. $this->addImplicitDebugContext([$useStatementPass, $namespacePass]); return [ // Validation passes new AbstractClassPass(), new AssignThisVariablePass(), new CalledClassPass(), new CallTimePassByReferencePass(), new FinalClassPass(), new FunctionContextPass(), new FunctionReturnInWriteContextPass(), new InstanceOfPass(), new LeavePsyshAlonePass(), new LegacyEmptyPass(), new ListPass(), new LoopContextPass(), new PassableByReferencePass(), new ValidConstructorPass(), // Rewriting shenanigans $useStatementPass, // must run before the namespace pass new ExitPass(), new ImplicitReturnPass(), new MagicConstantsPass(), $namespacePass, // must run after the implicit return pass new RequirePass(), new StrictTypesPass(), // Namespace-aware validation (which depends on aforementioned shenanigans) new ValidClassNamePass(), new ValidConstantPass(), new ValidFunctionNamePass(), ]; } /** * "Warm up" code cleaner passes when we're coming from a debug call. * * This is useful, for example, for `UseStatementPass` and `NamespacePass` * which keep track of state between calls, to maintain the current * namespace and a map of use statements. * * @param array $passes */ private function addImplicitDebugContext(array $passes) { $file = $this->getDebugFile(); if ($file === null) { return; } try { $code = @\file_get_contents($file); if (!$code) { return; } $stmts = $this->parse($code, true); if ($stmts === false) { return; } // Set up a clean traverser for just these code cleaner passes $traverser = new NodeTraverser(); foreach ($passes as $pass) { $traverser->addVisitor($pass); } $traverser->traverse($stmts); } catch (\Throwable $e) { // Don't care. } catch (\Exception $e) { // Still don't care. } } /** * Search the stack trace for a file in which the user called Psy\debug. * * @return string|null */ private static function getDebugFile() { $trace = \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); foreach (\array_reverse($trace) as $stackFrame) { if (!self::isDebugCall($stackFrame)) { continue; } if (\preg_match('/eval\(/', $stackFrame['file'])) { \preg_match_all('/([^\(]+)\((\d+)/', $stackFrame['file'], $matches); return $matches[1][0]; } return $stackFrame['file']; } } /** * Check whether a given backtrace frame is a call to Psy\debug. * * @param array $stackFrame * * @return bool */ private static function isDebugCall(array $stackFrame) { $class = isset($stackFrame['class']) ? $stackFrame['class'] : null; $function = isset($stackFrame['function']) ? $stackFrame['function'] : null; return ($class === null && $function === 'Psy\debug') || ($class === 'Psy\Shell' && $function === 'debug'); } /** * Clean the given array of code. * * @throws ParseErrorException if the code is invalid PHP, and cannot be coerced into valid PHP * * @param array $codeLines * @param bool $requireSemicolons * * @return string|false Cleaned PHP code, False if the input is incomplete */ public function clean(array $codeLines, $requireSemicolons = false) { $stmts = $this->parse('traverser->traverse($stmts); // Work around https://github.com/nikic/PHP-Parser/issues/399 $oldLocale = \setlocale(LC_NUMERIC, 0); \setlocale(LC_NUMERIC, 'C'); $code = $this->printer->prettyPrint($stmts); // Now put the locale back \setlocale(LC_NUMERIC, $oldLocale); return $code; } /** * Set the current local namespace. * * @param null|array $namespace (default: null) * * @return null|array */ public function setNamespace(array $namespace = null) { $this->namespace = $namespace; } /** * Get the current local namespace. * * @return null|array */ public function getNamespace() { return $this->namespace; } /** * Lex and parse a block of code. * * @see Parser::parse * * @throws ParseErrorException for parse errors that can't be resolved by * waiting a line to see what comes next * * @param string $code * @param bool $requireSemicolons * * @return array|false A set of statements, or false if incomplete */ protected function parse($code, $requireSemicolons = false) { try { return $this->parser->parse($code); } catch (\PhpParser\Error $e) { if ($this->parseErrorIsUnclosedString($e, $code)) { return false; } if ($this->parseErrorIsUnterminatedComment($e, $code)) { return false; } if ($this->parseErrorIsTrailingComma($e, $code)) { return false; } if (!$this->parseErrorIsEOF($e)) { throw ParseErrorException::fromParseError($e); } if ($requireSemicolons) { return false; } try { // Unexpected EOF, try again with an implicit semicolon return $this->parser->parse($code . ';'); } catch (\PhpParser\Error $e) { return false; } } } private function parseErrorIsEOF(\PhpParser\Error $e) { $msg = $e->getRawMessage(); return ($msg === 'Unexpected token EOF') || (\strpos($msg, 'Syntax error, unexpected EOF') !== false); } /** * A special test for unclosed single-quoted strings. * * Unlike (all?) other unclosed statements, single quoted strings have * their own special beautiful snowflake syntax error just for * themselves. * * @param \PhpParser\Error $e * @param string $code * * @return bool */ private function parseErrorIsUnclosedString(\PhpParser\Error $e, $code) { if ($e->getRawMessage() !== 'Syntax error, unexpected T_ENCAPSED_AND_WHITESPACE') { return false; } try { $this->parser->parse($code . "';"); } catch (\Exception $e) { return false; } return true; } private function parseErrorIsUnterminatedComment(\PhpParser\Error $e, $code) { return $e->getRawMessage() === 'Unterminated comment'; } private function parseErrorIsTrailingComma(\PhpParser\Error $e, $code) { return ($e->getRawMessage() === 'A trailing comma is not allowed here') && (\substr(\rtrim($code), -1) === ','); } } PK!Liiipsysh/src/Sudo/SudoVisitor.phpnuIwname instanceof Identifier ? $node->name->toString() : $node->name; $args = [ $node->var, \is_string($name) ? new String_($name) : $name, ]; return $this->prepareCall(self::PROPERTY_FETCH, $args); } elseif ($node instanceof Assign && $node->var instanceof PropertyFetch) { $target = $node->var; $name = $target->name instanceof Identifier ? $target->name->toString() : $target->name; $args = [ $target->var, \is_string($name) ? new String_($name) : $name, $node->expr, ]; return $this->prepareCall(self::PROPERTY_ASSIGN, $args); } elseif ($node instanceof MethodCall) { $name = $node->name instanceof Identifier ? $node->name->toString() : $node->name; $args = $node->args; \array_unshift($args, new Arg(\is_string($name) ? new String_($name) : $name)); \array_unshift($args, new Arg($node->var)); // not using prepareCall because the $node->args we started with are already Arg instances return new StaticCall(new FullyQualifiedName(self::SUDO_CLASS), self::METHOD_CALL, $args); } elseif ($node instanceof StaticPropertyFetch) { $class = $node->class instanceof Name ? $node->class->toString() : $node->class; $name = $node->name instanceof Identifier ? $node->name->toString() : $node->name; $args = [ \is_string($class) ? new String_($class) : $class, \is_string($name) ? new String_($name) : $name, ]; return $this->prepareCall(self::STATIC_PROPERTY_FETCH, $args); } elseif ($node instanceof Assign && $node->var instanceof StaticPropertyFetch) { $target = $node->var; $class = $target->class instanceof Name ? $target->class->toString() : $target->class; $name = $target->name instanceof Identifier ? $target->name->toString() : $target->name; $args = [ \is_string($class) ? new String_($class) : $class, \is_string($name) ? new String_($name) : $name, $node->expr, ]; return $this->prepareCall(self::STATIC_PROPERTY_ASSIGN, $args); } elseif ($node instanceof StaticCall) { $args = $node->args; $class = $node->class instanceof Name ? $node->class->toString() : $node->class; $name = $node->name instanceof Identifier ? $node->name->toString() : $node->name; \array_unshift($args, new Arg(\is_string($name) ? new String_($name) : $name)); \array_unshift($args, new Arg(\is_string($class) ? new String_($class) : $class)); // not using prepareCall because the $node->args we started with are already Arg instances return new StaticCall(new FullyQualifiedName(self::SUDO_CLASS), self::STATIC_CALL, $args); } elseif ($node instanceof ClassConstFetch) { $class = $node->class instanceof Name ? $node->class->toString() : $node->class; $name = $node->name instanceof Identifier ? $node->name->toString() : $node->name; $args = [ \is_string($class) ? new String_($class) : $class, \is_string($name) ? new String_($name) : $name, ]; return $this->prepareCall(self::CLASS_CONST_FETCH, $args); } } private function prepareCall($method, $args) { return new StaticCall(new FullyQualifiedName(self::SUDO_CLASS), $method, \array_map(function ($arg) { return new Arg($arg); }, $args)); } } PK!;  psysh/src/ParserFactory.phpnuIw= 2.0 — does. * * @return bool */ public function hasKindsSupport() { return \class_exists('PhpParser\ParserFactory'); } /** * Default kind (if supported, based on current interpreter's version). * * @return string|null */ public function getDefaultKind() { if ($this->hasKindsSupport()) { return \version_compare(PHP_VERSION, '7.0', '>=') ? static::ONLY_PHP7 : static::ONLY_PHP5; } } /** * New parser instance with given kind. * * @param string|null $kind One of class constants (only for PHP parser 2.0 and above) * * @return Parser */ public function createParser($kind = null) { if ($this->hasKindsSupport()) { $originalFactory = new OriginalParserFactory(); $kind = $kind ?: $this->getDefaultKind(); if (!\in_array($kind, static::getPossibleKinds())) { throw new \InvalidArgumentException('Unknown parser kind'); } $parser = $originalFactory->create(\constant('PhpParser\ParserFactory::' . $kind)); } else { if ($kind !== null) { throw new \InvalidArgumentException('Install PHP Parser v2.x to specify parser kind'); } $parser = new Parser(new Lexer()); } return $parser; } } PK!mKpsysh/.styleci.ymlnuIwpreset: symfony enabled: - align_double_arrow - concat_with_spaces - short_array_syntax - ordered_use - strict disabled: - blank_line_before_break - blank_line_before_continue - blank_line_before_throw - blank_line_before_try - concat_without_spaces - method_argument_space - pre_increment - unalign_double_arrow - unalign_equals - yoda_style - property_separation - const_separation finder: name: - "*.php" - ".php_cs" - "build-manual" - "build-phar" PK!(psysh/test/fixtures/legacy/.psysh/rc.phpnuIwsetRuntimeDir(\sys_get_temp_dir() . '/psysh_test/withconfig/temp'); return [ 'useReadline' => true, 'usePcntl' => false, 'requireSemicolons' => false, 'useUnicode' => true, 'errorLoggingLevel' => E_ALL & ~E_NOTICE, ]; PK!@psysh/test/fixtures/default/.local/share/psysh/php_manual.sqlitenuIwPK!7psysh/test/fixtures/default/.config/psysh/psysh_historynuIwPK!4psysh/test/fixtures/default/.config/psysh/config.phpnuIw", ">"], ["?", "?"], ["@", "@"], ["A", "A"], ["B", "B"], ["C", "C"], ["D", "D"], ["E", "E"], ["F", "F"], ["G", "G"], ["H", "H"], ["I", "I"], ["J", "J"], ["K", "K"], ["L", "L"], ["M", "M"], ["N", "N"], ["O", "O"], ["P", "P"], ["Q", "Q"], ["R", "R"], ["S", "S"], ["T", "T"], ["U", "U"], ["V", "V"], ["W", "W"], ["X", "X"], ["Y", "Y"], ["Z", "Z"], ["[", "["], ["\\\\", "\\"], ["]", "]"], ["^", "^"], ["_", "_"], ["`", "`"], ["a", "a"], ["b", "b"], ["c", "c"], ["d", "d"], ["e", "e"], ["f", "f"], ["g", "g"], ["h", "h"], ["i", "i"], ["j", "j"], ["k", "k"], ["l", "l"], ["m", "m"], ["n", "n"], ["o", "o"], ["p", "p"], ["q", "q"], ["r", "r"], ["s", "s"], ["t", "t"], ["u", "u"], ["v", "v"], ["w", "w"], ["x", "x"], ["y", "y"], ["z", "z"], ["{", "{"], ["|", "|"], ["}", "}"], ["~", "~"], ["\\^?", "\u007f"], ["\\M-B\\M^@", "\u0080"], ["\\M-B\\M^A", "\u0081"], ["\\M-B\\M^B", "\u0082"], ["\\M-B\\M^C", "\u0083"], ["\\M-B\\M^D", "\u0084"], ["\\M-B\\M^E", "\u0085"], ["\\M-B\\M^F", "\u0086"], ["\\M-B\\M^G", "\u0087"], ["\\M-B\\M^H", "\u0088"], ["\\M-B\\M^I", "\u0089"], ["\\M-B\\M^J", "\u008a"], ["\\M-B\\M^K", "\u008b"], ["\\M-B\\M^L", "\u008c"], ["\\M-B\\M^M", "\u008d"], ["\\M-B\\M^N", "\u008e"], ["\\M-B\\M^O", "\u008f"], ["\\M-B\\M^P", "\u0090"], ["\\M-B\\M^Q", "\u0091"], ["\\M-B\\M^R", "\u0092"], ["\\M-B\\M^S", "\u0093"], ["\\M-B\\M^T", "\u0094"], ["\\M-B\\M^U", "\u0095"], ["\\M-B\\M^V", "\u0096"], ["\\M-B\\M^W", "\u0097"], ["\\M-B\\M^X", "\u0098"], ["\\M-B\\M^Y", "\u0099"], ["\\M-B\\M^Z", "\u009a"], ["\\M-B\\M^[", "\u009b"], ["\\M-B\\M^\\", "\u009c"], ["\\M-B\\M^]", "\u009d"], ["\\M-B\\M^^", "\u009e"], ["\\M-B\\M^_", "\u009f"], ["\\M-B\\240", "\u00a0"], ["\\M-B\\M-!", "\u00a1"], ["\\M-B\\M-\"", "\u00a2"], ["\\M-B\\M-#", "\u00a3"], ["\\M-B\\M-$", "\u00a4"], ["\\M-B\\M-%", "\u00a5"], ["\\M-B\\M-&", "\u00a6"], ["\\M-B\\M-'", "\u00a7"], ["\\M-B\\M-(", "\u00a8"], ["\\M-B\\M-)", "\u00a9"], ["\\M-B\\M-*", "\u00aa"], ["\\M-B\\M-+", "\u00ab"], ["\\M-B\\M-,", "\u00ac"], ["\\M-B\\M--", "\u00ad"], ["\\M-B\\M-.", "\u00ae"], ["\\M-B\\M-/", "\u00af"], ["\\M-B\\M-0", "\u00b0"], ["\\M-B\\M-1", "\u00b1"], ["\\M-B\\M-2", "\u00b2"], ["\\M-B\\M-3", "\u00b3"], ["\\M-B\\M-4", "\u00b4"], ["\\M-B\\M-5", "\u00b5"], ["\\M-B\\M-6", "\u00b6"], ["\\M-B\\M-7", "\u00b7"], ["\\M-B\\M-8", "\u00b8"], ["\\M-B\\M-9", "\u00b9"], ["\\M-B\\M-:", "\u00ba"], ["\\M-B\\M-;", "\u00bb"], ["\\M-B\\M-<", "\u00bc"], ["\\M-B\\M-=", "\u00bd"], ["\\M-B\\M->", "\u00be"], ["\\M-B\\M-?", "\u00bf"], ["\\M-C\\M^@", "\u00c0"], ["\\M-C\\M^A", "\u00c1"], ["\\M-C\\M^B", "\u00c2"], ["\\M-C\\M^C", "\u00c3"], ["\\M-C\\M^D", "\u00c4"], ["\\M-C\\M^E", "\u00c5"], ["\\M-C\\M^F", "\u00c6"], ["\\M-C\\M^G", "\u00c7"], ["\\M-C\\M^H", "\u00c8"], ["\\M-C\\M^I", "\u00c9"], ["\\M-C\\M^J", "\u00ca"], ["\\M-C\\M^K", "\u00cb"], ["\\M-C\\M^L", "\u00cc"], ["\\M-C\\M^M", "\u00cd"], ["\\M-C\\M^N", "\u00ce"], ["\\M-C\\M^O", "\u00cf"], ["\\M-C\\M^P", "\u00d0"], ["\\M-C\\M^Q", "\u00d1"], ["\\M-C\\M^R", "\u00d2"], ["\\M-C\\M^S", "\u00d3"], ["\\M-C\\M^T", "\u00d4"], ["\\M-C\\M^U", "\u00d5"], ["\\M-C\\M^V", "\u00d6"], ["\\M-C\\M^W", "\u00d7"], ["\\M-C\\M^X", "\u00d8"], ["\\M-C\\M^Y", "\u00d9"], ["\\M-C\\M^Z", "\u00da"], ["\\M-C\\M^[", "\u00db"], ["\\M-C\\M^\\", "\u00dc"], ["\\M-C\\M^]", "\u00dd"], ["\\M-C\\M^^", "\u00de"], ["\\M-C\\M^_", "\u00df"], ["\\M-C\\240", "\u00e0"], ["\\M-C\\M-!", "\u00e1"], ["\\M-C\\M-\"", "\u00e2"], ["\\M-C\\M-#", "\u00e3"], ["\\M-C\\M-$", "\u00e4"], ["\\M-C\\M-%", "\u00e5"], ["\\M-C\\M-&", "\u00e6"], ["\\M-C\\M-'", "\u00e7"], ["\\M-C\\M-(", "\u00e8"], ["\\M-C\\M-)", "\u00e9"], ["\\M-C\\M-*", "\u00ea"], ["\\M-C\\M-+", "\u00eb"], ["\\M-C\\M-,", "\u00ec"], ["\\M-C\\M--", "\u00ed"], ["\\M-C\\M-.", "\u00ee"], ["\\M-C\\M-/", "\u00ef"], ["\\M-C\\M-0", "\u00f0"], ["\\M-C\\M-1", "\u00f1"], ["\\M-C\\M-2", "\u00f2"], ["\\M-C\\M-3", "\u00f3"], ["\\M-C\\M-4", "\u00f4"], ["\\M-C\\M-5", "\u00f5"], ["\\M-C\\M-6", "\u00f6"], ["\\M-C\\M-7", "\u00f7"], ["\\M-C\\M-8", "\u00f8"], ["\\M-C\\M-9", "\u00f9"], ["\\M-C\\M-:", "\u00fa"], ["\\M-C\\M-;", "\u00fb"], ["\\M-C\\M-<", "\u00fc"], ["\\M-C\\M-=", "\u00fd"], ["\\M-C\\M->", "\u00fe"], ["\\M-C\\M-?", "\u00ff"], ["\\M-D\\M^@", "\u0100"], ["\\M-D\\M^A", "\u0101"], ["\\M-D\\M^B", "\u0102"], ["\\M-D\\M^C", "\u0103"], ["\\M-D\\M^D", "\u0104"], ["\\M-D\\M^E", "\u0105"], ["\\M-D\\M^F", "\u0106"], ["\\M-D\\M^G", "\u0107"], ["\\M-D\\M^H", "\u0108"], ["\\M-D\\M^I", "\u0109"], ["\\M-D\\M^J", "\u010a"], ["\\M-D\\M^K", "\u010b"], ["\\M-D\\M^L", "\u010c"], ["\\M-D\\M^M", "\u010d"], ["\\M-D\\M^N", "\u010e"], ["\\M-D\\M^O", "\u010f"], ["\\M-D\\M^P", "\u0110"], ["\\M-D\\M^Q", "\u0111"], ["\\M-D\\M^R", "\u0112"], ["\\M-D\\M^S", "\u0113"], ["\\M-D\\M^T", "\u0114"], ["\\M-D\\M^U", "\u0115"], ["\\M-D\\M^V", "\u0116"], ["\\M-D\\M^W", "\u0117"], ["\\M-D\\M^X", "\u0118"], ["\\M-D\\M^Y", "\u0119"], ["\\M-D\\M^Z", "\u011a"], ["\\M-D\\M^[", "\u011b"], ["\\M-D\\M^\\", "\u011c"], ["\\M-D\\M^]", "\u011d"], ["\\M-D\\M^^", "\u011e"], ["\\M-D\\M^_", "\u011f"], ["\\M-D\\240", "\u0120"], ["\\M-D\\M-!", "\u0121"], ["\\M-D\\M-\"", "\u0122"], ["\\M-D\\M-#", "\u0123"], ["\\M-D\\M-$", "\u0124"], ["\\M-D\\M-%", "\u0125"], ["\\M-D\\M-&", "\u0126"], ["\\M-D\\M-'", "\u0127"], ["\\M-D\\M-(", "\u0128"], ["\\M-D\\M-)", "\u0129"], ["\\M-D\\M-*", "\u012a"], ["\\M-D\\M-+", "\u012b"], ["\\M-D\\M-,", "\u012c"], ["\\M-D\\M--", "\u012d"], ["\\M-D\\M-.", "\u012e"], ["\\M-D\\M-/", "\u012f"], ["\\M-D\\M-0", "\u0130"], ["\\M-D\\M-1", "\u0131"], ["\\M-D\\M-2", "\u0132"], ["\\M-D\\M-3", "\u0133"], ["\\M-D\\M-4", "\u0134"], ["\\M-D\\M-5", "\u0135"], ["\\M-D\\M-6", "\u0136"], ["\\M-D\\M-7", "\u0137"], ["\\M-D\\M-8", "\u0138"], ["\\M-D\\M-9", "\u0139"], ["\\M-D\\M-:", "\u013a"], ["\\M-D\\M-;", "\u013b"], ["\\M-D\\M-<", "\u013c"], ["\\M-D\\M-=", "\u013d"], ["\\M-D\\M->", "\u013e"], ["\\M-D\\M-?", "\u013f"], ["\\M-E\\M^@", "\u0140"], ["\\M-E\\M^A", "\u0141"], ["\\M-E\\M^B", "\u0142"], ["\\M-E\\M^C", "\u0143"], ["\\M-E\\M^D", "\u0144"], ["\\M-E\\M^E", "\u0145"], ["\\M-E\\M^F", "\u0146"], ["\\M-E\\M^G", "\u0147"], ["\\M-E\\M^H", "\u0148"], ["\\M-E\\M^I", "\u0149"], ["\\M-E\\M^J", "\u014a"], ["\\M-E\\M^K", "\u014b"], ["\\M-E\\M^L", "\u014c"], ["\\M-E\\M^M", "\u014d"], ["\\M-E\\M^N", "\u014e"], ["\\M-E\\M^O", "\u014f"], ["\\M-E\\M^P", "\u0150"], ["\\M-E\\M^Q", "\u0151"], ["\\M-E\\M^R", "\u0152"], ["\\M-E\\M^S", "\u0153"], ["\\M-E\\M^T", "\u0154"], ["\\M-E\\M^U", "\u0155"], ["\\M-E\\M^V", "\u0156"], ["\\M-E\\M^W", "\u0157"], ["\\M-E\\M^X", "\u0158"], ["\\M-E\\M^Y", "\u0159"], ["\\M-E\\M^Z", "\u015a"], ["\\M-E\\M^[", "\u015b"], ["\\M-E\\M^\\", "\u015c"], ["\\M-E\\M^]", "\u015d"], ["\\M-E\\M^^", "\u015e"], ["\\M-E\\M^_", "\u015f"], ["\\M-E\\240", "\u0160"], ["\\M-E\\M-!", "\u0161"], ["\\M-E\\M-\"", "\u0162"], ["\\M-E\\M-#", "\u0163"], ["\\M-E\\M-$", "\u0164"], ["\\M-E\\M-%", "\u0165"], ["\\M-E\\M-&", "\u0166"], ["\\M-E\\M-'", "\u0167"], ["\\M-E\\M-(", "\u0168"], ["\\M-E\\M-)", "\u0169"], ["\\M-E\\M-*", "\u016a"], ["\\M-E\\M-+", "\u016b"], ["\\M-E\\M-,", "\u016c"], ["\\M-E\\M--", "\u016d"], ["\\M-E\\M-.", "\u016e"], ["\\M-E\\M-/", "\u016f"], ["\\M-E\\M-0", "\u0170"], ["\\M-E\\M-1", "\u0171"], ["\\M-E\\M-2", "\u0172"], ["\\M-E\\M-3", "\u0173"], ["\\M-E\\M-4", "\u0174"], ["\\M-E\\M-5", "\u0175"], ["\\M-E\\M-6", "\u0176"], ["\\M-E\\M-7", "\u0177"], ["\\M-E\\M-8", "\u0178"], ["\\M-E\\M-9", "\u0179"], ["\\M-E\\M-:", "\u017a"], ["\\M-E\\M-;", "\u017b"], ["\\M-E\\M-<", "\u017c"], ["\\M-E\\M-=", "\u017d"], ["\\M-E\\M->", "\u017e"], ["\\M-E\\M-?", "\u017f"], ["\\M-F\\M^@", "\u0180"], ["\\M-F\\M^A", "\u0181"], ["\\M-F\\M^B", "\u0182"], ["\\M-F\\M^C", "\u0183"], ["\\M-F\\M^D", "\u0184"], ["\\M-F\\M^E", "\u0185"], ["\\M-F\\M^F", "\u0186"], ["\\M-F\\M^G", "\u0187"], ["\\M-F\\M^H", "\u0188"], ["\\M-F\\M^I", "\u0189"], ["\\M-F\\M^J", "\u018a"], ["\\M-F\\M^K", "\u018b"], ["\\M-F\\M^L", "\u018c"], ["\\M-F\\M^M", "\u018d"], ["\\M-F\\M^N", "\u018e"], ["\\M-F\\M^O", "\u018f"], ["\\M-F\\M^P", "\u0190"], ["\\M-F\\M^Q", "\u0191"], ["\\M-F\\M^R", "\u0192"], ["\\M-F\\M^S", "\u0193"], ["\\M-F\\M^T", "\u0194"], ["\\M-F\\M^U", "\u0195"], ["\\M-F\\M^V", "\u0196"], ["\\M-F\\M^W", "\u0197"], ["\\M-F\\M^X", "\u0198"], ["\\M-F\\M^Y", "\u0199"], ["\\M-F\\M^Z", "\u019a"], ["\\M-F\\M^[", "\u019b"], ["\\M-F\\M^\\", "\u019c"], ["\\M-F\\M^]", "\u019d"], ["\\M-F\\M^^", "\u019e"], ["\\M-F\\M^_", "\u019f"], ["\\M-F\\240", "\u01a0"], ["\\M-F\\M-!", "\u01a1"], ["\\M-F\\M-\"", "\u01a2"], ["\\M-F\\M-#", "\u01a3"], ["\\M-F\\M-$", "\u01a4"], ["\\M-F\\M-%", "\u01a5"], ["\\M-F\\M-&", "\u01a6"], ["\\M-F\\M-'", "\u01a7"], ["\\M-F\\M-(", "\u01a8"], ["\\M-F\\M-)", "\u01a9"], ["\\M-F\\M-*", "\u01aa"], ["\\M-F\\M-+", "\u01ab"], ["\\M-F\\M-,", "\u01ac"], ["\\M-F\\M--", "\u01ad"], ["\\M-F\\M-.", "\u01ae"], ["\\M-F\\M-/", "\u01af"], ["\\M-F\\M-0", "\u01b0"], ["\\M-F\\M-1", "\u01b1"], ["\\M-F\\M-2", "\u01b2"], ["\\M-F\\M-3", "\u01b3"], ["\\M-F\\M-4", "\u01b4"], ["\\M-F\\M-5", "\u01b5"], ["\\M-F\\M-6", "\u01b6"], ["\\M-F\\M-7", "\u01b7"], ["\\M-F\\M-8", "\u01b8"], ["\\M-F\\M-9", "\u01b9"], ["\\M-F\\M-:", "\u01ba"], ["\\M-F\\M-;", "\u01bb"], ["\\M-F\\M-<", "\u01bc"], ["\\M-F\\M-=", "\u01bd"], ["\\M-F\\M->", "\u01be"], ["\\M-F\\M-?", "\u01bf"], ["\\M-G\\M^@", "\u01c0"], ["\\M-G\\M^A", "\u01c1"], ["\\M-G\\M^B", "\u01c2"], ["\\M-G\\M^C", "\u01c3"], ["\\M-G\\M^D", "\u01c4"], ["\\M-G\\M^E", "\u01c5"], ["\\M-G\\M^F", "\u01c6"], ["\\M-G\\M^G", "\u01c7"], ["\\M-G\\M^H", "\u01c8"], ["\\M-G\\M^I", "\u01c9"], ["\\M-G\\M^J", "\u01ca"], ["\\M-G\\M^K", "\u01cb"], ["\\M-G\\M^L", "\u01cc"], ["\\M-G\\M^M", "\u01cd"], ["\\M-G\\M^N", "\u01ce"], ["\\M-G\\M^O", "\u01cf"], ["\\M-G\\M^P", "\u01d0"], ["\\M-G\\M^Q", "\u01d1"], ["\\M-G\\M^R", "\u01d2"], ["\\M-G\\M^S", "\u01d3"], ["\\M-G\\M^T", "\u01d4"], ["\\M-G\\M^U", "\u01d5"], ["\\M-G\\M^V", "\u01d6"], ["\\M-G\\M^W", "\u01d7"], ["\\M-G\\M^X", "\u01d8"], ["\\M-G\\M^Y", "\u01d9"], ["\\M-G\\M^Z", "\u01da"], ["\\M-G\\M^[", "\u01db"], ["\\M-G\\M^\\", "\u01dc"], ["\\M-G\\M^]", "\u01dd"], ["\\M-G\\M^^", "\u01de"], ["\\M-G\\M^_", "\u01df"], ["\\M-G\\240", "\u01e0"], ["\\M-G\\M-!", "\u01e1"], ["\\M-G\\M-\"", "\u01e2"], ["\\M-G\\M-#", "\u01e3"], ["\\M-G\\M-$", "\u01e4"], ["\\M-G\\M-%", "\u01e5"], ["\\M-G\\M-&", "\u01e6"], ["\\M-G\\M-'", "\u01e7"], ["\\M-G\\M-(", "\u01e8"], ["\\M-G\\M-)", "\u01e9"], ["\\M-G\\M-*", "\u01ea"], ["\\M-G\\M-+", "\u01eb"], ["\\M-G\\M-,", "\u01ec"], ["\\M-G\\M--", "\u01ed"], ["\\M-G\\M-.", "\u01ee"], ["\\M-G\\M-/", "\u01ef"], ["\\M-G\\M-0", "\u01f0"], ["\\M-G\\M-1", "\u01f1"], ["\\M-G\\M-2", "\u01f2"], ["\\M-G\\M-3", "\u01f3"], ["\\M-G\\M-4", "\u01f4"], ["\\M-G\\M-5", "\u01f5"], ["\\M-G\\M-6", "\u01f6"], ["\\M-G\\M-7", "\u01f7"], ["\\M-G\\M-8", "\u01f8"], ["\\M-G\\M-9", "\u01f9"], ["\\M-G\\M-:", "\u01fa"], ["\\M-G\\M-;", "\u01fb"], ["\\M-G\\M-<", "\u01fc"], ["\\M-G\\M-=", "\u01fd"], ["\\M-G\\M->", "\u01fe"], ["\\M-G\\M-?", "\u01ff"], ["\\M-H\\M^@", "\u0200"], ["\\M-H\\M^A", "\u0201"], ["\\M-H\\M^B", "\u0202"], ["\\M-H\\M^C", "\u0203"], ["\\M-H\\M^D", "\u0204"], ["\\M-H\\M^E", "\u0205"], ["\\M-H\\M^F", "\u0206"], ["\\M-H\\M^G", "\u0207"], ["\\M-H\\M^H", "\u0208"], ["\\M-H\\M^I", "\u0209"], ["\\M-H\\M^J", "\u020a"], ["\\M-H\\M^K", "\u020b"], ["\\M-H\\M^L", "\u020c"], ["\\M-H\\M^M", "\u020d"], ["\\M-H\\M^N", "\u020e"], ["\\M-H\\M^O", "\u020f"], ["\\M-H\\M^P", "\u0210"], ["\\M-H\\M^Q", "\u0211"], ["\\M-H\\M^R", "\u0212"], ["\\M-H\\M^S", "\u0213"], ["\\M-H\\M^T", "\u0214"], ["\\M-H\\M^U", "\u0215"], ["\\M-H\\M^V", "\u0216"], ["\\M-H\\M^W", "\u0217"], ["\\M-H\\M^X", "\u0218"], ["\\M-H\\M^Y", "\u0219"], ["\\M-H\\M^Z", "\u021a"], ["\\M-H\\M^[", "\u021b"], ["\\M-H\\M^\\", "\u021c"], ["\\M-H\\M^]", "\u021d"], ["\\M-H\\M^^", "\u021e"], ["\\M-H\\M^_", "\u021f"], ["\\M-H\\240", "\u0220"], ["\\M-H\\M-!", "\u0221"], ["\\M-H\\M-\"", "\u0222"], ["\\M-H\\M-#", "\u0223"], ["\\M-H\\M-$", "\u0224"], ["\\M-H\\M-%", "\u0225"], ["\\M-H\\M-&", "\u0226"], ["\\M-H\\M-'", "\u0227"], ["\\M-H\\M-(", "\u0228"], ["\\M-H\\M-)", "\u0229"], ["\\M-H\\M-*", "\u022a"], ["\\M-H\\M-+", "\u022b"], ["\\M-H\\M-,", "\u022c"], ["\\M-H\\M--", "\u022d"], ["\\M-H\\M-.", "\u022e"], ["\\M-H\\M-/", "\u022f"], ["\\M-H\\M-0", "\u0230"], ["\\M-H\\M-1", "\u0231"], ["\\M-H\\M-2", "\u0232"], ["\\M-H\\M-3", "\u0233"], ["\\M-H\\M-4", "\u0234"], ["\\M-H\\M-5", "\u0235"], ["\\M-H\\M-6", "\u0236"], ["\\M-H\\M-7", "\u0237"], ["\\M-H\\M-8", "\u0238"], ["\\M-H\\M-9", "\u0239"], ["\\M-H\\M-:", "\u023a"], ["\\M-H\\M-;", "\u023b"], ["\\M-H\\M-<", "\u023c"], ["\\M-H\\M-=", "\u023d"], ["\\M-H\\M->", "\u023e"], ["\\M-H\\M-?", "\u023f"], ["\\M-I\\M^@", "\u0240"], ["\\M-I\\M^A", "\u0241"], ["\\M-I\\M^B", "\u0242"], ["\\M-I\\M^C", "\u0243"], ["\\M-I\\M^D", "\u0244"], ["\\M-I\\M^E", "\u0245"], ["\\M-I\\M^F", "\u0246"], ["\\M-I\\M^G", "\u0247"], ["\\M-I\\M^H", "\u0248"], ["\\M-I\\M^I", "\u0249"], ["\\M-I\\M^J", "\u024a"], ["\\M-I\\M^K", "\u024b"], ["\\M-I\\M^L", "\u024c"], ["\\M-I\\M^M", "\u024d"], ["\\M-I\\M^N", "\u024e"], ["\\M-I\\M^O", "\u024f"], ["\\M-M\\M-0", "\u0370"], ["\\M-M\\M-1", "\u0371"], ["\\M-M\\M-2", "\u0372"], ["\\M-M\\M-3", "\u0373"], ["\\M-M\\M-4", "\u0374"], ["\\M-M\\M-5", "\u0375"], ["\\M-M\\M-6", "\u0376"], ["\\M-M\\M-7", "\u0377"], ["\\M-M\\M-8", "\u0378"], ["\\M-M\\M-9", "\u0379"], ["\\M-M\\M-:", "\u037a"], ["\\M-M\\M-;", "\u037b"], ["\\M-M\\M-<", "\u037c"], ["\\M-M\\M-=", "\u037d"], ["\\M-M\\M->", "\u037e"], ["\\M-M\\M-?", "\u037f"], ["\\M-N\\M^@", "\u0380"], ["\\M-N\\M^A", "\u0381"], ["\\M-N\\M^B", "\u0382"], ["\\M-N\\M^C", "\u0383"], ["\\M-N\\M^D", "\u0384"], ["\\M-N\\M^E", "\u0385"], ["\\M-N\\M^F", "\u0386"], ["\\M-N\\M^G", "\u0387"], ["\\M-N\\M^H", "\u0388"], ["\\M-N\\M^I", "\u0389"], ["\\M-N\\M^J", "\u038a"], ["\\M-N\\M^K", "\u038b"], ["\\M-N\\M^L", "\u038c"], ["\\M-N\\M^M", "\u038d"], ["\\M-N\\M^N", "\u038e"], ["\\M-N\\M^O", "\u038f"], ["\\M-N\\M^P", "\u0390"], ["\\M-N\\M^Q", "\u0391"], ["\\M-N\\M^R", "\u0392"], ["\\M-N\\M^S", "\u0393"], ["\\M-N\\M^T", "\u0394"], ["\\M-N\\M^U", "\u0395"], ["\\M-N\\M^V", "\u0396"], ["\\M-N\\M^W", "\u0397"], ["\\M-N\\M^X", "\u0398"], ["\\M-N\\M^Y", "\u0399"], ["\\M-N\\M^Z", "\u039a"], ["\\M-N\\M^[", "\u039b"], ["\\M-N\\M^\\", "\u039c"], ["\\M-N\\M^]", "\u039d"], ["\\M-N\\M^^", "\u039e"], ["\\M-N\\M^_", "\u039f"], ["\\M-N\\240", "\u03a0"], ["\\M-N\\M-!", "\u03a1"], ["\\M-N\\M-\"", "\u03a2"], ["\\M-N\\M-#", "\u03a3"], ["\\M-N\\M-$", "\u03a4"], ["\\M-N\\M-%", "\u03a5"], ["\\M-N\\M-&", "\u03a6"], ["\\M-N\\M-'", "\u03a7"], ["\\M-N\\M-(", "\u03a8"], ["\\M-N\\M-)", "\u03a9"], ["\\M-N\\M-*", "\u03aa"], ["\\M-N\\M-+", "\u03ab"], ["\\M-N\\M-,", "\u03ac"], ["\\M-N\\M--", "\u03ad"], ["\\M-N\\M-.", "\u03ae"], ["\\M-N\\M-/", "\u03af"], ["\\M-N\\M-0", "\u03b0"], ["\\M-N\\M-1", "\u03b1"], ["\\M-N\\M-2", "\u03b2"], ["\\M-N\\M-3", "\u03b3"], ["\\M-N\\M-4", "\u03b4"], ["\\M-N\\M-5", "\u03b5"], ["\\M-N\\M-6", "\u03b6"], ["\\M-N\\M-7", "\u03b7"], ["\\M-N\\M-8", "\u03b8"], ["\\M-N\\M-9", "\u03b9"], ["\\M-N\\M-:", "\u03ba"], ["\\M-N\\M-;", "\u03bb"], ["\\M-N\\M-<", "\u03bc"], ["\\M-N\\M-=", "\u03bd"], ["\\M-N\\M->", "\u03be"], ["\\M-N\\M-?", "\u03bf"], ["\\M-O\\M^@", "\u03c0"], ["\\M-O\\M^A", "\u03c1"], ["\\M-O\\M^B", "\u03c2"], ["\\M-O\\M^C", "\u03c3"], ["\\M-O\\M^D", "\u03c4"], ["\\M-O\\M^E", "\u03c5"], ["\\M-O\\M^F", "\u03c6"], ["\\M-O\\M^G", "\u03c7"], ["\\M-O\\M^H", "\u03c8"], ["\\M-O\\M^I", "\u03c9"], ["\\M-O\\M^J", "\u03ca"], ["\\M-O\\M^K", "\u03cb"], ["\\M-O\\M^L", "\u03cc"], ["\\M-O\\M^M", "\u03cd"], ["\\M-O\\M^N", "\u03ce"], ["\\M-O\\M^O", "\u03cf"], ["\\M-O\\M^P", "\u03d0"], ["\\M-O\\M^Q", "\u03d1"], ["\\M-O\\M^R", "\u03d2"], ["\\M-O\\M^S", "\u03d3"], ["\\M-O\\M^T", "\u03d4"], ["\\M-O\\M^U", "\u03d5"], ["\\M-O\\M^V", "\u03d6"], ["\\M-O\\M^W", "\u03d7"], ["\\M-O\\M^X", "\u03d8"], ["\\M-O\\M^Y", "\u03d9"], ["\\M-O\\M^Z", "\u03da"], ["\\M-O\\M^[", "\u03db"], ["\\M-O\\M^\\", "\u03dc"], ["\\M-O\\M^]", "\u03dd"], ["\\M-O\\M^^", "\u03de"], ["\\M-O\\M^_", "\u03df"], ["\\M-O\\240", "\u03e0"], ["\\M-O\\M-!", "\u03e1"], ["\\M-O\\M-\"", "\u03e2"], ["\\M-O\\M-#", "\u03e3"], ["\\M-O\\M-$", "\u03e4"], ["\\M-O\\M-%", "\u03e5"], ["\\M-O\\M-&", "\u03e6"], ["\\M-O\\M-'", "\u03e7"], ["\\M-O\\M-(", "\u03e8"], ["\\M-O\\M-)", "\u03e9"], ["\\M-O\\M-*", "\u03ea"], ["\\M-O\\M-+", "\u03eb"], ["\\M-O\\M-,", "\u03ec"], ["\\M-O\\M--", "\u03ed"], ["\\M-O\\M-.", "\u03ee"], ["\\M-O\\M-/", "\u03ef"], ["\\M-O\\M-0", "\u03f0"], ["\\M-O\\M-1", "\u03f1"], ["\\M-O\\M-2", "\u03f2"], ["\\M-O\\M-3", "\u03f3"], ["\\M-O\\M-4", "\u03f4"], ["\\M-O\\M-5", "\u03f5"], ["\\M-O\\M-6", "\u03f6"], ["\\M-O\\M-7", "\u03f7"], ["\\M-O\\M-8", "\u03f8"], ["\\M-O\\M-9", "\u03f9"], ["\\M-O\\M-:", "\u03fa"], ["\\M-O\\M-;", "\u03fb"], ["\\M-O\\M-<", "\u03fc"], ["\\M-O\\M-=", "\u03fd"], ["\\M-O\\M->", "\u03fe"], ["\\M-O\\M-?", "\u03ff"], ["\\M-P\\M^@", "\u0400"], ["\\M-P\\M^A", "\u0401"], ["\\M-P\\M^B", "\u0402"], ["\\M-P\\M^C", "\u0403"], ["\\M-P\\M^D", "\u0404"], ["\\M-P\\M^E", "\u0405"], ["\\M-P\\M^F", "\u0406"], ["\\M-P\\M^G", "\u0407"], ["\\M-P\\M^H", "\u0408"], ["\\M-P\\M^I", "\u0409"], ["\\M-P\\M^J", "\u040a"], ["\\M-P\\M^K", "\u040b"], ["\\M-P\\M^L", "\u040c"], ["\\M-P\\M^M", "\u040d"], ["\\M-P\\M^N", "\u040e"], ["\\M-P\\M^O", "\u040f"], ["\\M-P\\M^P", "\u0410"], ["\\M-P\\M^Q", "\u0411"], ["\\M-P\\M^R", "\u0412"], ["\\M-P\\M^S", "\u0413"], ["\\M-P\\M^T", "\u0414"], ["\\M-P\\M^U", "\u0415"], ["\\M-P\\M^V", "\u0416"], ["\\M-P\\M^W", "\u0417"], ["\\M-P\\M^X", "\u0418"], ["\\M-P\\M^Y", "\u0419"], ["\\M-P\\M^Z", "\u041a"], ["\\M-P\\M^[", "\u041b"], ["\\M-P\\M^\\", "\u041c"], ["\\M-P\\M^]", "\u041d"], ["\\M-P\\M^^", "\u041e"], ["\\M-P\\M^_", "\u041f"], ["\\M-P\\240", "\u0420"], ["\\M-P\\M-!", "\u0421"], ["\\M-P\\M-\"", "\u0422"], ["\\M-P\\M-#", "\u0423"], ["\\M-P\\M-$", "\u0424"], ["\\M-P\\M-%", "\u0425"], ["\\M-P\\M-&", "\u0426"], ["\\M-P\\M-'", "\u0427"], ["\\M-P\\M-(", "\u0428"], ["\\M-P\\M-)", "\u0429"], ["\\M-P\\M-*", "\u042a"], ["\\M-P\\M-+", "\u042b"], ["\\M-P\\M-,", "\u042c"], ["\\M-P\\M--", "\u042d"], ["\\M-P\\M-.", "\u042e"], ["\\M-P\\M-/", "\u042f"], ["\\M-P\\M-0", "\u0430"], ["\\M-P\\M-1", "\u0431"], ["\\M-P\\M-2", "\u0432"], ["\\M-P\\M-3", "\u0433"], ["\\M-P\\M-4", "\u0434"], ["\\M-P\\M-5", "\u0435"], ["\\M-P\\M-6", "\u0436"], ["\\M-P\\M-7", "\u0437"], ["\\M-P\\M-8", "\u0438"], ["\\M-P\\M-9", "\u0439"], ["\\M-P\\M-:", "\u043a"], ["\\M-P\\M-;", "\u043b"], ["\\M-P\\M-<", "\u043c"], ["\\M-P\\M-=", "\u043d"], ["\\M-P\\M->", "\u043e"], ["\\M-P\\M-?", "\u043f"], ["\\M-Q\\M^@", "\u0440"], ["\\M-Q\\M^A", "\u0441"], ["\\M-Q\\M^B", "\u0442"], ["\\M-Q\\M^C", "\u0443"], ["\\M-Q\\M^D", "\u0444"], ["\\M-Q\\M^E", "\u0445"], ["\\M-Q\\M^F", "\u0446"], ["\\M-Q\\M^G", "\u0447"], ["\\M-Q\\M^H", "\u0448"], ["\\M-Q\\M^I", "\u0449"], ["\\M-Q\\M^J", "\u044a"], ["\\M-Q\\M^K", "\u044b"], ["\\M-Q\\M^L", "\u044c"], ["\\M-Q\\M^M", "\u044d"], ["\\M-Q\\M^N", "\u044e"], ["\\M-Q\\M^O", "\u044f"], ["\\M-Q\\M^P", "\u0450"], ["\\M-Q\\M^Q", "\u0451"], ["\\M-Q\\M^R", "\u0452"], ["\\M-Q\\M^S", "\u0453"], ["\\M-Q\\M^T", "\u0454"], ["\\M-Q\\M^U", "\u0455"], ["\\M-Q\\M^V", "\u0456"], ["\\M-Q\\M^W", "\u0457"], ["\\M-Q\\M^X", "\u0458"], ["\\M-Q\\M^Y", "\u0459"], ["\\M-Q\\M^Z", "\u045a"], ["\\M-Q\\M^[", "\u045b"], ["\\M-Q\\M^\\", "\u045c"], ["\\M-Q\\M^]", "\u045d"], ["\\M-Q\\M^^", "\u045e"], ["\\M-Q\\M^_", "\u045f"], ["\\M-Q\\240", "\u0460"], ["\\M-Q\\M-!", "\u0461"], ["\\M-Q\\M-\"", "\u0462"], ["\\M-Q\\M-#", "\u0463"], ["\\M-Q\\M-$", "\u0464"], ["\\M-Q\\M-%", "\u0465"], ["\\M-Q\\M-&", "\u0466"], ["\\M-Q\\M-'", "\u0467"], ["\\M-Q\\M-(", "\u0468"], ["\\M-Q\\M-)", "\u0469"], ["\\M-Q\\M-*", "\u046a"], ["\\M-Q\\M-+", "\u046b"], ["\\M-Q\\M-,", "\u046c"], ["\\M-Q\\M--", "\u046d"], ["\\M-Q\\M-.", "\u046e"], ["\\M-Q\\M-/", "\u046f"], ["\\M-Q\\M-0", "\u0470"], ["\\M-Q\\M-1", "\u0471"], ["\\M-Q\\M-2", "\u0472"], ["\\M-Q\\M-3", "\u0473"], ["\\M-Q\\M-4", "\u0474"], ["\\M-Q\\M-5", "\u0475"], ["\\M-Q\\M-6", "\u0476"], ["\\M-Q\\M-7", "\u0477"], ["\\M-Q\\M-8", "\u0478"], ["\\M-Q\\M-9", "\u0479"], ["\\M-Q\\M-:", "\u047a"], ["\\M-Q\\M-;", "\u047b"], ["\\M-Q\\M-<", "\u047c"], ["\\M-Q\\M-=", "\u047d"], ["\\M-Q\\M->", "\u047e"], ["\\M-Q\\M-?", "\u047f"], ["\\M-R\\M^@", "\u0480"], ["\\M-R\\M^A", "\u0481"], ["\\M-R\\M^B", "\u0482"], ["\\M-R\\M^C", "\u0483"], ["\\M-R\\M^D", "\u0484"], ["\\M-R\\M^E", "\u0485"], ["\\M-R\\M^F", "\u0486"], ["\\M-R\\M^G", "\u0487"], ["\\M-R\\M^H", "\u0488"], ["\\M-R\\M^I", "\u0489"], ["\\M-R\\M^J", "\u048a"], ["\\M-R\\M^K", "\u048b"], ["\\M-R\\M^L", "\u048c"], ["\\M-R\\M^M", "\u048d"], ["\\M-R\\M^N", "\u048e"], ["\\M-R\\M^O", "\u048f"], ["\\M-R\\M^P", "\u0490"], ["\\M-R\\M^Q", "\u0491"], ["\\M-R\\M^R", "\u0492"], ["\\M-R\\M^S", "\u0493"], ["\\M-R\\M^T", "\u0494"], ["\\M-R\\M^U", "\u0495"], ["\\M-R\\M^V", "\u0496"], ["\\M-R\\M^W", "\u0497"], ["\\M-R\\M^X", "\u0498"], ["\\M-R\\M^Y", "\u0499"], ["\\M-R\\M^Z", "\u049a"], ["\\M-R\\M^[", "\u049b"], ["\\M-R\\M^\\", "\u049c"], ["\\M-R\\M^]", "\u049d"], ["\\M-R\\M^^", "\u049e"], ["\\M-R\\M^_", "\u049f"], ["\\M-R\\240", "\u04a0"], ["\\M-R\\M-!", "\u04a1"], ["\\M-R\\M-\"", "\u04a2"], ["\\M-R\\M-#", "\u04a3"], ["\\M-R\\M-$", "\u04a4"], ["\\M-R\\M-%", "\u04a5"], ["\\M-R\\M-&", "\u04a6"], ["\\M-R\\M-'", "\u04a7"], ["\\M-R\\M-(", "\u04a8"], ["\\M-R\\M-)", "\u04a9"], ["\\M-R\\M-*", "\u04aa"], ["\\M-R\\M-+", "\u04ab"], ["\\M-R\\M-,", "\u04ac"], ["\\M-R\\M--", "\u04ad"], ["\\M-R\\M-.", "\u04ae"], ["\\M-R\\M-/", "\u04af"], ["\\M-R\\M-0", "\u04b0"], ["\\M-R\\M-1", "\u04b1"], ["\\M-R\\M-2", "\u04b2"], ["\\M-R\\M-3", "\u04b3"], ["\\M-R\\M-4", "\u04b4"], ["\\M-R\\M-5", "\u04b5"], ["\\M-R\\M-6", "\u04b6"], ["\\M-R\\M-7", "\u04b7"], ["\\M-R\\M-8", "\u04b8"], ["\\M-R\\M-9", "\u04b9"], ["\\M-R\\M-:", "\u04ba"], ["\\M-R\\M-;", "\u04bb"], ["\\M-R\\M-<", "\u04bc"], ["\\M-R\\M-=", "\u04bd"], ["\\M-R\\M->", "\u04be"], ["\\M-R\\M-?", "\u04bf"], ["\\M-S\\M^@", "\u04c0"], ["\\M-S\\M^A", "\u04c1"], ["\\M-S\\M^B", "\u04c2"], ["\\M-S\\M^C", "\u04c3"], ["\\M-S\\M^D", "\u04c4"], ["\\M-S\\M^E", "\u04c5"], ["\\M-S\\M^F", "\u04c6"], ["\\M-S\\M^G", "\u04c7"], ["\\M-S\\M^H", "\u04c8"], ["\\M-S\\M^I", "\u04c9"], ["\\M-S\\M^J", "\u04ca"], ["\\M-S\\M^K", "\u04cb"], ["\\M-S\\M^L", "\u04cc"], ["\\M-S\\M^M", "\u04cd"], ["\\M-S\\M^N", "\u04ce"], ["\\M-S\\M^O", "\u04cf"], ["\\M-S\\M^P", "\u04d0"], ["\\M-S\\M^Q", "\u04d1"], ["\\M-S\\M^R", "\u04d2"], ["\\M-S\\M^S", "\u04d3"], ["\\M-S\\M^T", "\u04d4"], ["\\M-S\\M^U", "\u04d5"], ["\\M-S\\M^V", "\u04d6"], ["\\M-S\\M^W", "\u04d7"], ["\\M-S\\M^X", "\u04d8"], ["\\M-S\\M^Y", "\u04d9"], ["\\M-S\\M^Z", "\u04da"], ["\\M-S\\M^[", "\u04db"], ["\\M-S\\M^\\", "\u04dc"], ["\\M-S\\M^]", "\u04dd"], ["\\M-S\\M^^", "\u04de"], ["\\M-S\\M^_", "\u04df"], ["\\M-S\\240", "\u04e0"], ["\\M-S\\M-!", "\u04e1"], ["\\M-S\\M-\"", "\u04e2"], ["\\M-S\\M-#", "\u04e3"], ["\\M-S\\M-$", "\u04e4"], ["\\M-S\\M-%", "\u04e5"], ["\\M-S\\M-&", "\u04e6"], ["\\M-S\\M-'", "\u04e7"], ["\\M-S\\M-(", "\u04e8"], ["\\M-S\\M-)", "\u04e9"], ["\\M-S\\M-*", "\u04ea"], ["\\M-S\\M-+", "\u04eb"], ["\\M-S\\M-,", "\u04ec"], ["\\M-S\\M--", "\u04ed"], ["\\M-S\\M-.", "\u04ee"], ["\\M-S\\M-/", "\u04ef"], ["\\M-S\\M-0", "\u04f0"], ["\\M-S\\M-1", "\u04f1"], ["\\M-S\\M-2", "\u04f2"], ["\\M-S\\M-3", "\u04f3"], ["\\M-S\\M-4", "\u04f4"], ["\\M-S\\M-5", "\u04f5"], ["\\M-S\\M-6", "\u04f6"], ["\\M-S\\M-7", "\u04f7"], ["\\M-S\\M-8", "\u04f8"], ["\\M-S\\M-9", "\u04f9"], ["\\M-S\\M-:", "\u04fa"], ["\\M-S\\M-;", "\u04fb"], ["\\M-S\\M-<", "\u04fc"], ["\\M-S\\M-=", "\u04fd"], ["\\M-S\\M->", "\u04fe"], ["\\M-S\\M-?", "\u04ff"], ["\\M-T\\M^@", "\u0500"], ["\\M-T\\M^A", "\u0501"], ["\\M-T\\M^B", "\u0502"], ["\\M-T\\M^C", "\u0503"], ["\\M-T\\M^D", "\u0504"], ["\\M-T\\M^E", "\u0505"], ["\\M-T\\M^F", "\u0506"], ["\\M-T\\M^G", "\u0507"], ["\\M-T\\M^H", "\u0508"], ["\\M-T\\M^I", "\u0509"], ["\\M-T\\M^J", "\u050a"], ["\\M-T\\M^K", "\u050b"], ["\\M-T\\M^L", "\u050c"], ["\\M-T\\M^M", "\u050d"], ["\\M-T\\M^N", "\u050e"], ["\\M-T\\M^O", "\u050f"], ["\\M-T\\M^P", "\u0510"], ["\\M-T\\M^Q", "\u0511"], ["\\M-T\\M^R", "\u0512"], ["\\M-T\\M^S", "\u0513"], ["\\M-T\\M^T", "\u0514"], ["\\M-T\\M^U", "\u0515"], ["\\M-T\\M^V", "\u0516"], ["\\M-T\\M^W", "\u0517"], ["\\M-T\\M^X", "\u0518"], ["\\M-T\\M^Y", "\u0519"], ["\\M-T\\M^Z", "\u051a"], ["\\M-T\\M^[", "\u051b"], ["\\M-T\\M^\\", "\u051c"], ["\\M-T\\M^]", "\u051d"], ["\\M-T\\M^^", "\u051e"], ["\\M-T\\M^_", "\u051f"], ["\\M-T\\240", "\u0520"], ["\\M-T\\M-!", "\u0521"], ["\\M-T\\M-\"", "\u0522"], ["\\M-T\\M-#", "\u0523"], ["\\M-T\\M-$", "\u0524"], ["\\M-T\\M-%", "\u0525"], ["\\M-T\\M-&", "\u0526"], ["\\M-T\\M-'", "\u0527"], ["\\M-T\\M-(", "\u0528"], ["\\M-T\\M-)", "\u0529"], ["\\M-T\\M-*", "\u052a"], ["\\M-T\\M-+", "\u052b"], ["\\M-T\\M-,", "\u052c"], ["\\M-T\\M--", "\u052d"], ["\\M-T\\M-.", "\u052e"], ["\\M-T\\M-/", "\u052f"], ["\\M-V\\M^P", "\u0590"], ["\\M-V\\M^Q", "\u0591"], ["\\M-V\\M^R", "\u0592"], ["\\M-V\\M^S", "\u0593"], ["\\M-V\\M^T", "\u0594"], ["\\M-V\\M^U", "\u0595"], ["\\M-V\\M^V", "\u0596"], ["\\M-V\\M^W", "\u0597"], ["\\M-V\\M^X", "\u0598"], ["\\M-V\\M^Y", "\u0599"], ["\\M-V\\M^Z", "\u059a"], ["\\M-V\\M^[", "\u059b"], ["\\M-V\\M^\\", "\u059c"], ["\\M-V\\M^]", "\u059d"], ["\\M-V\\M^^", "\u059e"], ["\\M-V\\M^_", "\u059f"], ["\\M-V\\240", "\u05a0"], ["\\M-V\\M-!", "\u05a1"], ["\\M-V\\M-\"", "\u05a2"], ["\\M-V\\M-#", "\u05a3"], ["\\M-V\\M-$", "\u05a4"], ["\\M-V\\M-%", "\u05a5"], ["\\M-V\\M-&", "\u05a6"], ["\\M-V\\M-'", "\u05a7"], ["\\M-V\\M-(", "\u05a8"], ["\\M-V\\M-)", "\u05a9"], ["\\M-V\\M-*", "\u05aa"], ["\\M-V\\M-+", "\u05ab"], ["\\M-V\\M-,", "\u05ac"], ["\\M-V\\M--", "\u05ad"], ["\\M-V\\M-.", "\u05ae"], ["\\M-V\\M-/", "\u05af"], ["\\M-V\\M-0", "\u05b0"], ["\\M-V\\M-1", "\u05b1"], ["\\M-V\\M-2", "\u05b2"], ["\\M-V\\M-3", "\u05b3"], ["\\M-V\\M-4", "\u05b4"], ["\\M-V\\M-5", "\u05b5"], ["\\M-V\\M-6", "\u05b6"], ["\\M-V\\M-7", "\u05b7"], ["\\M-V\\M-8", "\u05b8"], ["\\M-V\\M-9", "\u05b9"], ["\\M-V\\M-:", "\u05ba"], ["\\M-V\\M-;", "\u05bb"], ["\\M-V\\M-<", "\u05bc"], ["\\M-V\\M-=", "\u05bd"], ["\\M-V\\M->", "\u05be"], ["\\M-V\\M-?", "\u05bf"], ["\\M-W\\M^@", "\u05c0"], ["\\M-W\\M^A", "\u05c1"], ["\\M-W\\M^B", "\u05c2"], ["\\M-W\\M^C", "\u05c3"], ["\\M-W\\M^D", "\u05c4"], ["\\M-W\\M^E", "\u05c5"], ["\\M-W\\M^F", "\u05c6"], ["\\M-W\\M^G", "\u05c7"], ["\\M-W\\M^H", "\u05c8"], ["\\M-W\\M^I", "\u05c9"], ["\\M-W\\M^J", "\u05ca"], ["\\M-W\\M^K", "\u05cb"], ["\\M-W\\M^L", "\u05cc"], ["\\M-W\\M^M", "\u05cd"], ["\\M-W\\M^N", "\u05ce"], ["\\M-W\\M^O", "\u05cf"], ["\\M-W\\M^P", "\u05d0"], ["\\M-W\\M^Q", "\u05d1"], ["\\M-W\\M^R", "\u05d2"], ["\\M-W\\M^S", "\u05d3"], ["\\M-W\\M^T", "\u05d4"], ["\\M-W\\M^U", "\u05d5"], ["\\M-W\\M^V", "\u05d6"], ["\\M-W\\M^W", "\u05d7"], ["\\M-W\\M^X", "\u05d8"], ["\\M-W\\M^Y", "\u05d9"], ["\\M-W\\M^Z", "\u05da"], ["\\M-W\\M^[", "\u05db"], ["\\M-W\\M^\\", "\u05dc"], ["\\M-W\\M^]", "\u05dd"], ["\\M-W\\M^^", "\u05de"], ["\\M-W\\M^_", "\u05df"], ["\\M-W\\240", "\u05e0"], ["\\M-W\\M-!", "\u05e1"], ["\\M-W\\M-\"", "\u05e2"], ["\\M-W\\M-#", "\u05e3"], ["\\M-W\\M-$", "\u05e4"], ["\\M-W\\M-%", "\u05e5"], ["\\M-W\\M-&", "\u05e6"], ["\\M-W\\M-'", "\u05e7"], ["\\M-W\\M-(", "\u05e8"], ["\\M-W\\M-)", "\u05e9"], ["\\M-W\\M-*", "\u05ea"], ["\\M-W\\M-+", "\u05eb"], ["\\M-W\\M-,", "\u05ec"], ["\\M-W\\M--", "\u05ed"], ["\\M-W\\M-.", "\u05ee"], ["\\M-W\\M-/", "\u05ef"], ["\\M-W\\M-0", "\u05f0"], ["\\M-W\\M-1", "\u05f1"], ["\\M-W\\M-2", "\u05f2"], ["\\M-W\\M-3", "\u05f3"], ["\\M-W\\M-4", "\u05f4"], ["\\M-W\\M-5", "\u05f5"], ["\\M-W\\M-6", "\u05f6"], ["\\M-W\\M-7", "\u05f7"], ["\\M-W\\M-8", "\u05f8"], ["\\M-W\\M-9", "\u05f9"], ["\\M-W\\M-:", "\u05fa"], ["\\M-W\\M-;", "\u05fb"], ["\\M-W\\M-<", "\u05fc"], ["\\M-W\\M-=", "\u05fd"], ["\\M-W\\M->", "\u05fe"], ["\\M-W\\M-?", "\u05ff"], ["\\M-X\\M^@", "\u0600"], ["\\M-X\\M^A", "\u0601"], ["\\M-X\\M^B", "\u0602"], ["\\M-X\\M^C", "\u0603"], ["\\M-X\\M^D", "\u0604"], ["\\M-X\\M^E", "\u0605"], ["\\M-X\\M^F", "\u0606"], ["\\M-X\\M^G", "\u0607"], ["\\M-X\\M^H", "\u0608"], ["\\M-X\\M^I", "\u0609"], ["\\M-X\\M^J", "\u060a"], ["\\M-X\\M^K", "\u060b"], ["\\M-X\\M^L", "\u060c"], ["\\M-X\\M^M", "\u060d"], ["\\M-X\\M^N", "\u060e"], ["\\M-X\\M^O", "\u060f"], ["\\M-X\\M^P", "\u0610"], ["\\M-X\\M^Q", "\u0611"], ["\\M-X\\M^R", "\u0612"], ["\\M-X\\M^S", "\u0613"], ["\\M-X\\M^T", "\u0614"], ["\\M-X\\M^U", "\u0615"], ["\\M-X\\M^V", "\u0616"], ["\\M-X\\M^W", "\u0617"], ["\\M-X\\M^X", "\u0618"], ["\\M-X\\M^Y", "\u0619"], ["\\M-X\\M^Z", "\u061a"], ["\\M-X\\M^[", "\u061b"], ["\\M-X\\M^\\", "\u061c"], ["\\M-X\\M^]", "\u061d"], ["\\M-X\\M^^", "\u061e"], ["\\M-X\\M^_", "\u061f"], ["\\M-X\\240", "\u0620"], ["\\M-X\\M-!", "\u0621"], ["\\M-X\\M-\"", "\u0622"], ["\\M-X\\M-#", "\u0623"], ["\\M-X\\M-$", "\u0624"], ["\\M-X\\M-%", "\u0625"], ["\\M-X\\M-&", "\u0626"], ["\\M-X\\M-'", "\u0627"], ["\\M-X\\M-(", "\u0628"], ["\\M-X\\M-)", "\u0629"], ["\\M-X\\M-*", "\u062a"], ["\\M-X\\M-+", "\u062b"], ["\\M-X\\M-,", "\u062c"], ["\\M-X\\M--", "\u062d"], ["\\M-X\\M-.", "\u062e"], ["\\M-X\\M-/", "\u062f"], ["\\M-X\\M-0", "\u0630"], ["\\M-X\\M-1", "\u0631"], ["\\M-X\\M-2", "\u0632"], ["\\M-X\\M-3", "\u0633"], ["\\M-X\\M-4", "\u0634"], ["\\M-X\\M-5", "\u0635"], ["\\M-X\\M-6", "\u0636"], ["\\M-X\\M-7", "\u0637"], ["\\M-X\\M-8", "\u0638"], ["\\M-X\\M-9", "\u0639"], ["\\M-X\\M-:", "\u063a"], ["\\M-X\\M-;", "\u063b"], ["\\M-X\\M-<", "\u063c"], ["\\M-X\\M-=", "\u063d"], ["\\M-X\\M->", "\u063e"], ["\\M-X\\M-?", "\u063f"], ["\\M-Y\\M^@", "\u0640"], ["\\M-Y\\M^A", "\u0641"], ["\\M-Y\\M^B", "\u0642"], ["\\M-Y\\M^C", "\u0643"], ["\\M-Y\\M^D", "\u0644"], ["\\M-Y\\M^E", "\u0645"], ["\\M-Y\\M^F", "\u0646"], ["\\M-Y\\M^G", "\u0647"], ["\\M-Y\\M^H", "\u0648"], ["\\M-Y\\M^I", "\u0649"], ["\\M-Y\\M^J", "\u064a"], ["\\M-Y\\M^K", "\u064b"], ["\\M-Y\\M^L", "\u064c"], ["\\M-Y\\M^M", "\u064d"], ["\\M-Y\\M^N", "\u064e"], ["\\M-Y\\M^O", "\u064f"], ["\\M-Y\\M^P", "\u0650"], ["\\M-Y\\M^Q", "\u0651"], ["\\M-Y\\M^R", "\u0652"], ["\\M-Y\\M^S", "\u0653"], ["\\M-Y\\M^T", "\u0654"], ["\\M-Y\\M^U", "\u0655"], ["\\M-Y\\M^V", "\u0656"], ["\\M-Y\\M^W", "\u0657"], ["\\M-Y\\M^X", "\u0658"], ["\\M-Y\\M^Y", "\u0659"], ["\\M-Y\\M^Z", "\u065a"], ["\\M-Y\\M^[", "\u065b"], ["\\M-Y\\M^\\", "\u065c"], ["\\M-Y\\M^]", "\u065d"], ["\\M-Y\\M^^", "\u065e"], ["\\M-Y\\M^_", "\u065f"], ["\\M-Y\\240", "\u0660"], ["\\M-Y\\M-!", "\u0661"], ["\\M-Y\\M-\"", "\u0662"], ["\\M-Y\\M-#", "\u0663"], ["\\M-Y\\M-$", "\u0664"], ["\\M-Y\\M-%", "\u0665"], ["\\M-Y\\M-&", "\u0666"], ["\\M-Y\\M-'", "\u0667"], ["\\M-Y\\M-(", "\u0668"], ["\\M-Y\\M-)", "\u0669"], ["\\M-Y\\M-*", "\u066a"], ["\\M-Y\\M-+", "\u066b"], ["\\M-Y\\M-,", "\u066c"], ["\\M-Y\\M--", "\u066d"], ["\\M-Y\\M-.", "\u066e"], ["\\M-Y\\M-/", "\u066f"], ["\\M-Y\\M-0", "\u0670"], ["\\M-Y\\M-1", "\u0671"], ["\\M-Y\\M-2", "\u0672"], ["\\M-Y\\M-3", "\u0673"], ["\\M-Y\\M-4", "\u0674"], ["\\M-Y\\M-5", "\u0675"], ["\\M-Y\\M-6", "\u0676"], ["\\M-Y\\M-7", "\u0677"], ["\\M-Y\\M-8", "\u0678"], ["\\M-Y\\M-9", "\u0679"], ["\\M-Y\\M-:", "\u067a"], ["\\M-Y\\M-;", "\u067b"], ["\\M-Y\\M-<", "\u067c"], ["\\M-Y\\M-=", "\u067d"], ["\\M-Y\\M->", "\u067e"], ["\\M-Y\\M-?", "\u067f"], ["\\M-Z\\M^@", "\u0680"], ["\\M-Z\\M^A", "\u0681"], ["\\M-Z\\M^B", "\u0682"], ["\\M-Z\\M^C", "\u0683"], ["\\M-Z\\M^D", "\u0684"], ["\\M-Z\\M^E", "\u0685"], ["\\M-Z\\M^F", "\u0686"], ["\\M-Z\\M^G", "\u0687"], ["\\M-Z\\M^H", "\u0688"], ["\\M-Z\\M^I", "\u0689"], ["\\M-Z\\M^J", "\u068a"], ["\\M-Z\\M^K", "\u068b"], ["\\M-Z\\M^L", "\u068c"], ["\\M-Z\\M^M", "\u068d"], ["\\M-Z\\M^N", "\u068e"], ["\\M-Z\\M^O", "\u068f"], ["\\M-Z\\M^P", "\u0690"], ["\\M-Z\\M^Q", "\u0691"], ["\\M-Z\\M^R", "\u0692"], ["\\M-Z\\M^S", "\u0693"], ["\\M-Z\\M^T", "\u0694"], ["\\M-Z\\M^U", "\u0695"], ["\\M-Z\\M^V", "\u0696"], ["\\M-Z\\M^W", "\u0697"], ["\\M-Z\\M^X", "\u0698"], ["\\M-Z\\M^Y", "\u0699"], ["\\M-Z\\M^Z", "\u069a"], ["\\M-Z\\M^[", "\u069b"], ["\\M-Z\\M^\\", "\u069c"], ["\\M-Z\\M^]", "\u069d"], ["\\M-Z\\M^^", "\u069e"], ["\\M-Z\\M^_", "\u069f"], ["\\M-Z\\240", "\u06a0"], ["\\M-Z\\M-!", "\u06a1"], ["\\M-Z\\M-\"", "\u06a2"], ["\\M-Z\\M-#", "\u06a3"], ["\\M-Z\\M-$", "\u06a4"], ["\\M-Z\\M-%", "\u06a5"], ["\\M-Z\\M-&", "\u06a6"], ["\\M-Z\\M-'", "\u06a7"], ["\\M-Z\\M-(", "\u06a8"], ["\\M-Z\\M-)", "\u06a9"], ["\\M-Z\\M-*", "\u06aa"], ["\\M-Z\\M-+", "\u06ab"], ["\\M-Z\\M-,", "\u06ac"], ["\\M-Z\\M--", "\u06ad"], ["\\M-Z\\M-.", "\u06ae"], ["\\M-Z\\M-/", "\u06af"], ["\\M-Z\\M-0", "\u06b0"], ["\\M-Z\\M-1", "\u06b1"], ["\\M-Z\\M-2", "\u06b2"], ["\\M-Z\\M-3", "\u06b3"], ["\\M-Z\\M-4", "\u06b4"], ["\\M-Z\\M-5", "\u06b5"], ["\\M-Z\\M-6", "\u06b6"], ["\\M-Z\\M-7", "\u06b7"], ["\\M-Z\\M-8", "\u06b8"], ["\\M-Z\\M-9", "\u06b9"], ["\\M-Z\\M-:", "\u06ba"], ["\\M-Z\\M-;", "\u06bb"], ["\\M-Z\\M-<", "\u06bc"], ["\\M-Z\\M-=", "\u06bd"], ["\\M-Z\\M->", "\u06be"], ["\\M-Z\\M-?", "\u06bf"], ["\\M-[\\M^@", "\u06c0"], ["\\M-[\\M^A", "\u06c1"], ["\\M-[\\M^B", "\u06c2"], ["\\M-[\\M^C", "\u06c3"], ["\\M-[\\M^D", "\u06c4"], ["\\M-[\\M^E", "\u06c5"], ["\\M-[\\M^F", "\u06c6"], ["\\M-[\\M^G", "\u06c7"], ["\\M-[\\M^H", "\u06c8"], ["\\M-[\\M^I", "\u06c9"], ["\\M-[\\M^J", "\u06ca"], ["\\M-[\\M^K", "\u06cb"], ["\\M-[\\M^L", "\u06cc"], ["\\M-[\\M^M", "\u06cd"], ["\\M-[\\M^N", "\u06ce"], ["\\M-[\\M^O", "\u06cf"], ["\\M-[\\M^P", "\u06d0"], ["\\M-[\\M^Q", "\u06d1"], ["\\M-[\\M^R", "\u06d2"], ["\\M-[\\M^S", "\u06d3"], ["\\M-[\\M^T", "\u06d4"], ["\\M-[\\M^U", "\u06d5"], ["\\M-[\\M^V", "\u06d6"], ["\\M-[\\M^W", "\u06d7"], ["\\M-[\\M^X", "\u06d8"], ["\\M-[\\M^Y", "\u06d9"], ["\\M-[\\M^Z", "\u06da"], ["\\M-[\\M^[", "\u06db"], ["\\M-[\\M^\\", "\u06dc"], ["\\M-[\\M^]", "\u06dd"], ["\\M-[\\M^^", "\u06de"], ["\\M-[\\M^_", "\u06df"], ["\\M-[\\240", "\u06e0"], ["\\M-[\\M-!", "\u06e1"], ["\\M-[\\M-\"", "\u06e2"], ["\\M-[\\M-#", "\u06e3"], ["\\M-[\\M-$", "\u06e4"], ["\\M-[\\M-%", "\u06e5"], ["\\M-[\\M-&", "\u06e6"], ["\\M-[\\M-'", "\u06e7"], ["\\M-[\\M-(", "\u06e8"], ["\\M-[\\M-)", "\u06e9"], ["\\M-[\\M-*", "\u06ea"], ["\\M-[\\M-+", "\u06eb"], ["\\M-[\\M-,", "\u06ec"], ["\\M-[\\M--", "\u06ed"], ["\\M-[\\M-.", "\u06ee"], ["\\M-[\\M-/", "\u06ef"], ["\\M-[\\M-0", "\u06f0"], ["\\M-[\\M-1", "\u06f1"], ["\\M-[\\M-2", "\u06f2"], ["\\M-[\\M-3", "\u06f3"], ["\\M-[\\M-4", "\u06f4"], ["\\M-[\\M-5", "\u06f5"], ["\\M-[\\M-6", "\u06f6"], ["\\M-[\\M-7", "\u06f7"], ["\\M-[\\M-8", "\u06f8"], ["\\M-[\\M-9", "\u06f9"], ["\\M-[\\M-:", "\u06fa"], ["\\M-[\\M-;", "\u06fb"], ["\\M-[\\M-<", "\u06fc"], ["\\M-[\\M-=", "\u06fd"], ["\\M-[\\M->", "\u06fe"], ["\\M-[\\M-?", "\u06ff"], ["\\M-b\\M-:\\M^@", "\u2e80"], ["\\M-b\\M-:\\M^A", "\u2e81"], ["\\M-b\\M-:\\M^B", "\u2e82"], ["\\M-b\\M-:\\M^C", "\u2e83"], ["\\M-b\\M-:\\M^D", "\u2e84"], ["\\M-b\\M-:\\M^E", "\u2e85"], ["\\M-b\\M-:\\M^F", "\u2e86"], ["\\M-b\\M-:\\M^G", "\u2e87"], ["\\M-b\\M-:\\M^H", "\u2e88"], ["\\M-b\\M-:\\M^I", "\u2e89"], ["\\M-b\\M-:\\M^J", "\u2e8a"], ["\\M-b\\M-:\\M^K", "\u2e8b"], ["\\M-b\\M-:\\M^L", "\u2e8c"], ["\\M-b\\M-:\\M^M", "\u2e8d"], ["\\M-b\\M-:\\M^N", "\u2e8e"], ["\\M-b\\M-:\\M^O", "\u2e8f"], ["\\M-b\\M-:\\M^P", "\u2e90"], ["\\M-b\\M-:\\M^Q", "\u2e91"], ["\\M-b\\M-:\\M^R", "\u2e92"], ["\\M-b\\M-:\\M^S", "\u2e93"], ["\\M-b\\M-:\\M^T", "\u2e94"], ["\\M-b\\M-:\\M^U", "\u2e95"], ["\\M-b\\M-:\\M^V", "\u2e96"], ["\\M-b\\M-:\\M^W", "\u2e97"], ["\\M-b\\M-:\\M^X", "\u2e98"], ["\\M-b\\M-:\\M^Y", "\u2e99"], ["\\M-b\\M-:\\M^Z", "\u2e9a"], ["\\M-b\\M-:\\M^[", "\u2e9b"], ["\\M-b\\M-:\\M^\\", "\u2e9c"], ["\\M-b\\M-:\\M^]", "\u2e9d"], ["\\M-b\\M-:\\M^^", "\u2e9e"], ["\\M-b\\M-:\\M^_", "\u2e9f"], ["\\M-b\\M-:\\240", "\u2ea0"], ["\\M-b\\M-:\\M-!", "\u2ea1"], ["\\M-b\\M-:\\M-\"", "\u2ea2"], ["\\M-b\\M-:\\M-#", "\u2ea3"], ["\\M-b\\M-:\\M-$", "\u2ea4"], ["\\M-b\\M-:\\M-%", "\u2ea5"], ["\\M-b\\M-:\\M-&", "\u2ea6"], ["\\M-b\\M-:\\M-'", "\u2ea7"], ["\\M-b\\M-:\\M-(", "\u2ea8"], ["\\M-b\\M-:\\M-)", "\u2ea9"], ["\\M-b\\M-:\\M-*", "\u2eaa"], ["\\M-b\\M-:\\M-+", "\u2eab"], ["\\M-b\\M-:\\M-,", "\u2eac"], ["\\M-b\\M-:\\M--", "\u2ead"], ["\\M-b\\M-:\\M-.", "\u2eae"], ["\\M-b\\M-:\\M-/", "\u2eaf"], ["\\M-b\\M-:\\M-0", "\u2eb0"], ["\\M-b\\M-:\\M-1", "\u2eb1"], ["\\M-b\\M-:\\M-2", "\u2eb2"], ["\\M-b\\M-:\\M-3", "\u2eb3"], ["\\M-b\\M-:\\M-4", "\u2eb4"], ["\\M-b\\M-:\\M-5", "\u2eb5"], ["\\M-b\\M-:\\M-6", "\u2eb6"], ["\\M-b\\M-:\\M-7", "\u2eb7"], ["\\M-b\\M-:\\M-8", "\u2eb8"], ["\\M-b\\M-:\\M-9", "\u2eb9"], ["\\M-b\\M-:\\M-:", "\u2eba"], ["\\M-b\\M-:\\M-;", "\u2ebb"], ["\\M-b\\M-:\\M-<", "\u2ebc"], ["\\M-b\\M-:\\M-=", "\u2ebd"], ["\\M-b\\M-:\\M->", "\u2ebe"], ["\\M-b\\M-:\\M-?", "\u2ebf"], ["\\M-b\\M-;\\M^@", "\u2ec0"], ["\\M-b\\M-;\\M^A", "\u2ec1"], ["\\M-b\\M-;\\M^B", "\u2ec2"], ["\\M-b\\M-;\\M^C", "\u2ec3"], ["\\M-b\\M-;\\M^D", "\u2ec4"], ["\\M-b\\M-;\\M^E", "\u2ec5"], ["\\M-b\\M-;\\M^F", "\u2ec6"], ["\\M-b\\M-;\\M^G", "\u2ec7"], ["\\M-b\\M-;\\M^H", "\u2ec8"], ["\\M-b\\M-;\\M^I", "\u2ec9"], ["\\M-b\\M-;\\M^J", "\u2eca"], ["\\M-b\\M-;\\M^K", "\u2ecb"], ["\\M-b\\M-;\\M^L", "\u2ecc"], ["\\M-b\\M-;\\M^M", "\u2ecd"], ["\\M-b\\M-;\\M^N", "\u2ece"], ["\\M-b\\M-;\\M^O", "\u2ecf"], ["\\M-b\\M-;\\M^P", "\u2ed0"], ["\\M-b\\M-;\\M^Q", "\u2ed1"], ["\\M-b\\M-;\\M^R", "\u2ed2"], ["\\M-b\\M-;\\M^S", "\u2ed3"], ["\\M-b\\M-;\\M^T", "\u2ed4"], ["\\M-b\\M-;\\M^U", "\u2ed5"], ["\\M-b\\M-;\\M^V", "\u2ed6"], ["\\M-b\\M-;\\M^W", "\u2ed7"], ["\\M-b\\M-;\\M^X", "\u2ed8"], ["\\M-b\\M-;\\M^Y", "\u2ed9"], ["\\M-b\\M-;\\M^Z", "\u2eda"], ["\\M-b\\M-;\\M^[", "\u2edb"], ["\\M-b\\M-;\\M^\\", "\u2edc"], ["\\M-b\\M-;\\M^]", "\u2edd"], ["\\M-b\\M-;\\M^^", "\u2ede"], ["\\M-b\\M-;\\M^_", "\u2edf"], ["\\M-b\\M-;\\240", "\u2ee0"], ["\\M-b\\M-;\\M-!", "\u2ee1"], ["\\M-b\\M-;\\M-\"", "\u2ee2"], ["\\M-b\\M-;\\M-#", "\u2ee3"], ["\\M-b\\M-;\\M-$", "\u2ee4"], ["\\M-b\\M-;\\M-%", "\u2ee5"], ["\\M-b\\M-;\\M-&", "\u2ee6"], ["\\M-b\\M-;\\M-'", "\u2ee7"], ["\\M-b\\M-;\\M-(", "\u2ee8"], ["\\M-b\\M-;\\M-)", "\u2ee9"], ["\\M-b\\M-;\\M-*", "\u2eea"], ["\\M-b\\M-;\\M-+", "\u2eeb"], ["\\M-b\\M-;\\M-,", "\u2eec"], ["\\M-b\\M-;\\M--", "\u2eed"], ["\\M-b\\M-;\\M-.", "\u2eee"], ["\\M-b\\M-;\\M-/", "\u2eef"], ["\\M-b\\M-;\\M-0", "\u2ef0"], ["\\M-b\\M-;\\M-1", "\u2ef1"], ["\\M-b\\M-;\\M-2", "\u2ef2"], ["\\M-b\\M-;\\M-3", "\u2ef3"], ["\\M-b\\M-;\\M-4", "\u2ef4"], ["\\M-b\\M-;\\M-5", "\u2ef5"], ["\\M-b\\M-;\\M-6", "\u2ef6"], ["\\M-b\\M-;\\M-7", "\u2ef7"], ["\\M-b\\M-;\\M-8", "\u2ef8"], ["\\M-b\\M-;\\M-9", "\u2ef9"], ["\\M-b\\M-;\\M-:", "\u2efa"], ["\\M-b\\M-;\\M-;", "\u2efb"], ["\\M-b\\M-;\\M-<", "\u2efc"], ["\\M-b\\M-;\\M-=", "\u2efd"], ["\\M-b\\M-;\\M->", "\u2efe"], ["\\M-b\\M-;\\M-?", "\u2eff"], ["\\M-c\\M^A\\M^@", "\u3040"], ["\\M-c\\M^A\\M^A", "\u3041"], ["\\M-c\\M^A\\M^B", "\u3042"], ["\\M-c\\M^A\\M^C", "\u3043"], ["\\M-c\\M^A\\M^D", "\u3044"], ["\\M-c\\M^A\\M^E", "\u3045"], ["\\M-c\\M^A\\M^F", "\u3046"], ["\\M-c\\M^A\\M^G", "\u3047"], ["\\M-c\\M^A\\M^H", "\u3048"], ["\\M-c\\M^A\\M^I", "\u3049"], ["\\M-c\\M^A\\M^J", "\u304a"], ["\\M-c\\M^A\\M^K", "\u304b"], ["\\M-c\\M^A\\M^L", "\u304c"], ["\\M-c\\M^A\\M^M", "\u304d"], ["\\M-c\\M^A\\M^N", "\u304e"], ["\\M-c\\M^A\\M^O", "\u304f"], ["\\M-c\\M^A\\M^P", "\u3050"], ["\\M-c\\M^A\\M^Q", "\u3051"], ["\\M-c\\M^A\\M^R", "\u3052"], ["\\M-c\\M^A\\M^S", "\u3053"], ["\\M-c\\M^A\\M^T", "\u3054"], ["\\M-c\\M^A\\M^U", "\u3055"], ["\\M-c\\M^A\\M^V", "\u3056"], ["\\M-c\\M^A\\M^W", "\u3057"], ["\\M-c\\M^A\\M^X", "\u3058"], ["\\M-c\\M^A\\M^Y", "\u3059"], ["\\M-c\\M^A\\M^Z", "\u305a"], ["\\M-c\\M^A\\M^[", "\u305b"], ["\\M-c\\M^A\\M^\\", "\u305c"], ["\\M-c\\M^A\\M^]", "\u305d"], ["\\M-c\\M^A\\M^^", "\u305e"], ["\\M-c\\M^A\\M^_", "\u305f"], ["\\M-c\\M^A\\240", "\u3060"], ["\\M-c\\M^A\\M-!", "\u3061"], ["\\M-c\\M^A\\M-\"", "\u3062"], ["\\M-c\\M^A\\M-#", "\u3063"], ["\\M-c\\M^A\\M-$", "\u3064"], ["\\M-c\\M^A\\M-%", "\u3065"], ["\\M-c\\M^A\\M-&", "\u3066"], ["\\M-c\\M^A\\M-'", "\u3067"], ["\\M-c\\M^A\\M-(", "\u3068"], ["\\M-c\\M^A\\M-)", "\u3069"], ["\\M-c\\M^A\\M-*", "\u306a"], ["\\M-c\\M^A\\M-+", "\u306b"], ["\\M-c\\M^A\\M-,", "\u306c"], ["\\M-c\\M^A\\M--", "\u306d"], ["\\M-c\\M^A\\M-.", "\u306e"], ["\\M-c\\M^A\\M-/", "\u306f"], ["\\M-c\\M^A\\M-0", "\u3070"], ["\\M-c\\M^A\\M-1", "\u3071"], ["\\M-c\\M^A\\M-2", "\u3072"], ["\\M-c\\M^A\\M-3", "\u3073"], ["\\M-c\\M^A\\M-4", "\u3074"], ["\\M-c\\M^A\\M-5", "\u3075"], ["\\M-c\\M^A\\M-6", "\u3076"], ["\\M-c\\M^A\\M-7", "\u3077"], ["\\M-c\\M^A\\M-8", "\u3078"], ["\\M-c\\M^A\\M-9", "\u3079"], ["\\M-c\\M^A\\M-:", "\u307a"], ["\\M-c\\M^A\\M-;", "\u307b"], ["\\M-c\\M^A\\M-<", "\u307c"], ["\\M-c\\M^A\\M-=", "\u307d"], ["\\M-c\\M^A\\M->", "\u307e"], ["\\M-c\\M^A\\M-?", "\u307f"], ["\\M-c\\M^B\\M^@", "\u3080"], ["\\M-c\\M^B\\M^A", "\u3081"], ["\\M-c\\M^B\\M^B", "\u3082"], ["\\M-c\\M^B\\M^C", "\u3083"], ["\\M-c\\M^B\\M^D", "\u3084"], ["\\M-c\\M^B\\M^E", "\u3085"], ["\\M-c\\M^B\\M^F", "\u3086"], ["\\M-c\\M^B\\M^G", "\u3087"], ["\\M-c\\M^B\\M^H", "\u3088"], ["\\M-c\\M^B\\M^I", "\u3089"], ["\\M-c\\M^B\\M^J", "\u308a"], ["\\M-c\\M^B\\M^K", "\u308b"], ["\\M-c\\M^B\\M^L", "\u308c"], ["\\M-c\\M^B\\M^M", "\u308d"], ["\\M-c\\M^B\\M^N", "\u308e"], ["\\M-c\\M^B\\M^O", "\u308f"], ["\\M-c\\M^B\\M^P", "\u3090"], ["\\M-c\\M^B\\M^Q", "\u3091"], ["\\M-c\\M^B\\M^R", "\u3092"], ["\\M-c\\M^B\\M^S", "\u3093"], ["\\M-c\\M^B\\M^T", "\u3094"], ["\\M-c\\M^B\\M^U", "\u3095"], ["\\M-c\\M^B\\M^V", "\u3096"], ["\\M-c\\M^B\\M^W", "\u3097"], ["\\M-c\\M^B\\M^X", "\u3098"], ["\\M-c\\M^B\\M^Y", "\u3099"], ["\\M-c\\M^B\\M^Z", "\u309a"], ["\\M-c\\M^B\\M^[", "\u309b"], ["\\M-c\\M^B\\M^\\", "\u309c"], ["\\M-c\\M^B\\M^]", "\u309d"], ["\\M-c\\M^B\\M^^", "\u309e"], ["\\M-c\\M^B\\M^_", "\u309f"], ["\\M-c\\M^B\\240", "\u30a0"], ["\\M-c\\M^B\\M-!", "\u30a1"], ["\\M-c\\M^B\\M-\"", "\u30a2"], ["\\M-c\\M^B\\M-#", "\u30a3"], ["\\M-c\\M^B\\M-$", "\u30a4"], ["\\M-c\\M^B\\M-%", "\u30a5"], ["\\M-c\\M^B\\M-&", "\u30a6"], ["\\M-c\\M^B\\M-'", "\u30a7"], ["\\M-c\\M^B\\M-(", "\u30a8"], ["\\M-c\\M^B\\M-)", "\u30a9"], ["\\M-c\\M^B\\M-*", "\u30aa"], ["\\M-c\\M^B\\M-+", "\u30ab"], ["\\M-c\\M^B\\M-,", "\u30ac"], ["\\M-c\\M^B\\M--", "\u30ad"], ["\\M-c\\M^B\\M-.", "\u30ae"], ["\\M-c\\M^B\\M-/", "\u30af"], ["\\M-c\\M^B\\M-0", "\u30b0"], ["\\M-c\\M^B\\M-1", "\u30b1"], ["\\M-c\\M^B\\M-2", "\u30b2"], ["\\M-c\\M^B\\M-3", "\u30b3"], ["\\M-c\\M^B\\M-4", "\u30b4"], ["\\M-c\\M^B\\M-5", "\u30b5"], ["\\M-c\\M^B\\M-6", "\u30b6"], ["\\M-c\\M^B\\M-7", "\u30b7"], ["\\M-c\\M^B\\M-8", "\u30b8"], ["\\M-c\\M^B\\M-9", "\u30b9"], ["\\M-c\\M^B\\M-:", "\u30ba"], ["\\M-c\\M^B\\M-;", "\u30bb"], ["\\M-c\\M^B\\M-<", "\u30bc"], ["\\M-c\\M^B\\M-=", "\u30bd"], ["\\M-c\\M^B\\M->", "\u30be"], ["\\M-c\\M^B\\M-?", "\u30bf"], ["\\M-c\\M^C\\M^@", "\u30c0"], ["\\M-c\\M^C\\M^A", "\u30c1"], ["\\M-c\\M^C\\M^B", "\u30c2"], ["\\M-c\\M^C\\M^C", "\u30c3"], ["\\M-c\\M^C\\M^D", "\u30c4"], ["\\M-c\\M^C\\M^E", "\u30c5"], ["\\M-c\\M^C\\M^F", "\u30c6"], ["\\M-c\\M^C\\M^G", "\u30c7"], ["\\M-c\\M^C\\M^H", "\u30c8"], ["\\M-c\\M^C\\M^I", "\u30c9"], ["\\M-c\\M^C\\M^J", "\u30ca"], ["\\M-c\\M^C\\M^K", "\u30cb"], ["\\M-c\\M^C\\M^L", "\u30cc"], ["\\M-c\\M^C\\M^M", "\u30cd"], ["\\M-c\\M^C\\M^N", "\u30ce"], ["\\M-c\\M^C\\M^O", "\u30cf"], ["\\M-c\\M^C\\M^P", "\u30d0"], ["\\M-c\\M^C\\M^Q", "\u30d1"], ["\\M-c\\M^C\\M^R", "\u30d2"], ["\\M-c\\M^C\\M^S", "\u30d3"], ["\\M-c\\M^C\\M^T", "\u30d4"], ["\\M-c\\M^C\\M^U", "\u30d5"], ["\\M-c\\M^C\\M^V", "\u30d6"], ["\\M-c\\M^C\\M^W", "\u30d7"], ["\\M-c\\M^C\\M^X", "\u30d8"], ["\\M-c\\M^C\\M^Y", "\u30d9"], ["\\M-c\\M^C\\M^Z", "\u30da"], ["\\M-c\\M^C\\M^[", "\u30db"], ["\\M-c\\M^C\\M^\\", "\u30dc"], ["\\M-c\\M^C\\M^]", "\u30dd"], ["\\M-c\\M^C\\M^^", "\u30de"], ["\\M-c\\M^C\\M^_", "\u30df"], ["\\M-c\\M^C\\240", "\u30e0"], ["\\M-c\\M^C\\M-!", "\u30e1"], ["\\M-c\\M^C\\M-\"", "\u30e2"], ["\\M-c\\M^C\\M-#", "\u30e3"], ["\\M-c\\M^C\\M-$", "\u30e4"], ["\\M-c\\M^C\\M-%", "\u30e5"], ["\\M-c\\M^C\\M-&", "\u30e6"], ["\\M-c\\M^C\\M-'", "\u30e7"], ["\\M-c\\M^C\\M-(", "\u30e8"], ["\\M-c\\M^C\\M-)", "\u30e9"], ["\\M-c\\M^C\\M-*", "\u30ea"], ["\\M-c\\M^C\\M-+", "\u30eb"], ["\\M-c\\M^C\\M-,", "\u30ec"], ["\\M-c\\M^C\\M--", "\u30ed"], ["\\M-c\\M^C\\M-.", "\u30ee"], ["\\M-c\\M^C\\M-/", "\u30ef"], ["\\M-c\\M^C\\M-0", "\u30f0"], ["\\M-c\\M^C\\M-1", "\u30f1"], ["\\M-c\\M^C\\M-2", "\u30f2"], ["\\M-c\\M^C\\M-3", "\u30f3"], ["\\M-c\\M^C\\M-4", "\u30f4"], ["\\M-c\\M^C\\M-5", "\u30f5"], ["\\M-c\\M^C\\M-6", "\u30f6"], ["\\M-c\\M^C\\M-7", "\u30f7"], ["\\M-c\\M^C\\M-8", "\u30f8"], ["\\M-c\\M^C\\M-9", "\u30f9"], ["\\M-c\\M^C\\M-:", "\u30fa"], ["\\M-c\\M^C\\M-;", "\u30fb"], ["\\M-c\\M^C\\M-<", "\u30fc"], ["\\M-c\\M^C\\M-=", "\u30fd"], ["\\M-c\\M^C\\M->", "\u30fe"], ["\\M-c\\M^C\\M-?", "\u30ff"], ["foo\\040bar", "foo bar"], ["foo\\^Jbar", "foo\nbar"], ["$bar\\040=\\040'baz';", "$bar = 'baz';"], ["$foo\\040=\\040\"\\\\x20\\\\\\\\x20\\\\\\\\\\\\x20\\\\\\\\\\\\\\\\x20\"", "$foo = \"\\x20\\\\x20\\\\\\x20\\\\\\\\x20\""], ["$foo\\040=\\040function($bar)\\040use($baz)\\040{\\^J\\^Ireturn\\040$baz->getFoo()\\^J};", "$foo = function($bar) use($baz) {\n\treturn $baz->getFoo()\n};"], ["", ""]]PK!amm&psysh/test/fixtures/project/.psysh.phpnuIw false, 'usePcntl' => true, 'requireSemicolons' => true, 'useUnicode' => false, ); PK!psysh/test/fixtures/empty.phpnuIwgetFoo()\n};' ] RANGES = { # All valid codepoints in the BMP 'bmp': chain(range(0x0000, 0xD800), range(0xE000, 0xFFFF)), # Smaller set of pertinent? codepoints inside BMP # see: http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane 'small': chain( # latin blocks range(0x0000, 0x0250), # Greek, Cyrillic range(0x0370, 0x0530), # Hebrew, Arabic range(0x590, 0x0700), # CJK radicals range(0x2E80, 0x2F00), # Hiragana, Katakana range(0x3040, 0x3100) ) } if __name__ == '__main__': argp = argparse.ArgumentParser( description='Generates test data for Psy\\Test\\Util\\StrTest') argp.add_argument('-f', '--format-output', action='store_true', help='Indent JSON output to ease debugging') argp.add_argument('-a', '--all', action='store_true', help="""Generates test data for all codepoints of the BMP. (same as --range=bmp). WARNING: You will need quite a lot of RAM to run the testsuite ! """) argp.add_argument('-r', '--range', help="""Choose the range of codepoints used to generate test data.""", choices=list(RANGES.keys()), default='small') argp.add_argument('-o', '--output-file', help="""Write test data to OUTPUT_FILE (defaults to PSYSH_DIR/test/fixtures)""") args = argp.parse_args() cp_range = RANGES['bmp'] if args.all else RANGES[args.range] indent = 2 if args.format_output else None if args.output_file: OUTPUT_FILE = abspath(expanduser(args.output_file)) fixtures = [] # use SMALL_RANGE by default, it should be enough. # use BMP_RANGE for a more complete smoke test for codepoint in cp_range: char = chr(codepoint) encoded = vis(char, VIS_WHITE) decoded = unvis(encoded) fixtures.append((encoded, decoded)) # Add our own custom fixtures at the end, # since they would fail anyway if one of the previous did. for fixture in CUSTOM_FIXTURES: encoded = vis(fixture, VIS_WHITE) decoded = unvis(encoded) fixtures.append((encoded, decoded)) with open(OUTPUT_FILE, 'w') as fp: # dump as json to avoid backslashin and quotin nightmare # between php and python json.dump(fixtures, fp, indent=indent) sys.exit(0) PK!d d psysh/test/tools/vis.pynuȯ""" vis.py ====== Ctypes based module to access libbsd's strvis & strunvis functions. The `vis` function is the equivalent of strvis. The `unvis` function is the equivalent of strunvis. All functions accept unicode string as input and return a unicode string. Constants: ---------- * to select alternate encoding format `VIS_OCTAL`: use octal \ddd format `VIS_CSTYLE`: use \[nrft0..] where appropiate * to alter set of characters encoded (default is to encode all non-graphic except space, tab, and newline). `VIS_SP`: also encode space `VIS_TAB`: also encode tab `VIS_NL`: also encode newline `VIS_WHITE`: same as (VIS_SP | VIS_TAB | VIS_NL) `VIS_SAFE`: only encode "unsafe" characters * other `VIS_NOSLASH`: inhibit printing '\' `VIS_HTTP1808`: http-style escape % hex hex `VIS_HTTPSTYLE`: http-style escape % hex hex `VIS_MIMESTYLE`: mime-style escape = HEX HEX `VIS_HTTP1866`: http-style &#num; or &string; `VIS_NOESCAPE`: don't decode `\' `VIS_GLOB`: encode glob(3) magic characters :Authors: - ju1ius (http://github.com/ju1ius) :Version: 1 :Date: 2014-01-05 """ from ctypes import CDLL, c_char_p, c_int from ctypes.util import find_library __all__ = [ 'vis', 'unvis', 'VIS_OCTAL', 'VIS_CSTYLE', 'VIS_SP', 'VIS_TAB', 'VIS_NL', 'VIS_WHITE', 'VIS_SAFE', 'VIS_NOSLASH', 'VIS_HTTP1808', 'VIS_HTTPSTYLE', 'VIS_MIMESTYLE', 'VIS_HTTP1866', 'VIS_NOESCAPE', 'VIS_GLOB' ] ############################################################# # Constants from bsd/vis.h ############################################################# #to select alternate encoding format VIS_OCTAL = 0x0001 VIS_CSTYLE = 0x0002 # to alter set of characters encoded # (default is to encode all non-graphic except space, tab, and newline). VIS_SP = 0x0004 VIS_TAB = 0x0008 VIS_NL = 0x0010 VIS_WHITE = VIS_SP | VIS_TAB | VIS_NL VIS_SAFE = 0x0020 # other VIS_NOSLASH = 0x0040 VIS_HTTP1808 = 0x0080 VIS_HTTPSTYLE = 0x0080 VIS_MIMESTYLE = 0x0100 VIS_HTTP1866 = 0x0200 VIS_NOESCAPE = 0x0400 VIS_GLOB = 0x1000 ############################################################# # Import libbsd/vis functions ############################################################# _libbsd = CDLL(find_library('bsd')) _strvis = _libbsd.strvis _strvis.argtypes = [c_char_p, c_char_p, c_int] _strvis.restype = c_int _strunvis = _libbsd.strunvis _strvis.argtypes = [c_char_p, c_char_p] _strvis.restype = c_int def vis(src, flags=VIS_WHITE): """ Encodes the string `src` into libbsd's vis encoding. `flags` must be one of the VIS_* constants C definition: int strvis(char *dst, char *src, int flags); """ src = bytes(src, 'utf-8') dst_p = c_char_p(bytes(len(src) * 4)) src_p = c_char_p(src) flags = c_int(flags) bytes_written = _strvis(dst_p, src_p, flags) if -1 == bytes_written: raise RuntimeError('vis failed to encode string "{}"'.format(src)) return dst_p.value.decode('utf-8') def unvis(src): """ Decodes a string encoded by vis. C definition: int strunvis(char *dst, char *src); """ src = bytes(src, 'utf-8') dst_p = c_char_p(bytes(len(src))) src_p = c_char_p(src) bytes_written = _strunvis(dst_p, src_p) if -1 == bytes_written: raise RuntimeError('unvis failed to decode string "{}"'.format(src)) return dst_p.value.decode('utf-8') PK!0 - - )psysh/test/Command/ThrowUpCommandTest.phpnuIwgetMockBuilder('Psy\\Shell') ->setMethods(['hasCode', 'addCode']) ->getMock(); $shell->expects($this->once())->method('hasCode')->willReturn($hasCode); $shell->expects($this->once()) ->method('addCode') ->with($this->equalTo($expect), $this->equalTo($addSilent)); $command = new ThrowUpCommand(); $command->setApplication($shell); $tester = new CommandTester($command); $tester->execute($args); $this->assertEquals('', $tester->getDisplay()); } public function executeThis() { $throw = 'throw \Psy\Exception\ThrowUpException::fromThrowable'; return [ [[], false, $throw . '($_e);'], [['exception' => '$ex'], false, $throw . '($ex);'], [['exception' => 'getException()'], false, $throw . '(getException());'], [['exception' => 'new \\Exception("WAT")'], false, $throw . '(new \\Exception("WAT"));'], [['exception' => '\'some string\''], false, $throw . '(new \\Exception(\'some string\'));'], [['exception' => '"WHEEEEEEE!"'], false, $throw . '(new \\Exception("WHEEEEEEE!"));'], // Everything should work with or without semicolons. [['exception' => '$ex;'], false, $throw . '($ex);'], [['exception' => '"WHEEEEEEE!";'], false, $throw . '(new \\Exception("WHEEEEEEE!"));'], // Don't add as silent code if we've already got code. [[], true, $throw . '($_e);', false], [['exception' => 'getException()'], true, $throw . '(getException());', false], [['exception' => '\'some string\''], true, $throw . '(new \\Exception(\'some string\'));', false], ]; } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage No idea how to throw this */ public function testMultipleArgsThrowsException() { $command = new ThrowUpCommand(); $command->setApplication(new Shell()); $tester = new CommandTester($command); $tester->execute(['exception' => 'foo(); bar()']); } /** * @expectedException \PhpParser\Error * @expectedExceptionMessage Syntax error, unexpected ')' on line 1 */ public function testParseErrorThrowsException() { $command = new ThrowUpCommand(); $command->setApplication(new Shell()); $tester = new CommandTester($command); $tester->execute(['exception' => 'foo)']); } } PK!dRZ6psysh/test/Command/TimeitCommand/TimeitVisitorTest.phpnuIwtraverser = new NodeTraverser(); $this->traverser->addVisitor(new TimeitVisitor()); } /** * @dataProvider codez */ public function testProcess($from, $to) { $this->assertProcessesAs($from, $to); } public function codez() { $start = '\Psy\Command\TimeitCommand::markStart'; $end = '\Psy\Command\TimeitCommand::markEnd'; $noReturn = 'new \Psy\CodeCleaner\NoReturnValue()'; return [ ['', "$end($start());"], // heh ['a()', "$start(); $end(a());"], ['$b()', "$start(); $end(\$b());"], ['$c->d()', "$start(); $end(\$c->d());"], ['e(); f()', "$start(); e(); $end(f());"], ['function g() { return 1; }', "$start(); function g() {return 1;} $end($noReturn);"], ['return 1', "$start(); return $end(1);"], ['return 1; 2', "$start(); return $end(1); $end(2);"], ['return 1; function h() {}', "$start(); return $end(1); function h() {} $end($noReturn);"], ]; } } PK!]K&psysh/test/Command/ExitCommandTest.phpnuIwexecute([]); } } PK!U' ' psysh/test/ConfigurationTest.phpnuIw $configFile ?: __DIR__ . '/fixtures/empty.php', ]); } public function testDefaults() { $config = $this->getConfig(); $this->assertSame(\function_exists('readline'), $config->hasReadline()); $this->assertSame(\function_exists('readline'), $config->useReadline()); $this->assertSame(\function_exists('pcntl_signal'), $config->hasPcntl()); $this->assertSame(\function_exists('pcntl_signal'), $config->usePcntl()); $this->assertFalse($config->requireSemicolons()); $this->assertSame(Configuration::COLOR_MODE_AUTO, $config->colorMode()); $this->assertNull($config->getStartupMessage()); } public function testGettersAndSetters() { $config = $this->getConfig(); $this->assertNull($config->getDataDir()); $config->setDataDir('wheee'); $this->assertSame('wheee', $config->getDataDir()); $this->assertNull($config->getConfigDir()); $config->setConfigDir('wheee'); $this->assertSame('wheee', $config->getConfigDir()); } /** * @dataProvider directories */ public function testFilesAndDirectories($home, $configFile, $historyFile, $manualDbFile) { $oldHome = \getenv('HOME'); \putenv("HOME=$home"); $config = new Configuration(); $this->assertSame(\realpath($configFile), \realpath($config->getConfigFile())); $this->assertSame(\realpath($historyFile), \realpath($config->getHistoryFile())); $this->assertSame(\realpath($manualDbFile), \realpath($config->getManualDbFile())); \putenv("HOME=$oldHome"); } public function directories() { $base = \realpath(__DIR__ . '/fixtures'); return [ [ $base . '/default', $base . '/default/.config/psysh/config.php', $base . '/default/.config/psysh/psysh_history', $base . '/default/.local/share/psysh/php_manual.sqlite', ], [ $base . '/legacy', $base . '/legacy/.psysh/rc.php', $base . '/legacy/.psysh/history', $base . '/legacy/.psysh/php_manual.sqlite', ], [ $base . '/mixed', $base . '/mixed/.psysh/config.php', $base . '/mixed/.psysh/psysh_history', null, ], ]; } public function testLoadConfig() { $config = $this->getConfig(); $cleaner = new CodeCleaner(); $pager = new PassthruPager(new ConsoleOutput()); $config->loadConfig([ 'useReadline' => false, 'usePcntl' => false, 'codeCleaner' => $cleaner, 'pager' => $pager, 'requireSemicolons' => true, 'errorLoggingLevel' => E_ERROR | E_WARNING, 'colorMode' => Configuration::COLOR_MODE_FORCED, 'startupMessage' => 'Psysh is awesome!', ]); $this->assertFalse($config->useReadline()); $this->assertFalse($config->usePcntl()); $this->assertSame($cleaner, $config->getCodeCleaner()); $this->assertSame($pager, $config->getPager()); $this->assertTrue($config->requireSemicolons()); $this->assertSame(E_ERROR | E_WARNING, $config->errorLoggingLevel()); $this->assertSame(Configuration::COLOR_MODE_FORCED, $config->colorMode()); $this->assertSame('Psysh is awesome!', $config->getStartupMessage()); } public function testLoadConfigFile() { $config = $this->getConfig(__DIR__ . '/fixtures/config.php'); $runtimeDir = $this->joinPath(\realpath(\sys_get_temp_dir()), 'psysh_test', 'withconfig', 'temp'); $this->assertStringStartsWith($runtimeDir, \realpath($config->getTempFile('foo', 123))); $this->assertStringStartsWith($runtimeDir, \realpath(\dirname($config->getPipe('pipe', 123)))); $this->assertStringStartsWith($runtimeDir, \realpath($config->getRuntimeDir())); $this->assertSame(\function_exists('readline'), $config->useReadline()); $this->assertFalse($config->usePcntl()); $this->assertSame(E_ALL & ~E_NOTICE, $config->errorLoggingLevel()); } public function testLoadLocalConfigFile() { $oldPwd = \getcwd(); \chdir(\realpath(__DIR__ . '/fixtures/project/')); $config = new Configuration(); // When no configuration file is specified local project config is merged $this->assertTrue($config->requireSemicolons()); $this->assertFalse($config->useUnicode()); $config = new Configuration(['configFile' => __DIR__ . '/fixtures/config.php']); // Defining a configuration file skips loading local project config $this->assertFalse($config->requireSemicolons()); $this->assertTrue($config->useUnicode()); \chdir($oldPwd); } /** * @expectedException \Psy\Exception\DeprecatedException */ public function testBaseDirConfigIsDeprecated() { $config = new Configuration(['baseDir' => 'fake']); } private function joinPath() { return \implode(DIRECTORY_SEPARATOR, \func_get_args()); } public function testConfigIncludes() { $config = new Configuration([ 'defaultIncludes' => ['/file.php'], 'configFile' => __DIR__ . '/fixtures/empty.php', ]); $includes = $config->getDefaultIncludes(); $this->assertCount(1, $includes); $this->assertSame('/file.php', $includes[0]); } public function testGetOutput() { $config = $this->getConfig(); $output = $config->getOutput(); $this->assertInstanceOf('Psy\Output\ShellOutput', $output); } public function getOutputDecoratedProvider() { return [ 'auto' => [ null, Configuration::COLOR_MODE_AUTO, ], 'forced' => [ true, Configuration::COLOR_MODE_FORCED, ], 'disabled' => [ false, Configuration::COLOR_MODE_DISABLED, ], ]; } /** @dataProvider getOutputDecoratedProvider */ public function testGetOutputDecorated($expectation, $colorMode) { $config = $this->getConfig(); $config->setColorMode($colorMode); $this->assertSame($expectation, $config->getOutputDecorated()); } public function setColorModeValidProvider() { return [ 'auto' => [Configuration::COLOR_MODE_AUTO], 'forced' => [Configuration::COLOR_MODE_FORCED], 'disabled' => [Configuration::COLOR_MODE_DISABLED], ]; } /** @dataProvider setColorModeValidProvider */ public function testSetColorModeValid($colorMode) { $config = $this->getConfig(); $config->setColorMode($colorMode); $this->assertSame($colorMode, $config->colorMode()); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage invalid color mode: some invalid mode */ public function testSetColorModeInvalid() { $config = $this->getConfig(); $config->setColorMode('some invalid mode'); } public function testSetCheckerValid() { $config = $this->getConfig(); $checker = new GitHubChecker(); $config->setChecker($checker); $this->assertSame($checker, $config->getChecker()); } } PK!c88-psysh/test/VersionUpdater/NoopCheckerTest.phpnuIwassertTrue($checker->isLatest()); $this->assertEquals(Shell::VERSION, $checker->getLatest()); } } PK!S  /psysh/test/VersionUpdater/GitHubCheckerTest.phpnuIwgetMockBuilder('Psy\\VersionUpdater\\GitHubChecker') ->setMethods(['fetchLatestRelease']) ->getMock(); $checker->expects($this->once())->method('fetchLatestRelease')->willReturn($input); $checker->isLatest(); } /** * @dataProvider jsonResults * * @param bool $assertion * @param mixed $input */ public function testDataSetResults($assertion, $input) { $checker = $this->getMockBuilder('Psy\\VersionUpdater\\GitHubChecker') ->setMethods(['fetchLatestRelease']) ->getMock(); $checker->expects($this->once())->method('fetchLatestRelease')->willReturn($input); $this->assertSame($assertion, $checker->isLatest()); } /** * @return array */ public function jsonResults() { return [ [false, \json_decode('{"tag_name":"v9.0.0"}')], [true, \json_decode('{"tag_name":"v' . Shell::VERSION . '"}')], [true, \json_decode('{"tag_name":"v0.0.1"}')], [true, \json_decode('{"tag_name":"v0.4.1-alpha"}')], [true, \json_decode('{"tag_name":"v0.4.2-beta3"}')], [true, \json_decode('{"tag_name":"v0.0.1"}')], [true, \json_decode('{"tag_name":""}')], ]; } /** * @return array */ public function malformedResults() { return [ [null], [false], [true], [\json_decode('{"foo":"bar"}')], [\json_decode('{}')], [\json_decode('[]')], [[]], [\json_decode('{"tag_name":false"}')], [\json_decode('{"tag_name":true"}')], ]; } } PK!,4 psysh/test/ParserTestCase.phpnuIwtraverser = null; $this->parser = null; $this->printer = null; } protected function parse($code, $prefix = 'getParser()->parse($code); } catch (\PhpParser\Error $e) { if (!$this->parseErrorIsEOF($e)) { throw ParseErrorException::fromParseError($e); } try { // Unexpected EOF, try again with an implicit semicolon return $this->getParser()->parse($code . ';'); } catch (\PhpParser\Error $e) { return false; } } } protected function traverse(array $stmts) { if (!isset($this->traverser)) { throw new \RuntimeException('Test cases must provide a traverser'); } return $this->traverser->traverse($stmts); } protected function prettyPrint(array $stmts) { return $this->getPrinter()->prettyPrint($stmts); } protected function assertProcessesAs($from, $to) { $stmts = $this->parse($from); $stmts = $this->traverse($stmts); $toStmts = $this->parse($to); $this->assertSame($this->prettyPrint($toStmts), $this->prettyPrint($stmts)); } private function getParser() { if (!isset($this->parser)) { $parserFactory = new ParserFactory(); $this->parser = $parserFactory->createParser(); } return $this->parser; } private function getPrinter() { if (!isset($this->printer)) { $this->printer = new Printer(); } return $this->printer; } private function parseErrorIsEOF(\PhpParser\Error $e) { $msg = $e->getRawMessage(); return ($msg === 'Unexpected token EOF') || (\strpos($msg, 'Syntax error, unexpected EOF') !== false); } } PK!9ڴ psysh/test/Util/DocblockTest.phpnuIwgetMockBuilder('ReflectionClass') ->disableOriginalConstructor() ->getMock(); $reflector->expects($this->once()) ->method('getDocComment') ->will($this->returnValue($comment)); $docblock = new Docblock($reflector); $this->assertSame($body, $docblock->desc); foreach ($tags as $tag => $value) { $this->assertTrue($docblock->hasTag($tag)); $this->assertEquals($value, $docblock->tag($tag)); } } public function comments() { if (\defined('HHVM_VERSION')) { $this->markTestSkipped('We have issues with PHPUnit mocks on HHVM.'); } return [ ['', '', []], [ '/** * This is a docblock * * @throws \Exception with a description */', 'This is a docblock', [ 'throws' => [['type' => '\Exception', 'desc' => 'with a description']], ], ], [ '/** * This is a slightly longer docblock * * @param int $foo Is a Foo * @param string $bar With some sort of description * @param \ClassName $baz is cool too * * @return int At least it isn\'t a string */', 'This is a slightly longer docblock', [ 'param' => [ ['type' => 'int', 'desc' => 'Is a Foo', 'var' => '$foo'], ['type' => 'string', 'desc' => 'With some sort of description', 'var' => '$bar'], ['type' => '\ClassName', 'desc' => 'is cool too', 'var' => '$baz'], ], 'return' => [ ['type' => 'int', 'desc' => 'At least it isn\'t a string'], ], ], ], [ '/** * This is a docblock! * * It spans lines, too! * * @tagname plus a description * * @return */', "This is a docblock!\n\nIt spans lines, too!", [ 'tagname' => ['plus a description'], ], ], ]; } } PK!Spsysh/test/Util/MirrorTest.phpnuIwassertInstanceOf('ReflectionFunction', $refl); $refl = Mirror::get('Psy\Test\Util\MirrorTest'); $this->assertInstanceOf('ReflectionClass', $refl); $refl = Mirror::get($this); $this->assertInstanceOf('ReflectionObject', $refl); $refl = Mirror::get($this, 'FOO'); if (\version_compare(PHP_VERSION, '7.1.0', '>=')) { $this->assertInstanceOf('ReflectionClassConstant', $refl); } else { $this->assertInstanceOf('Psy\Reflection\ReflectionClassConstant', $refl); } $refl = Mirror::get('PHP_VERSION'); $this->assertInstanceOf('Psy\Reflection\ReflectionConstant_', $refl); $refl = Mirror::get($this, 'bar'); $this->assertInstanceOf('ReflectionProperty', $refl); $refl = Mirror::get($this, 'baz'); $this->assertInstanceOf('ReflectionProperty', $refl); $refl = Mirror::get($this, 'aPublicMethod'); $this->assertInstanceOf('ReflectionMethod', $refl); $refl = Mirror::get($this, 'baz', Mirror::STATIC_PROPERTY); $this->assertInstanceOf('ReflectionProperty', $refl); } /** * @expectedException \RuntimeException */ public function testMirrorThrowsExceptions() { Mirror::get($this, 'notAMethod'); } /** * @expectedException \InvalidArgumentException * @dataProvider invalidArguments */ public function testMirrorThrowsInvalidArgumentExceptions($value) { Mirror::get($value); } public function invalidArguments() { return [ ['not_a_function_or_class'], [[]], [1], ]; } } PK!1eپpsysh/test/Util/StrTest.phpnuIwassertSame($expected, Str::unvis($input)); } public function unvisProvider() { //return require_once(__DIR__.'/../fixtures/unvis_fixtures.php'); return \json_decode(\file_get_contents(__DIR__ . '/../fixtures/unvis_fixtures.json')); } } PK!RS$$psysh/test/ContextTest.phpnuIwassertTrue(true); } public function testGetAll() { $this->assertTrue(true); } public function testGetSpecialVariables() { $context = new Context(); $this->assertNull($context->get('_')); $this->assertNull($context->getReturnValue()); $this->assertEquals(['_' => null], $context->getAll()); $e = new \Exception('eeeeeee'); $obj = new \StdClass(); $context->setLastException($e); $context->setLastStdout('out'); $context->setBoundObject($obj); $context->setCommandScopeVariables([ '__function' => 'function', '__method' => 'method', '__class' => 'class', '__namespace' => 'namespace', '__file' => 'file', '__line' => 'line', '__dir' => 'dir', ]); $expected = [ '_' => null, '_e' => $e, '__out' => 'out', 'this' => $obj, '__function' => 'function', '__method' => 'method', '__class' => 'class', '__namespace' => 'namespace', '__file' => 'file', '__line' => 'line', '__dir' => 'dir', ]; $this->assertEquals($expected, $context->getAll()); } public function testSetAll() { $context = new Context(); $baz = new \StdClass(); $vars = [ 'foo' => 'Foo', 'bar' => 123, 'baz' => $baz, '_' => 'fail', '_e' => 'fail', '__out' => 'fail', 'this' => 'fail', '__psysh__' => 'fail', '__function' => 'fail', '__method' => 'fail', '__class' => 'fail', '__namespace' => 'fail', '__file' => 'fail', '__line' => 'fail', '__dir' => 'fail', ]; $context->setAll($vars); $this->assertEquals('Foo', $context->get('foo')); $this->assertEquals(123, $context->get('bar')); $this->assertSame($baz, $context->get('baz')); $this->assertEquals(['foo' => 'Foo', 'bar' => 123, 'baz' => $baz, '_' => null], $context->getAll()); } /** * @dataProvider specialNames * @expectedException \InvalidArgumentException * @expectedExceptionMessageRegEx /Unknown variable: \$\w+/ */ public function testSetAllDoesNotSetSpecial($name) { $context = new Context(); $context->setAll([$name => 'fail']); $context->get($name); } public function specialNames() { return [ ['_e'], ['__out'], ['this'], ['__psysh__'], ['__function'], ['__method'], ['__class'], ['__namespace'], ['__file'], ['__line'], ['__dir'], ]; } public function testReturnValue() { $context = new Context(); $this->assertNull($context->getReturnValue()); $val = 'some string'; $context->setReturnValue($val); $this->assertEquals($val, $context->getReturnValue()); $this->assertEquals($val, $context->get('_')); $obj = new \StdClass(); $context->setReturnValue($obj); $this->assertSame($obj, $context->getReturnValue()); $this->assertSame($obj, $context->get('_')); $context->setReturnValue(null); $this->assertNull($context->getReturnValue()); } public function testLastException() { $context = new Context(); $e = new \Exception('wat'); $context->setLastException($e); $this->assertSame($e, $context->getLastException()); $this->assertSame($e, $context->get('_e')); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage No most-recent exception */ public function testLastExceptionThrowsSometimes() { $context = new Context(); $context->getLastException(); } public function testLastStdout() { $context = new Context(); $context->setLastStdout('ouuuuut'); $this->assertEquals('ouuuuut', $context->getLastStdout()); $this->assertEquals('ouuuuut', $context->get('__out')); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage No most-recent output */ public function testLastStdoutThrowsSometimes() { $context = new Context(); $context->getLastStdout(); } public function testBoundObject() { $context = new Context(); $this->assertNull($context->getBoundObject()); $obj = new \StdClass(); $context->setBoundObject($obj); $this->assertSame($obj, $context->getBoundObject()); $this->assertSame($obj, $context->get('this')); $context->setBoundObject(null); $this->assertNull($context->getBoundObject()); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Unknown variable: $this */ public function testBoundObjectThrowsSometimes() { $context = new Context(); $context->get('this'); } public function testBoundClass() { $context = new Context(); $this->assertNull($context->getBoundClass()); $context->setBoundClass(''); $this->assertNull($context->getBoundClass()); $context->setBoundClass('Psy\Shell'); $this->assertEquals('Psy\Shell', $context->getBoundClass()); $context->setBoundObject(new \StdClass()); $this->assertNotNull($context->getBoundObject()); $this->assertNull($context->getBoundClass()); $context->setBoundClass('Psy\Shell'); $this->assertEquals('Psy\Shell', $context->getBoundClass()); $this->assertNull($context->getBoundObject()); $context->setBoundClass(null); $this->assertNull($context->getBoundClass()); $this->assertNull($context->getBoundObject()); } public function testCommandScopeVariables() { $__function = 'donkey'; $__method = 'diddy'; $__class = 'cranky'; $__namespace = 'funky'; $__file = 'candy'; $__line = 'dixie'; $__dir = 'wrinkly'; $vars = \compact('__function', '__method', '__class', '__namespace', '__file', '__line', '__dir'); $context = new Context(); $context->setCommandScopeVariables($vars); $this->assertEquals($vars, $context->getCommandScopeVariables()); $this->assertEquals($__function, $context->get('__function')); $this->assertEquals($__method, $context->get('__method')); $this->assertEquals($__class, $context->get('__class')); $this->assertEquals($__namespace, $context->get('__namespace')); $this->assertEquals($__file, $context->get('__file')); $this->assertEquals($__line, $context->get('__line')); $this->assertEquals($__dir, $context->get('__dir')); $someVars = \compact('__function', '__namespace', '__file', '__line', '__dir'); $context->setCommandScopeVariables($someVars); } public function testGetUnusedCommandScopeVariableNames() { $context = new Context(); $this->assertEquals( ['__function', '__method', '__class', '__namespace', '__file', '__line', '__dir'], $context->getUnusedCommandScopeVariableNames() ); $context->setCommandScopeVariables([ '__function' => 'foo', '__namespace' => 'bar', '__file' => 'baz', '__line' => 123, '__dir' => 'qux', ]); $this->assertEquals( ['__method', '__class'], \array_values($context->getUnusedCommandScopeVariableNames()) ); } /** * @dataProvider specialAndNotSpecialVariableNames */ public function testIsSpecialVariableName($name, $isSpecial) { $context = new Context(); if ($isSpecial) { $this->assertTrue($context->isSpecialVariableName($name)); } else { $this->assertFalse($context->isSpecialVariableName($name)); } } public function specialAndNotSpecialVariableNames() { return [ ['foo', false], ['psysh', false], ['__psysh', false], ['_', true], ['_e', true], ['__out', true], ['this', true], ['__psysh__', true], ['__function', true], ['__method', true], ['__class', true], ['__namespace', true], ['__file', true], ['__line', true], ['__dir', true], ]; } } PK!xF%psysh/test/Input/CodeArgumentTest.phpnuIwassertInstanceOf('Psy\Input\CodeArgument', new CodeArgument('yeah', $mode)); } public function getValidModes() { return [ [InputArgument::REQUIRED], [InputArgument::OPTIONAL], ]; } } PK! 2 2 &psysh/test/Input/FilterOptionsTest.phpnuIwassertCount(3, $opts); } /** * @dataProvider validInputs */ public function testBindValidInput($input, $hasFilter = true) { $input = $this->getInput($input); $filterOptions = new FilterOptions(); $filterOptions->bind($input); $this->assertEquals($hasFilter, $filterOptions->hasFilter()); } public function validInputs() { return [ ['--grep="bar"'], ['--grep="bar" --invert'], ['--grep="bar" --insensitive'], ['--grep="bar" --invert --insensitive'], ['', false], ]; } /** * @dataProvider invalidInputs * @expectedException \Psy\Exception\RuntimeException */ public function testBindInvalidInput($input) { $input = $this->getInput($input); $filterOptions = new FilterOptions(); $filterOptions->bind($input); } public function invalidInputs() { return [ ['--invert'], ['--insensitive'], ['--invert --insensitive'], // invalid because regex ['--grep /*/'], ]; } /** * @dataProvider matchData */ public function testMatch($input, $str, $matches) { $input = $this->getInput($input); $filterOptions = new FilterOptions(); $filterOptions->bind($input); $this->assertEquals($matches, $filterOptions->match($str)); } public function matchData() { return [ ['', 'whatever', true], ['--grep FOO', 'foo', false], ['--grep foo', 'foo', true], ['--grep foo', 'food', true], ['--grep oo', 'Food', true], ['--grep oo -i', 'FOOD', true], ['--grep foo -v', 'food', false], ['--grep foo -v', 'whatever', true], ]; } private function getInput($input) { $input = new StringInput($input); $input->bind(new InputDefinition(FilterOptions::getOptions())); return $input; } } PK!cP""#psysh/test/Input/ShellInputTest.phpnuIwbind($definition); } public function testInputOptionWithGivenString() { $definition = new InputDefinition([ new InputOption('foo', null, InputOption::VALUE_REQUIRED), new CodeArgument('code', null, CodeArgument::REQUIRED), ]); $input = new ShellInput('--foo=bar echo "baz\\\\n";'); $input->bind($definition); $this->assertSame('bar', $input->getOption('foo')); $this->assertSame('echo "baz\n";', $input->getArgument('code')); } public function testInputOptionWithoutCodeArguments() { $definition = new InputDefinition([ new InputOption('foo', null, InputOption::VALUE_REQUIRED), new InputOption('qux', 'q', InputOption::VALUE_REQUIRED), new InputArgument('bar', null, InputArgument::REQUIRED), new InputArgument('baz', null, InputArgument::REQUIRED), ]); $input = new ShellInput('--foo=foo -q qux bar "baz\\\\n"'); $input->bind($definition); $this->assertSame('foo', $input->getOption('foo')); $this->assertSame('qux', $input->getOption('qux')); $this->assertSame('bar', $input->getArgument('bar')); $this->assertSame('baz\\n', $input->getArgument('baz')); } public function testInputWithDashDash() { $definition = new InputDefinition([ new InputOption('foo', null, InputOption::VALUE_REQUIRED), new CodeArgument('code', null, CodeArgument::REQUIRED), ]); $input = new ShellInput('-- echo --foo::$bar'); $input->bind($definition); $this->assertNull($input->getOption('foo')); $this->assertSame('echo --foo::$bar', $input->getArgument('code')); } public function testInputWithEmptyString() { $definition = new InputDefinition([ new InputOption('foo', null, InputOption::VALUE_REQUIRED), new CodeArgument('code', null, CodeArgument::REQUIRED), ]); $input = new ShellInput('"" --foo bar'); $input->bind($definition); $this->assertSame('"" --foo bar', $input->getArgument('code')); } /** * @dataProvider getTokenizeData */ public function testTokenize($input, $tokens, $message) { $input = new ShellInput($input); $r = new \ReflectionClass('Psy\Input\ShellInput'); $p = $r->getProperty('tokenPairs'); $p->setAccessible(true); $this->assertSame($tokens, $p->getValue($input), $message); } public function getTokenizeData() { // Test all the cases from StringInput test, ensuring they have an appropriate $rest token. return [ [ '', [], '->tokenize() parses an empty string', ], [ 'foo', [['foo', 'foo']], '->tokenize() parses arguments', ], [ ' foo bar ', [['foo', 'foo bar '], ['bar', 'bar ']], '->tokenize() ignores whitespaces between arguments', ], [ '"quoted"', [['quoted', '"quoted"']], '->tokenize() parses quoted arguments', ], [ "'quoted'", [['quoted', "'quoted'"]], '->tokenize() parses quoted arguments', ], [ "'a\rb\nc\td'", [["a\rb\nc\td", "'a\rb\nc\td'"]], '->tokenize() parses whitespace chars in strings', ], [ "'a'\r'b'\n'c'\t'd'", [ ['a', "'a'\r'b'\n'c'\t'd'"], ['b', "'b'\n'c'\t'd'"], ['c', "'c'\t'd'"], ['d', "'d'"], ], '->tokenize() parses whitespace chars between args as spaces', ], /* * These don't play nice with unescaping input, but the end result * is correct, so disable the tests for now. * * @todo Sort this out and re-enable these test cases. */ // [ // '\"quoted\"', // [['"quoted"', '\"quoted\"']], // '->tokenize() parses escaped-quoted arguments', // ], // [ // "\'quoted\'", // [['\'quoted\'', "\'quoted\'"]], // '->tokenize() parses escaped-quoted arguments', // ], [ '-a', [['-a', '-a']], '->tokenize() parses short options', ], [ '-azc', [['-azc', '-azc']], '->tokenize() parses aggregated short options', ], [ '-awithavalue', [['-awithavalue', '-awithavalue']], '->tokenize() parses short options with a value', ], [ '-a"foo bar"', [['-afoo bar', '-a"foo bar"']], '->tokenize() parses short options with a value', ], [ '-a"foo bar""foo bar"', [['-afoo barfoo bar', '-a"foo bar""foo bar"']], '->tokenize() parses short options with a value', ], [ '-a\'foo bar\'', [['-afoo bar', '-a\'foo bar\'']], '->tokenize() parses short options with a value', ], [ '-a\'foo bar\'\'foo bar\'', [['-afoo barfoo bar', '-a\'foo bar\'\'foo bar\'']], '->tokenize() parses short options with a value', ], [ '-a\'foo bar\'"foo bar"', [['-afoo barfoo bar', '-a\'foo bar\'"foo bar"']], '->tokenize() parses short options with a value', ], [ '--long-option', [['--long-option', '--long-option']], '->tokenize() parses long options', ], [ '--long-option=foo', [['--long-option=foo', '--long-option=foo']], '->tokenize() parses long options with a value', ], [ '--long-option="foo bar"', [['--long-option=foo bar', '--long-option="foo bar"']], '->tokenize() parses long options with a value', ], [ '--long-option="foo bar""another"', [['--long-option=foo baranother', '--long-option="foo bar""another"']], '->tokenize() parses long options with a value', ], [ '--long-option=\'foo bar\'', [['--long-option=foo bar', '--long-option=\'foo bar\'']], '->tokenize() parses long options with a value', ], [ "--long-option='foo bar''another'", [['--long-option=foo baranother', "--long-option='foo bar''another'"]], '->tokenize() parses long options with a value', ], [ "--long-option='foo bar'\"another\"", [['--long-option=foo baranother', "--long-option='foo bar'\"another\""]], '->tokenize() parses long options with a value', ], [ 'foo -a -ffoo --long bar', [ ['foo', 'foo -a -ffoo --long bar'], ['-a', '-a -ffoo --long bar'], ['-ffoo', '-ffoo --long bar'], ['--long', '--long bar'], ['bar', 'bar'], ], '->tokenize() parses when several arguments and options', ], ]; } } PK! (&&0psysh/test/CodeCleaner/AbstractClassPassTest.phpnuIwsetPass(new AbstractClassPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['class A { abstract function a(); }'], ['abstract class B { abstract function b() {} }'], ['abstract class B { abstract function b() { echo "yep"; } }'], ]; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['abstract class C { function c() {} }'], ['abstract class D { abstract function d(); }'], ]; } } PK!'65*5*1psysh/test/CodeCleaner/ValidClassNamePassTest.phpnuIwsetPass(new ValidClassNamePass()); } /** * @dataProvider getInvalid * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessInvalid($code) { $this->parseAndTraverse($code); } public function getInvalid() { // class declarations return [ // core class ['class stdClass {}'], // capitalization ['class stdClass {}'], // collisions with interfaces and traits ['interface stdClass {}'], ['trait stdClass {}'], // collisions inside the same code snippet [' class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], [' trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], [' trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], [' interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], [' interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {} '], // namespaced collisions [' namespace Psy\\Test\\CodeCleaner { class ValidClassNamePassTest {} } '], [' namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { class Beta {} } namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { class Beta {} } '], // extends and implements ['class ValidClassNamePassTest extends NotAClass {}'], ['class ValidClassNamePassTest extends ArrayAccess {}'], ['class ValidClassNamePassTest implements stdClass {}'], ['class ValidClassNamePassTest implements ArrayAccess, stdClass {}'], ['interface ValidClassNamePassTest extends stdClass {}'], ['interface ValidClassNamePassTest extends ArrayAccess, stdClass {}'], // class instantiations ['new Psy_Test_CodeCleaner_ValidClassNamePass_Gamma();'], [' namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { new Psy_Test_CodeCleaner_ValidClassNamePass_Delta(); } '], // class constant fetch ['Psy\\Test\\CodeCleaner\\ValidClassNamePass\\NotAClass::FOO'], // static call ['Psy\\Test\\CodeCleaner\\ValidClassNamePass\\NotAClass::foo()'], ['Psy\\Test\\CodeCleaner\\ValidClassNamePass\\NotAClass::$foo()'], ['Psy\\Test\\CodeCleaner\\ValidClassNamePassTest::notAMethod()'], ]; } /** * @dataProvider getValid */ public function testProcessValid($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function getValid() { $valid = [ // class declarations ['class Psy_Test_CodeCleaner_ValidClassNamePass_Epsilon {}'], ['namespace Psy\Test\CodeCleaner\ValidClassNamePass; class Zeta {}'], [' namespace { class Psy_Test_CodeCleaner_ValidClassNamePass_Eta {}; } namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { class Psy_Test_CodeCleaner_ValidClassNamePass_Eta {} } '], ['namespace Psy\Test\CodeCleaner\ValidClassNamePass { class stdClass {} }'], // class instantiations ['new stdClass();'], ['new stdClass();'], [' namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { class Theta {} } namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { new Theta(); } '], [' namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { class Iota {} new Iota(); } '], [' namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass { class Kappa {} } namespace { new \\Psy\\Test\\CodeCleaner\\ValidClassNamePass\\Kappa(); } '], // Class constant fetch (ValidConstantPassTest validates the actual constant) ['class A {} A::FOO'], ['$a = new DateTime; $a::ATOM'], ['interface A { const B = 1; } A::B'], // static call ['DateTime::createFromFormat()'], ['DateTime::$someMethod()'], ['Psy\Test\CodeCleaner\Fixtures\ClassWithStatic::doStuff()'], ['Psy\Test\CodeCleaner\Fixtures\ClassWithCallStatic::doStuff()'], ['Psy\Test\CodeCleaner\Fixtures\TraitWithStatic::doStuff()'], // Allow `self` and `static` as class names. [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function getInstance() { return new self(); } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function getInstance() { return new SELF(); } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function getInstance() { return new self; } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function getInstance() { return new static(); } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function getInstance() { return new Static(); } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function getInstance() { return new static; } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function foo() { return parent::bar(); } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function foo() { return self::bar(); } } '], [' class Psy_Test_CodeCleaner_ValidClassNamePass_ClassWithStatic { public static function foo() { return static::bar(); } } '], ['class A { static function b() { return new A; } }'], [' class A { const B = 123; function c() { return A::B; } } '], ['class A {} class B { function c() { return new A; } }'], // recursion ['class A { function a() { A::a(); } }'], // conditionally defined classes [' class A {} if (false) { class A {} } '], [' class A {} if (true) { class A {} } else if (false) { class A {} } else { class A {} } '], // ewww [' class A {} if (true): class A {} elseif (false): class A {} else: class A {} endif; '], [' class A {} while (false) { class A {} } '], [' class A {} do { class A {} } while (false); '], [' class A {} switch (1) { case 0: class A {} break; case 1: class A {} break; case 2: class A {} break; } '], ]; // Ugh. There's gotta be a better way to test for this. if (\class_exists('PhpParser\ParserFactory')) { // PHP 7.0 anonymous classes, only supported by PHP Parser v2.x $valid[] = ['$obj = new class() {}']; } if (\version_compare(PHP_VERSION, '5.5', '>=')) { $valid[] = ['interface A {} A::class']; $valid[] = ['interface A {} A::CLASS']; $valid[] = ['class A {} A::class']; $valid[] = ['class A {} A::CLASS']; $valid[] = ['A::class']; $valid[] = ['A::CLASS']; } return $valid; } } PK!dg@2psysh/test/CodeCleaner/LeavePsyshAlonePassTest.phpnuIwsetPass(new LeavePsyshAlonePass()); } public function testPassesInlineHtmlThroughJustFine() { $inline = $this->parse('not php at all!', ''); $this->traverse($inline); $this->assertTrue(true); } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['array_merge()'], ['__psysh__()'], ['$this'], ['$psysh'], ['$__psysh'], ['$banana'], ]; } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\RuntimeException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['$__psysh__'], ['var_dump($__psysh__)'], ['$__psysh__ = "your mom"'], ['$__psysh__->fakeFunctionCall()'], ]; } } PK![ 6psysh/test/CodeCleaner/PassableByReferencePassTest.phpnuIwsetPass(new PassableByReferencePass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['array_pop(array())'], ['array_pop(array($foo))'], ['array_shift(array())'], ]; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['array_pop(json_decode("[]"))'], ['array_pop($foo)'], ['array_pop($foo->bar)'], ['array_pop($foo::baz)'], ['array_pop(Foo::qux)'], ]; } /** * @dataProvider validArrayMultisort */ public function testArrayMultisort($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validArrayMultisort() { return [ ['array_multisort($a)'], ['array_multisort($a, $b)'], ['array_multisort($a, SORT_NATURAL, $b)'], ['array_multisort($a, SORT_NATURAL | SORT_FLAG_CASE, $b)'], ['array_multisort($a, SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $b)'], ['array_multisort($a, SORT_NATURAL | SORT_FLAG_CASE, SORT_ASC, $b)'], ['array_multisort($a, $b, SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE)'], ['array_multisort($a, SORT_NATURAL | SORT_FLAG_CASE, $b, SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE)'], ['array_multisort($a, 1, $b)'], ['array_multisort($a, 1 + 2, $b)'], ['array_multisort($a, getMultisortFlags(), $b)'], ]; } /** * @dataProvider invalidArrayMultisort * @expectedException \Psy\Exception\FatalErrorException */ public function testInvalidArrayMultisort($code) { $this->parseAndTraverse($code); } public function invalidArrayMultisort() { return [ ['array_multisort(1)'], ['array_multisort(array(1, 2, 3))'], ['array_multisort($a, SORT_NATURAL, SORT_ASC, SORT_NATURAL, $b)'], ]; } } PK!j. . .psysh/test/CodeCleaner/CalledClassPassTest.phpnuIwsetPass(new CalledClassPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\ErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['get_class()'], ['get_class(null)'], ['get_called_class()'], ['get_called_class(null)'], ['function foo() { return get_class(); }'], ['function foo() { return get_class(null); }'], ['function foo() { return get_called_class(); }'], ['function foo() { return get_called_class(null); }'], ]; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['get_class($foo)'], ['get_class(bar())'], ['get_called_class($foo)'], ['get_called_class(bar())'], ['function foo($bar) { return get_class($bar); }'], ['function foo($bar) { return get_called_class($bar); }'], ['class Foo { function bar() { return get_class(); } }'], ['class Foo { function bar() { return get_class(null); } }'], ['class Foo { function bar() { return get_called_class(); } }'], ['class Foo { function bar() { return get_called_class(null); } }'], ['$foo = function () {}; $foo()'], ]; } /** * @dataProvider validTraitStatements */ public function testProcessTraitStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validTraitStatements() { return [ ['trait Foo { function bar() { return get_class(); } }'], ['trait Foo { function bar() { return get_class(null); } }'], ['trait Foo { function bar() { return get_called_class(); } }'], ['trait Foo { function bar() { return get_called_class(null); } }'], ]; } } PK!e1psysh/test/CodeCleaner/MagicConstantsPassTest.phpnuIwsetPass(new MagicConstantsPass()); } /** * @dataProvider magicConstants */ public function testProcess($from, $to) { $this->assertProcessesAs($from, $to); } public function magicConstants() { return [ ['__DIR__;', 'getcwd();'], ['__FILE__;', "'';"], ['___FILE___;', '___FILE___;'], ]; } } PK!,psysh/test/CodeCleaner/NoReturnValueTest.phpnuIwassertSame( $this->prettyPrint($this->parse('new \\Psy\CodeCleaner\\NoReturnValue()')), $this->prettyPrint([$stmt]) ); } } PK!ڨ#''-psysh/test/CodeCleaner/FinalClassPassTest.phpnuIwsetPass(new FinalClassPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { $data = [ ['final class A {} class B extends A {}'], ['class A {} final class B extends A {} class C extends B {}'], // array('namespace A { final class B {} } namespace C { class D extends \\A\\B {} }'), ]; if (!\defined('HHVM_VERSION')) { // For some reason Closure isn't final in HHVM? $data[] = ['class A extends \\Closure {}']; } return $data; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['class A extends \\stdClass {}'], ['final class A extends \\stdClass {}'], ['class A {} class B extends A {}'], ]; } } PK!F *psysh/test/CodeCleaner/RequirePassTest.phpnuIwsetPass(new RequirePass()); } /** * @dataProvider exitStatements */ public function testExitStatement($from, $to) { $this->assertProcessesAs($from, $to); } public function exitStatements() { $resolve = '\\Psy\\CodeCleaner\\RequirePass::resolve'; return [ // The basics ['require "a"', "require $resolve(\"a\", 1);"], ['require "b.php"', "require $resolve(\"b.php\", 1);"], ['require_once "c"', "require_once $resolve(\"c\", 1);"], ['require_once "d.php"', "require_once $resolve(\"d.php\", 1);"], // Ensure that line numbers work correctly ["null;\nrequire \"e.php\"", "null;\nrequire $resolve(\"e.php\", 2);"], ["null;\nrequire_once \"f.php\"", "null;\nrequire_once $resolve(\"f.php\", 2);"], // Things with expressions ['require $foo', "require $resolve(\$foo, 1);"], ['require_once $foo', "require_once $resolve(\$foo, 1);"], ['require ($bar = "g.php")', "require $resolve(\$bar = \"g.php\", 1);"], ['require_once ($bar = "h.php")', "require_once $resolve(\$bar = \"h.php\", 1);"], ['$bar = require ($baz = "i.php")', "\$bar = (require $resolve(\$baz = \"i.php\", 1));"], ['$bar = require_once ($baz = "j.php")', "\$bar = (require_once $resolve(\$baz = \"j.php\", 1));"], ]; } /** * @expectedException \Psy\Exception\FatalErrorException * @expectedExceptionMessage Failed opening required 'not a file name' in eval()'d code on line 2 */ public function testResolve() { RequirePass::resolve('not a file name', 2); } /** * @dataProvider emptyWarnings * * @expectedException \Psy\Exception\ErrorException * @expectedExceptionMessage Filename cannot be empty on line 1 */ public function testResolveEmptyWarnings($file) { if (!E_WARNING & \error_reporting()) { $this->markTestSkipped(); } RequirePass::resolve($file, 1); } public function emptyWarnings() { return [ [null], [false], [''], ]; } public function testResolveWorks() { $this->assertEquals(__FILE__, RequirePass::resolve(__FILE__, 3)); } } PK!.Q'psysh/test/CodeCleaner/ExitPassTest.phpnuIwsetPass(new ExitPass()); } /** * @dataProvider dataProviderExitStatement */ public function testExitStatement($from, $to) { $this->assertProcessesAs($from, $to); } /** * Data provider for testExitStatement. * * @return array */ public function dataProviderExitStatement() { return [ ['exit;', "{$this->expectedExceptionString};"], ['exit();', "{$this->expectedExceptionString};"], ['die;', "{$this->expectedExceptionString};"], ['exit(die(die));', "{$this->expectedExceptionString};"], ['if (true) { exit; }', "if (true) {\n {$this->expectedExceptionString};\n}"], ['if (false) { exit; }', "if (false) {\n {$this->expectedExceptionString};\n}"], ['1 and exit();', "1 and {$this->expectedExceptionString};"], ['foo() or die', "foo() or {$this->expectedExceptionString};"], ['exit and 1;', "{$this->expectedExceptionString} and 1;"], ['if (exit) { echo $wat; }', "if ({$this->expectedExceptionString}) {\n echo \$wat;\n}"], ['exit or die;', "{$this->expectedExceptionString} or {$this->expectedExceptionString};"], ['switch (die) { }', "switch ({$this->expectedExceptionString}) {\n}"], ['for ($i = 1; $i < 10; die) {}', "for (\$i = 1; \$i < 10; {$this->expectedExceptionString}) {\n}"], ]; } } PK!#zZ0psysh/test/CodeCleaner/ValidConstantPassTest.phpnuIwsetPass(new ValidConstantPass()); } /** * @dataProvider getInvalidReferences * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessInvalidConstantReferences($code) { $this->parseAndTraverse($code); } public function getInvalidReferences() { return [ ['Foo\BAR'], // class constant fetch ['Psy\Test\CodeCleaner\ValidConstantPassTest::FOO'], ['DateTime::BACON'], ]; } /** * @dataProvider getValidReferences */ public function testProcessValidConstantReferences($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function getValidReferences() { return [ ['PHP_EOL'], // class constant fetch ['NotAClass::FOO'], ['DateTime::ATOM'], ['$a = new DateTime; $a::ATOM'], ['DateTime::class'], ['$a = new DateTime; $a::class'], ]; } } PK!lB5...psysh/test/CodeCleaner/StrictTypesPassTest.phpnuIwmarkTestSkipped(); } $this->setPass(new StrictTypesPass()); } public function testProcess() { $this->assertProcessesAs('declare(strict_types=1)', 'declare (strict_types=1);'); $this->assertProcessesAs('null', "declare (strict_types=1);\nnull;"); $this->assertProcessesAs('declare(strict_types=0)', 'declare (strict_types=0);'); $this->assertProcessesAs('null', 'null;'); } /** * @dataProvider invalidDeclarations * @expectedException \Psy\Exception\FatalErrorException */ public function testInvalidDeclarations($code) { $this->parseAndTraverse($code); } public function invalidDeclarations() { return [ ['declare(strict_types=-1)'], ['declare(strict_types=2)'], ['declare(strict_types="foo")'], ]; } } PK!JzK .psysh/test/CodeCleaner/LoopContextPassTest.phpnuIwsetPass(new LoopContextPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['continue'], ['break'], ['if (true) { continue; }'], ['if (true) { break; }'], ['if (false) { continue; }'], ['if (false) { break; }'], ['function foo() { break; }'], ['function foo() { continue; }'], // actually enforce break/continue depth argument ['do { break 2; } while (true)'], ['do { continue 2; } while (true)'], ['for ($a; $b; $c) { break 2; }'], ['for ($a; $b; $c) { continue 2; }'], ['foreach ($a as $b) { break 2; }'], ['foreach ($a as $b) { continue 2; }'], ['switch (true) { default: break 2; }'], ['switch (true) { default: continue 2; }'], ['while (true) { break 2; }'], ['while (true) { continue 2; }'], // In PHP 5.4+, only positive literal integers are allowed ['while (true) { break $n; }'], ['while (true) { continue $n; }'], ['while (true) { break N; }'], ['while (true) { continue N; }'], ['while (true) { break 0; }'], ['while (true) { continue 0; }'], ['while (true) { break -1; }'], ['while (true) { continue -1; }'], ['while (true) { break 1.0; }'], ['while (true) { continue 1.0; }'], ['while (true) { break 2.0; }'], ['while (true) { continue 2.0; }'], // and once with nested loops, just for good measure ['while (true) { while (true) { break 3; } }'], ['while (true) { while (true) { continue 3; } }'], ]; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['do { break; } while (true)'], ['do { continue; } while (true)'], ['for ($a; $b; $c) { break; }'], ['for ($a; $b; $c) { continue; }'], ['foreach ($a as $b) { break; }'], ['foreach ($a as $b) { continue; }'], ['switch (true) { default: break; }'], ['switch (true) { default: continue; }'], ['while (true) { break; }'], ['while (true) { continue; }'], // `break 1` is redundant, but not invalid ['while (true) { break 1; }'], ['while (true) { continue 1; }'], // and once with nested loops just for good measure ['while (true) { while (true) { break 2; } }'], ['while (true) { while (true) { continue 2; } }'], ]; } } PK!X9us s ?psysh/test/CodeCleaner/FunctionReturnInWriteContextPassTest.phpnuIwsetPass(new FunctionReturnInWriteContextPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException * @expectedExceptionMessage Can't use function return value in write context */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['f(&g())'], ['array(& $object->method())'], ['$a->method(& $closure())'], ['array(& A::b())'], ['f() = 5'], ['unset(h())'], ]; } public function testIsset() { try { $this->traverser->traverse($this->parse('isset(strtolower("A"))')); $this->fail(); } catch (FatalErrorException $e) { if (\version_compare(PHP_VERSION, '5.5', '>=')) { $this->assertContains( 'Cannot use isset() on the result of a function call (you can use "null !== func()" instead)', $e->getMessage() ); } else { $this->assertContains("Can't use function return value in write context", $e->getMessage()); } } } /** * @expectedException \Psy\Exception\FatalErrorException * @expectedExceptionMessage Can't use function return value in write context */ public function testEmpty() { if (\version_compare(PHP_VERSION, '5.5', '>=')) { $this->markTestSkipped(); } $this->traverser->traverse($this->parse('empty(strtolower("A"))')); } /** * @dataProvider validStatements */ public function testValidStatements($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['isset($foo)'], ]; } } PK!PN 3psysh/test/CodeCleaner/ValidConstructorPassTest.phpnuIwsetPass(new ValidConstructorPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessInvalidStatement($code) { $this->parseAndTraverse($code); } /** * @dataProvider invalidParserStatements * @expectedException \Psy\Exception\ParseErrorException */ public function testProcessInvalidStatementCatchedByParser($code) { $this->parseAndTraverse($code); } public function invalidStatements() { $data = [ ['class A { public static function A() {}}'], ['class A { public static function a() {}}'], ['class A { private static function A() {}}'], ['class A { private static function a() {}}'], ]; if (\version_compare(PHP_VERSION, '7.0', '>=')) { $data[] = ['class A { public function A(): ?array {}}']; $data[] = ['class A { public function a(): ?array {}}']; } return $data; } public function invalidParserStatements() { return [ ['class A { public static function __construct() {}}'], ['class A { private static function __construct() {}}'], ['class A { private static function __construct() {} public function A() {}}'], ['namespace B; class A { private static function __construct() {}}'], ]; } /** * @dataProvider validStatements */ public function testProcessValidStatement($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { $data = [ ['class A { public static function A() {} public function __construct() {}}'], ['class A { private function __construct() {} public static function A() {}}'], ['namespace B; class A { private static function A() {}}'], ]; if (\version_compare(PHP_VERSION, '7.0', '>=')) { $data[] = ['class A { public static function A() {} public function __construct() {}}']; $data[] = ['class A { private function __construct() {} public static function A(): ?array {}}']; $data[] = ['namespace B; class A { private static function A(): ?array {}}']; } return $data; } } PK!}1psysh/test/CodeCleaner/ImplicitReturnPassTest.phpnuIwsetPass(new ImplicitReturnPass()); } /** * @dataProvider implicitReturns */ public function testProcess($from, $to) { $this->assertProcessesAs($from, $to); } public function implicitReturns() { $data = [ ['4', 'return 4;'], ['foo()', 'return foo();'], ['return 1', 'return 1;'], ['', 'return new \Psy\CodeCleaner\NoReturnValue();'], ]; $from = 'echo "foo";'; $to = <<<'EOS' echo "foo"; return new \Psy\CodeCleaner\NoReturnValue(); EOS; $data[] = [$from, $to]; $from = 'if (true) { 1; } elseif (true) { 2; } else { 3; }'; $to = <<<'EOS' if (true) { return 1; } elseif (true) { return 2; } else { return 3; } return new \Psy\CodeCleaner\NoReturnValue(); EOS; $data[] = [$from, $to]; $from = 'class A {}'; $to = <<<'EOS' class A { } return new \Psy\CodeCleaner\NoReturnValue(); EOS; $data[] = [$from, $to]; $from = <<<'EOS' switch (false) { case 0: 0; case 1: 1; break; case 2: 2; return; } EOS; $to = <<<'EOS' switch (false) { case 0: 0; case 1: return 1; break; case 2: 2; return; } return new \Psy\CodeCleaner\NoReturnValue(); EOS; $data[] = [$from, $to]; $from = <<<'EOS' namespace Foo { 1 + 1; } EOS; $to = <<<'EOS' namespace Foo; return 1 + 1; EOS; $data[] = [$from, $to]; $data[] = ['exit()', 'exit;']; return $data; } } PK!gQ_,5psysh/test/CodeCleaner/AssignThisVariablePassTest.phpnuIwsetPass(new AssignThisVariablePass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['$this = 3'], ['strtolower($this = "this")'], ]; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['$this'], ['$a = $this'], ['$a = "this"; $$a = 3'], ['$$this = "b"'], ]; } } PK!) /psysh/test/CodeCleaner/UseStatementPassTest.phpnuIwsetPass(new UseStatementPass()); } /** * @dataProvider useStatements */ public function testProcess($from, $to) { $this->assertProcessesAs($from, $to); } public function useStatements() { return [ [ "use StdClass as NotSoStd;\n\$std = new NotSoStd();", '$std = new \\StdClass();', ], [ "namespace Foo;\n\nuse StdClass as S;\n\$std = new S();", "namespace Foo;\n\n\$std = new \\StdClass();", ], [ "namespace Foo;\n\nuse \\StdClass as S;\n\$std = new S();", "namespace Foo;\n\n\$std = new \\StdClass();", ], [ "use Foo\\Bar as fb;\n\$baz = new fb\\Baz();", '$baz = new \\Foo\\Bar\\Baz();', ], [ "use Foo\\Bar;\n\$baz = new Bar\\Baz();", '$baz = new \\Foo\\Bar\\Baz();', ], [ "namespace Foo;\nuse Bar;\n\$baz = new Bar\\Baz();", "namespace Foo;\n\n\$baz = new \\Bar\\Baz();", ], [ "namespace Foo;\n\nuse \\StdClass as S;\n\$std = new S();\nnamespace Foo;\n\n\$std = new S();", "namespace Foo;\n\n\$std = new \\StdClass();\nnamespace Foo;\n\n\$std = new \\StdClass();", ], [ "namespace Foo;\n\nuse \\StdClass as S;\n\$std = new S();\nnamespace Bar;\n\n\$std = new S();", "namespace Foo;\n\n\$std = new \\StdClass();\nnamespace Bar;\n\n\$std = new S();", ], [ "use Foo\\Bar as fb, Qux as Q;\n\$baz = new fb\\Baz();\n\$qux = new Q();", "\$baz = new \\Foo\\Bar\\Baz();\n\$qux = new \\Qux();", ], ]; } /** * @dataProvider groupUseStatements */ public function testGroupUseProcess($from, $to) { $this->assertProcessesAs($from, $to); } public function groupUseStatements() { if (\version_compare(PHP_VERSION, '7.0', '<')) { $this->markTestSkipped(); } return [ [ "use Foo\\{Bar, Baz, Qux as Q};\n\$bar = new Bar();\n\$baz = new Baz();\n\$qux = new Q();", "\$bar = new \\Foo\\Bar();\n\$baz = new \\Foo\\Baz();\n\$qux = new \\Foo\\Qux();", ], [ "use X\\{Foo, Bar as B};\n\$foo = new Foo();\n\$baz = new B\\Baz();", "\$foo = new \\X\\Foo();\n\$baz = new \\X\\Bar\\Baz();", ], [ "use X\\{Foo, Bar as B};\n\$foo = new Foo();\n\$bar = new Bar();\n\$baz = new B\\Baz();", "\$foo = new \\X\\Foo();\n\$bar = new Bar();\n\$baz = new \\X\\Bar\\Baz();", ], ]; } } PK!?<<-psysh/test/CodeCleaner/InstanceOfPassTest.phpnuIwsetPass(new InstanceOfPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessInvalidStatement($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['null instanceof stdClass'], ['true instanceof stdClass'], ['9 instanceof stdClass'], ['1.0 instanceof stdClass'], ['"foo" instanceof stdClass'], ['__DIR__ instanceof stdClass'], ['PHP_SAPI instanceof stdClass'], ['1+1 instanceof stdClass'], ['true && false instanceof stdClass'], ['"a"."b" instanceof stdClass'], ['!5 instanceof stdClass'], ]; } /** * @dataProvider validStatements */ public function testProcessValidStatement($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { $data = [ ['$a instanceof stdClass'], ['strtolower("foo") instanceof stdClass'], ['array(1) instanceof stdClass'], ['(string) "foo" instanceof stdClass'], ['(1+1) instanceof stdClass'], ['"foo ${foo} $bar" instanceof stdClass'], ['DateTime::ISO8601 instanceof stdClass'], ]; return $data; } } PK!p+5'psysh/test/CodeCleaner/ListPassTest.phpnuIwsetPass(new ListPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\ParseErrorException */ public function testProcessInvalidStatement($code, $expectedMessage) { if (\method_exists($this, 'setExpectedException')) { $this->setExpectedException('Psy\Exception\ParseErrorException', $expectedMessage); } else { $this->expectExceptionMessage($expectedMessage); } $stmts = $this->parse($code); $this->traverser->traverse($stmts); } public function invalidStatements() { // Not typo. It is ambiguous whether "Syntax" or "syntax". $errorShortListAssign = "yntax error, unexpected '='"; $errorEmptyList = 'Cannot use empty list'; $errorAssocListAssign = 'Syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting \',\' or \')\''; $errorNonVariableAssign = 'Assignments can only happen to writable values'; $errorPhpParserSyntax = 'PHP Parse error: Syntax error, unexpected'; $invalidExpr = [ ['list() = array()', $errorEmptyList], ['list("a") = array(1)', $errorPhpParserSyntax], ]; if (\version_compare(PHP_VERSION, '7.1', '<')) { return \array_merge($invalidExpr, [ ['list("a" => _) = array("a" => 1)', $errorPhpParserSyntax], ['[] = []', $errorShortListAssign], ['[$a] = [1]', $errorShortListAssign], ['list("a" => $a) = array("a" => 1)', $errorAssocListAssign], ['[$a[0], $a[1]] = [1, 2]', $errorShortListAssign], ['[$a->b, $a->c] = [1, 2]', $errorShortListAssign], ]); } return \array_merge($invalidExpr, [ ['list("a" => _) = array("a" => 1)', $errorPhpParserSyntax], ['["a"] = [1]', $errorNonVariableAssign], ['[] = []', $errorEmptyList], ['[,] = [1,2]', $errorEmptyList], ['[,,] = [1,2,3]', $errorEmptyList], ]); } /** * @dataProvider validStatements */ public function testProcessValidStatement($code) { $stmts = $this->parse($code); $this->traverser->traverse($stmts); $this->assertTrue(true); } public function validStatements() { $validExpr = [ ['list($a) = array(1)'], ['list($x, $y) = array(1, 2)'], ]; if (\version_compare(PHP_VERSION, '7.1', '>=')) { return \array_merge($validExpr, [ ['[$a] = array(1)'], ['list($b) = [2]'], ['[$x, $y] = array(1, 2)'], ['[$a] = [1]'], ['[$x, $y] = [1, 2]'], ['["_" => $v] = ["_" => 1]'], ['[$a,] = [1,2,3]'], ['[,$b] = [1,2,3]'], ['[$a,,$c] = [1,2,3]'], ['[$a,,,] = [1,2,3]'], ['[$a[0], $a[1]] = [1, 2]'], ['[$a[0][0][0], $a[0][0][1]] = [1, 2]'], ['[$a->b, $a->c] = [1, 2]'], ['[$a->b[0], $a->c[1]] = [1, 2]'], ['[$a[0]->b[0], $a[0]->c[1]] = [1, 2]'], ['[$a[$b->c + $b->d]] = [1]'], ['[$a->c()->d, $a->c()->e] = [1, 2]'], ['[x()->a, x()->b] = [1, 2]'], ]); } return $validExpr; } } PK!PP,psysh/test/CodeCleaner/NamespacePassTest.phpnuIwcleaner = new CodeCleaner(); $this->setPass(new NamespacePass($this->cleaner)); } public function testProcess() { $this->parseAndTraverse(''); $this->assertNull($this->cleaner->getNamespace()); $this->parseAndTraverse('array_merge()'); $this->assertNull($this->cleaner->getNamespace()); // A non-block namespace statement should set the current namespace. $this->parseAndTraverse('namespace Alpha'); $this->assertSame(['Alpha'], $this->cleaner->getNamespace()); // A new non-block namespace statement should override the current namespace. $this->parseAndTraverse('namespace Beta; class B {}'); $this->assertSame(['Beta'], $this->cleaner->getNamespace()); // A new block namespace clears out the current namespace... $this->parseAndTraverse('namespace Gamma { array_merge(); }'); if (\defined('PhpParser\\Node\\Stmt\\Namespace_::KIND_SEMICOLON')) { $this->assertNull($this->cleaner->getNamespace()); } else { // But not for PHP-Parser < v3.1.2 :( $this->assertSame(['Gamma'], $this->cleaner->getNamespace()); } $this->parseAndTraverse('namespace Delta'); // A null namespace clears out the current namespace. $this->parseAndTraverse('namespace { array_merge(); }'); $this->assertNull($this->cleaner->getNamespace()); } } PK!/ff.psysh/test/CodeCleaner/LegacyEmptyPassTest.phpnuIwsetPass(new LegacyEmptyPass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\ParseErrorException */ public function testProcessInvalidStatement($code) { $this->parseAndTraverse($code); } public function invalidStatements() { if (\version_compare(PHP_VERSION, '5.5', '>=')) { return [ ['empty()'], ]; } return [ ['empty()'], ['empty(null)'], ['empty(PHP_EOL)'], ['empty("wat")'], ['empty(1.1)'], ['empty(Foo::$bar)'], ]; } /** * @dataProvider validStatements */ public function testProcessValidStatement($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { if (\version_compare(PHP_VERSION, '5.5', '<')) { return [ ['empty($foo)'], ]; } return [ ['empty($foo)'], ['empty(null)'], ['empty(PHP_EOL)'], ['empty("wat")'], ['empty(1.1)'], ['empty(Foo::$bar)'], ]; } } PK!ڄ2psysh/test/CodeCleaner/FunctionContextPassTest.phpnuIwsetPass(new FunctionContextPass()); } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['function foo() { yield; }'], ['if (function(){ yield; })'], ]; } /** * @dataProvider invalidYieldStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testInvalidYield($code) { $this->parseAndTraverse($code); } public function invalidYieldStatements() { return [ ['yield'], ['if (yield)'], ]; } } PK!>Lpp3psysh/test/CodeCleaner/Fixtures/ClassWithStatic.phpnuIwsetPass(new CallTimePassByReferencePass()); } /** * @dataProvider invalidStatements * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessStatementFails($code) { $this->parseAndTraverse($code); } public function invalidStatements() { return [ ['f(&$arg)'], ['$object->method($first, &$arg)'], ['$closure($first, &$arg, $last)'], ['A::b(&$arg)'], ]; } /** * @dataProvider validStatements */ public function testProcessStatementPasses($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function validStatements() { return [ ['array(&$var)'], ['$a = &$b'], ['f(array(&$b))'], ]; } } PK!Cpʍ.psysh/test/CodeCleaner/CodeCleanerTestCase.phpnuIwpass = null; parent::tearDown(); } protected function setPass(CodeCleanerPass $pass) { $this->pass = $pass; if (!isset($this->traverser)) { $this->traverser = new NodeTraverser(); } $this->traverser->addVisitor($this->pass); } protected function parseAndTraverse($code, $prefix = 'traverse($this->parse($code, $prefix)); } } PK!+4psysh/test/CodeCleaner/ValidFunctionNamePassTest.phpnuIwsetPass(new ValidFunctionNamePass()); } /** * @dataProvider getInvalidFunctions * @expectedException \Psy\Exception\FatalErrorException */ public function testProcessInvalidFunctionCallsAndDeclarations($code) { $this->parseAndTraverse($code); } public function getInvalidFunctions() { return [ // function declarations ['function array_merge() {}'], ['function Array_Merge() {}'], [' function psy_test_codecleaner_validfunctionnamepass_alpha() {} function psy_test_codecleaner_validfunctionnamepass_alpha() {} '], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function beta() {} } namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function beta() {} } '], // function calls ['psy_test_codecleaner_validfunctionnamepass_gamma()'], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { delta(); } '], // recursion ['function a() { a(); } function a() {}'], ]; } /** * @dataProvider getValidFunctions */ public function testProcessValidFunctionCallsAndDeclarations($code) { $this->parseAndTraverse($code); $this->assertTrue(true); } public function getValidFunctions() { return [ ['function psy_test_codecleaner_validfunctionnamepass_epsilon() {}'], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function zeta() {} } '], [' namespace { function psy_test_codecleaner_validfunctionnamepass_eta() {} } namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function psy_test_codecleaner_validfunctionnamepass_eta() {} } '], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function psy_test_codecleaner_validfunctionnamepass_eta() {} } namespace { function psy_test_codecleaner_validfunctionnamepass_eta() {} } '], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function array_merge() {} } '], // function calls ['array_merge();'], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function theta() {} } namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { theta(); } '], // closures ['$test = function(){};$test()'], [' namespace Psy\\Test\\CodeCleaner\\ValidFunctionNamePass { function theta() {} } namespace { Psy\\Test\\CodeCleaner\\ValidFunctionNamePass\\theta(); } '], // recursion ['function a() { a(); }'], // conditionally defined functions [' function a() {} if (false) { function a() {} } '], [' function a() {} if (true) { function a() {} } else if (false) { function a() {} } else { function a() {} } '], // ewww [' function a() {} if (true): function a() {} elseif (false): function a() {} else: function a() {} endif; '], [' function a() {} while (false) { function a() {} } '], [' function a() {} do { function a() {} } while (false); '], [' function a() {} switch (1) { case 0: function a() {} break; case 1: function a() {} break; case 2: function a() {} break; } '], ]; } } PK!r| 0psysh/test/Reflection/ReflectionConstantTest.phpnuIwassertFalse($refl->getDocComment()); $this->assertEquals('Psy\\Test\\Reflection\\SOME_CONSTANT', $refl->getName()); $this->assertEquals('Psy\\Test\\Reflection', $refl->getNamespaceName()); $this->assertEquals('yep', $refl->getValue()); $this->assertTrue($refl->inNamespace()); $this->assertEquals('Psy\\Test\\Reflection\\SOME_CONSTANT', (string) $refl); $this->assertNull($refl->getFileName()); } public function testBuiltInConstant() { $refl = new ReflectionConstant_('PHP_VERSION'); $this->assertEquals('PHP_VERSION', $refl->getName()); $this->assertEquals('PHP_VERSION', (string) $refl); $this->assertEquals(PHP_VERSION, $refl->getValue()); $this->assertFalse($refl->inNamespace()); $this->assertSame('', $refl->getNamespaceName()); } /** * @dataProvider magicConstants */ public function testIsMagicConstant($name, $is) { $this->assertEquals($is, ReflectionConstant_::isMagicConstant($name)); } public function magicConstants() { return [ ['__LINE__', true], ['__FILE__', true], ['__DIR__', true], ['__FUNCTION__', true], ['__CLASS__', true], ['__TRAIT__', true], ['__METHOD__', true], ['__NAMESPACE__', true], ['__COMPILER_HALT_OFFSET__', true], ['PHP_VERSION', false], ['PHP_EOL', false], ['Psy\\Test\\Reflection\\SOME_CONSTANT', false], ['What if it isn\'t even a valid constant name?', false], ]; } /** * @expectedException \InvalidArgumentException */ public function testUnknownConstantThrowsException() { new ReflectionConstant_('UNKNOWN_CONSTANT'); } public function testExport() { $ret = ReflectionConstant_::export('Psy\\Test\\Reflection\\SOME_CONSTANT', true); $this->assertEquals($ret, 'Constant [ string Psy\\Test\\Reflection\\SOME_CONSTANT ] { yep }'); } public function testExportOutput() { $this->expectOutputString("Constant [ string Psy\\Test\\Reflection\\SOME_CONSTANT ] { yep }\n"); ReflectionConstant_::export('Psy\\Test\\Reflection\\SOME_CONSTANT', false); } public function testGetFileName() { $refl = new ReflectionConstant_('Psy\\Test\\Reflection\\SOME_CONSTANT'); $this->assertNull($refl->getFileName()); } /** * @expectedException \RuntimeException * @dataProvider notYetImplemented */ public function testNotYetImplemented($method) { $refl = new ReflectionConstant_('Psy\\Test\\Reflection\\SOME_CONSTANT'); $refl->$method(); } public function notYetImplemented() { return [ ['getStartLine'], ['getEndLine'], ]; } } PK!ʓ&ޘ2psysh/test/Reflection/ReflectionConstantBCTest.phpnuIwassertInstanceOf('Psy\Reflection\ReflectionConstant', $refl); $this->assertInstanceOf('Psy\Reflection\ReflectionClassConstant', $refl); } } PK!} } 9psysh/test/Reflection/ReflectionLanguageConstructTest.phpnuIwassertEquals($keyword, $refl->getName()); $this->assertEquals($keyword, (string) $refl); } /** * @dataProvider languageConstructs */ public function testKnownLanguageConstructs($keyword) { $this->assertTrue(ReflectionLanguageConstruct::isLanguageConstruct($keyword)); } /** * @dataProvider languageConstructs */ public function testFileName($keyword) { $refl = new ReflectionLanguageConstruct($keyword); $this->assertFalse($refl->getFileName()); } /** * @dataProvider languageConstructs */ public function testReturnsReference($keyword) { $refl = new ReflectionLanguageConstruct($keyword); $this->assertFalse($refl->returnsReference()); } /** * @dataProvider languageConstructs */ public function testGetParameters($keyword) { $refl = new ReflectionLanguageConstruct($keyword); $this->assertNotEmpty($refl->getParameters()); } /** * @dataProvider languageConstructs * @expectedException \RuntimeException */ public function testExportThrows($keyword) { ReflectionLanguageConstruct::export($keyword); } public function languageConstructs() { return [ ['isset'], ['unset'], ['empty'], ['echo'], ['print'], ['die'], ['exit'], ]; } /** * @dataProvider unknownLanguageConstructs * @expectedException \InvalidArgumentException */ public function testUnknownLanguageConstructsThrowExceptions($keyword) { new ReflectionLanguageConstruct($keyword); } public function unknownLanguageConstructs() { return [ ['async'], ['await'], ['comefrom'], ]; } } PK!\}p6 6 5psysh/test/Reflection/ReflectionClassConstantTest.phpnuIwgetDeclaringClass(); $this->assertInstanceOf('ReflectionClass', $class); $this->assertSame('Psy\Test\Reflection\ReflectionClassConstantTest', $class->getName()); $this->assertSame('CONSTANT_ONE', $refl->getName()); $this->assertSame('CONSTANT_ONE', (string) $refl); $this->assertSame('one', $refl->getValue()); $this->assertNull($refl->getFileName()); $this->assertFalse($refl->getDocComment()); } /** * @expectedException \InvalidArgumentException */ public function testUnknownConstantThrowsException() { new ReflectionClassConstant($this, 'UNKNOWN_CONSTANT'); } public function testExport() { $ret = ReflectionClassConstant::export($this, 'CONSTANT_ONE', true); $this->assertEquals($ret, 'Constant [ public string CONSTANT_ONE ] { one }'); } public function testExportOutput() { $this->expectOutputString("Constant [ public string CONSTANT_ONE ] { one }\n"); ReflectionClassConstant::export($this, 'CONSTANT_ONE', false); } public function testModifiers() { $refl = new ReflectionClassConstant($this, 'CONSTANT_ONE'); $this->assertEquals(\ReflectionMethod::IS_PUBLIC, $refl->getModifiers()); $this->assertFalse($refl->isPrivate()); $this->assertFalse($refl->isProtected()); $this->assertTrue($refl->isPublic()); } /** * @expectedException \RuntimeException * @dataProvider notYetImplemented */ public function testNotYetImplemented($method) { $refl = new ReflectionClassConstant($this, 'CONSTANT_ONE'); $refl->$method(); } public function notYetImplemented() { return [ ['getStartLine'], ['getEndLine'], ]; } } PK!N\Bpsysh/test/Reflection/ReflectionLanguageConstructParameterTest.phpnuIw false, 'defaultValue' => null, 'isOptional' => false, 'isPassedByReference' => false, ]); $this->assertNull($refl->getClass()); $this->assertEquals('one', $refl->getName()); $this->assertFalse($refl->isArray()); $this->assertTrue($refl->isDefaultValueAvailable()); $this->assertNull($refl->getDefaultValue()); $this->assertFalse($refl->isOptional()); $this->assertFalse($refl->isPassedByReference()); $reflTwo = new ReflectionLanguageConstructParameter($keyword, 'two', [ 'isArray' => true, 'isOptional' => true, 'isPassedByReference' => true, ]); $this->assertNull($refl->getClass()); $this->assertEquals('two', $reflTwo->getName()); $this->assertTrue($reflTwo->isArray()); $this->assertFalse($reflTwo->isDefaultValueAvailable()); $this->assertNull($reflTwo->getDefaultValue()); $this->assertTrue($reflTwo->isOptional()); $this->assertTrue($reflTwo->isPassedByReference()); $refl = new ReflectionLanguageConstructParameter($keyword, 'three', [ 'defaultValue' => 3, ]); $this->assertNull($refl->getClass()); $this->assertEquals('three', $refl->getName()); $this->assertFalse($refl->isArray()); $this->assertTrue($refl->isDefaultValueAvailable()); $this->assertEquals(3, $refl->getDefaultValue()); $this->assertFalse($refl->isOptional()); $this->assertFalse($refl->isPassedByReference()); } } PK!V D44psysh/test/ShellTest.phpnuIwstreams as $stream) { \fclose($stream); } } public function testScopeVariables() { $one = 'banana'; $two = 123; $three = new \StdClass(); $__psysh__ = 'ignore this'; $_ = 'ignore this'; $_e = 'ignore this'; $shell = new Shell($this->getConfig()); $shell->setScopeVariables(\compact('one', 'two', 'three', '__psysh__', '_', '_e', 'this')); $this->assertNotContains('__psysh__', $shell->getScopeVariableNames()); $this->assertSame(['one', 'two', 'three', '_'], $shell->getScopeVariableNames()); $this->assertSame('banana', $shell->getScopeVariable('one')); $this->assertSame(123, $shell->getScopeVariable('two')); $this->assertSame($three, $shell->getScopeVariable('three')); $this->assertNull($shell->getScopeVariable('_')); $diff = $shell->getScopeVariablesDiff(['one' => $one, 'two' => 'not two']); $this->assertSame(['two' => $two, 'three' => $three, '_' => null], $diff); $shell->setScopeVariables([]); $this->assertSame(['_'], $shell->getScopeVariableNames()); $shell->setBoundObject($this); $this->assertSame(['_', 'this'], $shell->getScopeVariableNames()); $this->assertSame($this, $shell->getScopeVariable('this')); $this->assertSame(['_' => null], $shell->getScopeVariables(false)); $this->assertSame(['_' => null, 'this' => $this], $shell->getScopeVariables()); } /** * @expectedException \InvalidArgumentException */ public function testUnknownScopeVariablesThrowExceptions() { $shell = new Shell($this->getConfig()); $shell->setScopeVariables(['foo' => 'FOO', 'bar' => 1]); $shell->getScopeVariable('baz'); } public function testIncludesWithScopeVariables() { $one = 'banana'; $two = 123; $three = new \StdClass(); $__psysh__ = 'ignore this'; $_ = 'ignore this'; $_e = 'ignore this'; $config = $this->getConfig(['usePcntl' => false]); $shell = new Shell($config); $shell->setScopeVariables(\compact('one', 'two', 'three', '__psysh__', '_', '_e', 'this')); $shell->addInput('exit', true); // This is super slow and we shouldn't do this :( $shell->run(null, $this->getOutput()); $this->assertNotContains('__psysh__', $shell->getScopeVariableNames()); $this->assertSame(['one', 'two', 'three', '_', '_e'], $shell->getScopeVariableNames()); $this->assertSame('banana', $shell->getScopeVariable('one')); $this->assertSame(123, $shell->getScopeVariable('two')); $this->assertSame($three, $shell->getScopeVariable('three')); $this->assertNull($shell->getScopeVariable('_')); } public function testIncludes() { $config = $this->getConfig(['configFile' => __DIR__ . '/fixtures/empty.php']); $shell = new Shell($config); $this->assertEmpty($shell->getIncludes()); $shell->setIncludes(['foo', 'bar', 'baz']); $this->assertSame(['foo', 'bar', 'baz'], $shell->getIncludes()); } public function testIncludesConfig() { $config = $this->getConfig([ 'defaultIncludes' => ['/file.php'], 'configFile' => __DIR__ . '/fixtures/empty.php', ]); $shell = new Shell($config); $includes = $shell->getIncludes(); $this->assertSame('/file.php', $includes[0]); } public function testAddMatchersViaConfig() { $shell = new FakeShell(); $matcher = new ClassMethodsMatcher(); $config = $this->getConfig([ 'matchers' => [$matcher], ]); $config->setShell($shell); $this->assertSame([$matcher], $shell->matchers); } public function testAddMatchersViaConfigAfterShell() { $shell = new FakeShell(); $matcher = new ClassMethodsMatcher(); $config = $this->getConfig([]); $config->setShell($shell); $config->addMatchers([$matcher]); $this->assertSame([$matcher], $shell->matchers); } public function testRenderingExceptions() { $shell = new Shell($this->getConfig()); $output = $this->getOutput(); $stream = $output->getStream(); $e = new ParseErrorException('message', 13); $shell->setOutput($output); $shell->addCode('code'); $this->assertTrue($shell->hasCode()); $this->assertNotEmpty($shell->getCodeBuffer()); $shell->writeException($e); $this->assertSame($e, $shell->getScopeVariable('_e')); $this->assertFalse($shell->hasCode()); $this->assertEmpty($shell->getCodeBuffer()); \rewind($stream); $streamContents = \stream_get_contents($stream); $this->assertContains('PHP Parse error', $streamContents); $this->assertContains('message', $streamContents); $this->assertContains('line 13', $streamContents); } public function testHandlingErrors() { $shell = new Shell($this->getConfig()); $output = $this->getOutput(); $stream = $output->getStream(); $shell->setOutput($output); $oldLevel = \error_reporting(); \error_reporting($oldLevel & ~E_USER_NOTICE); try { $shell->handleError(E_USER_NOTICE, 'wheee', null, 13); } catch (ErrorException $e) { \error_reporting($oldLevel); $this->fail('Unexpected error exception'); } \error_reporting($oldLevel); \rewind($stream); $streamContents = \stream_get_contents($stream); $this->assertContains('PHP Notice:', $streamContents); $this->assertContains('wheee', $streamContents); $this->assertContains('line 13', $streamContents); } /** * @expectedException \Psy\Exception\ErrorException */ public function testNotHandlingErrors() { $shell = new Shell($this->getConfig()); $oldLevel = \error_reporting(); \error_reporting($oldLevel | E_USER_NOTICE); try { $shell->handleError(E_USER_NOTICE, 'wheee', null, 13); } catch (ErrorException $e) { \error_reporting($oldLevel); throw $e; } } public function testVersion() { $shell = new Shell($this->getConfig()); $this->assertInstanceOf('Symfony\Component\Console\Application', $shell); $this->assertContains(Shell::VERSION, $shell->getVersion()); $this->assertContains(PHP_VERSION, $shell->getVersion()); $this->assertContains(PHP_SAPI, $shell->getVersion()); } public function testCodeBuffer() { $shell = new Shell($this->getConfig()); $shell->addCode('class'); $this->assertNull($shell->flushCode()); $this->assertTrue($shell->hasCode()); $shell->addCode('a'); $this->assertNull($shell->flushCode()); $this->assertTrue($shell->hasCode()); $shell->addCode('{}'); $code = $shell->flushCode(); $this->assertFalse($shell->hasCode()); $code = \preg_replace('/\s+/', ' ', $code); $this->assertNotNull($code); $this->assertSame('class a { } return new \\Psy\\CodeCleaner\\NoReturnValue();', $code); } public function testKeepCodeBufferOpen() { $shell = new Shell($this->getConfig()); $shell->addCode('1 \\'); $this->assertNull($shell->flushCode()); $this->assertTrue($shell->hasCode()); $shell->addCode('+ 1 \\'); $this->assertNull($shell->flushCode()); $this->assertTrue($shell->hasCode()); $shell->addCode('+ 1'); $code = $shell->flushCode(); $this->assertFalse($shell->hasCode()); $code = \preg_replace('/\s+/', ' ', $code); $this->assertNotNull($code); $this->assertSame('return 1 + 1 + 1;', $code); } /** * @expectedException \Psy\Exception\ParseErrorException */ public function testCodeBufferThrowsParseExceptions() { $shell = new Shell($this->getConfig()); $shell->addCode('this is not valid'); $shell->flushCode(); } public function testClosuresSupport() { $shell = new Shell($this->getConfig()); $code = '$test = function () {}'; $shell->addCode($code); $shell->flushCode(); $code = '$test()'; $shell->addCode($code); $this->assertSame($shell->flushCode(), 'return $test();'); } public function testWriteStdout() { $output = $this->getOutput(); $stream = $output->getStream(); $shell = new Shell($this->getConfig()); $shell->setOutput($output); $shell->writeStdout("{{stdout}}\n"); \rewind($stream); $streamContents = \stream_get_contents($stream); $this->assertSame('{{stdout}}' . PHP_EOL, $streamContents); } public function testWriteStdoutWithoutNewline() { $output = $this->getOutput(); $stream = $output->getStream(); $shell = new Shell($this->getConfig()); $shell->setOutput($output); $shell->writeStdout('{{stdout}}'); \rewind($stream); $streamContents = \stream_get_contents($stream); $this->assertSame('{{stdout}}' . PHP_EOL, $streamContents); } /** * @dataProvider getReturnValues */ public function testWriteReturnValue($input, $expected) { $output = $this->getOutput(); $stream = $output->getStream(); $shell = new Shell($this->getConfig()); $shell->setOutput($output); $shell->writeReturnValue($input); \rewind($stream); $this->assertEquals($expected, \stream_get_contents($stream)); } public function getReturnValues() { return [ ['{{return value}}', "=> \"\033[32m{{return value}}\033[39m\"" . PHP_EOL], [1, "=> \033[35m1\033[39m" . PHP_EOL], ]; } /** * @dataProvider getRenderedExceptions */ public function testWriteException($exception, $expected) { $output = $this->getOutput(); $stream = $output->getStream(); $shell = new Shell($this->getConfig()); $shell->setOutput($output); $shell->writeException($exception); \rewind($stream); $this->assertSame($expected, \stream_get_contents($stream)); } public function getRenderedExceptions() { return [ [new \Exception('{{message}}'), "Exception with message '{{message}}'" . PHP_EOL], ]; } /** * @dataProvider getExecuteValues */ public function testShellExecute($input, $expected) { $output = $this->getOutput(); $stream = $output->getStream(); $shell = new Shell($this->getConfig()); $shell->setOutput($output); $this->assertEquals($expected, $shell->execute($input)); \rewind($stream); $this->assertSame('', \stream_get_contents($stream)); } public function getExecuteValues() { return [ ['return 12', 12], ['"{{return value}}"', '{{return value}}'], ['1', '1'], ]; } /** * @dataProvider commandsToHas */ public function testHasCommand($command, $has) { $shell = new Shell($this->getConfig()); // :-/ $refl = new \ReflectionClass('Psy\\Shell'); $method = $refl->getMethod('hasCommand'); $method->setAccessible(true); $this->assertEquals($method->invokeArgs($shell, [$command]), $has); } public function commandsToHas() { return [ ['help', true], ['help help', true], ['"help"', false], ['"help help"', false], ['ls -al ', true], ['ls "-al" ', true], ['ls"-al"', false], [' q', true], [' q --help', true], ['"q"', false], ['"q",', false], ]; } private function getOutput() { $stream = \fopen('php://memory', 'w+'); $this->streams[] = $stream; $output = new StreamOutput($stream, StreamOutput::VERBOSITY_NORMAL, false); return $output; } private function getConfig(array $config = []) { // Mebbe there's a better way than this? $dir = \tempnam(\sys_get_temp_dir(), 'psysh_shell_test_'); \unlink($dir); $defaults = [ 'configDir' => $dir, 'dataDir' => $dir, 'runtimeDir' => $dir, ]; return new Configuration(\array_merge($defaults, $config)); } } PK!&psysh/test/ConsoleColorFactoryTest.phpnuIwgetConsoleColor(); $themes = $colors->getThemes(); $this->assertFalse($colors->isStyleForced()); $this->assertSame(['blue'], $themes['line_number']); } public function testGetConsoleColorForced() { $colorMode = Configuration::COLOR_MODE_FORCED; $factory = new ConsoleColorFactory($colorMode); $colors = $factory->getConsoleColor(); $themes = $colors->getThemes(); $this->assertTrue($colors->isStyleForced()); $this->assertSame(['blue'], $themes['line_number']); } public function testGetConsoleColorDisabled() { $colorMode = Configuration::COLOR_MODE_DISABLED; $factory = new ConsoleColorFactory($colorMode); $colors = $factory->getConsoleColor(); $themes = $colors->getThemes(); $this->assertFalse($colors->isStyleForced()); $this->assertSame(['none'], $themes['line_number']); } } PK!Ya4  /psysh/test/Formatter/SignatureFormatterTest.phpnuIwassertSame($expected, \strip_tags(SignatureFormatter::format($reflector))); } public function signatureReflectors() { return [ [ new \ReflectionFunction('implode'), \defined('HHVM_VERSION') ? 'function implode($arg1, $arg2 = null)' : 'function implode($glue, $pieces)', ], [ ReflectionClassConstant::create($this, 'FOO'), 'const FOO = "foo value"', ], [ new \ReflectionMethod($this, 'someFakeMethod'), 'private function someFakeMethod(array $one, $two = \'TWO\', Reflector $three = null)', ], [ new \ReflectionProperty($this, 'bar'), 'private static $bar', ], [ new \ReflectionClass('Psy\CodeCleaner\CodeCleanerPass'), 'abstract class Psy\CodeCleaner\CodeCleanerPass ' . 'extends PhpParser\NodeVisitorAbstract ' . 'implements PhpParser\NodeVisitor', ], [ new \ReflectionFunction('array_chunk'), 'function array_chunk($arg, $size, $preserve_keys = unknown)', ], [ new \ReflectionClass('Psy\Test\Formatter\Fixtures\BoringTrait'), 'trait Psy\Test\Formatter\Fixtures\BoringTrait', ], [ new \ReflectionMethod('Psy\Test\Formatter\Fixtures\BoringTrait', 'boringMethod'), 'public function boringMethod($one = 1)', ], [ new ReflectionConstant_('E_ERROR'), 'define("E_ERROR", 1)', ], [ new ReflectionConstant_('PHP_VERSION'), 'define("PHP_VERSION", "' . PHP_VERSION . '")', ], [ new ReflectionConstant_('__LINE__'), 'define("__LINE__", null)', // @todo show this as `unknown` in red or something? ], ]; } /** * @expectedException \InvalidArgumentException */ public function testSignatureFormatterThrowsUnknownReflectorExpeption() { $refl = $this->getMockBuilder('Reflector')->getMock(); SignatureFormatter::format($refl); } } PK!jAk  .psysh/test/Formatter/DocblockFormatterTest.phpnuIw * * @throws InvalidArgumentException if $foo is empty * * @param mixed $foo It's a foo thing * @param int $bar This is definitely bar * * @return string A string of no consequence */ private function methodWithDocblock($foo, $bar = 1) { if (empty($foo)) { throw new \InvalidArgumentException(); } return 'method called'; } public function testFormat() { $expected = <<Description: This is a docblock! Throws: InvalidArgumentException if \$foo is empty Param: mixed \$foo It's a foo thing int \$bar This is definitely bar Return: string A string of no consequence Author: Justin Hileman \ EOS; $this->assertSame( $expected, DocblockFormatter::format(new \ReflectionMethod($this, 'methodWithDocblock')) ); } } PK!s&pp*psysh/test/Formatter/CodeFormatterTest.phpnuIwassertEquals($expected, self::trimLines($formattedWithoutColors)); $this->assertNotEquals($expected, self::trimLines($formatted)); } public function reflectors() { $expectClass = <<<'EOS' > 14| class SomeClass 15| { 16| const SOME_CONST = 'some const'; 17| private $someProp = 'some prop'; 18| 19| public function someMethod($someParam) 20| { 21| return 'some method'; 22| } 23| 24| public static function someClosure() 25| { 26| return function () { 27| return 'some closure'; 28| }; 29| } 30| } EOS; $expectMethod = <<<'EOS' > 19| public function someMethod($someParam) 20| { 21| return 'some method'; 22| } EOS; $expectClosure = <<<'EOS' > 26| return function () { 27| return 'some closure'; 28| }; EOS; return [ [new \ReflectionClass('Psy\Test\Formatter\Fixtures\SomeClass'), $expectClass], [new \ReflectionObject(new SomeClass()), $expectClass], [new \ReflectionMethod('Psy\Test\Formatter\Fixtures\SomeClass', 'someMethod'), $expectMethod], [new \ReflectionFunction(SomeClass::someClosure()), $expectClosure], ]; } /** * @dataProvider invalidReflectors * @expectedException \Psy\Exception\RuntimeException */ public function testCodeFormatterThrowsExceptionForReflectorsItDoesntUnderstand($reflector) { CodeFormatter::format($reflector); } public function invalidReflectors() { $reflectors = [ [new \ReflectionExtension('json')], [new \ReflectionParameter(['Psy\Test\Formatter\Fixtures\SomeClass', 'someMethod'], 'someParam')], [new \ReflectionProperty('Psy\Test\Formatter\Fixtures\SomeClass', 'someProp')], ]; if (\version_compare(PHP_VERSION, '7.1.0', '>=')) { $reflectors[] = [new \ReflectionClassConstant('Psy\Test\Formatter\Fixtures\SomeClass', 'SOME_CONST')]; } return $reflectors; } /** * @dataProvider filenames * @expectedException \Psy\Exception\RuntimeException */ public function testCodeFormatterThrowsExceptionForMissingFile($filename) { $reflector = $this->getMockBuilder('ReflectionClass') ->disableOriginalConstructor() ->getMock(); $reflector ->expects($this->once()) ->method('getFileName') ->will($this->returnValue($filename)); CodeFormatter::format($reflector); } public function filenames() { if (\defined('HHVM_VERSION')) { $this->markTestSkipped('We have issues with PHPUnit mocks on HHVM.'); } return [[null], ['not a file']]; } private static function trimLines($code) { return \rtrim(\implode("\n", \array_map('rtrim', \explode("\n", $code)))); } } PK!rji44+psysh/test/Formatter/Fixtures/SomeClass.phpnuIwassertEmpty($readline->listHistory()); $readline->addHistory('foo'); $this->assertSame(['foo'], $readline->listHistory()); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['foo', 'bar', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } /** * @depends testHistory */ public function testHistorySize() { $readline = new Transient(null, 2); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['bar', 'baz'], $readline->listHistory()); $readline->addHistory('w00t'); $this->assertSame(['baz', 'w00t'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } /** * @depends testHistory */ public function testHistoryEraseDups() { $readline = new Transient(null, 0, true); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $readline->addHistory('bar'); $readline->addHistory('foo'); $this->assertSame(['bar', 'foo'], $readline->listHistory()); $readline->addHistory('baz'); $readline->addHistory('w00t'); $readline->addHistory('baz'); $this->assertSame(['bar', 'foo', 'w00t', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } public function testSomeThingsAreAlwaysTrue() { $readline = new Transient(); $this->assertTrue(Transient::isSupported()); $this->assertTrue($readline->readHistory()); $this->assertTrue($readline->writeHistory()); } } PK!fG  'psysh/test/Readline/GNUReadlineTest.phpnuIwmarkTestSkipped('GNUReadline not enabled'); } $this->historyFile = \tempnam(\sys_get_temp_dir(), 'psysh_test_history'); \file_put_contents($this->historyFile, "_HiStOrY_V2_\n"); } public function testHistory() { $readline = new GNUReadline($this->historyFile); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $this->assertSame(['foo'], $readline->listHistory()); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['foo', 'bar', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } /** * @depends testHistory */ public function testHistorySize() { $readline = new GNUReadline($this->historyFile, 2); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['bar', 'baz'], $readline->listHistory()); $readline->addHistory('w00t'); $this->assertSame(['baz', 'w00t'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } /** * @depends testHistory */ public function testHistoryEraseDups() { $readline = new GNUReadline($this->historyFile, 0, true); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $readline->addHistory('bar'); $readline->addHistory('foo'); $this->assertSame(['bar', 'foo'], $readline->listHistory()); $readline->addHistory('baz'); $readline->addHistory('w00t'); $readline->addHistory('baz'); $this->assertSame(['bar', 'foo', 'w00t', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } } PK!ps#psysh/test/Readline/LibeditTest.phpnuIwmarkTestSkipped('Libedit not enabled'); } $this->historyFile = \tempnam(\sys_get_temp_dir(), 'psysh_test_history'); if (false === \file_put_contents($this->historyFile, "_HiStOrY_V2_\n")) { $this->fail('Unable to write history file: ' . $this->historyFile); } // Calling readline_read_history before readline_clear_history // avoids segfault with PHP 5.5.7 & libedit v3.1 \readline_read_history($this->historyFile); \readline_clear_history(); } public function tearDown() { if (\is_file($this->historyFile)) { \unlink($this->historyFile); } } public function testHistory() { $readline = new Libedit($this->historyFile); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $this->assertSame(['foo'], $readline->listHistory()); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['foo', 'bar', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } /** * @depends testHistory */ public function testHistorySize() { $readline = new Libedit($this->historyFile, 2); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['bar', 'baz'], $readline->listHistory()); $readline->addHistory('w00t'); $this->assertSame(['baz', 'w00t'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } /** * @depends testHistory */ public function testHistoryEraseDups() { $readline = new Libedit($this->historyFile, 0, true); $this->assertEmpty($readline->listHistory()); $readline->addHistory('foo'); $readline->addHistory('bar'); $readline->addHistory('foo'); $this->assertSame(['bar', 'foo'], $readline->listHistory()); $readline->addHistory('baz'); $readline->addHistory('w00t'); $readline->addHistory('baz'); $this->assertSame(['bar', 'foo', 'w00t', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } public function testListHistory() { $readline = new Libedit($this->historyFile); \file_put_contents( $this->historyFile, "This is an entry\n\0This is a comment\nThis is an entry\0With a comment\n", FILE_APPEND ); $this->assertSame([ 'This is an entry', 'This is an entry', ], $readline->listHistory()); $readline->clearHistory(); } /** * Libedit being a BSD library, * it doesn't support non-unix line separators. */ public function testLinebreaksSupport() { $readline = new Libedit($this->historyFile); \file_put_contents( $this->historyFile, "foo\rbar\nbaz\r\nw00t", FILE_APPEND ); $this->assertSame([ "foo\rbar", "baz\r", 'w00t', ], $readline->listHistory()); $readline->clearHistory(); } } PK!$tt&psysh/test/Readline/HoaConsoleTest.phpnuIwassertEmpty($readline->listHistory()); $readline->addHistory('foo'); $this->assertSame(['foo'], $readline->listHistory()); $readline->addHistory('bar'); $this->assertSame(['foo', 'bar'], $readline->listHistory()); $readline->addHistory('baz'); $this->assertSame(['foo', 'bar', 'baz'], $readline->listHistory()); $readline->clearHistory(); $this->assertEmpty($readline->listHistory()); } } PK!MP| psysh/test/SudoTest.phpnuIwmarkTestSkipped('YOLO'); } } public function testFetchProperty() { $obj = new ClassWithSecrets(); $this->assertSame('private and prop', Sudo::fetchProperty($obj, 'privateProp')); } public function testAssignProperty() { $obj = new ClassWithSecrets(); $this->assertSame('private and prop', Sudo::fetchProperty($obj, 'privateProp')); $this->assertSame('not so private now', Sudo::assignProperty($obj, 'privateProp', 'not so private now')); $this->assertSame('not so private now', Sudo::fetchProperty($obj, 'privateProp')); } public function testCallMethod() { $obj = new ClassWithSecrets(); $this->assertSame('private and method', Sudo::callMethod($obj, 'privateMethod')); $this->assertSame('private and method with 1', Sudo::callMethod($obj, 'privateMethod', 1)); $this->assertSame( 'private and method with ["foo",2]', Sudo::callMethod($obj, 'privateMethod', ['foo', 2] )); } public function testFetchStaticProperty() { $obj = new ClassWithSecrets(); $this->assertSame('private and static and prop', Sudo::fetchStaticProperty($obj, 'privateStaticProp')); } public function testAssignStaticProperty() { $obj = new ClassWithSecrets(); $this->assertSame('private and static and prop', Sudo::fetchStaticProperty($obj, 'privateStaticProp')); $this->assertSame('not so private now', Sudo::assignStaticProperty($obj, 'privateStaticProp', 'not so private now')); $this->assertSame('not so private now', Sudo::fetchStaticProperty($obj, 'privateStaticProp')); } public function testCallStatic() { $obj = new ClassWithSecrets(); $this->assertSame('private and static and method', Sudo::callStatic($obj, 'privateStaticMethod')); $this->assertSame('private and static and method with 1', Sudo::callStatic($obj, 'privateStaticMethod', 1)); $this->assertSame( 'private and static and method with ["foo",2]', Sudo::callStatic($obj, 'privateStaticMethod', ['foo', 2] )); } public function testFetchClassConst() { $obj = new ClassWithSecrets(); $this->assertSame('private and const', Sudo::fetchClassConst($obj, 'PRIVATE_CONST')); } } PK!o&-psysh/test/Exception/ThrowUpExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('Psy\Exception\ThrowUpException', $e); $this->assertEquals("Throwing Exception with message '{{message}}'", $e->getMessage()); $this->assertEquals('{{message}}', $e->getRawMessage()); $this->assertEquals(123, $e->getCode()); $this->assertSame($previous, $e->getPrevious()); } public function testFromThrowable() { $previous = new \Exception('{{message}}'); $e = ThrowUpException::fromThrowable($previous); $this->assertInstanceOf('Psy\Exception\ThrowUpException', $e); $this->assertSame($previous, $e->getPrevious()); } public function testFromThrowableWithError() { if (\version_compare(PHP_VERSION, '7.0.0', '<')) { $this->markTestSkipped(); } $previous = new \Error('{{message}}'); $e = ThrowUpException::fromThrowable($previous); $this->assertInstanceOf('Psy\Exception\ThrowUpException', $e); $this->assertInstanceOf('Psy\Exception\ErrorException', $e->getPrevious()); $this->assertNotSame($previous, $e->getPrevious()); $this->assertSame($previous, $e->getPrevious()->getPrevious()); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage throw-up can only throw Exceptions and Errors */ public function testFromThrowableThrowsError() { $notThrowable = new \StdClass(); ThrowUpException::fromThrowable($notThrowable); } } PK!eAD+psysh/test/Exception/ErrorExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('ErrorException', $e); $this->assertInstanceOf('Psy\Exception\ErrorException', $e); } public function testMessage() { $e = new ErrorException('foo'); $this->assertContains('foo', $e->getMessage()); $this->assertSame('foo', $e->getRawMessage()); } /** * @dataProvider getLevels */ public function testErrorLevels($level, $type) { $e = new ErrorException('foo', 0, $level); $this->assertContains('PHP ' . $type, $e->getMessage()); } /** * @dataProvider getLevels */ public function testThrowException($level, $type) { try { ErrorException::throwException($level, '{whot}', '{file}', '13'); } catch (ErrorException $e) { $this->assertContains('PHP ' . $type, $e->getMessage()); $this->assertContains('{whot}', $e->getMessage()); $this->assertContains('in {file}', $e->getMessage()); $this->assertContains('on line 13', $e->getMessage()); } } public function getLevels() { return [ [E_WARNING, 'Warning'], [E_CORE_WARNING, 'Warning'], [E_COMPILE_WARNING, 'Warning'], [E_USER_WARNING, 'Warning'], [E_STRICT, 'Strict error'], [E_DEPRECATED, 'Deprecated'], [E_USER_DEPRECATED, 'Deprecated'], [E_RECOVERABLE_ERROR, 'Recoverable fatal error'], [0, 'Error'], ]; } /** * @dataProvider getUserLevels */ public function testThrowExceptionAsErrorHandler($level, $type) { \set_error_handler(['Psy\Exception\ErrorException', 'throwException']); try { \trigger_error('{whot}', $level); } catch (ErrorException $e) { $this->assertContains('PHP ' . $type, $e->getMessage()); $this->assertContains('{whot}', $e->getMessage()); } \restore_error_handler(); } public function getUserLevels() { return [ [E_USER_ERROR, 'Error'], [E_USER_WARNING, 'Warning'], [E_USER_NOTICE, 'Notice'], [E_USER_DEPRECATED, 'Deprecated'], ]; } public function testIgnoreExecutionLoopFilename() { $e = new ErrorException('{{message}}', 0, 1, '/fake/path/to/Psy/ExecutionLoop.php'); $this->assertEmpty($e->getFile()); $e = new ErrorException('{{message}}', 0, 1, 'c:\fake\path\to\Psy\ExecutionLoop.php'); $this->assertEmpty($e->getFile()); $e = new ErrorException('{{message}}', 0, 1, '/fake/path/to/Psy/File.php'); $this->assertNotEmpty($e->getFile()); } public function testFromError() { if (\version_compare(PHP_VERSION, '7.0.0', '<')) { $this->markTestSkipped(); } $error = new \Error('{{message}}', 0); $exception = ErrorException::fromError($error); $this->assertContains('PHP Error: {{message}}', $exception->getMessage()); $this->assertEquals(0, $exception->getCode()); $this->assertEquals($error->getFile(), $exception->getFile()); $this->assertSame($exception->getPrevious(), $error); } } PK!10psysh/test/Exception/FatalErrorExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('ErrorException', $e); $this->assertInstanceOf('Psy\Exception\FatalErrorException', $e); } public function testMessage() { $e = new FatalErrorException('{msg}', 0, 0, '{filename}', 13); $this->assertSame('{msg}', $e->getRawMessage()); $this->assertContains('{msg}', $e->getMessage()); $this->assertContains('{filename}', $e->getMessage()); $this->assertContains('line 13', $e->getMessage()); } public function testMessageWithNoFilename() { $e = new FatalErrorException('{msg}'); $this->assertSame('{msg}', $e->getRawMessage()); $this->assertContains('{msg}', $e->getMessage()); $this->assertContains('eval()\'d code', $e->getMessage()); } public function testNegativeOneLineNumberIgnored() { $e = new FatalErrorException('{msg}', 0, 1, null, -1); $this->assertEquals(0, $e->getLine()); } } PK!r5jj/psysh/test/Exception/TypeErrorExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('Psy\Exception\TypeErrorException', $e); $this->assertEquals('TypeError: {{message}}', $e->getMessage()); $this->assertEquals('{{message}}', $e->getRawMessage()); $this->assertEquals(13, $e->getCode()); } public function testStripsEvalFromMessage() { $message = 'Something or other, called in line 10: eval()\'d code'; $e = new TypeErrorException($message); $this->assertEquals($message, $e->getRawMessage()); $this->assertEquals('TypeError: Something or other', $e->getMessage()); } public function testFromTypeError() { if (\version_compare(PHP_VERSION, '7.0.0', '<')) { $this->markTestSkipped(); } $previous = new \TypeError('{{message}}', 13); $e = TypeErrorException::fromTypeError($previous); $this->assertInstanceOf('Psy\Exception\TypeErrorException', $e); $this->assertEquals('TypeError: {{message}}', $e->getMessage()); $this->assertEquals('{{message}}', $e->getRawMessage()); $this->assertEquals(13, $e->getCode()); } } PK!q+psysh/test/Exception/BreakExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('Psy\Exception\BreakException', $e); } public function testMessage() { $e = new BreakException('foo'); $this->assertContains('foo', $e->getMessage()); $this->assertSame('foo', $e->getRawMessage()); } /** * @expectedException \Psy\Exception\BreakException * @expectedExceptionMessage Goodbye */ public function testExitShell() { BreakException::exitShell(); } } PK!A,rr0psysh/test/Exception/ParseErrorExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('PhpParser\Error', $e); $this->assertInstanceOf('Psy\Exception\ParseErrorException', $e); } public function testMessage() { $e = new ParseErrorException('{msg}', 1); $this->assertContains('{msg}', $e->getMessage()); $this->assertContains('PHP Parse error:', $e->getMessage()); } public function testConstructFromParseError() { $e = ParseErrorException::fromParseError(new \PhpParser\Error('{msg}')); $this->assertContains('{msg}', $e->getRawMessage()); $this->assertContains('PHP Parse error:', $e->getMessage()); } } PK!h -psysh/test/Exception/RuntimeExceptionTest.phpnuIwassertInstanceOf('Psy\Exception\Exception', $e); $this->assertInstanceOf('RuntimeException', $e); $this->assertInstanceOf('Psy\Exception\RuntimeException', $e); $this->assertSame($msg, $e->getMessage()); $this->assertSame($msg, $e->getRawMessage()); } } PK!3& psysh/test/CodeCleanerTest.phpnuIwassertSame($expected, $cc->clean($lines, $requireSemicolons)); } public function semicolonCodeProvider() { return [ [['true'], false, 'return true;'], [['true;'], false, 'return true;'], [['true;'], true, 'return true;'], [['true'], true, false], [['echo "foo";', 'true'], true, false], [['echo "foo";', 'true'], false, "echo \"foo\";\nreturn true;"], ]; } /** * @dataProvider unclosedStatementsProvider */ public function testUnclosedStatements(array $lines, $isUnclosed) { $cc = new CodeCleaner(); $res = $cc->clean($lines); if ($isUnclosed) { $this->assertFalse($res); } else { $this->assertNotFalse($res); } } public function unclosedStatementsProvider() { return [ [['echo "'], true], [['echo \''], true], [['if (1) {'], true], [['echo "foo",'], true], [['echo ""'], false], [["echo ''"], false], [['if (1) {}'], false], [['// closed comment'], false], [['function foo() { /**'], true], [['var_dump(1, 2,'], true], [['var_dump(1, 2,', '3)'], false], ]; } /** * @dataProvider moreUnclosedStatementsProvider */ public function testMoreUnclosedStatements(array $lines) { if (\defined('HHVM_VERSION')) { $this->markTestSkipped('HHVM not supported.'); } $cc = new CodeCleaner(); $res = $cc->clean($lines); $this->assertFalse($res); } public function moreUnclosedStatementsProvider() { return [ [["\$content = <<clean([$code]); } public function invalidStatementsProvider() { // n.b. We used to check that `var_dump(1,2,)` failed, but PHP Parser // 4.x backported trailing comma function calls from PHP 7.3 for free! // so we're not going to spend too much time worrying about it :) return [ ['function "what'], ["function 'what"], ['echo }'], ['echo {'], ['if (1) }'], ['echo """'], ["echo '''"], ['$foo "bar'], ['$foo \'bar'], ]; } } PK!psysh/test/FakeShell.phpnuIwmatchers = $matchers; } } PK!)psysh/test/TabCompletion/StaticSample.phpnuIwgetAutoCompleter(); foreach ($matchers as $matcher) { if ($matcher instanceof ContextAware) { $matcher->setContext($context); } $tabCompletion->addMatcher($matcher); } $context->setAll(['foo' => 12, 'bar' => new \DOMDocument()]); $code = $tabCompletion->processCallback('', 0, [ 'line_buffer' => $line, 'point' => 0, 'end' => \strlen($line), ]); foreach ($mustContain as $mc) { $this->assertContains($mc, $code); } foreach ($mustNotContain as $mnc) { $this->assertNotContains($mnc, $code); } } /** * TODO * ==== * draft, open to modifications * - [ ] if the variable is an array, return the square bracket for completion * - [ ] if the variable is a constructor or method, reflect to complete as a function call * - [ ] if the preceding token is a variable, call operators or keywords compatible for completion * - [X] a command always should be the second token after php_open_tag * - [X] keywords are never consecutive * - [X] namespacing completion should work just fine * - [X] after a new keyword, should always be a class constructor, never a function call or keyword, constant, * or variable that does not contain a existing class name. * - [X] on a namespaced constructor the completion must show the classes related, not constants. * * @return array */ public function classesInput() { return [ // input, must had, must not had ['T_OPE', ['T_OPEN_TAG'], []], ['st', ['stdClass'], []], ['stdCla', ['stdClass'], []], ['new s', ['stdClass'], []], [ 'new ', ['stdClass', 'Psy\\Context', 'Psy\\Configuration'], ['require', 'array_search', 'T_OPEN_TAG', '$foo'], ], ['new Psy\\C', ['Context'], ['CASE_LOWER']], ['\s', ['stdClass'], []], ['array_', ['array_search', 'array_map', 'array_merge'], []], ['$bar->', ['load'], []], ['$b', ['bar'], []], ['6 + $b', ['bar'], []], ['$f', ['foo'], []], ['l', ['ls'], []], ['ls ', [], ['ls']], ['sho', ['show'], []], ['12 + clone $', ['foo'], []], // array( // '$foo ', // array('+', 'clone'), // array('$foo', 'DOMDocument', 'array_map') // ), requires a operator matcher? ['$', ['foo', 'bar'], ['require', 'array_search', 'T_OPEN_TAG', 'Psy']], [ 'Psy\\', ['Context', 'TabCompletion\\Matcher\\AbstractMatcher'], ['require', 'array_search'], ], [ 'Psy\Test\TabCompletion\StaticSample::CO', ['StaticSample::CONSTANT_VALUE'], [], ], [ 'Psy\Test\TabCompletion\StaticSample::', ['StaticSample::$staticVariable'], [], ], [ 'Psy\Test\TabCompletion\StaticSample::', ['StaticSample::staticFunction'], [], ], ]; } } PK!On #psysh/test/Sudo/SudoVisitorTest.phpnuIwtraverser = new NodeTraverser(); $this->traverser->addVisitor(new SudoVisitor()); } /** * @dataProvider propertyFetches */ public function testPropertyFetch($from, $to) { $this->assertProcessesAs($from, $to); } public function propertyFetches() { return [ ['$a->b', "\Psy\Sudo::fetchProperty(\$a, 'b');"], ['$a->$b', '\Psy\Sudo::fetchProperty($a, $b);'], ["\$a->{'b'}", "\Psy\Sudo::fetchProperty(\$a, 'b');"], ]; } /** * @dataProvider propertyAssigns */ public function testPropertyAssign($from, $to) { $this->assertProcessesAs($from, $to); } public function propertyAssigns() { return [ ['$a->b = $c', "\Psy\Sudo::assignProperty(\$a, 'b', \$c);"], ['$a->$b = $c', '\Psy\Sudo::assignProperty($a, $b, $c);'], ["\$a->{'b'} = \$c", "\Psy\Sudo::assignProperty(\$a, 'b', \$c);"], ]; } /** * @dataProvider methodCalls */ public function testMethodCall($from, $to) { $this->assertProcessesAs($from, $to); } public function methodCalls() { return [ ['$a->b()', "\Psy\Sudo::callMethod(\$a, 'b');"], ['$a->$b()', '\Psy\Sudo::callMethod($a, $b);'], ["\$a->b(\$c, 'd')", "\Psy\Sudo::callMethod(\$a, 'b', \$c, 'd');"], ["\$a->\$b(\$c, 'd')", "\Psy\Sudo::callMethod(\$a, \$b, \$c, 'd');"], ]; } /** * @dataProvider staticPropertyFetches */ public function testStaticPropertyFetch($from, $to) { $this->assertProcessesAs($from, $to); } public function staticPropertyFetches() { return [ ['A::$b', "\Psy\Sudo::fetchStaticProperty('A', 'b');"], ['$a::$b', "\Psy\Sudo::fetchStaticProperty(\$a, 'b');"], ]; } /** * @dataProvider staticPropertyAssigns */ public function testStaticPropertyAssign($from, $to) { $this->assertProcessesAs($from, $to); } public function staticPropertyAssigns() { return [ ['A::$b = $c', "\Psy\Sudo::assignStaticProperty('A', 'b', \$c);"], ['$a::$b = $c', "\Psy\Sudo::assignStaticProperty(\$a, 'b', \$c);"], ]; } /** * @dataProvider staticCalls */ public function testStaticCall($from, $to) { $this->assertProcessesAs($from, $to); } public function staticCalls() { return [ ['A::b()', "\Psy\Sudo::callStatic('A', 'b');"], ['A::$b()', "\Psy\Sudo::callStatic('A', \$b);"], ["A::b(\$c, 'd')", "\Psy\Sudo::callStatic('A', 'b', \$c, 'd');"], ["A::\$b(\$c, 'd')", "\Psy\Sudo::callStatic('A', \$b, \$c, 'd');"], ]; } /** * @dataProvider classConstFetches */ public function testClassConstFetch($from, $to) { $this->assertProcessesAs($from, $to); } public function classConstFetches() { return [ ['A::B', "\Psy\Sudo::fetchClassConst('A', 'B');"], ]; } } PK!6iipsysh/.gitignorenuIw/build/ /dist/ /composer.lock /manual/ /psysh /__pycache__ /.php_cs.cache /vendor/ /vendor-bin/*/vendor/ PK!/E_ psysh/box.json.distnuIw{ "stub": "stub", "output": "psysh", "compactors": [ "KevinGH\\Box\\Compactor\\Php" ], "blacklist": [ "grammar", "test_old", "Documentation" ] } PK!a͓͓2psysh/756404bf2251edf8e3711bfa0a0cd519e8496200.zipnuIwPK u2O bobthecow-psysh-90da7f3/UTc]PK u2OG% bobthecow-psysh-90da7f3/.editorconfigUTc]}M @ 9Eׂ\@JmbiFfRގX7^N)cyb=x ʝ:{L^ t•4lYGLT8&Ss!7vccYXv^PK u2O bobthecow-psysh-90da7f3/.github/UTc]PK u2Og/ bobthecow-psysh-90da7f3/.github/CONTRIBUTING.mdUTc]}N0 >pCݍ08RiåqS=N{B0ĉ?,zNâ8:Ԍ0 Bs.: 8+ZHU ޱKrzCѕ|Q0P4EZdɠޯ%Kq&G돡):報UWjB!A I  x;mw[1jJP+ h?h;a e Gb6.U!햿U n_*[R-<ΎZAC %hp.H=JPX>7z샴RYMX|F)çP&RB&A9}# K%#%MFiE)dznD&*Ѓzi{3/e,D0>o4 ]kGM,ϏhJ{Y,e-T]'m wx%8ΊY>.H+H|חY/:4xF.:&QU}.#Xj?{gQZp䦾f9zTPy-QP)~X7/,xٌ}9\*z2т->M?dhųɬ³ga~A ڄ_s)O@8XV>q˒lga 05גxsR!Wq\"dp4;#hݝzyw ޽vILi9މ^Zs Dt{xtWu58`,2˦0] .U^!L~*K;!?f"}9mߵLr]z<𣸞 u2MT;z"p "(L\6P+YX;g J=Oe#3 =Ou֗L^$2q:t>Nl@<51.;ei%|dUwb/]J?ʓAd =}|mGPK u2OmK$ bobthecow-psysh-90da7f3/.styleci.ymlUTc]uM "rzӠH'jVߗ3uu1H0EW3 b\ ;&jA8 26WR0GAoKWJpjj@wpfiA'Z@60Gh@=;-iܳX/+P2_PK u2O5w_# bobthecow-psysh-90da7f3/.travis.ymlUTc]Tn0}W U-[BAқIة@*Rwos3g&-S6$Qb2 !F  ̧i,Rmw R٠D*Uyf d<{3?j#L0)_cKױӧE˛Kp|=k/swLEo6NUz OOpr1ZaRB0^_w Z+Sr 槂)!R*e6DuxsGMYkY=mTIw^7Y>6]I.9rq_0GVkvN =޳/ ݿXJ%Ul]R޹`%2yZVH[}'W$q}mKPh)A=i{ݍY@1w7PK u2OyC> bobthecow-psysh-90da7f3/LICENSEUTc]]R_o08婕XiڛNFYp'#lk; |gda%գp=!=L{kO?fIz:8/pua^MG8!2E=Gg&(lkAgG|;w,bqE:6\aO  .xx=<.$&>8WXy?'Й@=6]hƝ&!g;@] a":ޞ>&1iDI1ŕEߺv%Dkؙ}'D?:fh=ZZp~ۑ0^^.Nj7j1P?gT+o3X `H`e^m$AZ'/_`M βxOD\Y?FRYAQqY3X%/% +$PS!y)z#a(!m˕@f| g,iQD)A"Kz'S.!as]*҂uB2O,*dqnB=O*yUU) $Ba P u"$+ٕ%>z0Kh\M~ PK u2Oe{} bobthecow-psysh-90da7f3/MakefileUTc]Vo6WDW[9h\a@'ݮ;d28M;zϲOIG;m&$;~qpІ#1(DaDly(t & J/&O;]g]5a~{)˄4f̒r E1 4x\2pT),aK^ zNH:q?2N) b%su[L)+rO"nP3E1]]OZ0>Ti6 yƁ7dJE,lgB#L !;QbOb{m$則:qN[}bF;Pj98.r;5 bs]FLNV+2a޾aEioׯlk*fUGtpJHfYޝs`.X3*}rPUWqkTa}4 6 &a۸c<`R>_J?ӽ$0'$Ŏo5I@3D-,+Ԝ?|t/rk&'_4< aUVOUB52M0$K{U3V @}l鵌ۛBJk A嘐I-#_F"¥! 0x 3hDȿTeR ?SC ?vbݷ~~n+۔F҃u7ͼS5>1ߧ sp_8Yh'XK^y?[? .:_|nsEoPK u2O'u! bobthecow-psysh-90da7f3/README.mdUTc]ߊHg{,&n3= + xP$lUrYQoAZa|;wi٫PΩS=qp t)-b\Pj4JuҢfjyQ)22k kW /0W: QpY`?⒉vPh" az2.2-!WYfm ք(L6&!LLtnRnrG*jA;"jč;3i>e",QdyꛌUPBmekD0?J v݌tpOI5j%biC&XJ *BC% 8%ũJN7 ˛3oyT#5Y;n}\`,0lͿ6gZ؋x]0:*;]F P&GG^sn2=b.SB{Moq` @o w$QP 0UT8GؤZS`Lz"[h4(m2ɤwU#. H]FG4=W7j^6Kqjp<~x# GްqÅ7`Kq B=Xf  zMſFd@suN-Z3%-2z^Z`?lMW-";ìz[_AI8~..[*wl;Ȅ容~'k|*U:okoSX+nhFeOzHCy|PK u2O bobthecow-psysh-90da7f3/bin/UTc]PK u2Oe& bobthecow-psysh-90da7f3/bin/build-stubUTc]_O0)Hm!; $ x\Ҍj5w{z{Ck%醗=L8ЮN; BK^?v\*Ԁa|E0"e[.]e05k$\"K驃&&;t6)UxeZIz@Ɨu5p!q{ F?"~|taʆKFD9rθU2AH-I6a~fl13!8wLyaҚ穝9D#X*]oș/PK u2OV.! bobthecow-psysh-90da7f3/bin/psyshUTc]WsFb3 :2-I0!HIh8KgKDT)޷w-Gj2}};RQezMywgC}+lj$E);5H&r.=~xoqJ0k*EV$$ E<44$dB:Ίq(Ou,gfޛ!2Hh EatJ-C:$ %~0D$, $ DBe"gQR)ČyIBbQ5T 2s$H${JL?xv f! (E;fp9Rr1T2]; ט+%_/^|pxԥ:FT=4)\ iݍipl<񃕍 r|x엩.G 鄌Gd9<knMWO#jۏMUdyA:MpӳiYM*GutX(J}$#4#.]pީک VU.m彎N~!Du>~^!vuX[Fez`, m,tw4soG t"9my$i1/*K[%Zm:ke0 ƀ(J&Ȍdv=E)/#O>8J9`D7d"[ >O^d_d=z#a^Ƃؼz-0+8s| O#]-?6keO7- 3/JL]HlzH 54Oe1r4H|Q{d/ϙɶ4@ 6HiPE Plyf=g Hnوo <%ZSSHR6=+u,_4UPĹ: XG#m5j|مT{E tyU6H&J޲7Lk.p` 2rB#R1#P衰G#(E825kpsi7RJA}8DbhM[4e Wuc`t6nBhfq$e"?N=АLc9}]*b?qBRɜ%5ӈ~~2jH,UJ";ˀʦ2KU4rQT:*}FoUm%Ru眊B:h˳I{zh ]]@H娜,k%~vr?{b\\,>z8E[*k."-SsJgu{PJeNbx˔L%r:wVu:˸p=$`Q}jQ*huEZ6;hVE񸾷.Xu=Uvmk;Σ{_pX mɔ`8XPK u2O|*% bobthecow-psysh-90da7f3/composer.jsonUTc]}UmO0ί lHI0|ċ&nrԱd4)_^dImn-HM hJz$ 7,q0\2Q*F鈶PW`S0SS^͕I-DIvIf~aMU5˂9}ܫReցKT]t2kjI·:/l pW jW^+Sxt"ZAª >tO>l]MSS./7/*&JV(_!{cob]-vL# )$=#2ϸuH*ϸ48tǦ8Vr -!ގ7!Y1ƝO)H~)w`OAr<.\|u1+Vx 2֢ v@$meܺ.A_jHdc2#.d9A9<Ф`SnVə 9~z˚/*S{Eu'PK u2O bobthecow-psysh-90da7f3/src/UTc]PK u2O.[ ])+ bobthecow-psysh-90da7f3/src/CodeCleaner.phpUTc]Y]w6}@rr*:뤮,'uN, Q5EhYg3H$(ۮN>$b03ܹ.ҝ\-$31T(ȅ\EA %?}wL*O0kIc+r̲("a/D YR+3k\,asBe.s`\EI!*glN`ַ ANnMt>9A ]Wb|u`=i/PmZlWגAA(d5~7i&gc1*[$k<,!S!Q<;@hԐvDJHIP"Luɔ)*MP$(dAӔ]T@8g隬qOH2xʥ̘̱ 2θ'3d_ςߌaM{ ÝNjM2Ero4?]#v'Nv^%8@3uf441"_lDfy=Nr!*‰S+ej T f" %˫4l.{I%ر>M( z r `"D<#27&5(jDuJ`jՂlHȮjRZ5p$3(o BpK[wev?n*>gzɊKnSJ}5N&H}UhMbml7!}Geޱ*w=1\={. b9 Әi\ Oӗp $"Sdžgû jTΈ3!ޣ ":gW5 v]{tE!ZeU XT"P (mmno n@-7*_V &dG%&L$KBP o($,JDaqWo w*=.Wg"|XJCwH^b:cI_a&ToD@6EUx(L !ۺj[ۨhtZݤK1` |F_h,jcxϿcx+=U^ƱCbl'~~8ϫˣ`|`|tq=M4 [ N#%f\x( _ZaU8c3uR%nsu(uK7܏έא3uzͿF폻 MmQ$V9ͻۛגhZ~/$ =4L9Sl4?PқT$rFΚ'G1J\('@|ɾn4 «.h, cR` <+rHǣ*hD}!j[/K%\MbQi*-YQ#v5 i7Fx0R UHm'zゑØFO![0l: iq%']F5+:Nj֮t v=Α׳:;1!oO9ǃ/g].6j հc^[*/.ncw|sJrכs&o`_z1aVgzʺ.m', 8?%ot׷SVKnοdE00ˌ̗\hgjsL0FSB #(}\({A\6 f`I(hpb>>3[]F|jnyz5\6LV<}=vHhL&$_^!`BϬ6t[谶sRү{w2wҚ@K:[f߸p, ӷTtII,#vª{``NwX- ]H- tb}4%Ye;`Ƌ @8)&V= bobthecow-psysh-90da7f3/src/CodeCleaner/AbstractClassPass.phpUTc]Umo0_q*/2*DM]辕2ɅXJvJІM{Dpsw·")<ăp1O`RCD>4}G.\_JsTD%!.¼XIH40AC<8<)2=s\sG1e Ӱd "RcKP*/e(B * )و#r!P=$O0PHoug) WIU r7~ 0nfX\ne}Cv6S>,C9=)EUїY_*d"e\p$sGSRQV ]Wm#"R/#~x@i=+ UL::Rg 4m.R3Ѫ5Km20Q)N]xmgFi@"]fQ<~E#f"DbA̬9pM;}x׀~ݩ-7jSK[(8әz lN&nXcJ:R@F``L-{m!"ȅAa2:YAt4Lopi<~6- Է\ Qo|5ϧvW%4ldՍWsAp.œ2ej4Z~kX նGuIݦ}B#DHK|'\}*~[u;AssЬP4 :t:p uiJz!6tAY{?PK u2OoW B bobthecow-psysh-90da7f3/src/CodeCleaner/AssignThisVariablePass.phpUTc]SMo1ﯘC #)R*MrBj[ږ DUc_*>x޼7V,ep߄O.Y? E.]xϵRG~Uއ\Aj0ɵ% Ҟʸ 4 VQ&4o*ؠRTF.՛@%"Y"o\bʎ)Chr,i& 'e "Z\I\&cۂldƀ*wθmN ݣ%=ș8VJCa|r?DGl1: +t ɺBIBq^Q-oH̢tHh~d+Ua25 'A80uDzM| bDw i%O".@.ƶ_tRx\\G;9 ﱓNOwozc.߈{Do'F"V'hoQ5Eu hu |>:m@nv3<=g9{PK u2OGƘlG bobthecow-psysh-90da7f3/src/CodeCleaner/CallTimePassByReferencePass.phpUTc]}Tn1}߯JQ4j*iRiR ,kkloU_q!Bî=93>RU'+@J6ð@;dV لGm|%y,M.P m5wjR&$OLn])FAGw}Ko)pB!LLԸT4ID2ȃ$1D_ Q=JauL эnI ʍ.j#{B[`(lft&ۏ.D:uκ'Y!DXkC!cPRvP%m޷L=9 [z#ϗ}9lm,8,#f-*+׳P8;0 ;nBma60hO'ռb;au~|aZ@C>ݠ,L0\+f""y[$/PK u2OXgn[R ; bobthecow-psysh-90da7f3/src/CodeCleaner/CalledClassPass.phpUTc]UQo6~ׯ^-N箃l #hR\Z>[\eR )+زaՃxw}_EDtIKk3o!#ی[q˫_^YZ'P͕kmeL2)MH2eeA 'PNr޽LgS*qpT K+i*2XҤD+ QĖm!p PlFQT"MVcg:SYw.͞s]t" @: n\Xx~gt; ާ\xScyx6-~Rmďˌ,4J zl-•8 pYbMT+>Pʍ 珬蟈FcI\7Pؒ0F쩧6a\BDЖJ}dàjǠ/>KC?=/MjZo@N&~D燧i(shmMjUWA]wgCl SgP)ckׯtfeE$ϙ.G .;S&?gaIC}\R{{xɞ8K  ~pio*&+ȄҌ/2ƚwTp!; zT9W:U;Q;q٢i&2 ى\CB PsKQy~AanB}ܪSL_r ?]aW5:9o&%r0hw+0l-P .:N>'B#] {!ؘ>8qdtc."8SaǺM`ok7!/r_#U!o}] hp;}0jF8I̝ױTw?ю>}zlhJ7MZDŽ3(ԷJZw9 U.>}~Ih\cj}'}C |Ǎ3 5b[˻׏j\/U#N'jlhvV:d@5C4F g3p AЯ+$*J Jı^"7#V/!Y}? `*ܛ%X{ζ1i$8~{a$zE=_Et:Ч +d@%tYY p:?ŸazC)aᏘx"l9crD>2f[*D{xF+T2DOkȿkTL*GO'g4OuRΟKG()CwΕ9֞sv)HRc'$.}֒Jn_kQ .+>ꕃ{Wm IB Y`|cEZͥ\wtҖi6JxDoxB"%!Ek?9ݧ!=*8X6d;@tOtӷ"l]Žk-v-a5fOZ>ڑ9Ehg! B/:Am Y黜PXو1V5egDS<8pPwU5`PN-')\7wJĞN0/SM!8) &{'N<Ȑee6h^=Ftx42rg\j5Buhz`82>qD)}/IHOBNlIonHBFPK u2Otc 8;? bobthecow-psysh-90da7f3/src/CodeCleaner/FunctionContextPass.phpUTc]Sn@}WL#S%45j*"K%Kbfmͮ(;kb`Ks;<v Dje\,Kiz!6 = , ~pR:d!.,ߒ\$ !**h)TVei?TI$Zh6$$a:+(DВ9KԹ`#2B8NH$H3gl)-1^G -/P&ܚ0"2:U/ʱR|gޗ^5zϿDp 236V">!.nMb.[u*-ORX?%zkl\K?:Q[c)9ye3& Q`n6l5+>1sOPQ[x}58TSnNa3oV( 0N!6}jV>7׵Op;V p֫oM9||_Tõ*mQz05-RPBl'ȿmmh3Zίv YwM<`*K68^ @QYp`HDm(׶9SJd񑸞j![L9GdqBayUBDo:yZq{ ^ U $jE 5^OhDom,uS4\bX-Ph?Z\mvE4kgF~azRU?r\XYĔmKWnouIp JڰPW(lf'U/]`l­u2:MSI zM^u4*nY>ևpo<)W^`^*;pPK u2O#5> bobthecow-psysh-90da7f3/src/CodeCleaner/ImplicitReturnPass.phpUTc]WOF~_1IPBS*ѻ"*P]NA gmy Qޙ]Y'P"fv/fqj [p c! Dn `W01INH:A>}<ԧ??6R5iͅ*E~Os01BT$ i,6 T Pi4 #SՃ,AAVj8bS6 K!rZ a)ML'N<@r"9h'tpI.VAFq6|2w,{@yh<{0-G_G 27+_+c6IkR@34p[`R[DhsT RH6 )U( 7=Ј_Ajj[?TAX"q]UΥ)__jOpRxԌ= $$:ͮUp)mr/DsZVCބyfV@m1%bB$_t:g؃N .۫3Lݯ?Y@oޟW%@ *E?q4PxVxX2ʆT{[RlηebƣW`0 D L7U okt)l Dtlڎk[I@t# hѢQ}Tn3{D- s_[*Y?:J},&&|)G05%6;)u$td4p0ϊjb&Ւu}%C)$oNmKO dV5i#5S42˛O&h"ʍZD@P3И,njƀcLBRi8yRCcI=LgÝ\^5U[Se2FΙIfo„Jm-2y#lR/= =oa0ksKlSOs!΁kdi4~hib8ZE?He-PK u2O!+[2: bobthecow-psysh-90da7f3/src/CodeCleaner/InstanceOfPass.phpUTc]TKO1 TJT)xg ?ձ`AI+B%I͞E5@ȎnX MyQl\2 7FX9ʖ8 7 Rk]z^d~IP`NTrKUMBPUϱc#Bљ?ᴌǃ|ZT”g C+fnA8ܓ4SWHz>^#!W$63ſl;a=(،4nV}a_n1/&,%z>hޗ OC6`[`<,5M>-nòk-:$ol6-.:vwag b5mx~-q|V4(o9RɛQqzww{UguJJjj4KPK u2Oˢ? bobthecow-psysh-90da7f3/src/CodeCleaner/LeavePsyshAlonePass.phpUTc]Sn0+DvmNE[9 phieVI"%e;c@!G_BL\mk 5P<(4=ĮQ5o{4Oj%[~tBhzc +$\+Xsk4wk6GD'(`#=}6:(0UB^Tc$9dJN2rƅ t=o*-{ȕutZ.͡ md])<^c$exڱd;@] : SbaΫHtE6 NƼ+#%נ\p~59hohl:B >I~aSQV tw60NLc ҇Was4 LSȎܲ N$=zv}gCd!<טRѨ5#)G1/PK u2OѢW; bobthecow-psysh-90da7f3/src/CodeCleaner/LegacyEmptyPass.phpUTc]To0&1T*!M*1uB ISDMwge w;Swy<&J[m!_``^PGaW_|- PV&Trk ªLSbeX*T UP\g\HQZlP a j,-F6j EM^zB&?J(+4)B GBGYawOBKLk5چX0 iހv =TFVԘ3h-T1SD -<#7ϐ+ f,!e, /SEukԄ\)L10X;sqkQEZk#,IOY$ss2WX,=coM9h(3?i}m҃.qM78}a')l 3l#n\:Cs'Ԏ8hA6:@Gѷ:<9cׄrԓDK-*j7Q!RI/[E}64Gʮ)+{JE@~kgEu`Q #B,A$ڠ[O#vм =Sj-qB~3B/f̩txRfK |4W4tP QimM-|(k?u縅J= Vok^PK u2O׌v 4 bobthecow-psysh-90da7f3/src/CodeCleaner/ListPass.phpUTc]WݏF篘D(޽: pUW>o^[kjwvm>l תo>qj5x ӀkXr@1S%u "pM^?¯6\G2G LL?SW& RT d b7`8 (g Ӱ(\(d#)Z5SIBj i)j6"Zl6,avK/?`05_D&yG SCD"*QwYJn}mgyTg] <'&<|Q,n ʅ_5'V|mE֙y$x25t䙀H5s?7dاn1K֨4]! 6çQ wW{^$};s䳍کǎo TPGK3k&*ɔ+\|4-׮5y}3 ),Q`qyZ3o^wµ,{/eW#}UmvAek F4Jl|-זu)D ̦5hYs(psXfL-qtctrJu~J뤢?q*v i\f%9I 5L&,"6pR M%¹_qp4F:#J#I‚T.M4bI)-6C!^t7X6kz;wȄ^^?rnaϗf{_+`XK[Y$;@s*,t5—nA8 ftĔi]2WNYK)h"#v'5dpriW_v/[DXSBG>K"9o uLKnz:]> JAYdĔOK#tٶÁ*_G݋eX:^>n%ޥF,퀒8"k`ĶҪņj.0(̥Ӌheh9OTX&4(#P'= ~*s'!a&g7HY?笎 f(r 'm=$H]pʾ_GU 2P ~t7^p_ תS{īW-PZT |uGJ`#XqQ 9ʵEoVw>DZ4)ƭK+7ŞqŖx8v cwC/ۿo;0; ݋ +qc۫P*diC=]1+g%~ssyΚB6fIx-iͩV:9E !OP'|-9> P)gkv :='eGKL&4JsGM@4[6V;u]wEq)?֦qY_PK u2OhW,> bobthecow-psysh-90da7f3/src/CodeCleaner/MagicConstantsPass.phpUTc]SMo0 W0 v6[O2[=LGb8m1]u!zt5'*mI롭`aݠ1g Dp)o[p^|[[IdZ BvV׍I%3Pڭ1t%n5{׋l\b^otPj%o8R]B&*1ArdyƉ)TL[IKM]gy Ic"Lr4VHVYKWھ9~_i|~ j()|q=6VpiI :u@.)#g!!HCqG^D\$aJKX`h,A:Tn 7 x+MBs7\ـ;?]oޢؑW}9& ([T4' yn\< ĥ+H:v~&ACIɨFv(ͯ_y#qx:d4z /PK u2OWU?@> bobthecow-psysh-90da7f3/src/CodeCleaner/NamespaceAwarePass.phpUTc]Tn0 }Wp@El}C-}BX,{4K IRtUELO8THDw<2E)O)Exg?M _hWTrk)BRJ |H4N`r)bia'Lqw9,cL\k wgc|̬ >ЩP{m,I in}@-$2Be)iNj54AAܧCy8.VZg&st1YՙmAN@=TC"PhfAQE.hs>{ɰt{>],ԗ0 T>2Jlc QWu*{oXI"ChvN$ݢtNː|5^^&ma b _H 5!'98 :\f(A$`P:Y$t 0QMT|iB{*?'H\VcA$zЫ!Jͺ ïB<0k*NH̳9 :_hzľv.]&ElC\*b1]I5uN<&_h^A"vh+z8LRG?%Xy`[2ov2<_ :/,~ VXLTK+MoΙGy/p=և^ٙ8n>ue1mE_(;| PK u2OLZy9 bobthecow-psysh-90da7f3/src/CodeCleaner/NoReturnValue.phpUTc]uRj1}W̛/8q m0N/֡O"F$tcJG VEs̙3W^TДniÄːu'*67z79Ǥ-}DAr%ecqJ$mKF7l#*΅Lyo5˧j]*')(#:9qKG"] PE\+#,QrXQiFaFlzſknkFwšj55FH`kj`%д?31#iF17 :{%a$y[S4Ke(-N; @ea[ 5%ĀRRhEHttr|p\6%j]-Ϡ\o5{TʙNܦ-= BM`HMqFw9<Ton^oX).ۦb_Ǔ30W `?ضݙdQPK u2O5,s C bobthecow-psysh-90da7f3/src/CodeCleaner/PassableByReferencePass.phpUTc]Wmo6_qNͧ!Yf苑݀yhʤ@Rq5}Q-rÄ^{/YEaDt(GSJw&'3[M"",Վ;tI?J{ ]\K>4Ӕb-%PbnSc+R`^E8?t3`UO hj{9 v`3%.H68K ,Q}\=7 l(v {g kCfnpo~\}%>J2Ck2i;x;}VqZ9 bq"F‹t`3GHe6Nt_rV?{bJ\sHxIVN:.3si>ny]m/Q-O?Ow77o9|޴.ƍV?|~5 G 5%mtoysJ'Zq1Ţp^Zmtdwv!gAQlB,-8JQ 2pک]R^m\Xsrpwi!z!:8л2wQ\0ohvmK=F?[A9IS,j1TZW!?ozeɼߝ'v٠]'G(T\)V 4];t1HL_H)؄`b& Ba%_P+TJMQs*‚oΆaŇ>k. ~^i.3! Tv2[^wip7|%sJJöNO;Q2UL+hv*y*r>ES`RBXi!q]t{K`a^0mFO;+6ac(|V::h6Om4gU)^ԇZk [h;xk3\{|\_&Tyw܂9X1 ΈYx+Z]NG%EtrhBqshnQ1cp̏'\T~_al%\azJ&E.0 BBGOߧL23E01tsL~Opye`JenφU ?nZnJJJf-GUfVZ|>q>Э_9|V`8|]2'>\>_ގ.OAs_FLjq3*"X>V7~{3="I`UH\pW{ٽvY;TjUzuFkK]ԗklBwwdJ&Ԫ<n|T\3hǶA 9`k!te13IqeڨđsJU$Egf!tT -\yvr(%JX+댚Ni\@Ya"Ds  isE\a )4V@QLn7KTx80b1;dn`'ߴ^O̹‰44&3/kudy}T#%FPYwH>ɨݚz#B.%#봞Ti.@2(m3Lz%I(b50R`.(;S3Ofk!RDAc[>9?-#B_x㧐.,JR*g mǁs+DEj n0 zW;34 ё8z\%z~y(N H3YQxo3Oϣo5vwkxX˼^xu\N~aiAqt_ĔSgzU:`Vʂ`V  B៤Ru-0b Vulei䑊qhjN_"FvlZ,H#tV[$$`dfЂ]; ~,{u!x׏^L+|rLd!*SCW-0A \ I\4mtX6ecpG;1}{kYG|ۂoZ]mӏA.6{SN4^n3CeyWUn~[E#:7ohw_qpVIۥ.KBtQevh[Q|͕} 1 QKWV%wZ,Ԧlʮ*]==jZhF}TOW_=ϭPK u2OuT< bobthecow-psysh-90da7f3/src/CodeCleaner/UseStatementPass.phpUTc]W[o6~8(.Y3tiVw{興L$eJ.aLD߼H;=1}%*dI7vKH Hj g5Y4J21"I,)HҭQw#CU LJ88[+|o^_\.X7EFX uF-2'C($3P+iSC?Pz4D0V5&gk8x1g۟2-0yr{VnIgҁOi k_NOȍI*DW)1uɕIGlso285e? ) Z2x_-g-%֒L;idxV)/dJ+뤸=99M`)$k)vg% tE `DЧbeyAf [SBiא[3r1;0Jn@>8CK5Xy5 IrGt`h@ 9eW~ljX D<(}GᬗT m@Yw%Βii!!h7!HM.e)59my6$/iY{|kKY<8&Y?D&Rߢuq)Б4n0GiSG-i/жRH\FsJWm-dDt}YmkD>\,f0]'iruHla3~ Sqp4{ͷ=Ѫ>D=<`r SMѬѮ_U2<cz=`,qٖJ.^xCX˿>nP% )I=endaRmiqP-M tT\{^M-%'6F ols4kn6VQgid bobthecow-psysh-90da7f3/src/CodeCleaner/ValidClassNamePass.phpUTc]ZmoF_1-n;W @a{ Tus\\YD(R]Z.73|'EINq9#p晷];<0 B {)xz c$!C~|_?6AᮅE%̒0/^U07 "F ,V a82=r\GWbu\X ~ #}Xf+IKR׋Bd CIu%(zJK5µgǥj] C0ƛ^մ}ulPa#,Lա9oXmZT341ߛo U"05GצGO.  aD8R*Vٳ3(cO0@j)BK\@4h` J "P\v *!\ (m&FJf$qb<kbc\!hdkJ1z%/F0|zYm>[ )4~],WێX@ķā0@(B0#C@lj@Jj9"1Sl""3h[HuC/~MWh* !8 IW}0P>29%s`ZӀ^GxT`Vpw X?p}b̗7+go[ B%a59-P$ct`K`A3=ʒKrDU*I83=f{I^Wႅ~Ik$"#y\Evi{[8?@&E˴kyy)\2UwY#7˳" Ok"x q}w\ajDZ֢ E9"Kb-;1'-i j)d&XqtT; ؞ZFm˻K=o0y攎I`;=uOJw>ʎ4erԑLIFYhԂoJ[!BȼnTLi?siInU$*zMӧUwaIuWkʉim9~K+b+hlQb#=2"Dɡ~=dZ8bFBJ昶XrHi.p]@WUdJIi t75UV8< ٜYm,4Yv3Uu)D,VknoU. +ag N*\iӽ3"NtZ{G$&'wjq*E7/3i}eii,w6ٔsGm,lkx "2Lf1NO O%XOGJUrDe0y ;G͹]1C0VĬHlUdfg6}xFGlH]`x|^E/eE׏MB 3wiֈ@Gr) cC@ƞKyIc5(:B ] b*#TLOp!»n3򶁴fX0L;>$ѧ|8_a{]rW0cYՄdGu6|k>;Gث/_rkzMkKOy8M( Pl qҢ=pvś |`{\DSX'm}'vtjҿ,6VǬNIr>X_Tug)TCjMCmC; jp(OS!- jg^MNAw`@;G8<ӧyI/;_$w c_zg1Z""ER[Wh7x(T)5e:o52ʗŲ]D}v)9r6aWɥb4R|kDm<*}> shyYÔ/1=ADK8Xz'Cb5Nʄ; Q* /"tYl]Yw=?N (Byg*~ʱ-*J\f4 y~aЀU>QV$W ;n9)q廳53%-Z:*D8H-@)ܩ/j[X+gٰ)2 z.y@J.z ȶЫXu&!>eqKд18($X b[?}f%?nNFjd~Y5W RC^k QnOJJu/Ud`tU (&$D2WQG}UÉSf[t p~ĈI3V-CeaZEn/ N%4q;_ `4ܼ9ov݁ :?.? PK u2O.8 = bobthecow-psysh-90da7f3/src/CodeCleaner/ValidConstantPass.phpUTc]VnF+&J%'A])\qD YCqQj]Z!~IgDQrGMRO1n\{{v;uK+c%s1ďuF#Ǵ/n;m3;}Kc]-8m}K e ?vg 9dЕAWVC;.9Z.لoguRVM={SZAU-pߧ}fp= _o;%u]`eN+TIzue!uq6| 5(4)M{M)ox~Sxq&l3[:p{< n5NOmҐI_op-y o~cCXC_ۇPK u2OM,@ bobthecow-psysh-90da7f3/src/CodeCleaner/ValidConstructorPass.phpUTc]WnF)DR@i9.qmH\%vX߫3KI柒=Aw~ofWoI띾 KL;Ɓ^µmi:&DCxW#>I*jNp ²HSt5r8*TF,EPKm2V) Z{v/g9D8X a kPV&B #'y)-R3 Lz"]'0MxEIZxrr)٦C|2Ra+OWwD7MN8΍6zyEZBE̵Tځuv"D< veF/,賅{M8&I!.*̚:GmZ&lm׉|  J}b?YOuHs3Di!j ]G*%D Mp! 'j3a_›̿zULtܳ|5/ơ"*L='7YrrH(=UTEL,+wXA$cĖȩz?'yFoOt9xZ#h?>/\bBG3GO^Hܚp 1Ѱɠ \ h|TD1$G)[y[8;TWZbgr"Ws`RS`(}*&$'w.4$!f PnO^!ן9A_@tI+#Bzq:k4e;XîS* ^vunS2q)6#p~%dtɵ>)Bh<5 Rɬ}$ Y&1y*A5uzc|ybyW_gxvG<2Q/cv s_f:삱 hѹAH|KFycǛƌq0-YRO7I ѹӷtUnSḫRn9hѮ_AٳgFBiJWe,Oa?П [@y5V0>XyMAzE]tx|1&JPlTHŬ]Zr@-pC$lhS·Aɻi¾)PK u2O W A bobthecow-psysh-90da7f3/src/CodeCleaner/ValidFunctionNamePass.phpUTc]Vn6}WLIOEܤ[v*FYDiJ 8F7b'㴈|pf4TZHB\YsEJQhϾ{?:#Z ]A2.EH ԁ1(A'Y '3=\ww~Ol1eW~;.B,3pZ,U&B #o4X2L(F3"|.E6xNs^:##ŭvp+7r.3O3'JRek;iza+ᄚݘ)[E( W$v RK߶"ĸ'U.&[[3k89I)8:"ȇA aGɓ+"^BΈs~ulaVs䧵0=wa/t,yP b1Z3*|99 Ƶ@DΦ0@?k3P*[SQa,N*g4~b.i [m c,3k(IϷVÏLoQ%NW3~z<{V޽7@ezuBGHKF/]l~+ĘV]2t7ߙSಘJ x[xC &Sl`PQ@rl\(G4AfUç. b'$vW4HZO°qHtEz^,7|`?uKLvv|]ua)D%,5VOUl+TSvWxږ>5=fʈ\+.:g;w4vrOj `/ԗ:(iLaY+-rMƒ=&~ %>1X: :_AʀjUT_]#gGBvlHtКj>=QZByFރZ PK u2O$ bobthecow-psysh-90da7f3/src/Command/UTc]PK u2ON2>x5 bobthecow-psysh-90da7f3/src/Command/BufferCommand.phpUTc]Un8}WCQwT8iERNQR/F,ET#ȿwx+; %`K$g朹*S*IF' `OEf q"N|!\%j5TFw[3:!hFUm/4 V7V@ Fgk7Sgӱ5Jnwe%C9$aFQ;hq#cݳ'ob8QAQ$:Ci'+6pIF2r C"sx$`yʲy>9X'k DCa0i8`;tbuBo/N?̮E#0?[deОjZS\Śs%jI6Nn<̓urp2`5ݠ]Čm %(vҀ&oȠ2UcLVpF j(DIc39>6i4Ä,=MC1"@Fv 5 :GfwPK u2O #4 bobthecow-psysh-90da7f3/src/Command/ClearCommand.phpUTc]RKo1WL%](ʥUAi%JQ"[xYKƶ(AQ{ƻ4j ji7gՎaAnk@*@> XרRtafбZrOm畉,ފH}_z=PK u2OM^/ bobthecow-psysh-90da7f3/src/Command/Command.phpUTc]YS6BpKR:eG(-ttG vㄭlٓd kHm- uy{˻Ym=lFҐ 8&KOѩ QT?m[*$e" #9#h!dL"R044fõJn5OC%J#gX[,P@*$@T*D1`Ol F^*+zA#s<1DIpD~eFC~D`[XQx1 'g*$1*NR>0I<9RYb҄YTl !>!w޷>јHS·\3TDԧr78BVP*ru)8|K x S+Ġ<-#[)r+dk2BZ-P;۳Ĩ1vC4`$9Q8+l5+*oTȔ3 }gjox~{Cٌp*ؿ_`, [ܺP_=8U}Q;[ogP%hwMxDPz5:bԫ)$30SXz~Qŵ&Dse 9t4YUCQ/l>$£ex*j;E\:@KN@]om$,( B˿ImNo$enWZ *;җ,Q^9_Bb #SʨSV0(bsCAƘzε eZohFD -GwZ h,z,z4)#s*m*mP-$4Z wN\-2vnqЮFL :rWьahWOwY/FTV 9MB,_R^WA{la|K{hUOI'#4CZ9na/p4@Š{!2kvCޜ3#mэg1~*uʄt~zjt:`0:Ҹ4T 'hF-dTavBʈtp۱%D6yZ1a`)YO ֲ0vMM`kL󁭠}C`plj+o7J’5d1Cu|\%&s*?V]D s7hIwt/Bs}wE x<>^\:OXqιv `K,d’i6LbBjRrvs)Ua2t 鮋 =Fcr0OG枔'!e-y}P+[S0Iƒ*Vޡz_1$viއ {%*nޭ=ϋEr5Zߪ2Dᵍ] &*3Qh<׹Lwa¼ގ+$zG!yMӯ}kt_u`MZ8sz#["m [p޷1^֦T o!wm]f^yK=:t[/&gِX e)h`u3W['R4Su YOKʚZ>R#!:/(ɪ F p(Xђ#r3mwV|Cߖy`,yg,!PSho,HqVTs=ϵno*;4+~4nᆱ"p5fSȄfu7LaxM#) $'esj"lfM fW (ENE7T\)7-(@C`jZJ8t6lZ< Ӻ8J1Ajc.⭄Tei s;@<3Y/x:Gġ*^ջ$t^;R>'#T6l&vaVew6~vK.֨ evGICY#r RD<zw:QD}ϵesۧ F\p{.AW 5Lh`0xI1:M#n 2ffM\z̓XM{8Yc?,I'TI⎏h֒] 0I5^WP>jŦ]cy'Cڿs[y4OG~\kr{q*4#ZE=9ɣlD'ޫhl/]/Х`hq GZ8鸂`0,8oЮvJ\3Vjt[~HF hYmBh߆H> zݹxKW%۵d!xՔ_eokSڳ^R̎Nۇw]2߫%0`t>HW6w1쿃cm_0*E^q1U.+QP) ߋN7竉7^ x `<9?PK u2O M3 bobthecow-psysh-90da7f3/src/Command/EditCommand.phpUTc]XmO8_ChrKW+`>PiMv I ˽D4=g2 {G"q2JMDL \4݇)8۟ߍ/\鄓ϰjEIHyPd,P4 W\Q,e 7Φ'eK=U$J]YD7 l1Tr<pb*0?*Ff9prO%U,Y θ9Jl>YWKAWe觗r+쭲 LRd%yG Bkgk* ƀ/3fdW\'+vHrD<v6i.ECC-+\ifj\D2\!Zd(eEIa:ƻ)+و3 F)TX1I4YA;FӀ{dKVc+fYoMc,ڋNξNng);m@5[8/b1Sn' sg9=zcZ/=Sabn:C2fgMFY ^rCuT@hQBbE~KS.c&3K3߻htz5 )1JDBl^)bF@= 3G F!2c^r7rIIv#)_4 FR؝n6tY/Hb}*u\"ӒV3|!39۪ xn!Hw+LL*ULSӘ)hvWM; g[_}mR:%cP%!y󦆣E^xGr o|4*6#uNti r*4ʡ[PQQ!p{Q5QoYH)H-EFQ_Sv_cfaK9ZϪsVbmE *sL\9rD#HUͱ6jn6j9B\SBRПXLxy06- ڂM3]ZY,{FIF7l/Pޝi ?6b7ױi2;[)h uRvaNޘխz8$wHoRC*ۖZ3 tB ˅c}[' gssBU0KON5Vؖi5h@E8I5q*:Wе& N㎲Bi|hKr&zF'f)CRjcU3`x^'T4<3e)d9\TClHuco^mPl?T7YhiƢOh~yno}}sX"D xc^h}6ۀp\}C*<tz;^&pVa Sp]ob%ünL@yӄ耬-uU\L%},7~r<<5e8&Of[VƗ8~s]DUtVPK u2OW[<3 bobthecow-psysh-90da7f3/src/Command/ExitCommand.phpUTc]SMo0 WN&[Obtd(٭AX"Xd#X0,z$}۴MG Fjhm`js{X6Ԅ !\y{yAw-8/5)kub,J0u uеchrMy7vYRo-wPI|+JQu&XԨHrʘt- _] qfEʝ6^}YB,ӟvFjB{5[cRE'ʝiWJGmag'{F'$) *w.UgyԕgO Rh#x uVʈCƣA(Ikatբ G/ŕCKlzt.!Ɛ=f?>c- NXN,J:";PG5,`I3+vrUE˛Sp۸"F1,r>OsϛypkH@ߜTzO) 1%D!{ }KmʘUR!)H廂SL xR"c+9\ ǭ=1)3ebMWܤ$!ZE(F ryesFQe-𼒼NH.F@Uň:;$z* K&(_M'Jt!H=2/g4<]=pP[=`W+.;co=X䎑a8ړ~ /}dɡrlM#:TSѕKғҝ4T&=]XX}TI:ֽN~) o PK u2Oz0_6 bobthecow-psysh-90da7f3/src/Command/HistoryCommand.phpUTc]Y[s8~Wh~"L7]Vds-2Z#$9s$nC2Uؖ;hZ-n$kP' J- >l]!G{7X*PiYiuSɓdŤ!VtE *X(*9h2!@qKGZ|g2B%qx+\Flzq^:ZRr\qt][ b,QQsؿkAc:D`M5?914BN־Lp dH KQH5.Jhd*ȭbbFgEJ{E )JkCFD?#ƷT0 Wp`$.\%b_m9!@ѻi#zvZ'Q{ǘZ*$ 2o7&.ۖ:c­6؜F$z38^Ʃ65ĂemoW]fP=d=R}H2FBHӛf ױ8u:  %ݹlF׌3 Au$$M ׹Ӌz.q04&6`9'/N{X•yvP7&1M-gB*2#L)9ye(" 8UDL 4r_@;ie9&}41*ͪ_g4܊%9^\9-d44EO4c բM5TłOC{*`<c] ~h7F!C0plQ2Q2bA9-]>S68`2}l-/к.&{k8T̲BD$ " wPK@٦8MA=oo Y{n1+&ni֓ݺN.>%Lz  L@= fdBz&)IkOjnQE<&4q X(sGdfya ,w^Η˯77%QYmj/$ \]g r<`=E*eڅrZyJ(1"Ux' _E)@8p7s)^7ieZJkx%6{WgWEĭ3ƃݮV@?trUbWn/GsjX46V@ÑNBMM}jdKpJP,+C윒S_oa[_< "׉$a'xѵ" #맓r!_@F07Q(ߛ[tOroM[ҫT;1i"%jHoroeFoNqUTQCF˻۫?#&Hm[hq_FiVw;26f"æik+o-0ix`ᔎ-V;d{=8W4̙+QNkrL]û<i?էoѰr|"GJnH1(IIwY}}SkϬB$RvRƠ[Is-g VZr)1]7;ֵ @Qj5dQ@wɨo?.87,a%oX̧T`Gtyx׊u]#r{|[+)`@V!wɁՏ$Xn4➒0 |/7X,Nl15u E n⿶j' pe+Z)o6)NZj0ijkh̬F928c=mh"`_&(%JEw{7p҇Tм"Pj_Zғ2_xʯ!ގ J)Jctb չKOʘ lTl[dWam*=A98cf%>* Y<6gWTY72@+M+ )R31;[DkPK u2O3; &3 bobthecow-psysh-90da7f3/src/Command/ListCommand.phpUTc]]s۸]w d_謹ؾxQǍSۗ> LB]$/IΥ& vdl4:x9"/k #Z1!a 1?{2+ `NIҴraX~atkXfXqz\/dJªY}{Q ^o|RFUmN8w-sqId !@FKzO@ƉP ޛTOK ɜSpL0 /0jr\+| )I G~@D^V[*7V le}!u= 82p.Df̉=L]jud{Hk.W,&USJK ,ri 0JY6!{ұ{fcWْyثztp k'CM|D<>|\r$4V'B0<]|_?9B'!9lU~4z)AG_l׳_?s7\g>֡c mP!؍^:*;ʇV`*Ϡ9 0F zK1?\a7&TStvK>?X%H1Z(:ۺIY-+Β#3#I7tg}ŒwtWULm:,U˻h~iJV 9|n!!p"9_spK:k8O{NHCy؝:BN;yrGIaK?zU3sy_go&3}P Dg, p#r~a QDtgGr~꺢tpGnJ.3'gn>mgq͗(x\W:ɹ1yhw7TCΏ;9<<ޝFd9pBv ЊɨedU@#y0?psBo;yxDhhLחO> W #`k<[yNy28A1Vkq >p7iJ7xV'J0k/$z_̿E No2Rϵbnگʱʵ]?e^>&o1BY88 J 9DJ5fӃCkIx6^F 3PV'T=~=IRcqp~٫Ye%_۠6&)Kڜ?9( ?]^t!.4s!HUF~M]/:BI*B':"o*wg!}7nNq7nO7cR:þvyzv`ҵ臗Go}w/Y{"c RSH "j[41Va~~?RiZ^|tF!-bQl$4@b"TL9%8ڮ;MqehX SZRLg8T(eL(Ap 8Bn WW (iNcC{DJvY[o륙9]xQj;&6l}+*f1GMyك/'gT2<w!KKnwYPzJm0`{P @֯G1#h"郞#YR x r 86"Ta$bB#UHKSb nĺ$>"nEjX+bѕK#9"PōSDX[/[ߦTAchE=M:;?]J8 Dy U㕋Jèq0h8*SǨ5t+{V30#t]z6(/ڑ:0[{tk㠬j#"&4ekLZu;dZJ"YWnVyq^&5oSlkZye7j)%ݦ2q8Ǿn]/y1/bh)3tps8M\zqqx#-D~P|[{x eF1;F^ё.qC#+xZiBZȭT`2seS|`"(4yT3\}uzw͇52 F`[n2!ZV*FryKF5aKVw]_AE"IR0&qeeBT)rs5܈@ Eܽz~1(N5zEk.2T$2~FV"IDj0Xp$`9)j_/APQ"h9Pg EsN|la!kiPSf=վk#  0T`)Q|RL_#M7x~IJ}r iV#ٵpn"wm-aVwrS߾k&Ghמ;#rouWd5$`afתt:v4(ƍo\ A,'U7 Qm{<FbJ#mz"5:̽~8_Dd2 YV<I%'iL.]tx;7o v!To_D5VkIxhd8)tqj/^zU)D\W9Q}˩NW#سZtr838pMiEg`%*W>Iȶ6t\3de":@!qhzhz{&x 3 9Z -zmh6(zjzu+\a뎝K(DxO|{Gf^kgk*k~p F bobthecow-psysh-90da7f3/src/Command/ListCommand/ConstantEnumerator.phpUTc]V]o6}ׯ lgӐ,m 24!ANffa_*X B51D 'Q$YMp/TؒG߯ŒM*,J%&b*ߩ\욈re½ ł([.E_#ť q-lm=xK,1Qt;0P'{?y&$.zeKP2߸$Ȯ:]da[{Y]FIFAĨ_+ՑJ1L&.2U$*( SZ"Aٍ }klƆhn+-۱mt^LF4SX"f9Z1̓WaO%aoIvo7fÝ'$˻͛W.1|ۥ%vʜ?cn%~udafe9#D5vx> 4ڝvXǭc-WRS!u;nUעk]i6xה?>YM< LS MVGgJpcJIlX>+Paj`ߪ1sÑغ7+!u)j!uwY]vl=@0hs۟`!jjK2Y7KGޠ_cs0a(\֭^H6P_#psu.c w\33Q;dqpo9kAWSY32X_Hfc*j.+f,Π3ׇӒoL&Sk@yC bobthecow-psysh-90da7f3/src/Command/ListCommand/Enumerator.phpUTc]Vo0~_qU[ec21 ˨*bq")c'Pi('0q ! ZmaQbP~Ђ. |ɔfP*&AQ3!HҭdH+,B&2&%RN =2rQ0 *뎎 QbJK4]OUd2hhEm$*%/Icv]T~:~h*3Dg[5iCqwV3ʤL*wD~^K(ͶqV<'N;2#vlV{K "$pT4)^W LjPz˩Z0=\~ĬwL% 7?|h ]o>p${$1ӏ3ɒ:?Bbܛ)1I>N,"D`hCE9נZN鎲`J+*[;xx(O TΨY gyګRխKeFj ⽡! ~`BVE/RXG*M%5k$iak 95#k "vIJ}ȦNVdxwZwrwvdbz[r:!aiƒ^ERP) X2o 8c,|PQU7qi6cTĬof&j"j»sNO-|`0|zhgUVLG3}ui Uhr"R;~Y(A n~òrV?U^2Yk&;m/b34m(+`mPUțKғη)eJJ_IgcUqR,P~t/p+:Du:UϯO_oPK u2Oۥp- F bobthecow-psysh-90da7f3/src/Command/ListCommand/FunctionEnumerator.phpUTc]V[o9~_q!!>BF.U7J(rf0V\_$3YAn!b*d( i9\r7wGͱfnftCUIQ(,GS0:$*'ے'(*IlJzD$JK;iT SiQD6q 2vÍ,s̒ñ`~[ZǢLLK,-)2CmZYV s3 =~`SAB%HJzk yAIJjJ fW. on\Y(#mvW O5T"reȀG80pvxx<#.W-H<xZ0he<=!ܞ [tK-gK%ek F0<1bEBޑυk,Q}`( SOƫK5[-#pWޒlV߰Qkj rH:f36 H:)ż/ s4.=5oKm` XQ"N05L58jPH/|sĕ P+lurrߝOMid+e.W Ӛm^Ν 'Dܧ:̊k!YxoIZ᠒o:`9rn]vjp"wuIkOvw?(m4M7Hܿ$,S>4J;iCϽ6 )n2v w[msrwV]iD GQnePowG$~0Qf,01JC 2U:g+9B [ 7|T^͘3pc5.-&6jTc$(,GS0Z$cd6}E%1NDBgPK s\S+/>gyhcnZ,XښOMkӅ[7\;2̭S.?assW}_2QnXGF9&S 7B6ngMC6v0 G(_ƴ=]COÌePUg"cMIڂC,ՖPK u2OMYy^G bobthecow-psysh-90da7f3/src/Command/ListCommand/InterfaceEnumerator.phpUTc]U]o6}ׯ XiEb,āJWH%iV6Mޏs=~{Q4>@}L[PܛV9 1&g'x˯oGY%A^JJHTYk-0 JCdt,Wr@Fg9zqZP͙3rc5TYLamN7ըJ'HRt 'Q$YdtHת lYU&MU Jz/Wu)K%v(,+>>L3Ǣ9 `)XjL+NQ r &WH%E1YJ;q;a?25Lїh': 1l6 Jl x|MDo7q{ T $;<agx,?.n&(iM]0p/O[eeT%$T*KO=~a '$u=9+ ()j$|m`tTnU=#0; থt}˜| !x+FJb=}hWbljq$_h&*j|yq73ax6pF[i cbʶ#4)1O 3f1=&4ztE.&~? ,NK*rtEmu:ne5eڤHS1ݴ>$} q'Ϡ WxbΥU1|zmC-b7G;QY}o0'sVnsVo}Is&a'tNW $T^ (%)MSǕ%9tCҠc~ 4 ߹'te}q{[[ M7(t\߾_^1D[!iŷfh?tŶPK u2OqHD bobthecow-psysh-90da7f3/src/Command/ListCommand/MethodEnumerator.phpUTc]Wr6}Wl2qNܸQ%QKI,"A5 pв&w@)$ =gHq8y$, I.f!DrwI8|]1Œ"R(O$B1r<iL|ID 16NlM:*$ DϤJ2Sԇ5S! U)ԣSMq8L"X_q2Dm@p"ro\.̬th#wpXJ*]0;ߜ/G|:r3&2ϲlE^` oj5ۑFf2t۪oMW b}J@P<ȪSj,պ%[鎹zZjk^?}=_ݫDLj&ْELmfz<`;e E0c+N0>OC{o]e:{_,} !v]yM,_Q<  Uk] F{,D߷.[XEz}tgr:z7NVDE֕/OH)] ($`7v" dC7+ȶR{ػ}EyR9zKXoJ$aq|"Z |x+qք"jE!$^) <KDb BSkn̾|U8jElI%UhV$EC! 5)E 6+ʁ@YEP;t,6y\ GP >VaI2$W9*:"g"ƥ"wbG]na6Ճ`b|UzXk[|8yEmԌ#gv$*;pP?JkD5c.:qk 8#:*QNU%Ls֫OC-ruKb'pdXtC=?7U9j,pM'k~G;F,nNTj蔈zȵ;PZrM* /Naҳ[B=ۀ`^6o^?dzǾS{o{ Ip֔e+%㑯)b#NM2`DrOnK=4YLN76^LNv`LjNYE*ȿ׭a6/e>>v67GRCP&l93yd4EĒwϖL^&6ttgNMJg!#g9g.oh^ճ%{{.(bwX3d ou5HtXpGNm'ktKJ16i=}c/J*K[PsAk-/x&x ѽu%ۨƝKA@%:qJdԾt;nнQo{PK u2O.tC bobthecow-psysh-90da7f3/src/Command/ListCommand/TraitEnumerator.phpUTc]T]o6}ׯ XiEb,āJWH]:6Eu2/hv|ȹ /275lrbJ~'^i9BV *k&SH bQ3na%5DE"1-}K s%)_) &Bix?[ED@>ļL%Ub>v䭂[-ߣޡJȔT $8a{zݬV>nF!Dz?O[eeT%p*bصħ=wc>`&Ȉn{ :ez>gd6%E타ul8( /nĄ=˾U=#0kMGzN39W<% L&Mvz9N[W^c@ؑtuv<ڛ|1מzVZ}Vt v4)1O 3Ϙ&4vrE*a1@&%h&WBWyo.E@.`I$,J[Ǎ Mo^77͆7%*5Av%AY&7;%,m% =FiQ8ş5<4SUx2أ O`ݴ>>L ,ɡuKSyGC=w#sd_?!Q}c l>_ov׷6WA+NlX46Yk89:~G|VT_PK u2O F bobthecow-psysh-90da7f3/src/Command/ListCommand/VariableEnumerator.phpUTc]WYo6~ׯBM mHS#N5\idHY8:rT2fF/oꢎאL9\5\XSRt ~z^?_6\U1D~ L7e ׊Ƞ) MD.U bu8އ֔ iȸ6/)BղQ) mQ$XfIˊbH;O0͜v_jT TuKRЁղLԍA9[R碩P1C%G떝@BZt= ˩Ϟ)֖1T*VO 5pkB(Y" DgVmbgp, н1~7"<_Bf~2ˎCUEXe\%우F-G>} }@KդV(-B%56EwzzgQ  ,M2fF)T<:MҠn"MN-܈#[[jA؃,٠e>`knwǶގ^S*V"#c''Cg|ء-7L6P`jKĖ`G 1'0yU<AhBY0u&ΑZKr ۦ@BBoَH״S9y{|Gi =9#}Y?iVYz??L2$^"tbׇ}l23G8Bo )_.v܀ǎ R 7Z*Nm;ŌjMEf"od^hd*-2?9 9! uׄ!m9+5nG . 8(QC_n ?)kG Rs‚WiU| d.;s!Ā1yhYN[ϟÜrӸ/U[\4h6+gV4҇O(WSZm;;Crk&7(e4j1j̰ϰt/}qmA'0w^' d6kYZ' ۳ŧwdW_+aջ.~X>DPK u2O34 bobthecow-psysh-90da7f3/src/Command/ParseCommand.phpUTc]XmO8_1tv? e-e.: rSH(v fl'u^ th?y=w=|_A K% -LW< {Vy~>|ŏL sZ,9S+, m,WX40y$phk&8@rc?*ѷT)8r$<2@4e1+A"RFsN 5 A%^#ddLX*xz +ceFl$ 9עЁ!DmZ[E[bԖ8e͝A#9p=ϵ5 Tօ7sh YUvnmF]ݫ1^^xMZ,b֘ش{s»)s JgX-XBUlȈ(azjt6z|34;t\~ y:&MnYI1Ѥfw` _S2fdoT6`Ӵo06^JH55u\)Yݩ 9Hv1:2K U"r.v]\n48\1v|y%1s+."V9O ugM '?FSZiiK`nHXYĩUbp/1+©Lʗ ܚc{pK-:$= ', h<BI] 93Nb\vkޕ2*hhUnC;SvJN|@_!Sd++@1XVUv}@Y ? 7@M[0j.<::rGy{+S2r?$2 ş(L{5P-Մٰ*r2RCӚ:򭧜JD %٬@Q}j!8 GaI`BֱP qLH+.NaxcP\ls`%K?)?qkWnСT:jhj.FLrvMYs>ap(6 CXPMW\.*5m.r3l9B”cJ} go禱4i: .cUU^{ŒI[}O*tu؁q g_oΜ2i4*cT :ݷMm*w=scW-'ZpdS3IXCU#-݉Ņ #,OB(ShkU~ x䰌g(oсS:cdKV)Qm=tK%H_ c_*l*k=Z7*՟;v nadL_Ef67 uMl:5`*?= ZS֛ۛUmL]F&y xvPK u2OG^/P9 bobthecow-psysh-90da7f3/src/Command/PsyVersionCommand.phpUTc]SKo1W!RvU)j*Pw6kk[iT3.|tV MƼ`UN_yxR$mኣziG.um2 F`[zI%cw%zsS:IHA%v:>aѥ 5I.%ḼY f߷;xe3x>0-ah91a%%-RC;nd p,\ҵJ!pꟊ= M)#ċ_t 6ƽxVg[m; #(Pe1dU fh[M ٲMOlUDftZ?wx:'~;zUо8L7X+4/q>V&`uDaDۂN'I@c"FH `Xl1&qBE$ 4"PJ8PQP M:X0) cJzel\Jqc2R@JBpY({|"Seh|߂іWtk!xت^VO`n Ho'5 r;[&|s[ZǴ(+K"mꍖ狭]0TsZH[SU?4dI-w"@N@cq8l Hl^M8 %16QU x*)X.5] uGEMNwdSjgxmP ri,`XP$xup<S aqMðֲ|LX"LlF7un.:/(^ztcIiVTuT;Uu4Nh0T;.*~ʞ5BIV\WZ t;l"DUYIQuw+1Ge^%7Pq FފB6@q)w-Uc7`4'|ڎE^9~/g'r7z SuHV|*%<+>=C+eU!\0eF?Mzc~-LPU+!F 6ȞYt=ľ}yVUaeC+a;;AƵa0<]ՌOVI# 9GMm[Z͙*Dly•Q mgB _ A^ k@k2|+!հ(oQl%.z"'B ApFU L~&OX!?!7!YtMދgP!Mۺhz7?F5hrDmYw–Q,ךqpVmfnju v7䓸8T׎͉Uct[)JgM@p Z~Ʃʝ וfo[hr=TrF^KMDUۺ- wPMUYvt1 W @ޔm_؃ [OswY,aЅg=rώO.OG,+''"T0V\,pEM4vn1rjΒ%(8\l^.9tx,~pƗ8 gPDdظߓk`i,e. Sa.&O\* _|9vmQGqYB8B]0F3 T VY34֌ l^d?6UEB&1Wt$%L,B*Èb" %/ `O^Wl#/L .^y|a4{ O*QHu_'%U!?`{l椾J^4PۤSt<%0Hĩ+lŁTiKWwhk>|t5}drfb81phnQxi,X̅emP` rn>w0q¶9$@(¡~\n ZSKSL9d:lHrBYUK2q{IVQ5pi:BZg4 o\,:r΃6.TC9P Eir '(l$ &1˚(t|xt KTtgi058J!F4#tGel  .LC Lt2!XS@>gEbI1؏?2:ې/uhș3ԩ7xukMCf=\~\3F.7Y oP7 u*f&^DK~ 2?(l'9K8m( }XLL//uq /:hLzNi0oIF m%͠v3!\ -E>tUfwz*Ylm?3:IU]ȎJɹmG[6?2ɭqZ(! b GW %V qzׁϙ.1|2H;+8aF-$M3=NFWXd`ا{o }_`~3l큦uSlgV,q!E6輒ԫjX/{q>y'aI*g/C(P]z>z)ftv4l1 Mu*6PI 'ZaBP0-5HR{~^mfN@>WC.'+Oy$qY|_8-T_T@ϔjcLH ]~˘'0YEb_dqT̖Xےγ,i|C,9cd&GIA~>a6YKh|q>Q+_>ٵh6мLmmMN)e|Q^uG-b[I]ӎZzOHd 򢽚Ugmp|&Kx[_ɚzG} ~$y{52Gy٨"ըYIR0o\V4:jb2;)xDߏ$,lw :OºGL2&mIy~oWdX;S&|3R1ۉ%K)-x,WW:ݴ]!B |%yvCg<oQc alySn{U#WdC]A}TbϭPK u2OaB3 bobthecow-psysh-90da7f3/src/Command/SudoCommand.phpUTc]W[o6~ׯ8 H|i48!uY^`$"&I1 Rrҥ/Ӄ-o,&ǀ25sÛTdC^^r9dwp" 7RC(rtЇ)7NZëbʀO!utgfneq94K?oPf9ο^+?BP?}kmb*ɗ3xFQ=UqƗAQԪ}+{+l楺B2}exڋ{c(Lत%DYZ˷bssK쇃 #Llm{3W 'd3s RđJxSi3qvZvaU BFQ[? S}SVG~n!i-)nbRX,61j 0~4,]P^ 9{'{_PK u2OOdp66 bobthecow-psysh-90da7f3/src/Command/ThrowUpCommand.phpUTc]X_s8P:tR2MpGz}Dhjl$CNdci߮V[v;Me,|g\NHx.$Hm]k#v\ 8T13l1 llnO"P$4$T-iaY,8-Xz/ђ)$5 p!@&C!T(iNHG~1~@IY._t6~x  4ogW1;a>dX2qFL%72b&Z&7y[%!PZ4&{`%[;tzS#B,VXa[O2 %M/u *BR(.*Mj$6Q\wA"h50mgc?,:w*sƴcj@dq {ٗE"? |;q] Lf! k*gA ƞq3KYLe"QzpWS3_Vߩ7˛ӫR雔=ݩoIJ先`ǽcbx5=R_ aYX6f<`˚)t'%B.uz1J"YLJnq+2bHρ~Zaj[MX.2Yy@ERDIZC׊C<~:X+BjnF%:0MѮ9l4CCHE<+GYjI) ՉEY5!QL!ƺZSׄ24=ֺ8Qv Uu=U+3RyJ3lQ$ Trg1Kd$2)Re]'7)njrbiŠJ0ըBGZO9,*QUU~ɵzv ך6jl^jaRە\ ka+v-S!m4Ҫ YXbL/TdvTp:]t*j/>О QL E"nhKٛ8 s&cG&aV{m{ǾBUc٣tɽՌ6ÝXyC%ZYaۤ." :Zyç71^0Y!2(;X40Ȋ4 p)TM_E!Np6Hp:ݽ*. EpXXaNDw~륉N\j'qg"qzz~0%'%j)C'YZp`:\NIÓxc֎e([jf4ݰ~v.k4{VJL&4&Ka'N[]= ]i<~E`7 IZE[丶;UV#pۃtm #|S p:ޤ]`f!4pUՖvjģ7w<)@MyW\SvC7 ™n1F|<ԩDsFC*`Ɍk7HC݈L;)xUΙ{ܩz_cCr@(W* Ħ®TLpKipvtX#}/%"b/Vg/]/NC)&i0>G88848rc/c)-UZ0E"YHpd!Bo\ht|ڤ41 *9-=kz ( gr$c%ev@O)aʅD6@"Dnb/\xe+jrKy#>-y-Ȝ92mjHAɥ<ґWZ`Mbe@Žv+< ސShl!؈/NHv8QQZk>T"a >og ?{埩 **) cɺ;Ai*qp.r78O@y8eM l= wfϰz?;5@{YTm:7FFҏT_6[;tÍrX14pj5-E4se¶0/7"w;o_D Df%Y>i lM-*,60(7Mh*CCFo PK u2O2 bobthecow-psysh-90da7f3/src/Command/TimeitCommand/UTc]PK u2O9hTC bobthecow-psysh-90da7f3/src/Command/TimeitCommand/TimeitVisitor.phpUTc]WSF~_LlK& I0]O'ٖlN{wyZ-؇DB[&pap` [u޼zG??X# L>dl0),_hyXj Q& +3Յ78 C݇wj1%\n<U- Xf/~Ϲzs>Z}'瀘:.W|i)υ9"MzQLIgjiwWK7iDvt$Si@>u`^|OE {, 5VqV2 XW&5Vj8qV|ߝnlI 97 9p ĝ9#xH,A}lPK u2Oً["4 bobthecow-psysh-90da7f3/src/Command/TraceCommand.phpUTc]RF]_!f$C:6StA#Kk{'J]A<g/us(.3FsoiJ-Bo݊p 1F? @ prB=:~ۅЯs8A0$V-8FanY hbbʁ]$lP1`Guj28bp.gG葈@@Td,(RȞe`y&O [tbY;4̈́T O u&$T)5lY/ȥ TIJer g0%6u*f3 ""K3ѝ0D4ȼ[-+eNg \$+̈llACCB@,NGz rf(WGAwJk׈R~A$%BYf ;u1c]d8P@PNy3%m:(7#ho BWrIbʱ ,ݔol)gdz뫱*PT@*m{'ֶWmvƒf|b5i7ˮhJTVG#*h>q4x||yc[?gY: [&M7sB 2ex햜==(@."ct4euѠg6*M*SI9 jw$jU;9R#)96`VpB r¹eZ( xԝ}Ƿˋ\'.3)y M jt8496 DPwaT`#G")PuNdܠdXdT`]*mBVͭM-DNA>9]\>Γ$۳F[X?`,ؠ|$t"j{j\xWbb /DE"ܰ$691q\GZkPp]9onEm}jlC\*%?(*԰W~eByTvnu GȶQ[=0 |+:zAԡNZ)@;-yA~N˕@:U)<֗N]E]t|qFC(#֏jdKڙ9|!{[͎ԕ4AnaITO^ •c|XrbՃYAKшFP.Rx&_ _'[_䕱jqW{`pA3W@?Yܶt&e66bE+v osq0KW6l)5F2v2R RnUz R8IRZvCԾ v\;R/oV=^8 {㜤sڿ8p8с/Ք-gy1cUvH븭١}0D{qNj]~7Z-}K)] [&]>OcsH>Htzۀ3*zL;T&j.IJ>\T=W+\!*r_y@%^tFF ڦ͔mkPrj 5"`NJXiJ W4JI`pq3h&nJpfx8੎ O dTe2ًCK>g9XW*Ovw%iXZwjaXK6cwu;GwrFh3Ìb}$fKG1Ud_4ɜ̺ݮ}9OLZΑ$ɺ;AR 씥aD*{`5ZG#˩(8;;ͱ@]eIMھY %{n57 !k5W7i|NQ9kfug]ޅwotS5ZY^s=[&&NnWmy˪iG mS[ɩIŖF )2ׂ;heh?XKJn91Wf8j א_z⌴ۙI,Iv{sg`mHic#B?2 ]_rn;w_=9v1Jn.tݛB w+.4~!Qk pF9J\ pu!w #jarQx!i^6"=ؖ 3:ɴeiP95M\lҫ1\^w 1Q>O(*ݨox{dg- ϔ&o^ȱ/xt{"ȻmޑWa#5=cX)XcR,џIDvnoƷ7e\fM?W<j2y!I~  ܕ^-y P q$f`#HXHD 'aOX3 Bfmx4 $Uz7J8ё*)joPTOb.v0d-hރ)vGG, ִ 4/=2ܭ]_8IV}ruM=[~1L/>zp)\CA"azvdvu3aBY-<&S *Iry.I}[0>,.SC _"c`Bi}ڝmave(X) $MH3 bu+!_$ Cb:_!@ĕV&MǙ1p^ȣEׂJ)_ЌZRrr8l} U#awd-qKtקtԢℬ^MXI)cv!=4 8%,6"2yVKJ7l* bVx=H(V̊ynj5>iWmToACmƸZw$aQm{Z,)^OIads|tZS7K{֛αY: zcX^,of?a{?`g[O-&[nݐ20^dږGYU^ YPގc<l;7eWƲdhȖQ[ !LдxaK+‹3$z{qvIs oaԳ,ty6m#h6[b ƈcs_Ş* puM*iݩon껆qwTA?ud.)=!,xs4}j=~om퉻?}z{`&_R^n) 9+|ٍ]55,6Q2 &1 `~Y돌3UP&0FXpo2YM3Oץ͖sxvٍaOlk5ѭ)] rx ((*BJA9tJXPdJ(>$ eʇT`8LQ} Ժe.[Ȟ#,6tpn2us.# w7&!$mU\%]]]~\\>|8hj}bqlpխ^-2g98ӴD%\;%۸=Qqo-'L2U}||ꯇ"G盩g֋UևN\ʨ_ a=50w,aﴒ*XM*WdW)VJ;XQ~;CM F +%[̚tNK7R϶ǧCoum&Jd~2&=af%fw{)SyQY#R=s!f:ɻ ٺlVralosKjv +ΜȼյFѧ쪡:}7խ2(q}+8ޞm,<`o`ar5e  .L0sM @ʝG?V{aΒ4|,ڝ]#*"ZD{JeUuV xy]:J8Yx!Y]o7ǟb>oqg{:պ.9/w6{G2go0|{y$!u1^G 8L9\CTի5/n. ^|ɋھ['pO7} 1ZڀڬfyQz#dេtK4dt^$BleTPpY۷GǷgx:ý><<>p 1OBG'Wߝ,@GK%u~nbu)Bߞ_\]AFaIeM˼x ̇8ڣԀG#>%5^ /W{Tai֫"/N<#_/EmN2[ºbs tL-_ZПq JR?i*ENdFwX֠EUēx\ETVzygzXֻwY[y(6Bh˚=m#s)Ӗs^48QBcT0Toh J{~az2*[i}cNfm{e 1)LJf-Ds0%mT мE @OO-8HmtMi7Z^:V+܀QڬNr.I {BZO [ydjSe-LԀ7h`1_m 4jqNN\n&\7!{#4,'^-(Q72ZɶR%4QJR?bհ&rmjF;n%܍KZ&}[O :%XXN7P錍0%?Z)}m4qdhhv3>GW?^= W|4IxP ZOZˮ~P{{L+6?if 8a/ :cm ]dp20'oڼ?)Z8U^ |\뷂;v>, ݎ7X. <_ӌeGO, ָسX4p;X_)uG n{c/Z..a@'Cf 3!Q9" !;ZSf2GX(Ul $mѾ@My`cѢ[! `a[v1Xa/6}vuD7/qۃEK-,_&,Qp (x`}/̶+52$kӾ=KޤCH"͑#eYs@AкcŶ֩sZzM'IP%nz8p} ԳdqNʮcr~\` u3TV'ˠnq1?:hERYYx':]4Aj+75HՐ A!˝[2ݝ#хRA]@Yo.}ETj JjsK kѭi)@|RrtY8#ё-A5vjj-?O_kAz 4mCTN˪'ΤO9'piʘ,W5f*dZ 29ķB8

¼40]aÄ3= JC/x&=d'fJLSvdI*LXž&?`/mلq] %& V9<ì М LN9 mb݀p8M)`V3KzpSv% + 2?eJJ+]UqQ`1ax3OY@Y9<{?gțwf#Fw>P  j^bi{9ֲ\x-D,vS=R2HpݕJJ ZzߡceD[Ćj/a}p<يC LHZ|$|7 Ж!OzYG7 ?EĞԢ?>A!' ЦE IWSpITK3QlUŖQRQA>]vS+ c;>?8A{ZInĹ;ИbYb/=7 Hr0N܂&EiLVt(\m/R"7xgl.7R'RaZQOCH WhytOw8Q6>JWu .E󦦓ҳrR o +}';g M{8 5bU o~2bx(ٵDsG%,o Wq&9)hP15Jy̢Z&"4H AjM3,j^vDq(ћMwI,+.jz4՞Pe&I:ڌ}Cylߪ:u}hs[^K%!k{2' \httrfnr3^+TRib{7Wú"gc;"x }bW<5W~Q?m({fbI8Lnw7ST)cLv M9Z_QL(sT%{ZV^!k#If]dQ`ίN=;|{pސ:bW*)5'Tp4쒇 dk9vMJ5ӂкwO򝻻6E#EDG.pV/](oO8G7DF0)2*N4hUIpD#%//h8iγDY1/X-m6ahU}5q௲ d`eV!v> @7s/BA2AV]ycPYI&" өUSѱUSKx%hQܰ.Wt(tY2@3bq X >MяNJ|I .'tKFȀʼe*RfTҊ((4۔"i8֎S;/)K*B ݃"QFG7̫48&Y?Om]^o .n({7(pnctQOZ qJr!B2~,D*/Bu._¦$Uj(l0[Ez6#{ \'jՠRGۼiOH 01 c[WwʪZ]5Cԥ"%0SYeJh*f'tݡ%SCvWPuΟ^gjXfjtK5d.DCgc Z6I~9Bhe&2p6դ F6SPQn㭒v5:wJB,$];u۳+Ha+ai;QĔQm1U,M/X~{ŢKUl +P(KC)EL@k{ZO$-C4$ ^O&Ѧl&1Un{$uv|SQNOjG33܃SSF1Zi<8Ëjj#1C&78wWʩBl`ꑣ982o92 WWYzk]i%̛>W:H{pǫݮP+es`}GkC=?~q@Kca Kh?b/MF/]kNZA xv#gd~ IzDպBa?'J3\EˇhCKItIO8 ~[Y_1eCiR_?ʨC 畎5ti-^O#ߕj:]2o+[{h7sf"]}X^XB*^Rjw73=^Iº6a[c{gBono9kg.p6V#PK u2O3 3 bobthecow-psysh-90da7f3/src/ConsoleColorFactory.phpUTc]T[o0~ϯ8Jv4F!K*uJMbUcGSKSRH]=9;vi3N 19 b' Q?9?şpj\#jJ2)8B b,Ք& $,uZu7p-Ufh6RC#1Z2U!EZg#ȔG_qoC:DDZrZ\Ke[5fm6T+Y)㑆<= !R$U C"&&`d=R:!$juW#12`qnd:N2[={\-&B444gQbNl+?W"ZٲT:aEMċmMvBM>&CuժUf\.׽^ jC;QصdBohW֘'\M_wQ iA~i2[h5Y]*`SZ^(c:.;KG<vF^mO߰9^r7zW`({^|KLg$kUMAߚjȯKsZk73&$Prm* Z!|mֆ~S\Z'ȎZo8kyrPK u2Od7 ' bobthecow-psysh-90da7f3/src/Context.phpUTc]Ymo6_qZd!]uAe(aYM`i(CMHԋCZyT;=Ioka wtϭ\R5=ޙE'P)aVovA&BUB"+F_ Wx; ij~^]sqR-vzmz>:>h}ь>՝#xX+lwϷU:W֝9SUm|sۘcQ4PK u2O-dL7, bobthecow-psysh-90da7f3/src/ContextAware.phpUTc]]QJ1) ړPATTDivɚݝĵ9l7eo{33xuA^'`cLaqz89gbV:FMLރ.ˠC $ b8ޣڛá=ܭ֏uvjA48mfl`plERɠ5XLΕ C䫾V10SqZ2LQfATAHUIj>:c!kvB+)a` Gk[@NQ 6ȕlDTZTJ6=`>>,FL.էPK u2O& bobthecow-psysh-90da7f3/src/Exception/UTc]PK u2O#'[8 bobthecow-psysh-90da7f3/src/Exception/BreakException.phpUTc]}Sn0 }W!C.pOCK![Q4},2 %CE}8iM!?YEQ# _*pCkezgoO\U*mC9!̫<ʵ7ArђTs - _?NgUL1AjI*V3y*Q HȪTr)OP"(~ģ}"R\$-j&/ԏ#+"R;P`)B$h#SzTjVx3Kc3S7IPS*̓^cC,ާ+=.H^gX6KO>Iu~{m m% ͑[[P ,`P"M=2?t-qoa.}f.kS<89_2Vsrnf#Gʂu IX B&\t|b+9(,W%5kЪ՗6kt^Xr>H V0w.MZPK u2O˵:~= bobthecow-psysh-90da7f3/src/Exception/DeprecatedException.phpUTc]mAK1Eړ L&͆dֶI+=5yMK4 ޝ/|`( ej#{T #=5GCNɶM'z0X>:wSeiNa8&bӈ&9()'˫gɅ a甃(y@f;# "0"㔹%cLO=Jӑ%V<^撮` U<EȆ&ҟ{Oefx O7@9GF6Yk'PTp](ȺD"x,}k P&2?Ik$MTS vȑ (Gڪ8+<x_bu#qA)[lTDU|,qyr e{w3N4-'. KFLRSEP91>B.¥k;+2g!\C׼2CD~m᳏@ 7tɝc0QzYDN9 re}f=joD|{ , ǘ_ ә7 >V2~΂֒S2R=~a_4}wǩ:onuN(p +uogM;t $ Q^G5?<`4H1~H$I^#Uk^\`f2tz D UpR\sn -E)`;a145Y}Ȃ1ʬS}~1UP-6prf&]*C=q@3ʜk*}ޜz,moiQ^V ~3݆$IXZʅu]%!ݾE;ywU0C.'_詧πʭ桪/@v)}\&K;{`fIySlĻC8yx @kW@A1'/]Ք%U/BjTDAZR1GݣP)n)gpL(_^RK@x5yPK u2O2S33 bobthecow-psysh-90da7f3/src/Exception/Exception.phpUTc]]OK1slKjOBYQQ֣&MBt]dV0&/o~󮮝tB.UFi0NKjVa}~>RL{!J&i uW*2;f Nr=?ޕ2[8Qb*D)R _5+F5eȕ; gE.wIG[|5L2y҅͟"]B㝹CF2<-9UMeNXHuF+ hڢ21R,і5ƒ+]Ik` '1@AMX k᎑K0|u G2䨝s4r+Ј/VlNM dEJވX ׆y L0r  GR;h!U-nHcO}cQDWWvstNx=[jipļ]Y$x}m}=oUq+T8% :m}Yjxϼ73/s{8Gt4}$U{Gm3Jl{J+>'N4y7;i8PK u2OPF= bobthecow-psysh-90da7f3/src/Exception/ParseErrorException.phpUTc]mS]o0 | YT>Pdn0=(TȒ K}8Cj=Xx϶I'0ߵPITԨ9C*-2pqh=I wCT#TRP&% Ԟte\#H}V?1fJE9T PJON>%%a޴@&*1\& z+ot: „dNtθ `Y!+T(=# ua66"@6Mh7^;9͝?;0@hT`ʍxCHKDhIvTI]\˸'El8(Ij7CsneT.,]{zfj5Fݳm!ёT4!to6SCj9SS[{>͗).>gN?z޳Ui6PK u2O*SL: bobthecow-psysh-90da7f3/src/Exception/RuntimeException.phpUTc]}S]k@|ׯ!qj7OũAqiKS@8K+tw{vBϞ$ IΞ>~:f!A޵*Í{mNEN 'c\_^~yTt~z3IQ脌UT+3E]NӾ*jp{jVoḗ|6UֻFv=_(Q//ow#ո-|aM쭁!-6Ǝ z1 e>זxݏxpPK u2O&pb: bobthecow-psysh-90da7f3/src/Exception/ThrowUpException.phpUTc]}To0_qHO]Vij7$dKb)#PIB2?t߇ʫ k5@oŔ“KEqE).+#zD?j:T`rIJ(H1 M"dK1@Fǵ0~Və5Ӑpm_Z ijiU#9J џX93J%#[6CHq \q&OQAh3^hyjn 펋7up쿕]䬈}"L ;0uvn2[Jqa{w6IKݿnD_3[|Dz-O W\ZFޜ4U 1J,8[cV¼Mp,gc'\F !)tvS##|"ނhiM&Ǻml`?mۧwg VɽʬmIo)M]֦hy>wHOlmPK u2O4 1/< bobthecow-psysh-90da7f3/src/Exception/TypeErrorException.phpUTc]}Tn0|Wl  i IZ(< 0ie(AKrzA c& B"{ɵ"fJ9#C8ˋSz?+cTs@lVRB\{-6"FeJ s+ 5R"\zX9*/fŽHZt3qzE ڪ'R^ǭuhҐ] 7ť0Q=[Tjܬ5"bb.%eJ4.\F0%>9 "'&4Pzdhʦlԥ搠1 _Fj֕/Hלo85ҪCߠ 99Kn["?9]O`g|XXuJO3))&ՍO# _PK u2OJ 0 bobthecow-psysh-90da7f3/src/ExecutionClosure.phpUTc]VmoFίH6 IN*rUI&UDG~('kx{f]ЪBvw^gf"+zIN%R#o³4~DdDڋ%qo7ͭHӸCxp-Lɵ6kQe ;J7kκ1S%Zqkwd2Jr\aNnuQ$Q<9o qc'u7oߥ 3Yu~vJB_ԴouWXㆅVh 3ط[d?dn^@0|YJӾf.= \`:vzY52.*?Τ)@Y4:+&(KctVd8Jt}RaWS{9jXg-IjlJ Ҋi'9&/#YzJӛ99"K)~]H?va̝1%8ƒ$,2VSÐwK?4WEá=׹>sg ʕ*\JLQOxp-_컳{Shr9JI.}ej9Z[ԣ{U1C8108&[Rcؔw.?7A[NJΟmoPK u2Ox=- bobthecow-psysh-90da7f3/src/ExecutionLoop.phpUTc]Uo0~_qNk {B &PepmvU;g'MҴ ?̋~[S$$p_Knì][]RNH%h|g/^+X9/| %S{mE%%pmV<A ʑUhd^hu F"Ghws}5t7 P1_2+ [<$ te9C$Ql0z/r쉣 >3km?/ إ 6589m%7$H~'@'Bs_*3;_Zr䔮o DQ`8s\{JsILC([6ap5iM "GRi_y<9 ̎/fѥ&jq]eހrU:fFI4ސ{qPTuG#}Rs\Lҥeƭ]ef8s>ЈYIh)ׯU /!,ƗیF@ pp8{̇"<,rՋyeǶ bobthecow-psysh-90da7f3/src/ExecutionLoop/AbstractListener.phpUTc]RMK1WC[՞ *RRDG/ dk)NuA^ls؁7yյɈ^ (@q66Q2k 0=Su)CMuenjJ `[5cp9a ץo?YĉGX ѫ*Ealɨr˜- oO);-u3R2,O_RV$Ed=C7`}kOU-Ԣog[tY>#(#ѫX[ۃR]hQ?#J i[̠d˰p;z(,KNT=v?šLxmME'ޱ/PK u2OLy`ˀ16 bobthecow-psysh-90da7f3/src/ExecutionLoop/Listener.phpUTc]T]o1|_h@E)(,GBwƾAڦ-QS|}6(FtHOTLxZ.f +uuXɫ'/>G3d-B>GaRTqr"%KtmRibuΛ'ItB#J<h-C7Mt%Pʼn(Xu˘*ME}{:Mg}8kvk}D |2L ##f)5{Z7\Tm1}ch$ W :gn>8iQ~8ĀuK?|B)h3&yW)y>At ]|z"-Uԇ진MLr$7eC "&9FnWuҐhҠ^P0dV윬 xk'nwAߣ6N;SH]$íA/Is „3i jxj2F4`!O HPf^0%<$^n&09aiuf~q4KLVo7,&MS8'4 ?TB}u7 +c?YWr=nOb% PK u2OCԙ; bobthecow-psysh-90da7f3/src/ExecutionLoop/ProcessForker.phpUTc]XnF_O|(rSŽSӺur@]Q+ikj.-<=Ľ}?(Kі0,ܝ|3W_勼9|aB6`yakfÅȲЪ$/> }W+\%otBYe,e\MY&S NP3],ZY {Rܾ Ա nي6rRZ1e+ixU.Tࠩ %;ŗ7A%tu~?ʊ{\ݸxHEN G_U?7+'a3D2H} % 3l3ΤЩ0MK+Kgo6I'Z8ݶ,DfrƠ^4+ȃN^{ZxGYw)' 3K+q0Bo]A(.mSnl\c}k = iq oNYrxpFsF9RF3@=JcBJ+59 2RD4 K?}zn7J[ڎ\J>;6/^qe oo.~_> οսw P 8K^l+@J#jRTtT; "bk 7 *τsop[Ns;VH]ҠNG}'mk:9َLBdS=e"ߓ #^iƁ}z]!d!Q3i}~wi.A}I^S0k0咥`6*:5f5[rW{752aΒYS?LcGRlwz d|/.6ZRꝔQ2"Hs[UmAgHOMգ=/^95j-й8B?׆IDp mD ~nB41t5OPtФ@(kI.j=R&l}{D[`$ע-˫6Q1ft4g囋jny!}D`6 XMO |p2?)A{v ܥq ?iсmo暗͊~̆so\_Do1/mF:U稤 90M, 7fj8,zYT6G}7H)/^D:1V*ES />\ @ήSv6[mCn]cz~>isa֊8ѫOxV.2W v(F s.Ң:BP)͎fߨHjdS:l;zO=^n>1}jɳTNw76\i*,{c\;1{_ތ1{R(֪zn?'JIyWXR$|Q!LMzOPQވ7i9>j:3k8a(o%!^|M0y$hIr ?:.}H܉5;y\8w[]-Z9hU%=:f: %щ;ӆ_R<7¿v6.26KuR:_Q4|$͸ғ {U*C±[wl=)و{rj֙n&vx+-”2[bk HeVO aK}_RbKbW9xt<굼 }X;PK u2OP+, < bobthecow-psysh-90da7f3/src/ExecutionLoop/RunkitReloader.phpUTc]VoH_1RD>%(%*$ *kx/];ݵC!&%2;pIYL &rh.?o=qR m*@E4}1!Bҡh|WؼMP:vk9fDWSPхuȄUP6oBV̷H SaZH($\/k4SNdE43MbEL%<@sxepYXGo)eoKL,Ws_u,KF\?qR"g3dzuh~">XP%2d-* RbDBI&Jfk}M_X9y~ \%pF{[Wq sSw )ӱYZ@$v~| Wpj @Gǵڬn! u6kyzm-|=8Ǻ0@g.q7I@LFTPN-|[BO6R ®5~(2XQy98NN͌_*\hDS\\ӯlf*0x2?:jIj1뒬6lۘ뿬[h #1n"W:sUݗ93K)qb爛ϰ,N'hw5.]TŶfb=А: LDpegDCcJ%zR*ß7sf>?_p]f#7`~,d:wp:}6X8ȴ_=Vw@/o^qO(N5oqD:*?T;ngIam (~?JcS *ZIi B\fXtX2, Q csaS%OP2ŕMXKRjTC@2 ϓ"GS$Wm6~ _O?/[VVwCkѿf]`]{zÒ@TY)4|w4`0uLIK Uq&hA9ʂr#,Ҝ򒣴.KFCGn cAn .>Z9B m*/ow'APIz}E9'DTD2tAH0.C7 b ٕA[AkO.!pj/5'|ACa-=.3: ́HЂ }]S3cƔn/5GsAozȢ.TL\}5dV˕3-\4˨=cFAq*1 {wy޴RcǨHؐHZȨtLcIZ?9X987]\+DgApNbiQG"HH2 YXϠ/EVb~֤Na= = YdNɭnl&&ԫFG2OׇnHYbsU+/% eJK ?kznnV(7WgKhWٺ' d}{2s=[S eDw%4"3uI%I;9aI09{gt[K* :]wJ=lQ暰/v@mтM[mm7*?ᝰޏDL7ݕ*?>y~7PK u2O& bobthecow-psysh-90da7f3/src/Formatter/UTc]PK u2On7 bobthecow-psysh-90da7f3/src/Formatter/CodeFormatter.phpUTc]U]O0}ϯ*OS;P׊!J4]5v i{mb{>zyp O)אp@9Sf) qB&*p~O?_ІK&5d)0)BRQo_A2Ԛp8۟ll2!(, ư&BEHb$O@5&џO\$jŹar*cTlLL5(yy|,%|U(ǺmGԄE&Sp; iC[vW+KTJ6`ZÈ_S(f'ZԮcJj@!E[n0h xw>[qo㆑&ڶt"[;+1a0gm %%>F?/43dHUhdd= Ò`W x'" l)0,Q݊]&U$hѬA(${a\Xk*/`0Nwկ0eбfLIJå>zaKHۥ.4ۇ1]D $MrKC'1j8۷\R $X;s{a ;;,[ 4x= ^jNKq+ nCUg)ƙyfWӞ϶g=WX ҪJ+z4J1zMH K"(#Qu*$~/T-jj2D]ba[SWwC4ueʌ>{9M}O&ՒtFkPK u2ONVzl; bobthecow-psysh-90da7f3/src/Formatter/DocblockFormatter.phpUTc]WYo6~.bHqα=-6h}m$DBdJ )'n:l~ir8|3<9ϖ`0>\-cQPߌp ibK$Hã~B ~[+,甃\R$ 6<[J ,$((E)_̇,1}~+\ D@ \bTU9( Rr<0"#?kI` 4M~/7(et2+&҄V 2ex_2N܌23<4B_В +t  (7Or[IAHtU{kȔ_NVWᙀSibq&\ɚp :1ewlF_m[-ؓ]44JFNjeݒs*p40,y[±7 )̍r +n`LS%*&,=Um*f~!.ʦh 2e.tqEn䡨/}j^97YUZc|Qx7Si<mMohs[pN6t#ൔlhWvgk/Yܕe!Ho_p+WHnpN.y nRBM  ~vc7i}Čno6mczlm$ON gQ*]H-[G~8|-XVQ(fZʢ+rD6&Xޒ'o}_qu c"ެaj7zAJaW :bٮ[+e6 jjq+^͘*T1ܜos`F .KY JP32q 9AAR#nAi %*uZyM?BTҘIzzo^FrZ27;{@2sڄT02zt6:8 EO Ȱα!f8 5 h_}i3h]PTCO,_\7ЉZwrpAc(oAFLv&lOZ9Wx̋p4 U@*;L41^C/zP (}T!4l̜Cm iDDN̐ _9j :SNPԀK3{=mfMFB5=,ci_*?}CGʓ?%%d1RpkӨZ0AЭD̲ GÊW{kQ2'YB۝oV-U^#}X>!D N_ hE= e;=l4S'(V2 qcZ n'os'O凜*oTxtLe5nGU$QJztr;qxU O$2EĀsl' nT:ªZZ&)wT(6swʒvk'y&mD$ҹ}#BJ"P#Il/t߱gҊwsgHi􋰣ޑ$#=׃nE/+rHΨN˦NuԹIՏHӴҿ9PO<}ăV_-=`&:T> XH~]~=Pf7<~ma74qB 8.@ 0iOwu;|inm?%#t*1h9YSfJӎVͱ4= }~"_lͪ8 --4T1vp8q@'N&ߑ9[ї~;0+TEтGks-W-n۴hlMc,>;QȤ"  hw^Ͼ*= adMQ I4иL/g<%Еbi3~gS>81ChR}>jz7a9x᪠>+a=UbW\&~ը$=:&DNC%ӣzOEnNoXy{4XG3 ̅'^UvzV~g8xWct/cj t:zKˆv@~vk.{SGJnnv}qph戴C+Swʊ&ACC}q7:}Ըwh5/˕/PK u2O" bobthecow-psysh-90da7f3/src/Input/UTc]PK u2OF2 bobthecow-psysh-90da7f3/src/Input/CodeArgument.phpUTc]uT]o0}ϯ&N= QDѴv!M䦱p`;νN-!u|9>e^FQGpKT[ dpjXԘR8kۓx_+祆/TUݦ|6|UJAbuALP;3c 1 m$nCl~sV8HVUSJS:SiP 8(Е BFQE3Vu]ߜ4vFaذwmtM^čF iM mdn(AT{C`'x*Ǝ۳.8~Ȗv]̽8F1Âpd9}2dsryu$% ^#>}YQ!IB.DJBf hU skF2ԝ'ejɴmt~ꎾ){m0:Q AȮi7wKf0lza2YngI:@4}^d9z V=twt7aKd, v. PK u2O 63 bobthecow-psysh-90da7f3/src/Input/FilterOptions.phpUTc]Wr6}Wlg4&$}ؕ{qDI&/Q 0(Y߻")ɖS<"vX KApz12SQgN1j)ͲT1ZQÛW'PqxVs½[!AEA"dTXBB|*h&x[0vW,e)Ѱ$ &LiƅX2CU EGj< NT'1ѐ>BcBsy4R|M5Ӗj>|5\p5JdrCb/L~$R.,H&DSBZB74a>b-,(^"s3!&ɈReK0>:S+>LI00'5[aKbbY+3ܲ&t8b\NIij S#@iW(0^]Es6/yWM5'Qh2vKqgg4xix3 3 Zt,g+>`7.>'a}:Z1^"hQHR$ׂI<mNEx my@B `c%ce ((#sh wD;ڸԻ(im"1oBCI$]T؊ڵیl8Ws_PxEe07Q!<{ZM+(^{uoM+o)<- zV):fmU+J%S)M2X6\cAJ[v ={\5}%+-~wRH}=[B"%Ya߻sky]Q*ǫ!I~߳}ȑǯX*o7PerI |G|>WmVǃ+\VI.Pbݦ15= I:.mݶ`:bi{c~S(a"H\hz-aeum2<ǾUdDs(2">"@_BC|>T1F _uule:ѶF-2}0&U]+C˓߄iVFj`R|e.|ưbv3s_k8]Cb?G+6kF;Dm24ɰlDa- 縬C-o/%3q}#auPK u2O{vx3kHj Gt4c*f"dqp`1O#)lsEޞ8CV$N:Sv+F*MIGJfIaNG >2KO: X-ROb))\ %cWi$"d+ JmFOI ulľa<87T@R3?e ૴z%i]S󇔋P;v|It秜}u ^Nl̦~8ȃH&4KDŶ׶⥉Yu fqǦ v ;3)Bɕ&RYi7BF|CNCHP|dĎnhʘ(J%ӐKhTScbsJ @R\fq~ :,\8ڔ"iM8;\ݔδs1܁&𣚄iI% 7ug?\(^&|v &{ѵ} l57|X]sܽ]}o zlh;dzqO/^\~<,@ KW7ʖ n`s Q2P\y6pwՃc<^Wn PxѠ4[~س~?h&k!?wd+lMm'9la/}{mm4 hR_ӲWX"N%,g|& \nSmє-|u퀬߄6e>:gqӖ{{ɮݰcYnW~j@>oݶW"+aqQ*1[h*+p7\~LYi/uz6vnlzy7[Qca 4`a73Z&bTw(/^kߌS杴L L%vY*8bgxd2ᱼ/Y"zzھ#$,x:fELC&Gq/U5V(|D˘rvwE8w>j43d&n5?ʤNǷ1@Uc|v˙Gd_C< +J3{[A|r+X_psvqz P5V>O7!Jnf/>g7w.:48=tT8vf2փKor'[y^t[&\PiY`ӊWnme-I=5-tKɋ:3,C؍/X$FѪ^ ޹޹nʟmݵB̬NZ7HWY:kCd kjBww f8 je̗ϙjg_9x4Lǣi2ZD*~Mb>8:џj<~pNjn@x~,cZrj:Sk\_ަ710* SMUf!P S*"뫐;!j%@$. 5 Nf=d5AѴߦE;?Ju'?9/[ԞrF ۖyLn\0,bUL $ynjOt :@3U^|u#~cg ny%.)2[".ݎ*;R(a3ROO4Wŝ>Ḋ47N<ݴq:uEG2s:o;S%o"vFJ-sPK u2OB1 bobthecow-psysh-90da7f3/src/Input/SilentInput.phpUTc]MkA +t1hs*4!%)6BށY2YJ{5sb;ܷ}Uu #ȷ7!lWnhKsbG$U)[-6{6CtPY$hbgZ@HlP~-."i6ܐHG{c> ! (CyxC҃"zLLQud ۹e{W"tmz(|S^6P꥘[>9 {wVyN\Zd@ߕ0t3bD&l%xw˻!} I_ȫ5 !]=B!T2LR8U UV׍ˋ)j\8X a kr!V&AJ"%J"_|]U )̴z\\ _[g|Ҕ43:k3DI!P-uBQu! F zwW6jU%%k0q#8c,kbA׎7y+2l)Wh=}0 8JF^['J>%ɚZVwk+;H=q2OԵrH7{uzCJGȒZDc=+Β,&eJR3?' L8mFfƂyp<=%3Q=. `8gڰcR O&!L$X5S"H)2墪P._nMpOnhNhaWANdlCc-)aev;`p |^h*/&~f(}Ϥ!Is3)e4S>ڧm=~YV6^̋B[l(cf*^QW(AZ.jjt]d{PpFwoC>{Qv\Sci mߟ]͞T=1_s<J="M5j  @stQtZNӑ2og@[~7HMHBsL iĢޏt1l7$vH|>kO;8 zr֠z7CxC,= ק7UteWOPK u2OOK?1 2 bobthecow-psysh-90da7f3/src/Output/ShellOutput.phpUTc]Y[s8~ϯ8@J'm -Cwv{!LQl%H^Ino#:!4ѧsΑ{-^o~)ADlA!)“GlS#Vqx'"0|%/4@|gB.f )+FWvߛ UG/Q0%ƚbzOPU%bS<(F^%UETr(ֻ^3דb Nƿ! i* #_3DQ3[w=L֧Pz*!Qh}D}6c> 5S󈁰'Nخ'ZS2nk㚆wo_^9zwxcx)cG]M9s|h*ikܷgi %].YT9!Y’]ck>+*B1/3z g;;O_uas*DX Bc9&T"lJҵͤ4sh'o #l;wS,(3JK?uWpxKFE[ɪT6Qs\PUHLzg $il$Lyo3r}W`3R%Ɖ 1'X z!cl wM7@CE Kap)B,|c@-o91-2je*VV"! <^bt}^#Tp6E)|ƀָQ y SeIFFV*>GwOS k=4H͠PJ)Cxd0l nJɧ#lQp%fh@M1vb "+#1h dt%njA LM^BxnA"JXfJ$U)T`pڿry0 /Sg@m_KYtlgkl+Aft ͍c;ĉwAI4P>jM2oXG'h-VRؐiE+\) ; L%&*K96+""H&`3rڂnmrڭ>f.`a)H]Uj8h;GlUݷǴπcr" )Sr~nDmbBoF+Y@A3I.P!vl,icu}`4nL1'ȅn"˜#vGUs:cPLiNtfvʩs^WBRK^_͌[¨x&n1SD9{&.Rny0ͥa |t4D=X@~5ܨm{;wv`A'痧6T3޹\8{`|Q\MYaK(f}}jc}a3/s/F @ㅜ)젤(,p.{Sw;G)6MY,ƾRsNfd``taJSlܲ@VP+#nUO=PcI>QÕckeI aC_nnmm}=y؝[}7ns:}wX=L6!բx\Jud;Jf.7Xj,3׽ jkb5(y=*R.TS;m1'orǹQ` 1P'Q Zу FKW&et7 AefYM\PbOKmU[4L9>T{Iu%9)/{YL4(AĘ T,~1$آlh7hj4hk1h湓L93m,)r*Fbxv jbi%DqL89QVGOu>a(i0'p!bYMNO$kO2Tu7})9Nf6,LDStbuz$nxjDlf4-><$s㕫Iõwh҉ڻ!p z0lFqٹf[ʭO6MSӐn&} ^m{6hf5YԊ{J*$M0r4&`8z?뱌!Q9:l$z~y{`|iKephwtHKR,ŌoI`LZŢ7+a-grQ EU|M!US\i)fFq.Mm.z֔jyØY|# v_X%NlD{^FUr[qS ZV'үbxwO{)W(QP3|7R]*9 m-C }z µֿPK u2O47X3 bobthecow-psysh-90da7f3/src/Readline/HoaConsole.phpUTc]T_o0ϧI2>Mbi{+rXslvHQw9 ! nc&]LA4Sq s.h8PsfW0P⣢$7]y _ 븄1eL!! ! Qze"sd '(-1ȹ29s\3-9Ud*9.cJf!~W8L.jUa$^HՌ6I;Tp (ftU lS|'gի\p9QꓼD0[l $C0X2!6|BnҪT HSJ{uzqG%*xI2T(VfxOݰɴ]z=9g U:h36TYB=w{ղ h"څo~p.UFK1PfeݫyNjKh.̆w&/YUũO^;쐓6!t^]@Jbknn=ҬWOneFvs{@:#:M(/ʯ'Fwa'[` ݮۯhR)}4CIAm[PK u2O 0 bobthecow-psysh-90da7f3/src/Readline/Libedit.phpUTc]VmOG~b@ʧJ J:Taw= <{ؑzB3<3oyeg'Ч4%>ka)} ι,0VݼG?]N*W%Tkr 9Ӵ)Ku0r6w$TAYYdPSm*V}K8{{*qsIX*uFN=I7@19#QY)Q7賓h̕=` N'RPr"Y^~Jaf\.l>Bl駱.K>m ܣ5 8 #?67xR bpoKeT}٪#\AeK*N%)t2z)vBČvG갿|)ީ3%ՁOH"{,6 cb"tW5\_Sg|+/q*~Wu1y%}H:^6Ϋac"tV6 Tu*{$oևIgk#)ZY&7l! K/]DU۫fS;7P3~2G6 S2lv6~+"g Qp9>Y7 )\fl_E!nx7g{~//=.㵤?Ӫ6 }hwjmlD|l#8SQZ."ݚ <9Qz;V#1K//(= L}PK u2O61 bobthecow-psysh-90da7f3/src/Readline/Readline.phpUTc]k@W̃O-GJ 24ev!{)k-b|x[_UeKnuFyzaMKƜHHZ#8}Xnm Q[1ĖIƀr~`}F@[ъl80jg7rv/yWo6Y#!ަH5:FPKHjʐQ(amxn 79"Jʸ)ڥ<}dUF ;t|nI}% `!y8WJd#!DNFISLlaVV !JC՞V6H Ew]$,vg zT ?L0GGĺܙ- Z *+O3W!ȌÝF0_*ͻ|/BV6B>}m}а S 6ʇmZ / > nC% QΊ,|.(S/w6ל#M%;aC|ˀW?PK u2O` 2 bobthecow-psysh-90da7f3/src/Readline/Transient.phpUTc]Vmo8 _ bҤOrڭ; ð[]MɐrC(V!)|"/`v\@L[P|5kX(ĔTVD.iגF`sU5-0 JCdY dwWվϟޟ}Y9S3 +f j~SZLamN+ըR'HRt gA MHHoR%΃4 <~}>王*l}xCRhm.KQ$K='Iiec: )4caDX,'76V1砇 (cb\YJF 9jnSlWPʰLj2̢Fb{4RKlb DIJv }:םj1H*ɀLMz$wƄAlcKTk3yۖBctz<ԅAKTĆ"c#E~]l$u{O);~#ɻq-De,M΄J !y#32K vT"/&6g$ *P& X\)6l|{sSKԐ,% nsxPtPq'iLIaOb` :EWU\ys2SA9T/b*&Jƀ%{!\OCtZ[(zQKax_T+ OZDfPr4,a2r85€c,*f`y\o ;Ђ/^UԏWKǨJOI@5 G~Љ{%l€5G8#(.\[6[zͿH?}|폡}R'=:e6 "η ՚.wl9e@@:Gw6@mڕS }[!.V{y'B6d>!}2s">6}6uy_* (L)f "&?sF*Ke+hu^ ڛYwF2*1`5I Z*Dkw8F+ȦVЂ@A6Ph##2MvY0EW%$n:5kV$WLA`22j9s"l P #Ճ(# t}*6i+؊ ]e\tL^3\OrhcAo4X*D :|ԮyVs`uH,gǑX?o`bj(%O4 HaRUy7Uk5C=]}E[OZ}v?9= WZ*tvvR!|zVFX8* uLVɅ*o8V7V>P)8i_38]aUEz^&N>18AGBWSMU5x2y`A![do(&@ vT0fz7?9Ŋ{;ƈ{!W_߳tsV_ecrh qӊk?n| '7actvċ>|n *N0Zu0IN~=DoыJcwKhcqyG[E [IUs3Ҹ0jϨ;o^6Kꫡhkc7K݀-r3ܨ-Nk}^ܠנqÍhYW:U,Y4TCcjbo'}(OW)^JFu.3:|)ӭn5.ݳ~ס_{~v5qnTfZjzDuo+VR%cz1Kr}L` ?-7k4cPK u2O/og= bobthecow-psysh-90da7f3/src/Reflection/ReflectionConstant.phpUTc]RMk1W!ͩ88Ra^,-l;4!:`7omZ&CC46Am߭ezu΍"էW߻DW~ur"PPw΁ c@ 5+:ă&Zk,u!T5T6Q;l5.d D)ZE]aЈԵ-*l#-LiOS:Q #!L7s4# .1Cw%Lyl-JWOJsrd}"8wxgJy,P" =gf9-jXb!{7|XrQ,WnS,³i:}uƞIPK u2Oן> bobthecow-psysh-90da7f3/src/Reflection/ReflectionConstant_.phpUTc]WmS6_w>u\ CrBGXŖ(E+!ZF=& U3㺣xN*d-tx=ޔGgɦpz{6n Mj09oa__ [l4u/.&<|< ZDmousoؓ$|e;?UEjrvżyt(86lȑ ?hl9K^618OJs/ eyzjv%$fOfQٟ|6-q=c{P&sٚT[~iᆃ,.f(E ;:IUI*fy6stLEN j1joww5P?Mh{Q Ԭ^VYo[2&иf*A-]=b&F*k3GRlbv1+r5iĘŭ0*ԦіBhv/sgX:_WP)24Zpv2nc׆Jf /PK u2O`$#\ F bobthecow-psysh-90da7f3/src/Reflection/ReflectionLanguageConstruct.phpUTc]VYoF~ׯHP0ƅqVPzKaY;rofgy1 >@ - > (ĄDTW_Пwg,VLV"J2'$h-0 JCdY 87؜YX3)7V󅳘šۜTNA f5@<#l?]:@ց`rە%֔Ѽk9G250k?[ K)܂2{ܬN ? s-f(<R̸ެNK?0`,e̋CR6wwÇd!_𘘈'ɐG=s~aa%\vҿ[N⪰LrեUO?.T*=y5?Ԕcag{̛{Tզ-^VRSMN\6D&%Ie5C ŵ(H~k l:妅e6͵ZA0LL/ xL0$5ReEO!IMcN~hx_nwGr'a.&LFb?LHRESmC)wQ+!?|M]魸2>JS,;NMэA |EsgصaU%GG4:n;1hUe Yì,_1h7J_Xh@+U$4-J9t eƄ{G1}6,Qm%9ewv_~y [P,qzjq宻)ߔ+'}BՊ}+6&lc(o|SWS7xIʿ>EV':chsLVRfXbOq3;۾l;Ꙅk1&5PK u2O qO bobthecow-psysh-90da7f3/src/Reflection/ReflectionLanguageConstructParameter.phpUTc]UQO0~ϯ-*ciuB 1UNri,\;hl'!m #Z|vG d\ o:G!^Q$C8x`·X.+U͘S>+ 6GJ! QE4d '( u3f#(29.|Ay:6g@ʍ<.-6jTF):Q$ M(Ho0VTO2vt4Y@@@09-Kj[& %$fc ƖEU:|V(mskn893TaM v4NL΢L <"#=s[Y),[E+qLJceL L&@-55c2r[EUneP>!p0w/q…0?rĥV06+m|Q$} +%IcWn< _ vꊝQw6Cj~!Ԝ٪ttg ̪p9% B,'UozI/PK u2Oc"O% bobthecow-psysh-90da7f3/src/Shell.phpUTc]=r9rηR$^YϺȒ"޺jH✆3|HVn*OIUTX.@/4~x^< ]--3 v?%=(Y}??y%=Z,.XlQ1,],L,f<ɡdfd1}r;2,CyY4- >gQ7<-;Ix!t'eNƇPKx6>M/xQfɧ0.K]deحیw(ҬƠ2K>,8{K`ӔyqG wGHoŢQcYl"9b6 Brsq ы¤Oк:wA'uq@b*f+BshsmDrfü@NYpEo!"i[=V~a \C2#rWĂ9_e\ Y}_)<@HfTg2!Y2Eײ St*R-ܝꂸ&׷0O}FƪMk;)Ϫs(yJ+TլEԲką,ᅯg|`3b/=/4W j91 `O55.CVz4{x1JktP,.-.YaL#9,^$y9F7 E? %%>,94)(^ [aNEr+%Iz`(IZ|ɦHٜ"LY^Pqªi1PSQ&^Ȑ-PH`hom\Q~,:=, aVp@H0K(ruO}oQ2!vQƁDzqU>|%~n>CX" ]c9O[tYt7倅Uza^=ц H40Cq hRaIg !3Ő*-;_9'Ɏ=_mZ\-1rpCR1h4W.HuV ;Ojtr010dr;q)o?@ɳtzف١NVMX(NgIȭt88@$T1mVy_P{!)nyk(O\mjlq5h랭MA}7Aq9 jX.xJu> a+rm4PR"e2-9 1&l, ybQ'PwEM5>/穖ElHÖo {xf>X3l:}`u+uJQPP e].*0z4Xx~i$0ޫhţ.XByC9t(*dry?W& (jƄB'P`54J ytҵ/^}nbFV0KX!L'2I:c r L`"w Hӽ*im_ʬ޺;r;P?LJ4*I ʢ\YYCwr:E}0] 554>*~PHOPg$-woAߪ c QG޶=jnm^Ćz #ЦOJ,ܲB.R0l0N:tW90|'^]A# {=  :0L}h+pqޠ>%2qoܢ]W֧r]N` 4}s}MnQf.7H/G*eC44  Ȗg5+C\ V7!ÜUlҳG!߻Ʊ_\5i4.R1.2h%/ЕO(*ynJdg1% #&!C=t"u\Z:xjTt҅I5q1 n;by6E!i=5zZ_շ4|PM" \~ l~;dg d@l6tH۾,c~|p, (WLXVϮcLdtzxp~9:M~z|5N>72Ȋґk>I59q_uK!:Cq qhs^]QQ lf(?"VuxۜA0o7&bv䉰4"Î(1-{C6}y 70,7]ߟ{&2/&NGty:"uX[Nmm}bj3.cݙ3z LOLaĵ oaOb"%5@Aot!j۰W@N3 [[]$Ǔ- ' 0N2#]Gkg:2LnUzce1:ɬL]fmyw|G%wF CL\)Y?W`f}SKC B>{F|&A,n!RJ-C&ٗ Q$]{J&_BnTIZͬ Xy#Bwك݇>֤M[{XCgSN;9,0U􅷟qS,o֏vi};Y#[ c+lZmODsc' zƪHcr juV|޶s)؜Kv4T20juzn#+Nr˩IDT&$eV3*ʦGzϩX83=f7Ly@w+'.&kDso8?]F?.S5jQGpQ\zlKԆ*cׁq %5l]Gn>٪}06`aFoCR25;nnlxr2=҉vJw"S1#'7gx2`Ĭ)㼜@q&dxҙ?Z:4"QJ4U74sX < I! oD*5s,B$(K}dK_[tF!@R2䊠u, HRU ď }nnYN:JsTyTJ 1uGFHŠ\[ <'E l+N)C H5d8!VNA[k$0 ? ՙ ܈ m :r.!KnZ@mm.Rgt\%1$Gˈb;I m^C5.ԿMd]7櫛Bo1_bW8^o,/YEQXžߣu 6ҪI_4;Y4sݨq W L H"ym á>VYTO˔%Я7Dz(lC֐ƥlܔ ᪬ C \Gf*_\/[h\E4!0]EEVC2c;I(j<[qR[RE&K-Tioniv|N\it3}vK܁{|Ox1%QYuw$]m`ܩ`綯"jWcmlT0]cMoDt ypFl(Oe"d{!_!v6;TL "4݀i'^?8=:]LFGD)+U_Ó8ed c!S1Sd!yvh~88Hۛ;^{-]"qeXID&^> y6VZPSK""--$1y4G;1OF&܂aulqdu{NE!Pz5,I4#@E̩m7U<+V *dzNXk 8 B:1Z-ډolMrHܸ]T4TE IC>".qoʙc{#| ?D<W 95zMNb¢mUMCV 4T+ܐ1CyX (HύuFGBq]OjKdV_AtNw-F9$$Jx6QlYYTB&mzUCn#QZXJB T$ :WD$G5%NRzL`)ˑ'N {bd:lT/(r`n@m~e=H]WZ\C:$/b .a,yJ!-Z(҅2oob8*B ӰfgΏO6< mU5~8QڴW |gp-D4 9lq##z(I\f2h2TJx }ݫ1y &h\=Ec(\p,LK0mri(:Liq3yϹMn[m`V#2f;*KʞM:fլ_;AP??s|lj][Yhbwk[ cJ0NL:, dR[ vqZGDŽ򷹸l H)AFyή!ŗڑJC^2d(ie靧8E%IJ`VTZW4۳BX`khIoՑ]́V;.*EUO& T~ 0 ]|CO@킡 ^oStz l y7nd@ۮv^SF X߶`\˰4iz16<P%IHa1,5;ߡë:EiL'_R*b@7:p%1.B]v^Qq]Tg8䕇/->i_pZ˓4y6|yaſj'[H}эvϟrQM`Jv9w?kf2%V$k4CE66Q%q []5+Œ%{Yv(>'Ox{Q w0o3LLrvf^CH(dո^Af_߽^/0f_r&Ϗ:@]mn+.<Ѽe滄,ubV6vWdC])CFcrS5 d\Xy9:n&p>:~Nm%T>ź {}YtY(˟2 e*Y" 8`!p̾wlWnH,lQ·<)T0O/ᐔBdj<@KzI'i`4+_~ezbuGdmvMEZ%05U:hs7y~=]N=<'Lד&%ꁤ103,x- wVW@ 6CtqN= 4ZhK1)'ev Kǎ`l0/6$k\Mj .s^uէ}zxMn1/ '<PK u2O0-)$ bobthecow-psysh-90da7f3/src/Sudo.phpUTc]VMO@W!rEJ'$Xx]C-zQ'@bH>`;3̋fqy;l÷)H iYL9`[L1f%DSr!HBy8 P T&DT KFlާӣϳ#S1pELi\4E;'HBUF%7Y^ǔgTb/2sUg$5J I ѰGSTPI KBaz ,) k̅:@&S8f" @g6qzpW$q0(C5f`f-(ΥֿSUT.~޳".5 K"K&k"[6Fހ@-}gj|yU~o a̩njN@Q}s:2S],#xݽbf \ۅA;;$0rc@xhm"Hp"b|d-U`'5}T͢A,lݞbsj^c8W1P&溽%LIU[o PU:G0mݧ5kYq riֆG=+{[Wţ9f69>yjn刂Ԋ@-b!Z*5{me۲k,J]O+_mPK u2O! bobthecow-psysh-90da7f3/src/Sudo/UTc]PK u2OLiMi0 bobthecow-psysh-90da7f3/src/Sudo/SudoVisitor.phpUTc]XQ6~ϯSw{8K/RU*dC,$i{vBp+T?f# 9?@Jׇ1b&BPDTFi8$q܌4\n%1*9.dKFsy~m\`$V BxgDY 1d ? d_QVSm $$Di(l"D3I5 @ 2QiS+-XPf0(3LB(@.)I@5E P:c$i p@q_?̇߇7%L>>LFoF-K2(Aw?-s Ї|8k/6 n87/Jf;.` h·cjyj\w,(,Lb|+`Vp.Ui[BK/`u }TsmոPMRW͒ژkdkg _ TGmlE ͘ ]Ez=c}]T< U篮3N-QUZ^έ] h,ӱËa7r= Q<*cdB b&3dIAR:`F8'y-eK;xhv#\M)۩>eE4 h 6e|wB' ~Z-gBQ*Bh"jYpZY`Yjlku b TJ7 Js#[L·|sӗvů9O7rKӚJt#v?XI^O-\ᕨWzLY%k͋ߣ<.%*0۝,{ه>~w` UߙsJPec+寤,QϽz.tK7,4_#lbJ\9HIL*LbOz¶Ъ%Yp)󆫎yrE$_ AX+hU+@cBG6\™e$4'j ;NFgKC-jm]f3<Vs~Fʤy rmC'^ԾY7Xm*Y$ TXCT :֡ͻE!z{@E&.xhmuPK u2OL?3\E bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/AbstractMatcher.phpUTc]Xmw6_q9dKҥ-e fm835GqXñ=In6,9ݺ@9lԒˣ>1 Vp{L@" 7%\BDl`(:@E{GȄd1 ׊Ć䧄 )YΖ/ b>jdI܇4.]|#{LJTn 5`Br6$]OTdܧhAVLVT7KvB%J%~Hun5Gė ` LK}8F=[R#"V~nbI@nR*XHԵכ֯0Λsݛ]}Ϯ<<)I:+ &hj{rgS%7m;npIXϵnUQzhz~:DŪF4~bh[[fh xthN4R;9t8JfwjSlp듑;N,hܭks ~ejF|<>Z:ׄ +CǶ&QnqaM;:3,fq37v*]S#9#Cg7w sP!:P\Jw3$'lAKPhі#āSH{JV@8'F7{)YD,V0f˩x $̞n4#"~`!p݊^N1H=F^@"Au_s"eX֬utEWޒJDQg5O$Սun_Ro*# Rf9&i#e2; ?ΏF[b>*+-.? 7/%G1|Lnv7mE[IAU-9Vݦi \j^0-VB^]%%]Ĕ.BN]cQBT}R9)D{-eT^HbAHƳ;TOiITY=К|i(6$YΩ"R2(T r;Ձ@*ү8އ.BK@;4`W }S5*xI좶55Zne1C;)!nN0Wh*Zlt9#dzDN qZ+,BX09hdq4J.h@~d#Ę&ذ#D/H὞ /fLxy6!˽ mL$JhҨm)$UҮ>ԇg1?9M%ˊ֚k"C@/7\`0 =αIJ9 216qj .ώ&IannQ=>(7x7`*+-ԇ";P"L֝;v6P3"Ss@G;MQ( %؎t%#ͶMml3PK u2Ouf7FL bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ClassAttributesMatcher.phpUTc]Uo0~篸T۞&cZZL{SeX$Nd_I @w}}9iur؂CBC "2pW(:&x.|=>Lb&  9Y+%f!>DRS$*f(م4l 6fʖ!CX2 Ш4CR`H;TN2qJsSI%YuHOlObJbMnz!Wk[x؀lJhe%b%0&1Yn^P@𹮂Q*52`zC+\.Y!E25=9.g11_ض6yU?#)Q<,쭗вTu/B҆@?օٔ#Ug[E;L)6&sR ū_̢4Cj.ih,N:@(cc~J[ͣ׳[CToѵV Iネ6F癟 [< fIJ#>զGխTZmŃ"SKOHRuPK u2ONGyeY bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.phpUTc]SQO0~ϯ8J$TMPvOUnr!mJ5wv&yHWJyp4Ӑd9J n&)Xp^gME- ߄"$EC$Zecȳ <jL&1p⮇h22+!δQ٢0*3)U- !ђzgKԒ!џM٢/TV0=/ʙз40aEnnxJWXgU$"ҟM|ƘDe酔V5xb*IUq/_%M@AN&. T4P3=U$%cFӘDO1a1bk塺0(gI_`"4֋xi: I?6fY>>aO~E؄sLF̧&COԅ,h#Hm|ƅu i,+ 4 \WFn;Ph|5Ko:ZvT5!('2[qoR4iei ŴiѢ gHpjdM"^p|hQ]Nel^1uJ}s薆wVUEZjoqhH,\w4+AM;cNE,#^VMRTm6[52=ȱ2e[$B YCf]vvF mHMmu1t]r;wnpK$NSiYB8S`ʷozէ_s1$fsqg sF] NX c.ys=;m n|^ߎ{pp{ǩn*F*{GDٳPK u2OU$&~^ G bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ClassNamesMatcher.phpUTc]US8~_} #MS0\(keWL'd9q(ww[tg=rf)`|D((p#`,{.ˍ=xUR11*'ܺ|*¢2Ie2S.1_"'܇2m>pLGQ)QH$$L*敢 <2*J%T:'9%A#gd>,rLWD)'jvqFqnkx` m, P@SJsED xcNs"%;_eo̔Q{ dP'sTڝe-n w@f";|9m\ZL`'nnM[0ڲx/r~Sbd{ؘk,g&03/xn\3ܴib"B*Vl͢q0q`زNFO EBA*QvةP(Cѽg}[}E{"d2_Z=-1`Ұ-H&łѷ|7 .6`MG7`v=X8x!eȯxr/.ng][Z5>PvV/VPK u2OR7X E bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/CommandsMatcher.phpUTc]VMO@WL%lT%@TU%RE8^/Iz6;^ϼyf_=` H^0!zL>]>Ri7JYLtIN~]\?M_pc~jJo6ޘPK u2O\ZDF bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ConstantsMatcher.phpUTc]SN@+搃i9U D(J@+jw PeP.`ξyu 882YFCPepm7EQ1AI_-I?9D!?* ꢀ#rT)2rUD.rIg{v>/ C9˼H^qp8}ChMDZ!MY -oM.!Y >qd5s?L]o@i3Zf8N.ߣ;^ĻR0 iN T9?H"Y$PK u2OL8+E bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/KeywordsMatcher.phpUTc]UMs0WCNJ4tJ C3p"ojMdHrCJ޾Z)/_WE$aZ !hqpapY Q)ٓώ hUT\7rA-)Z(v+p}_z YȅuFk9+ I6)Q^ I+V$j'$>'xwԎ,q&Ԡ!D&ѷ"G'WVXvP 3z /Kf47%1 d‡HEtr 9q]<ܗ #nja^z\j~#%2B\-a) C3xbJ>?VF(?$vUª@{MձDݖ3Q~&C3Ѕ=L㾲Ĭڬ86j T4ZmVk]7>zz<)/aUl?ltY Td愍҆i+fV-ߵ}w,9._ޜdB/C/!1]}i#idbl[ 3c 4PӝnRe[ɷH;{87~i`hxL{vJa:jPjR-2x; =jr- b8$/=}8=Mg}h"__&7OQj6LBagCdQm4A7_2:$aE;a|A\B 'ZпTC!HaP_EM=p*Ie].6&ʜH:&J{2m0i;:=)+-ۢDYIXmƔ6c+G-e6,XSzN5q܁Z5_O퀐A-cq?4a/"F5W<>Pc+o{;whq\V-%/q2}hІOڬR&D>Z5΁8 !|Ip UK5.H&/vI'sIT+`vjfVzuD}%hf~z=,27~3xV75̉ç;l筁,]:+S_$بn)߸4{yqt:rx_\{o$%z}FMCPK u2OJ bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/MongoDatabaseMatcher.phpUTc]TmO0_q*T>M1Jױ"k4N;;'NIԡEj=wܛYvmg@:sT n3&A*#8KOp^%|'9J4،AZʟ4eP& x̤2Uz+ف\0$قeic4^ $Xͧe ,HCT*t(PnH3# dӁSmr6Θ>tYlpL}=SR##+Z-xLOUH(KaIvq u gGsԏG9<.!QyFX&)c;PҒD]c)stOO$_[y1Pdylń5>A˪Gj[|B4yaIr=&O#' ʾ¦\;vr2r75&^TL0@?܎oFgQ T֠KXnݔoiJleB]9x%8,uA\Д;ЯnyѬO2}4eh'~7-66>SNtfC=pLu֠ [ t mjĮzG)ik~}ᚇ׮y6$CSO7>TWlx- j3.fbwn]ߒဎM|u`ENr$MR°!/_PK u2OKn?M bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ObjectAttributesMatcher.phpUTc]U[o0~ϯ8*Z>M֋Z= !^s}EU(%9;Ws%rk{Hje,9SYzC21V>oǣFwJXLe 0q <JN#K.RM i`$I1~?}@p0bs!(KHCP\Q LmKY"tHHᏆl"1l+< 3ˠE"R?sSL7l[p9 ] cR WLB)u#υBIrɠ,P1`,E9+0"+8\Зdp0D?id|HLgya,P3&ː!j]fQbig\v@ d~z=˱ $Xͧ脤1QN~H6CmM8q8bm'0eWLSڔOebdJXl7)Jqe l-S:Pv@nn#_fq+Dyֽwa!W+KҵE̗=P%6f[y Θ (UF[hIW$"%& {v݁6}on뢭7`Jrh iΦ[Ә \:Iu<|Y^\@쬇pܗLD3ZMCTM47UYQ0a43$vƗG>dA]Φr9k,TF /uџ9+G;YW1v7” /6ё?p-AhؿiL_ѓoO18=7< TX]EPK u2O>J bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ObjectMethodsMatcher.phpUTc]Un0SJWuTZ]UdC<;hUU$;v Q4K9>Ivp C2gN9k K=TZ!m]z6\ʈ*0i TODĐrʄF1*#Kф!)S8ʈd!ͱMp/J2' $`. 53%y9<. (&_3/XS,.3%R jFMm=4}IeJ f{H={zd;JG{2TBaD=VPmwyhTr9hعN-3ET &kyy 8{#VMWwOqݽn7m Ri-亦b߰YA^?PK u2OpO(fF bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/VariablesMatcher.phpUTc]SMO1ﯘCDv-*JRJŗJDEz-KoS-f޳R'n0*8gpkpWr))G,O~6 ?(BC\aH K#THĠfЉZ%GZ{|./ΆwCq%:XBXgĴqp%Pn DTp_A(HTxӳ"6BJn|ס<8%"Co"U5Ц~[@K͆Xc Wj"bJJB^BD?t^Zcocq@p\Sch؅ShCfxQb9wk1 }xxBʏIAc*kbItsҍK#j9-1 ƁhBq_dJeki#Yg[5nѴEz=tBZ`GU_%/q ^ҵݶdt=X 3 W/rhrs;9+_o9ܠM!ÖA-ߝJ[7V_PK u2O! bobthecow-psysh-90da7f3/src/Util/UTc]PK u2O- bobthecow-psysh-90da7f3/src/Util/Docblock.phpUTc]Xmo6_1]ޗkκm=٢ni, $Ƿ~3CŲk8ð-r8/<$}eu^çHبX~gB[H7pcp8>G#x{? ύU v""?l$a1ivjYbĠdꝰ*MƐR؃{^O}Ic#aa/ Zk+ j\ %99&8/* ٹoaAee??/kHf1 ?Fh#5y aj_e"ktߟoѹ<8T*z"VwsV1鸮#9{X0>{_z/^t5 ƽăHYd-cS~DRBas{0BZ3繖6׉O=](İ:*C~n8)gyBA6fpbH{35,` rgWRlzRhU"S>!}-71>ZeT9ad [ImPIQ Ke?rhZ!yK<*ʹ$ck'."ΥҋFKY tJ̱I6X@ө!> OHK-/s#% yyY-*4L3T6q.zFK (Ct 8GuR֞LK2ncf@VWsj`49Q`KQ굪oɓ :l]=e_Ӧ0. 3~VR뭴U13uO'J1$\`# X&[LV{F=v庬lIJz{:PKu;MLS<$t40 mri* 3(;t72liɌj%װdNjZ$jIC. x÷)nTO gIKu҆jeI穚DyɺEA-{&[D/9iΕܩdHp`·Çf =} /yMpv:}f3=5ekꫫ*U3/7%Y 3NX޲h4@A0h#sd2!sk4Tv_0yۨ,V$w 5h<%ΐ`謹OVװI+%w)ʰ V%em(:+t<ᶇerᑅ.јݰA@+tSC4*A 6r9UAinJL2KJ=e𲳕FmMήZF٧Ū 26}튙v^&V,A\ ]q[ՂǙ`s/^XA>4A(W jxZ&~E=Vj&l1C;3R[1|%\HԈł0ތ;k[=A@SW°eVؤPCtZG( /[HۯP1ߚ3ZsLg*OL4۩p0r#mV m/85A!--*  Ugڅi:L0xHBkHh}-M;Jy&-r9~JP U2m|??c-Cp$Q림6oA[#abwU掓7a6"9;5f\ǶE)0"W) 1vPi[ޟV\rtEtt9L| ټ+VQ5 ,ެ8b{`>N0B\bӠ_\Jm09. 'oǟ[ 8 b?ybwS?PK u2OP2{) bobthecow-psysh-90da7f3/src/Util/Json.phpUTc]ePN0+NHjJJRe1r ^;;3;7w6 CҡJníG[a徐BA">WXƜ{Ckk*(5_VnkK(YHAWm>QSC]{zf.ɌuOYzАZՈm_ۄ7zjt-w (rqẠWmY/|:YeM4Yz8}eNli?PK u2OVh + bobthecow-psysh-90da7f3/src/Util/Mirror.phpUTc]VmO#7bNHJ;B>T7ޮwe{ Q۾%!T?Ş3OERQG0MoA<; h~4ΏQJ8|Ep'9 qZe,\"#|EJ =12z^ƷcmQ Q"L*楢 X1 By)"T< N2* M"Ji?GЎg%W,E%sOFVDQΥ"\ub:&*WP"iC%U%8\H{+qÄEO"mFۇܺxu;@}|lI8 1W݅`Y:>_7̛:Y:܈scXa$(QK[ 9޷ݘ+`; oq\Y|C-r6|0?w,o,U(7+F'zxx/{ f@;3cԬ[ɭAr} }l,r)b(l A=V "gk5w H uLh-3;hiۓN3-;W>'EokupE8mJ 7!u0!^ w& PK u2O-R# ( bobthecow-psysh-90da7f3/src/Util/Str.phpUTc]Vn6A,N,Z8 K qD0`]#mT h_O#%0,wO>ajY= :$L>S")\9x!l358)NYC#SbLcnxcD;$'9zmB#WF/ZLRN !'Ιp.R+ZZDy\~# 'B9`ihx7oLme \1[hmE B0H~M$a!`?cT ?gh}} 8#xlJ6{5_͊T{vwaghCP`?.Wǰxxv]3Mv""{:ײQ٘hk,  o8 DG,UX816)3GPK u2O& bobthecow-psysh-90da7f3/src/VarDumper/UTc]PK u2Ojm0 bobthecow-psysh-90da7f3/src/VarDumper/Cloner.phpUTc]R]o1|؇%QӔ> @zT=Hgg[HIU}xgvǯOmmK-=TR!n `*(jT 5#8>zy<|>H ẇ|0BPE@qg=1ʸiXr+y~YT+'<{(N.c2tCRN DNӼAo9%I↻Xt3"2z:9aWq"?)ѝfi%[+C Kǰ{7pD$%J1Rd(i<.Md T8wOZ|Gb='O0DӷdٟKf-~? (҇&d <"%s,˿/?n^<B)oT-mPK u2OBD 0 bobthecow-psysh-90da7f3/src/VarDumper/Dumper.phpUTc]Vmo6_qJNM?lpⴁ,8+:XJTETJ%;,JW S~t|xqZ]$,sLȇY@ h+~~3\$<39!QKpBR.qGbIx}L]OWJQQH$xL*>'zToU%¥GV%1Aw>q,c*Z~$Z\QH'Es8Q$DD;̋Upmw}eL]FB7ZܐH R{rkzjX(tmuܥB9JDZb\D<\DJD$ Bޮ` ௹ug`@V):E(.Il(橱mgXpUં*_~.*ݻi'>+ S;q]˼ %I(i7}*vkѮUڦȗast~wwX%U(`c$H]=xx@S^n2pШnJm "Q)Nii9 Xua>dkGdizؐ3T,g}Ėkq íAX <uM&9^́T?h) _d7"!;<03f}S,e*]sX) .w0ksV냅??ZrycY,_b?ջSuTrni U' e!)vU ۃ鯋z1r19vZϜ76;<օA YhTӱxɪE/j`* [>.:# w:ICfw8XIt̊L[_+!a qճ}٪Ilh̺wb)MPK u2O=-3 bobthecow-psysh-90da7f3/src/VarDumper/Presenter.phpUTc]Wmo6_vA%Nf68sQQIl8n! Z:Zrb4;H;-P >X"#ſ~ȖY>.CN02AҀ\-!"Q&GG #"L'@>% "ٚwKAh( ! RSIdP[+E):bIy!,\|% UT$Z g'욲<΀Z9ZAg4_ O#}T(Y.񎍥ـrQ ]|q,vJ 8ly|"xZkw%}%+*yJq}7M£< >DLDpxPy;ϺUNm1/]bR݋(Lnz4p ::-+c|Op(uPU~%w5޲@Hͣ$PAê3*HU ̰ `koi@9aBV1Z%1ާ*U[aƟ5POWng'F`oNT;8ϔRsB8DWCsя?|TK#<(>q w2tH}\w@6+2+@C 5V4d+umc]r>ʡ&YPk7^b! <5΀ܾe-o.dvL~2r%F_%RmW\>aRfSWbQ#,f2lۡ졨WiMZL ?t>&)yz^w lK'3l<M=j<^Nm[Qm@,A}ϷF &}2P% fXŀ5ѩ"O=ÄxEΊ+yRF|S:6.4FQDb@,1dOSlYlnLE#ܱS džE*|W4mqϞ4t{L+@`kQMÊSnkV٪= lO0Pv6@lP h>vm*b)DPHmr$H(&Ts\kɰ)=lF̋;S!C.77v)vQM>EgS]*UR"o}CMK>}p"[ x&QI%?.j]Pe,m+;'N,~gmqObYۅ49xοfxq@]1(6U{4pJ[PK u2Oޥխ>8 bobthecow-psysh-90da7f3/src/VarDumper/PresenterAware.phpUTc]mOK1sm'VTD O^Dd֥ɺ &ervLb60'c hxN2D A,d~ğSo 2 n6WC C* K1Br(ybe-㐑,BnZ:KO6++L =$y_en}¼7 W  oNHh0ah0-PɗoUg2 ON9xuL`Ȩ1sּځm:w ~r9n5@PPB|/PK u2O+ bobthecow-psysh-90da7f3/src/VersionUpdater/UTc]PK u2OE)/M.6 bobthecow-psysh-90da7f3/src/VersionUpdater/Checker.phpUTc]}QK0)ͭ= Stʦu_IHҕ!~wu49.\^[a#̄PH@rw0)4U ]p_ 5z_rgPTJAfɵuJf=MЅq%c 9/4iuj!>8P ЪT.Ccd̘%z)Iyjsbl3 `9#jGv0NҜKIP5>>Mf#DK8d|)kܢ#8Hn8 Ӱ2Fsqm"gp5V:ݿE+_5o PK u2O50< bobthecow-psysh-90da7f3/src/VersionUpdater/GitHubChecker.phpUTc]UO0~_qTcB0(MGbGCA}gǥihyh>|:Dw͔9_&\Ww3hN(b»K@7e  LdP\.8.\ȦrpL ,k1VJ6Ђ@ uHר4sUg̠ F .NK5|椙ޢ^ MI.`˜Z|f6Je+grFդrAduu$ڄMX+~Gjoo7qp4JL6DH-Զ3"}|]DB9룋!lY>ws4DCKmICZ;q!;IzeʆO.7ϛ.SLJI4KTsQ_"qn๐ ѝBjďnV4\Za1Q?)$j!-+1un)Mi>'!$KIExLsVj>wgfa^ݯpG ^XYO?PK u2Oe> bobthecow-psysh-90da7f3/src/VersionUpdater/IntervalChecker.phpUTc]TMo@W! vɩBD mT -5֬54]l 3oޛ0q0 G ;!RCzǐEt1^.U?Ti.`Q+"2a,A 4ɳP>D20b"ǢI֜mlzp80P Qs%_:SI&!tAVL%HIy&>LFD)&uo&L >q=J>k 3JhȆH] ѭ=]R,F"4=-0Egvsf5{W>pQT4i̖߭Rh6vĦm7ܙ_*sgkdhƒjV! bW(99NbyFp%މN EAzjGSB><lIݎMtk:|\y$өPUTζu_]\A:5%2^e\,EؚV T,&˹Yԧv箍}%f[ޣVFWq!FUVw3_kOZ*QF| etZIT*{aۄ.GGDؒt03@n7{ӻW/{g5ygIIO 1aߗuPK u2OΐM6Y]: bobthecow-psysh-90da7f3/src/VersionUpdater/NoopChecker.phpUTc]}MO1s6J Bi^$ږgUTw9;;s5٤|`G?w𓎰g)Un\| (]SCaW1eС Bkv1\AE;8ZjYQ[0hg- d*Œ jrT=R"I8oӌyT1Zp+X4laX~GAͥ)9cT{HI*ea&u~zٵ.IRH4 5f-#`ySH|eKjL8\6 =yN;byGM٭P7^$Iz_P  E*4$L ܁8TWABaDV7ID @6쟗S`%.8dۅ$$]Cր?zLg{F"XoNLv@RV2)A[%?ڳjF춍^,JصcstV`Z 8 R%JYZDE#̒d~esyg&4$(Q8ԨM^3C * CX*45SXs6Q-Cu]֦ ߘڳ_^3~]OHMBT֎q6Xqؖ+AByخXj42aJ,eDo{u`\;$DAP0"h"FN);$p&K EPpuUMzK/J ͳ["}DgN~ø_jBt`ȯ{MrWP[ e96QpCEs6ABa6.X^a}TXCF2Ѕ3[NT,)I? f=ZAA*PHDLϚ-k;^Plܿ2 * +|٪.\R 6:%B~#aѦP|jl'@&jËr1/i%]"!NeI'Zjv%I7N(HUױ`7V UST9_bﻅ-=-Ȕn)zъa-XvČZq`m D/"M5yqkoQhv[epErl5-L⪵(EsfbzWh53v^JVp7>Du=UxkVBA#:Q!1xk!DɻI l*vBȪՄ钧u1TLIUqX"Q߳bbw1YQS7R_P1q}`艾NL K+=]7CrS ܖ(wl[덒Pr0Rats՝?Br|S %,yCuRY#Y2Hʐ)'{mR78_%_}EF3>>;pw^J|-#l8<}88c|Q%H's$o6Z_Ċ x{[Io'@sfkoڢlj_w H :KKB_?fGv1jkwEpǰUtQRy tnqf2B*/8+I,\ 3)2_aU%mdܺ9U+̬~iDkt?g߹XA<+0٦+O*s gWl4;D<1/*dG>7nnO i},&=-2:~?8?{?j[w%^'Ç,; oCdJg'},Tzd<ݿf\o*= z^1_6 n_GՓ!Tf77y DΆo8KoM4[Yڣ~Pmb9ZE;n)pWt{lY}L>^3%̎)ؚRWr{sDe8<8;=;;M.F?0=OoO[29کAٵrCH܎h bz7=@jvpua;-L@wU]3%?"F;O='|ky%0)&t>25/};t(Mx5 :#gfhP*hVZ ,jš@ a Rqȷa /T[2Y/Tx+沣osL\¹lb@vZ-8^a˯S6dϚafo E[o5Z9] Cin12n3;+W+`[ mŹ݉,$:y:ފ-3@ V#ӕLU0s1J<w)VX a# - (۳.szZHeoћ;۰ʽ%b?PK u2O bobthecow-psysh-90da7f3/test/UTc]PK u2Om1 bobthecow-psysh-90da7f3/test/ClassWithSecrets.phpUTc]QK0~_q`?M$!2&Nt[e0bH9dW惠6KzS nt3 Y%G6O'tmP*!VU0Y6k+_Sbd$ *6(: NoK)V%n2O*#X:@JbJjF 7cL\8ڟေ(ȟ Dd:XEC=Nb0 BBsJHsGsHV"hTά6ur5**򓄽S-'5Ehe2hXA}А ~tUhBoNP~t{%aW|6~ګyڰOPK u2O) bobthecow-psysh-90da7f3/test/CodeCleaner/UTc]PK u2O (&B bobthecow-psysh-90da7f3/test/CodeCleaner/AbstractClassPassTest.phpUTc]R]0|ׯX]S!MhK)O{PM-Pd!A1n.NK b;;;;zN~O@Nzr㰅IƼX_[V0j)mS2*=PU׿ is0Z .JK{ ΠJ} L IryEZS5WȍrCrI)e͸E? Qt0gr(321Nod"#8biyvt_l3|D<#qLHmD.|COE&q̷_PK u2OjX. @ bobthecow-psysh-90da7f3/test/CodeCleaner/CalledClassPassTest.phpUTc]Tn@}WRl6OU*)DbJˮB 61R-̙3=ÇyA@709 n2 A*L"~nGa,Ln!CfBHT}fOP gJϙJ^B.mq~~FG˱dRnb Kn3PF:AJ+䌌TdNbƔGAa6$fB` f w8;6E9cj#x R4&m>Qp.u.|Ie7Z-x&`#,QZSpcB#}1{9htUaKJ1e!„7HLtu k0Ӌ~^ O-ۋ{ɅeS8^!p̔ #x|x>ω O]xUw͔Zzsk-sLڎuqEczTSi.p;Tw.bki6C(5-K{'b:\Fv:wz҆p{2׍;Y` Im:ͮ hq^mԈV3 q3cc+A>'` CZDx_˴iq_J)5ԥZ{e2[TGA5P0NJ&:ri6(UU0XDPK u2O>LpE bobthecow-psysh-90da7f3/test/CodeCleaner/Fixtures/ClassWithStatic.phpUTc]-N0 @ &Xa'$8MB$.dK"I; q >8l?$6 6pwAޤ3C&h,zdVf ݕ[x).L :#-B_ӔݧeС  ybQK̽>f?ZtjQt8Sa`tl#K6(:%+G$nkr'`nKFSxM?daâdԏTN 3̺ņK߯ QUÅpOBʰۅ9PK u2OpE bobthecow-psysh-90da7f3/test/CodeCleaner/Fixtures/TraitWithStatic.phpUTc]-J1 @]tG$(xwQf^:miSAMGsH!yI^B4͠C7D4:mJaw}t /%S!$ sB4B!lJ}YvE$dfJT,j%)CVF/GQr=f:mtP俏r2/K]L>>>>ӗne2X:@ Y¼Fc1$2.o\:T#T1Pf@ZFhwKI h J47|:9TK t ZBkM5gXjp/)"GBXHb9Ba:֖QO,f2FwEV3Z'sG< մ<3['t$i#:\~dN,12IqW6ʲ=CJy =jNp4D K 0$ggժ+<>E&O bBS-'ZouwW%){ɻyv3& R Qsi L=7~Y*^KD!~ɏp4|d3#cR2L>:%:LEߠcG-3|vp\}>tO]彩C$KrdUAXQLa#b @\!ѰߣAᦢQ#Xc4ss]WIYZcg=Xc @y~+/4r ҷ\lW3yBZhfr" K|m7SwMs\=knUsu+3IP]'c< tN^#tnxA2`X8e03+"f#<#2'`ᡎV"ogʏ޴DRfQ:o$b㚓ѸhUZ9P7W?̓Rj╺u9AWX|JDІeAK"]<ˊy*d' _ ӌty U:Y@&3cvXcP /t=DĊ:T*1(X|c@ػB#3ʀ a_`a%E~ LgbyH&B8_/J $XhꐄR͹2@#ؓEz;MFT.Dk6JxE:GNH݉x5%ݯ`08o`5kl!Fe؂%+Xc=/!5^v2 _P(5,F}U;?7PoֹW{UW5~TP կP`j2?IĿ*;ɍA{&-jC9v} 0ة=rxy*PK u2O?W<? bobthecow-psysh-90da7f3/test/CodeCleaner/InstanceOfPassTest.phpUTc]Tko0_qPXˣҦݫTeV4ؾ 䦱ȾׁJ}y4aJ  C;e 8T>:1|),I5j(EH,HwFަBŐ*f*Hjuyc32k6R8 KKFN RQ.L(F7d3y-:> iv$:)KBEx 2~ T'.a}r #7fRȱ#kV18țzX ZD?Y/9$FdLSTd0\,Ey9q_]pk6*dSL~S!&}#5c K3!\EkKBT[ʙOd#[;@o6d C-?`%Ѻ{c?p?{n@=HDf=J2.܍߷/a'+?hh…N{}ӫ$|زzU˗'Lфj~iq=ѡm ^`-YU=?:Ƴ9:S<9 ߶v:yÔ:PK u2Odg@@D bobthecow-psysh-90da7f3/test/CodeCleaner/LeavePsyshAlonePassTest.phpUTc]Tao0_qOu TIbͱ#EU!(Ռ{w5O t,R!;,a0MQL0}~|o#weBW@)²P bo\B'dq46$APpl-qSOG>U)RAEAFRKu1rAhY|CF\G9ke4NšY u`/)^yy:͂C1jF ԡA4 ;rsИ硻JjLRkU}s踲,6aֆR=h{ɲHϯ3K3[`Hxpk2A kd2%A&W&F)-&N̺Z'>E*:}[X+QvzpDQXl[Ud!4׹%u_p9|[G1? M2:fB0GVFI_R5wl6Lv/br)~?6>PK u2O/f@ bobthecow-psysh-90da7f3/test/CodeCleaner/LegacyEmptyPassTest.phpUTc]S]k0}@&K0.Yԡ(u-%#By$s?"-rkHx@g@W0N1:D,7C✶Ԇ # V*0)BRfDX)`"G(4eT93\629.*pߏ}*Ǥi6J1,I R,U(F[dqQT~8Am#PkhE+?/*`Z+4(b ;> ΫrFZ""AQ^v5mhWPҹׯoNut[w ̰@9QQG,09 4\QeEULhoaF_)sCR)oZ jd6WO#}n{s<7ɜϏ eOMK)=]OM8okz!?j3ghӫnj̘cLnЎ'DsãLTt1)j$Rb PK u2Op+579 bobthecow-psysh-90da7f3/test/CodeCleaner/ListPassTest.phpUTc]Vm6_1BH 4n?Ү(QqB AC"'^TH ա&33xfc?6Nۀ6@2)3&\B؃0GBY^ ?<<_DȀ'd EOa!xQʗ@L b6!% V>zWt8'D"Dl*{- c .b p~Ot~F#"n{!>ᰠ@wC0p?'sTdj>M]7izҸ7C?:vJk "ɈG`A9&oC`H"2)0<(\%.h2rRDףB J^ʸ ̓/"+ZV,rTbFwUX: 6~9b*OSv̫̊߀X SPF.Y3sr-<*4eB)9P8Yu:0$} jm$Jl}<,g}$U uKU/B+z׆x*Xf0Q.jǂf"ģԹz_e8s挿 ې״]St͖k9FCLtv# "'qL;"@*I$T.JGFRA*4[[INL@sZO>( Y9v<-[[+̋XBy7gu-5?528ٚr[vIi܅YzrdR9=rJ5^izxw\ TuAL>LA04-;W6޻mL{(AJd:U*~YoCϗ KZqk*U?k(cPKٵˬyu; Kz5wxF\weeNDQ\`=4:zT5[٘5fhd(9ijݜ_%݆gxN4%rr_g.s`9K؜#~\LԆ j!0 Nӫ^v Fly=UaPK u2OJzK0 @ bobthecow-psysh-90da7f3/test/CodeCleaner/LoopContextPassTest.phpUTc]Wmo0_q m4QuSU!}*jx3vd;Ъ9^Hms/q|M0 􎘶&00Opgq߀E~}_\Y͘\B."Lb!Wѓ4AN1˕lA$ڜ"U 3pc5XpjT}$G ۞' Mh Qv{Gz^lҭѵRQOIv!/ ue``ޭ( zxLR wTo${)=5WtuIȹ7%vZ7{,h5j ZfqҚ TQ9$ZlmiޚTɯd.^s_Ž$D!fsKFvyO hc-.[p݉O2ƓVng-. ԭϰ2~`µ5a”ː LWom`O)i :!0=WsU,!~Xc CKq  5օژ~ƆR o[-0q EN +g:7NX,罎vp^I)ap5g޵@I:229`8@J-0(`MV<\ W".NO/*1gբ._L4$8$Ѵ9uTftw55nvWErJ]Kv 瘴Rji~{H)~Up:TՆP]P4tV=(A,&m ~RT6*63:oElfxPK u2OeC bobthecow-psysh-90da7f3/test/CodeCleaner/MagicConstantsPassTest.phpUTc]uPN0}WR.*[([DW{; V}$Jz(':V*F8Sȋ !B٠o%9=sFsceBt~6k*Ɠ4g{&;B6\&PK u2OcP> bobthecow-psysh-90da7f3/test/CodeCleaner/NamespacePassTest.phpUTc]UQo0~ϯJ U{nmHeB&4;B҂(]D~)B?R.]0mA 2A.+kpNOp[%\*grUiBZ *&?dL@ 2U:g+y@Fq\u{W.TEf˜HK hU)Qd$D?꣱Qv;Gn{^i[k ƨ)d05 עL <:{tyShE8,*s9Pd"U{s[Nhl TOrs_ so6"*FnaEb\&}FH¦CQ.MijK;ӚM9BWfA*Y KQZ0*ET j\jKn꫰V= ~sGj(y -k\tKVP4R9)Y*E8< J0"tuu`FQ6Z] VMrлqӹړ}]_ZT,m uXSS}l7NlgRUWiI'xUK/~{4xmy3PK u2O> bobthecow-psysh-90da7f3/test/CodeCleaner/NoReturnValueTest.phpUTc]QMO0Wc(hA+Tm+.!L%ױ<jf5y3WJ*8Ym *Ldh* 5:w"E?Ώs-STs㷔&UMXE^3_z_5qn6C#N~4~S.׆aaJK[Xr-DQ)ȒgH8TI&&Q|sHR 7)ɸwa,]G1)!$KF_9}|QgaCK$2\./-{EKK!?Ȳ=}//+tWsZ]1SY7҉y5ֳ,\z73Iz].K^ PK u2O[ H bobthecow-psysh-90da7f3/test/CodeCleaner/PassableByReferencePassTest.phpUTc]U]O0}ϯBH;Xe- 剢In'lNRiS(s?cƩkԠs 4LH"8([XTܧ8ɴא(01B AN 0JMd!3<{ ddqN[nR阘eB~f0[nbZTu)P6ɺH6D22RjojHT҂δf/ P К`ݲ P,4̧ک%2EFs|mb ?EKJjHAXZ=|jS|a*uz4zq=0͓۞?m5͜Kk2T2 PyB+NA4z2)6BzT8ғtRɔ] $u7L%Jbyd]h<;lw 8ˤLOez ԉhSqwwVk3up+Q ggp(VӇ$6sx;+"h*~I`Eop./gg:hy<^eb+~<սmllPn@s vCYҕz,k]9%^$;)_u,߁9PK u2OFt < bobthecow-psysh-90da7f3/test/CodeCleaner/RequirePassTest.phpUTc]Vmo0_qDMB(2i@M.Yjgӗ4M{>_޼/F=R#л`ʀLTyy\W3 p)jH*0BZ9IJW|`"(41T93\!92Zx'硅rrL 2 Fii0[n2T-K#%hE{C?:g?9슝>^w0&RБ:HVCwDIrfBK讜 QΧ4JuE&T jq$5|hiiqU"voe6з3]]xWPcuJR)۷ZvٜBS0Mgnz*ଐ--KA[]oKK5ߎIgY~uS$Uy١$p7V?#P)Vk!,P1]f@OHGSAquw"]v[̮vI_0eSYNߥ#V LXS kaºnt,O!xN.>|;QXHE_A35w,&霩+p~ŋ`QZ=;)qP://첔ZHZ%p2W`m~.PK u2OlB5!.@ bobthecow-psysh-90da7f3/test/CodeCleaner/StrictTypesPassTest.phpUTc]Smo0_qBHʗM{U /MX e;h9P1瞻|wEgnA fn͍n`aģ8~ߡG^X'$PԂ r !-b7Fp@.b2TwB69ٖWex8Uaҝˢb[qjQZ%KBж5k{<3]! 2w>ҜHdPNc/ Ma 9Ԑს-Ԑqҭ-T0Ja_ ײHsV\zEx,>l2U,)=8nףH~4ҸgfcIϞvE^H'Kݓ_ p_jfMTh1{78v@F [vXL4V(M0'VY\y}tD#m[nfdmfj!'yZORa*ͷ@"*E6egBNs95ٙ4{cӞ]OSԧ8oPK u2O'6\5*C bobthecow-psysh-90da7f3/test/CodeCleaner/ValidClassNamePassTest.phpUTc]Zms6ίfL.s]K{0Kg2X<Bo߻ 8[ҳ^vW?_:T \"fC\ZMN_oC{QH:ف"sNog! bIw|`xwGL{^ J#, dQ!9XhF%`7 RVKP4$B:P9gZ ¢vqмwhg-RKY%P}!`"AGea uoPA7=0CVb:-jv|p-,q;jn-yy&J2TBq,y:FUDmɃ d5 (:#7X ,CrRw"f&!DP2٬ j,-] =w3G}jjcb+iU23(N e7`/ 'QtŽ}s\*a}u!' nMR?Rfx$ vnn2J=R4}c> o=lJj>%S||qd+>5\ߨÆFM6pW/mPKPg!'& W?Uno^g)Ħ6E{c0X&ѶYFf@f~dqzPPK u2O#zZB bobthecow-psysh-90da7f3/test/CodeCleaner/ValidConstantPassTest.phpUTc]SMO@W!Nu˩JDPA FbJή;N*{g B݃מy3o޾e^z^Q.-d@@g0pcQ|`CI?~:>gUY Nj&2(GȪDFBPei3$:@E]w~FWתrARiۊ03<ՕIRtC m)8ZCΆ̣Di.LB# :@%a^%h`‡{(UH摨@"#ۄ4{n5/J0e |䯉F\VUHɪe 6F32R*oAuʚe%*smY]r *x:.SBNs\F+B2HgZ%3AN΂sa\ޑӠۂ+k;N-YZQ-32|f&GIOLz[3cZp5giG}kp¦\VՌSJ7!2PNU\\iօߑl >k0dil0?̳n&[z.h[[+e[?LEuہrYTNdGdJ> }#5fѕb^4&vaRw%Rpbo`tWgRyJ{d#Q'RdLaoNV'ɐ\w! yד_x[R+~݊#(uG&h惷^Bqp":'FZAMc_ZTKI.Ěq"i*M MGa<, 9~8Qwk@g̔(k=xC*VjpvrzvL-цKJFLT."&D!>A1#y@F{i6e}uӶ28&dR(>H rAQ<$G>Z Ǒl:f$$jkhHTMIthN2DzYfZ' 2Ake- yt8PDt6h4?cM5u`9Hִ+Rn&MѨק6g]`Rϛй"> T.Ȓh+\6(PC\_TْkVziBG{3BЋKb}AB( clğCXP=uRl[Qy/W{sc=[J6toU,'1C8d][|eW[R4ὔ%2<[ .C6> |szy?%ޛ0P-w+7nY[ڱWsz1*Q nKZwv6G"vU5leK|CowMDd⤣Jpz;1H' 9=㤙 -VBAeHjRipI'̠Vo+kKKyKfDdS@ž_.Xe4MԻ0YƆ3)涓' 2/o?[K֣)7^iUn{?Y5P~l{ݻ8ۙ\tPK u2O3& 0 bobthecow-psysh-90da7f3/test/CodeCleanerTest.phpUTc]VmoF_1l&WUIWEDIˡ~ {׷N`?2̫ٝE8Þ=]p s#wʔ9~x@.xzvB6\Y%Ll RY ̳8Pϊ?, 0AC"T 3\>12=r\v]_oc*O,qme#Xq eB@$#X:e$[f8.^" T$ c5Td dPD&Tr%2vA:gߔ뻈6QG@cCKa}o0N$B0Hۖp5>S=C'u: f\@2|J1tsEf!ZvTfJ5>yZ#9zwm,`<L +лYh#R[w s >glB;yYmjqsu`; D5UOzAM 30h~s-#_BMRbjJ/m|d H6`M9w['aaasJMrkWQl})hyn Lh]@Qa|M"|mR#S,I>UknVBD*ѣq'ut]]}z0( SK{MThƉrRFIv!ȡg^H慎k@rfː5PC8?!Vk*!.ye (盠_ i30Z. Ji\vuw7aT*$RFtaKMgXjtUPȍ2lE%gM;ۤWzg s8ΎXIimSaXW!>'PK u2O0 - ; bobthecow-psysh-90da7f3/test/Command/ThrowUpCommandTest.phpUTc]Vo6~_q P xЮ޲E:,QC tRFR{Wy"[UTQ?&07Fv og  ɫjmNp´2]A jMɝЪ DNksC:B.3vBvյɐIHmiq*Z+]VZrN:׉w:jb@ɶ+0zAѴX/In-"MC[HGףOJ| PW$OoÛ=玏 A`F" ]$:Be^mp7ll73ۅNG_0s|L+opOzhk&f^F+lX2EWƷluQyƎp7~oVI!B#ڨ͘OcԢ}sODkm.olNv2̚!ݮ UE+nRڶt׈;(^~1PSqC>8R [Ih[no|kNY.3k{R7 ^M.*ȶ45pSۻ.L;vP3l1x3Fuep|ߟ4PP6"g/'g=)Y]"kYRvI}6Ogfq,~s4+a5[ZT+-4[,"Ӓ{a#H?[@C6׺ @6G W0Ӯ'O#dMO>҅'4a;k{69@H߫9"4$7;ܠ|ApquI~SK'' jÍgܿF=P[QhU9-c>g3 MյC=Gq7a[kXd2X W[|:[_PK u2OUx' 2 bobthecow-psysh-90da7f3/test/ConfigurationTest.phpUTc]Yo6+ ܸ .Ć`FT[(mKV ے}>njuZd\Lw@"yH.y+#qr\+c#_YGl?xl*BCep O{@Q.UJ08)ߠ mdt2͟]TZPP#./2EQPTJpLy $ @̎: {.7 a |\iE ߚ;4P)X'p;'Oّ@|qjn >5;Y2;v}cz@8fg7b1B Dlh_$2A9xO?%yt2}buE*PXnV'u.eL>2zև =%eScȎ3?QjFf^bTA)Ƭ=KI-k}ޥr?ov@' ldKNc$[$QOB;e-dba=oPXoFd~6懟.F9K4qZ9pf VTa 3jXS`ǠpCLͯg5T>EW2{oݹX8uir*)hhqΪv+3@X]^|@閣sx;N) ڊ;ܫBZ}9A mygحAE!iɬ r',EWaxJB,$#zB`;rDFvU`T_ƹY_Z,ٴ;YyM2ZcVI7qA]sS2G8=ߦ^WT@" &i]u% 1$}[[=/24=8#DsxeTCJnuC:UUlricKt*8qCPoiJ[9 e.4*QFXʞUPڙ'9%=+("HQ%!܂d4!/5cك|h4 %!X5娇AzO%60JÂq8b#oX !dSpx̪UWVL Yކ rk-Yhdq+.wSi2wmDiY`3mg3 <,Ab4s>'5~*]::*QϗB=0e鲪Ү:R͌dN'ϊUI|lםLP=z|ʱ\jp{ *uRwDdtrF$vĈ!UzA$YUZ**TFO_[Q\Yv^ݦa^{*7Ld:ÏWX:cW];^j6'q59k͖BȬ?S=]_Uה]}m/GLeP*fZfj%N).e(bO<7f8IP[~ccP5;6֠!1(ހy[-I#u{_PK u2O8 bobthecow-psysh-90da7f3/test/ConsoleColorFactoryTest.phpUTc]SMO@ﯘC8 T*8q u͉hmU7~"I3ycVW5c  RH8% H%MUw]>oPpI9WHpB饄\K#f "GeA̹ZB-SAōdشj帊;Xp Έ;,`!\Ej79Qc9I$Ezyz *̛Zb6ϝ6K[ /䚦Uaa2*&!6ZҐbO >7(nw:+Ls>MFsS~vƣfzmrA/,M}.Ff+x HxS[+(Iq?aHNEgآ7dcp~בBTys?Za}Q| _t?_z1=HzcaN8ԍj&CPDNlEC;7y#A#߅;I (f#Ⱥ7,ݚn L;^*XEa9"EP%X,U?iCfZ2_j8<n խX{ql0?P[l604e!eNN+>ŴLku!\9C ~B{h|SQD$ `;W=C.2}lϼ\0P*C n^V%/6OiN$OPz!h~,0!oW{#}-ݲjQ!݀ 5Άտ T6 "1'mzOe7Qܖ.:]޷4FV՜Ҽ&])0{DU(Bu"rv, %-9t!/rC\ϏH3<:X?PK u2O' bobthecow-psysh-90da7f3/test/Exception/UTc]PK u2Oqʟ= bobthecow-psysh-90da7f3/test/Exception/BreakExceptionTest.phpUTc]SO0_qHm#06*eoyqKcږYZ!SItvbH.`sDP'𭢠 \sZ=zB^%(^dPjX֯e+Qrƺ~3.f  AC;llPD#HNrH!m(w&DE~(BT)[<&#HFҳXmc3 I/W-9- o iG dߕKil }t,i?ޒ<`?H= vnjM/V*jG^1&IcI n*Z|J^ ͖['smth*+%Ƴ PK u2OeAD= bobthecow-psysh-90da7f3/test/Exception/ErrorExceptionTest.phpUTc]W[oH~Jv}*fJ>cl̸3c{Ʀ`ذi!8|;9GĆnAA(F@7B\QQB-ey'm)|N F9e+. I+E((I|.T5IgMkG6QUdI%R!Q0%PJ4ȶa0:S|1HO{Hdb̵"/ETJR|xR- {%ْO1 W<`H6QǤ$G0KletoX~ܙM4}VGaڨ HIgat9S4d2N?`*feYmFȬ4ȟSPE8APveiP&ҿWbW44IRv`27ǁ(XW1s5yp6of5bM,)|:m|G!ԚX56{*@%;{7sOoTfY;p*_Bv=;8#3V煮ϸ22F}\"ΚP^  6n4247šGseW  WP;\u@?,faz+RojpZic@ky~d0l&{s[/ GW9LM>q1}ӥPHs~8)3Zp m"Z`NoPҋ\JLOߜ!(:0M3PK u2OA,ӤrB bobthecow-psysh-90da7f3/test/Exception/ParseErrorExceptionTest.phpUTc]RMO@ﯘRDpB)C*(Л/zjv5wi@ f޼7OB:U w%(l #/`Fp[bU $fG_8 up.Sv!SK*0>Rm4C C̢fL1IGRY(Ar_) JKQGHMc@֍M-ՖMAq`mBMϦwptİ)}5aԳ9Ue6l`ioŬ!tG{m' <+_Jo$%6ƛ4|yp7w&\6ێQ '믔nY+R/PK u2Oo&? bobthecow-psysh-90da7f3/test/Exception/ThrowUpExceptionTest.phpUTc]UQo0~ϯ8U@=ljnikQiHI."=ہV}&mҤ"b}PrnˁD@cWL[!#dQ߄ã6ϩ\&`#0cz|Y`"( e \P12Zs\/^rϨrl,,$ۈvT#S#% 0+8%hE*߻Ac*Kw8YmkMVՃEF[7Дp!,գfGQ:&!v6Ud+s.SAUnZ2le4O+jݒL9LxuM7ʷt7yy#eqrS(qIÚ{e|jmnб@_Ů| j%hT,*-\6ky4ۆONFk-3x7Gmw˄N7tֿ.s9rgfU0=>+[k2c$Y$ϧ2yԿW-mV- }99yIOEu2o]<$j;U3R2uf n._>ҖO۠]Vu?PuRPK u2Or54jA bobthecow-psysh-90da7f3/test/Exception/TypeErrorExceptionTest.phpUTc]TMO@W6J UAiObUֻuB;IK;ڝ޼']h;>Fs@_͌ýC\GRGi'I^sepMUȕ2 R熏 Lf xҒ̕)Jv@ dt68[ 8鸂91 a3 TL$aIVՌ)d%s;ʾ^4gh12FͰT0k}U>;.2$:Sf!ztD2 ekd |Ih l߁iHY6KJ1]N_DpDvZkLя  n.{9F(&ډ~`OԐ&_x{iM2l~*/I[VALL[%B7$ Ll9`h[m+֕kX[9Tm!v;ꑴtC̤^xµ,pOmpUeW%5;l%v Zx?PK u2OA* bobthecow-psysh-90da7f3/test/FakeShell.phpUTc]mMK1s-՞EEEhB6iúHيEa̛yQXVJ!>-Td9tSC9tŸ+xJ!j ڡ=,d H״^oT-v;3h !>4q6]λ2NTa*eT^G7\بBdx-D }p- R}FUӊ/|T21 T*e':Y%Z:hIZo` s `yNQKYeNƴ`P<~6Dek65fXA|PK u2O' bobthecow-psysh-90da7f3/test/Formatter/UTc]PK u2Os&p< bobthecow-psysh-90da7f3/test/Formatter/CodeFormatterTest.phpUTc]W[S8~дf%R4 J #lȒW#ql'vgw3st9'ut> (# :Uw?&mB LVy.r $cF)c(ɝc0! ,1TJ6d};tO]c+Q%J5Д1J2$`("p`X9Q:8i"?:Nb-nIb.P N%QA_ĤðR+5Dn5BwNG7lvr׳+lK5>bB#"$#FB-oe$7wyh4YZ@k6[e~kh>Uۣ:qHuG0 A"$ {km Kí (>ǯro |͍}p'WM4"lnCox_f\F</̜N_[v{}{d3ȡL>GhPB!ew?$W}Zr+H:5# <̅wCTے?&ȳ82nmU,V~WύřvnղR3oWz@C ebBB; %E]eo`3WNT`뫥]-aܿ*\o|pff%궮ߨװ(t'xfa{&uU* O:xv̳Ҭ&0|[pk>\},›?R`+[Wb5b:eq9W 5a1,-CjBqiDpJ؀^`RZEADF00ËyHxK6$r&AO̗J3 `# >2z̧U{S}@9/q@{W `)e tIĂAzPK u2OjAk @ bobthecow-psysh-90da7f3/test/Formatter/DocblockFormatterTest.phpUTc]}O0WܤJMBOE0L{鋛\lwv-~|}eVz^8`Oאƒ)2^49=/҆ #V*0BZ9IJ\+ 0@c2T.ͽp\:؆rrL ,k2VH%hE'Xd4IgO֥3=fnv#y.m8gZÛ peP$f/)K]kڎzm} i~jZKV[Uzc[~)p/^XΓ+ fB/4}j;++37}ؾRbϒ C9S%r* k M>\/DBbo"!tc 3(mHuJ~m|vX+-wvvAdW6ۼ6׊ fyI6mjNw R}QN(2A+Ea;Kܞc]HЭۢviNlEiCD_):N6k޺۾v{tm9]+w,GGxӳwшTfJCↀk쬾@}#9:;}eb}PAzPK u2O0 bobthecow-psysh-90da7f3/test/Formatter/Fixtures/UTc]PK u2O kc? bobthecow-psysh-90da7f3/test/Formatter/Fixtures/BoringTrait.phpUTc]-AO1D Q\,M;+wvum޼oq\2Lq\в'l儵#j]zl~ ^"𬩃 UGh;Qtʼwx)mm+%'qȽ<.?~Հ# "wP#E-5iQC=deL*ɪ ٮ:]tʭ1- boc*{B;"f觪2tl~PK u2OrjiI4= bobthecow-psysh-90da7f3/test/Formatter/Fixtures/SomeClass.phpUTc]uN0EY 5E@+XDч.+!7Kmٓ '!ϙ{UNѹsXW*@4Nz[* P+F"C_ߌ/y&2]4=2B(![E MZh;ZFw;).ijP% 2@ym +Qm|lT` 9|7k v~3Sx !r-C֘/!WnM Ȗk\dkA`+ &-IB8D9a-Oa8*D`T"E;ӫ-ݛ%jx J:8OPK u2OYa4 A bobthecow-psysh-90da7f3/test/Formatter/SignatureFormatterTest.phpUTc]VQo8~ϯ!]}Zѻ"P{euX vd;P!In[?6\%Y-( #,I FElḀZ2åB o+`x3ڥr:&fLCĵQ>3f EhIG%Gߢ6(wgP;N7La V8O0Lki=B&1l uhНhPDDZFR={P%a4oΥK2tT3LY}<9O G2Rlm) mv?n9MiJawulNN'Lj6Qr#TTk۲I,O E`.J")bTmGjnTfFq*(m( [h0Ns^>x@_;v!( j.HE'@s-ÇOjSMzEbDZjh~8PK u2O# bobthecow-psysh-90da7f3/test/Input/UTc]PK u2OxF7 bobthecow-psysh-90da7f3/test/Input/CodeArgumentTest.phpUTc]RQo0~IžІdZXCUB˄X8e;M#璖ҕM_rw;==A&$YíAj( 4nr/_> Upi >GJ)!Ѧb{*)T:Lۂ{UDNͻG4hJt|=TA*B%|NtiF)6$)^3D?qLO+#EY`EUMhEnRNKdHimqw{tK[Upu4ނONd2r ~^d| '.0frxS܏)8Z̟PyGo鹡:Uy9FjW#Ϸ=?{[ PK u2O 2 8 bobthecow-psysh-90da7f3/test/Input/FilterOptionsTest.phpUTc]VKs0W0 !Mh R4=(:HF$v2O+D㴛4>B#3aʀ a00_Ģ\޼=pd5e!i/GiJ5eKт$FFc3]}ص2:&bLCQ| `MD3DUTH hIG) ݣ6;qRfߣ ~bylrR,G9M@aMhcao0[zFC-&+~̴ږ# 4~S\Y JtL ߚh giʡ:pY]|R؀mR+td*(PONh7Qf@P<Ȃ'._k{탖mR )dAb){(& A2d݋oswRkwùf=V<'mQI7Q\3:0 Ō׀iڧty̨тzr"[k\$S#.|̲Lۆs˧%ŻZL%?E_ G`cm ')%} ÏnhhiY䦹)B˨RP+<0 H_Y窮@h6t"m[t(M^AyA^ x<7ǗoVbp,?aUI')sӤUXgb&B]=pZa!ߊPK u2OcPK"5 bobthecow-psysh-90da7f3/test/Input/ShellInputTest.phpUTc]Ymo6_q zۧ]f躬IQ0m I8CdXe7kL@";>J˯,tG8Y aOBrF%h׃~' R !ל-f&qǣ3eW`.D! )E@H2pԌ(X ~ Ʊ>,5*y,< Tt:̩"|J垳(V:X&{#FSд{k-HVf?dJeSP42):&0BĥQ~$:0(c` 1`Qj&R~QVsV Heu{FD~^k#107kZh]}`pqY!]{PqC׮>ŝ{kO816iqnAkѶ[MŚxp[lZvN~igTAthVތ5&.>z .N 'C_Ni 9 $b*ZO>'(ƾRE㈶(S:>: 1!8L_ë'vn~;YC~F{Na= [RL /96uaW e=缔8/|$EuEJ~5OkKƌ0@"תkd$LH!`Ү1j\,qf^APF `:>{ `'1Z'zLS`F{8 Qʋ( 5U`PN7vcvsvNT=ݗjĈdiPWDUԬmys45ܴ7 ff]x2>ܤ۩Lv]@%NL-)e߀޺96xV=dR\ӵhp84+[-Ј+.\ ~5p!mW`'0v]{cČƹNB" 0 N?X$$iiQy5}F%3[A0[1#>8ֵ6e>Y*.q!pcƌEu\˗ƪ׊.P%OPLL&HU⠬!8`l53%j.dg I}gGM-7-n5r9|WvHMP+0L7*C#I)oөSm Y`:B)*P& On6ް;$?Ηm[Z 7ukϲf/?9txVIOr6uY IM,\Qu-}`5p&惁_뾹pS'NLݞ鴝:i߁c- }Jwg٭οPK u2O,4M / bobthecow-psysh-90da7f3/test/ParserTestCase.phpUTc]V[o0~ϯ8]=MeM6JƋjbGI;zY ؟3>iEg'u*-d߅0z3yY!'#xSx JKR> UA.JVeA@%d2AeكZi ZPڭč?|Ly: S.a#)juidGKt$ϢHm!x/$Jv1K0bfh73Rf Z|~MpLm=, icI&,[…jia12$-. shs1)&L\2I#o! ql?rJ[ ިx䷃+ \*O?4=(.ߤ > N< o+q\-s] E2Iٵ"FH $8MC"(I!^[8+__e.3L6:?_7*Ꭓ3p[D3!#ȼsL+0 <#-W+YF|p#] cr"f*I-JE2ǦR *iBJΆhxvRZ;Lk޿''g^ܯcP_ȖgeAC6tf?xږtoZI7 VrHuO9Kk(S+h vn26hē}4d~W7L^;u^ AfY{FBXlpfôڕcܮ]&ǕktT~wTKfIߠrb; I)1 ;Eb yk>PK u2O& bobthecow-psysh-90da7f3/test/Readline/UTc]PK u2OfGe 9 bobthecow-psysh-90da7f3/test/Readline/GNUReadlineTest.phpUTc]Umo0_qLV--66FGAhLdEBEn.VS۲/+-眦âCV4H޿=EU9C3 hĸD\`N*ժҤ2d3n5##_pGβBH~]צs< ,"+3O{tW 9SmZ Ui4rYV O<aRkeBwCϘJКHEH6.xhޤ_/(^p1a]c I&LlCC5'Ťcww.1I 7Iڰ ES?^p}p1}n$I-^4.q!"N^n]nQІv}p-zPK u2O$kt8 bobthecow-psysh-90da7f3/test/Readline/HoaConsoleTest.phpUTc]OO1s0a1 1\eumv]wwY.&"=o潗ݛ;Bza 5z)\KyH ˫~kx( 8SE&ڂ8hSYy WTmNЪFrOz~4~êڎϨ:`y+ J3U pb<hΝXD;?sʤP|@H6])j:iAS X߾su~ܦJ퓚EAu$za_E Ӻ/?epڈ#~ۿ [7PK u2O9 7 bobthecow-psysh-90da7f3/test/Readline/TransientTest.phpUTc]VQo0~QJKit*7.m!A\ܮuB?w9zc X?bB"l0q5$J -ua8x1%|( j9|0/LڊW9HrĠ.Z`$r}XOGQ* rcyTK!gL:HSt>S6%ztIQ≬xG4kpIitѸVF7ۭ kp~PK u2O( bobthecow-psysh-90da7f3/test/Reflection/UTc]PK u2O\}p6 G bobthecow-psysh-90da7f3/test/Reflection/ReflectionClassConstantTest.phpUTc]VN@}W*$;QRZ*(H NDB x Cp.Ιsoi:f݁: b! L=cLb[>o5 ȴ 5fbr$!ʒ+> 0BD$՘.En9NrIm*cbf`4\ů3!L鄤j(D+rqNIp 0J0|;XJ-)as`CŹ xgP޹fxHDE9X~p~v]"ivM%ʉ [rW݊hP$ (U6ls""Zsoɦ呼T_m5Ȍtr.лi2Sۧ*yUuú͢2}`.F)w=;bT+ڶ~$[ӶxG4Dc q(y,Y!갏w)U]i>cÎe (Y9Fȉ'VrgY}͈?o|&TR̪04XVFhᰪVX4"\<+fd~/h u3f+*m,|9JC)w)CrJ2G+._kSDN2z祼%i4{2ʹ;Wиy߸g0| !3$i7:/.6y=g'b4 ZeihC3%bfυK]s銾l,Exv$PK u2Oʓ&^D bobthecow-psysh-90da7f3/test/Reflection/ReflectionConstantBCTest.phpUTc]PKk@ﯘ-Z[O 7ɤYI{gcAAJC|者& Ry(F%-`(QsT;r<֞ @E5d:VHVn-IYӅJهM{ƣd1 RM*%Fzȕ'V5aE%o8ːr !BF_IreXĥP75Ɠ4ĸLKtMOB{X'h9vlQK,!%>I_gn #v ^q5ܘi?\ ڝW 84`Btluznyhڐ2Zb_wb'PK u2Or| B bobthecow-psysh-90da7f3/test/Reflection/ReflectionConstantTest.phpUTc]W[oF~W"[ISmw\`*D-ؙ!NcL]lk|]v9`^BhJKV&$M@%GCxO/g2"j$ "M!N׉Ő҈0*PҌC(ٖek*U;2 %lC1ӏ$1lL]Y#b4nC^9u ${ݏ+^uU KhT)q(hL8l5,v2Ghy!^PqvP-o6'jDM}A, =?X+k %cƮ%-ǖ%07s%a离|.xdfcUtf v (~ p!܅)q9Wz޵h=>GWHlG$/˷Xuׅ=&fX} ϶ёwmm;콍pʹyguJG*HĨ815|Kjnu -AWUdug| ZJ=ͭZsse$ݐl)LCWvy$>rs~!2OREΜޝƒn-dܕgicoM?ݣ/PK u2ON\BT bobthecow-psysh-90da7f3/test/Reflection/ReflectionLanguageConstructParameterTest.phpUTc]TMo@WNPh/HA%$*  \=Wݬ~DYI&iL=${3o>7y{'0J ϙ2%0sMQq jًgmy6\5fLV~,+>M 0JMd3c(I鄤̪QNI6C3$j3<' S˦$uM)oPQH0 ةaPg͸NLݕSt&r;!/bYCsVXzvs%H 5s[$|U>L\,gjs}M@„pc¬0_װ>.Z=eҭ`vNBQm \Sf@ҙvg.9h|'RᠲcMcY}'f٤2m?zl =MSg7ַt1a JfFEvdL5َ8N&Oi1ҥyZ'LT*ѩZ l-Eic*m>Ut+ SRI4Aq,`$:֭,$'7~KvIY>%9xZ'-\L|A~|ǔKə% g0g&yن?&B!9) ͔9adqWIhwY(B8J? H0 Ϯ}6SpNOJ#'Te"Gf* y Z!2Sx;LV"A+/o\#ofQ.X4^DSQAҝ0TLN"Og;G!r9Q^"D:}EDB('a7 هЗe"IݺkM%#Ba K.R`Edf5+2N~c N_G[!K#> (2uICge7,wwv#Θ Aɞcoc4ŭF޿ Aty sXl@vuS _1=3٢<Ҷ@=@ eƋXF}y 90.O#CR?vG+E0ljÜC=f,6Mfq(k& Уyx ^T ¸:yZ>Za$ X-M?cxhHdkU;XFzEϨ"&JBw PJΨ4;fv*=`JE4E#ڝ'O4'/&2oD$d K|tj3SOńG9Ё5LDzAٞW*)OB7H<&~is-0M-g`AMt2PV<,Gs8.ҠwBif[Ɨ0U9ttk3NDTm:`Z[yF0nlo8+1c+4x>\}3m:5E8#T#1s*h{sŕh,%3,z^PW{lu?}MUɔoszq1RoA5zO{jgz%P LŤW4,^Bݭim }CN9:]K~Oy*NElT R{bV$v1y@z)mrC1vFRdr^b0A]hHU_:TڞJ}PVt>:TAH38 .ĪvPH78~yؼ^ŠiaU˲ g' z/V}¢* DLKb5c:s4^Ne@]lS񴃛4TZMtZ)4>U AFC4:W> Ahƿ1gًٗHv_/o5;vS*$*ϥDhFh_fnGi6R,YKlZ Hv[?q< sj6Vl%7fr]j|xi%z u*ԕ:}w'EzF"?wsF:e3lJ~SUU cMOG׀(WcY;_lxJ ӕ໷{Y|Yo®Vv{fh"ˤI< \#xizM|ww3]yۙc-4 i7ᅸ+$Voz#yc|b޸h}R5:;+"[f=oHbS65 utrJQț8zjK}q]ps 0kFzY̒*pIOG4O$]\ :fȓ%54S*!]$Y>.Oίf1@D\ifi&IScr <jD 2ƌNf*cbb`B4L!Lj"QHdD${]MqR=[i(p$Dk {<\vn93BP,#VMͭ ,>,7JcH?#'WVwr?njC[QCK4ܯ[.b{2 jLWT7_Mi\  }\ؘ U"n_I/]yo87Ok̩UFBS3Y6(n2zd ͞XG9/sӼv.}OOPK u2O+ bobthecow-psysh-90da7f3/test/TabCompletion/UTc]PK u2OmI@b@ bobthecow-psysh-90da7f3/test/TabCompletion/AutoCompleterTest.phpUTc]Xo6~_Si0 ͒Hӵ] (KL$/,JSaɏwKuQi)d9#[PHȭz$s j 鋗Ct;صA ItHR9D(U 1ɳqx"L90wfr RM6T8SZfRl2 PUE1C'k @6eJϦty)֠ Uz0 5vg;Tl:yJIDoZhC%g|fR&WSȨ-3 H`SeΔRVainЉ 4[w`/,NE|8~]w|tcnvN]}N}[nŊF 92dPj0,Y"<=s|" ( >橎/hoV턫Q9] 4$J3@ތ?Qfz 阡1[< )"%%Aa3*2e$i)DuFy\LlG< 3|9{wZ7{QvX eU1 ѻPL?"ީU͸z?z%MtHD qdUacp)m d\,%-x^_$!8di&9$ԅ$8&u:E,=Өf.M`  i7TyLZb :|)kVlJ=&jh5J; 84hӲ&ưm+ =.t ۛ6b,"\h`C: {ՕS|d.ㆻ=;`lpBoVm]l{&ƿl~j|fqrСeؽ!#5wt1noy؂*mpJǦE!HtupjA3 B=vzJ.}-3pbTF)=u%V9ignzuf146Y;^0b{$_I^A`DXurcߩsE0@N k==2^(l Yb]f퍒`e ^Ӽa{KqS6Uy!z6|2;}wM; Go;g)|l؉`7ݿ &B480md:.>?]uo̰ܪ6?s޿PK u2O); bobthecow-psysh-90da7f3/test/TabCompletion/StaticSample.phpUTc]mMK1s'i)KJ®=d65la)dۋ9$;>cl T< uwAr2F!*=VK!ec+g ZJDa?F+X7F5m택YAؗ. bݭŸ3ކI2~EA^_8dlA[-VzA|- ~6n äm=CFYcZYm.3z)ᅗЧ@FxSc?g2k?)[&Э gb,]h옾V҆/W >Ra9nc̴¾j2_HsD;^(;-JZ÷;qpБJ琺7O u0fgՕ 낙H5 [ ʽ zTHXS#=m_a0UGdJ{~x)z{%aᆟȊ;qEj2VjK{tD ~*m<\[/PK u2OS0 bobthecow-psysh-90da7f3/test/Util/MirrorTest.phpUTc]UO0~_qHIB){V4hԖIA\Ԏl&]B٤}w8?qjYM\CO2 #pcL= ɣ]_2mϔ5cbҗ LeIL 0BD$Ռ.E EAw1P3 !(> &&I2SQȶe 6C22|ox'GҖosTd 5<֠5xgRpA.YuIZasT8S LZ9Nm AsOw$fSPyM,CQĔ n`!+/]V,{Gaw>B<&t͇jм5U[ u!K ~XJ伫t*DMe_z'gAwGC7|NR,p)`ػ 0-.6o gdYƶ߸' ]/,9x;1g M6Ca6i .yh]רC XfQloSܳ)4pUfϮ}ݪ^]oZ:kGmoPK u2O1e٠- bobthecow-psysh-90da7f3/test/Util/StrTest.phpUTc]}RMo0 W NZ[OC;0 Lɓ$>Ma<&ޣ䷗C?!pu BRPק'xr"ᖧ6 7!]vL} oY>Bh/`p>]]Z]`6Qr4B-R7McfM֝ K͊")з r-57v!~yب.CcfZMzֶ!Mc7es f\t5~ȴ 4lxQ*1)\UbKO袘?;˿fH9z-ۈ*xR>+UOe]ILX7M%<͗jPՔ+UHgMH 5Lm,~PK u2O, bobthecow-psysh-90da7f3/test/VersionUpdater/UTc]PK u2OS A bobthecow-psysh-90da7f3/test/VersionUpdater/GitHubCheckerTest.phpUTc]U]o0}ϯBnkNm $ձ#} 1iO9s|D5T"F\ =aڂA@7B!tĝ nH*fr~Hi(h>,0JC rt,W@FkӬ{296b@ȍ|Z amD;$ըTHD!:Mϓ,F0Z$ 4e2zRf@0c; +Y~})iB*}rjv'ٟ5Ln1I5S8K0fg& –˧=Sה /; +Η+ 8w[ F*4~N.K2{Y3\1LHf_Ε5SeM||;=k?3ջPK u2O& bobthecow-psysh-90da7f3/test/fixtures/UTc]PK u2OݣC0 bobthecow-psysh-90da7f3/test/fixtures/config.phpUTc]mAO0 > M ;! ƴ*nk)MJlڅN1{N.ۺ"&%)p2nzy&gQ8.;& a7F(Rvg.@Qڅ]H&*Ansm2_%~%V:(ȱX3 얌8ɍ.kerشY>!۠AtwḃT쭆W"pP1C]̀/5cR#aӓ6eES AkMMURܠ[$M)|%y~q(ާPK u2O. bobthecow-psysh-90da7f3/test/fixtures/default/UTc]PK u2O6 bobthecow-psysh-90da7f3/test/fixtures/default/.config/UTc]PK u2O< bobthecow-psysh-90da7f3/test/fixtures/default/.config/psysh/UTc]PK u2OF bobthecow-psysh-90da7f3/test/fixtures/default/.config/psysh/config.phpUTc].YY]Y]Y33zggug+>᳖n;>?{>\k> |-[>m>|x|x|`<0?GWW|;77ywx~.s5xڌx~`\v?Ol>?b>nO'yz?s|1wo>O|׃<=yzN3|ͯ\<ӳx2gt>O|<=kyz.l3u5g|<=;7yzfnmSϿyz,qx;??[燧.燧-燧lO____o7߲|x|i<4o<Gz;Ғ#|?o~]VB*d!R⸪d!ZBjd!,,+YYZYdd!^YֲY*BrWCx[!V}Hq>UܪqnՇDC[!׭V}Hw>Vx@ļU ަ@qhg,q," %|"B;G,"+5|"@;;,-X9P|h+ Z/d@B .e@J e@F ^B+Y(к;Y(кײPu,h>( CP>( CP>( CP>V@(( DB  ((((((((((( ( ( (d D@PA}(Р>hP 4ԇ C@PA}(Р>hP 48}|²SBXJY>gdeee)JCV/Y:Ybee-K%r¢>-sƢ>,s>,E}X\ ܲPB^(z˒YQE!@VE!BhQZ"DQE!BhQZ"DQE!BhQZDQE!@hQD-X`QE}*YԧaQ%XԧeQ,E}3y΢>/XI]Y(PU,*e@U% jY(PB,ZBV TuPUkY(Pd@UUCj@PZ}(P>V TՇCj@PZ}(P>VZ(P@V T@@YrjD Ԉ!+P#BVF@Y5"djD Ԉ +P#@VF@U ԪjՇCZ@PV}(P>U ԪU *j)+P'@VN\:u"dD ԉ!+P'BVN@Y:u"d  +P'OW +ՇCz@P^}(P>W ԫՇCz@P^}(O {@h?)O {@h?)O {@h?)O {@h?)Z}(PP ԇ@A}(PP ԇ@A}(PP ԇ@A}@A(PP ( ( +P!+P!+P!+P!+P!+P!+P!+P!+P!+P!+P +P +P +P' 4( C@PA}(Р>hP 4ԇ C@PA}(Р>@@:*=Ё/P| t T{_@@:*=Ё/P| t T{_bW}*sƢ>,s>,E}X\ ܲPb@Y eI@E!@( T"DB(PQ* @E!B(DQ! T"DB(PQ* @E!@( @E@ *XԧdQE}jiXgɢ>+iY1OboSG)[#-~J??}䟟ҿ>OboSG)[#-~J??}쟟ҿ>OboS)[c-~J??}쟟ҿ>OboS)[c-~J??J}V}XE}.XE}^bQkaQ[cQfQ7, %ope'@|+;ope'B|+;\ىNWv"7! Dope'B|+;\ NWv7' +Cz@P^}(P>W ԫՇCz@P^}(P>ȿ>I b$oO'I[쓤@-IR $)}ȿ>I b$oO'I[쓤@-IR $)}h>( CP>( CP>( CP>V@(( DB  ((((((((((( ( ( (d D@PA}(Р>hP 4ԇ C@PA}(Р>hP bU-/PbU-/PbU-/PbU-/PbU-/PbU-/PbU-/PbU-/P>U 9cQs`QKyɢ>W,E}YE}nYE}(PP, E޲@V Td @U!B*DUQ! T"DB(PU @U!B*UQ TQT,SOŢ>54,dQ,E}SyƢ>Y9K b%oϒgI[쳤@-YR ,)}ȿ>K b%oϒgI[쳤@-YR ,)}R TՇCj@PZ}(P>V TՇCj Dj@Q:rj +P#BVF@Y5"djD Ԉ!+P#BVF@Y5dj ---Շ-Շ-Շ-Շ-Շ-Շ-Շ-Շ-Շ-Շ-Շ-Շ-Շ{@<):O Γ{@<):O Γ{@<):O Γ{@<):O ΓԇCZ@PV}(P>U ԪjՇCZ@PV}@QV(P@M\:u ԉ!+P'BVN@Y:u"dD ԉ!+P'@VN@Y:y@Q^(P>W ԫՇCz@P^}(P>W ԫՇC=ER t]$@I=ER t]$@I=ER t]$@I=ER t]$@ICP>( CP>( CP>( c DQ@(@@Q@Q\YYYYYYYYYYYYYhP 4ԇ C@@@=Х/P.}jt T{K_]@@=Х/P.}jt T{K_]ջ-PP39gQ dQ,sŢ>XE}nXE}Xԇ z͢@oX-K d @u!@V! T"DB(P] @u!B.DՅQ! T"DB(P] @J *y[ o'ȿEJ *y[ o'ȿEJ *y[ o'ȿEJ *y[ o'M =A'!{:'!{:'!{:'!{:'!{:' {:' {:yW `QE}JXԧfQE},bQE}yʢ>X9`q>w8aZ"L [i;0-|op-´οEw8aZ"L [i;0-|op-´οEíՇ@A}(PP ԇ@A}(PP ԇ@A}(PP  @A(PH\YEEEEEEEEEEEEEEy@QA(Р>hP 4ԇ C@PA}(Р>hP 4ԇ C[k_ƿEj[k_ƿEj[k_ƿEj[k_ƿEj[k_ƿEj[k_ƿEj[k_ƿEj[k_ƿEjvg[f>g,s΢>,sɢ>/YE}^5ܰ-ܱj Eް([ DB@M!B)D5Q! "DB(PSj @M!B)D5Q DB Ԕ `QE}JXԧfQE},bQE}yʢ>X9`q>7IO$?Mz4MR Ӥ7IO$?Mz4MR Ӥ7IO$?Mz4MR Ӥ7IO$?Mz4MRJ}(P>V TՇCj@PZ}(P>V T T+ D +P#@@Y5"djD Ԉ!+P#BVF@Y5dj ' T T T T T T T T T T T T T T T 6)iۤ@Io&M 6)iۤ@Io&M 6)iۤ@Io&M 6)iۤ@Io&M R ԪjՇCZ@PV}(P>U ԪjՇCZ DZ@Q6r +P'BVN@Y:u"dD ԉ!+P'BVN@Y:ud  Dz@P^}(P>W ԫՇCz@P^}(P>W ԫ@wI=]R t%@wI=]R t%@wI=]R t%@wI=]R t%Z CP>( CP>( CP>((( DQEEr"d"d"d"d"d"d"d"d"d"ddddY@QA}(Р>hP 4ԇ C@PA}(Р>hP 4ԇ{~2TD_ly?e.rgen_0׹y|͇mn_1kun>b9vngYss99}Ŝ~Ŝfz0gowYm7{5s s-sLˁo[ssķ9m:7sN|͜Ft3ķ%9mN7sN|͜߆u3ķu9mb7s|͜v3̹'|> `΂Y9]1gkwÜ^2gWY999999Y{)Z{)Z{)Z{)Z{)Z{)Z{)Z{):MC֛7Yo []06¼͟2327\/ܼ}en>`^C67毘5:71|s st;Y39s9}ɜ~ɜbzbz_3go޷Y;= 9 9 9N&-f΁S͞|3ķ9m7sN|[͜|3ķ9m7sN|[͜|3ķ9m7s|[͜|3Ys`zY9]3g9bzYY'YYgYY/J{)J{)J{)J{)J{)J{)J{)JzS6M۬7ozS6M۬7ozS6M۬7oV6 N,8òw9p+xwrV.'nrV.'nrV.'nrV.'nrV.'nrV.nrV.[,8zS>M7zS>M7zS>M7zS^?_4SzO3_4SzO3_4SzO3_4SzO3_4SzO3_4SzO3_4SzO3_4Su֛7Yo d)C֛Yo >d)C֛Yo >d)C֛Yo }>|v6|4m{Mߜ~w?|0G=|0kO{?o/㯖?w݇̏gǛ=6~uw{|G_/&==wH~w?=ٌ{_?PK u2O# bobthecow-psysh-90da7f3/test/tools/UTc]PK u2O;k}X0 8 bobthecow-psysh-90da7f3/test/tools/gen_unvis_fixtures.pyUTc]Wmo6_qu HdMZs nI8YWԁ@KF"U;$}>$uϽz)=oZ\=Ry3)J*Ρ9'SeлVTF1II#*w0B9o5HE=e+.#d|:><P }.FgG[R0thvjeL97NKܿA~?=>hi1 q* 5@u5a v*1 9] &gO(&&&EbIh2Ğ9AAu`ZF}o r#IMKɊ{/}1J`$p/~sw&c))k{ʢv$sI&7z?ؽg_C'.A5ŋI$%:.IgL+Tj;B<Ĩ\;8*29;(`ɹP)[Qj9\drћLZd$ 4n%]QxDR' {5䴨 ϐ!<JEէ|/jɭ.l2,(- ۵b݆1|] ೨a p"m^N/d:QP<قD{{J:OY~\kF w`ˌj{[\#m"\a\oRa 63lvUw4^'Zq;n ~2EpaՔnlרNĹ|_p  ]lR=kˀ 4i˂Dә[vtX3ChX;0>}XalC*u增 ++3 jRܸ9fHh\O׆5df;V+0CtC1U%QTYRD-uD-A,h[ȡ-%,f@rA&ܶgU2Q+x垆q΃l vĂ,&H=,:@V95d9KATa>e!6Tn4}0O%9|b(z5 hY0KDTL 54A=SUL @x+Au{6U%MX]tLe8{3ȧ8'vh,=j:qkб܎_bzܯ7S_tt6\8v;L?fP|*.钵,RNn2N}"SP")oxtz; rTٕjɄ 5{֟&;n>]Ma\_?W (Zr_z5 m҂ Rf 5ݮXaCWHf1J FûG*lΧ|ԺZDI9?!^>H݇wڍ{a;MYL Fr^f<Tl !^ +d:tZM됅60_4%e^YAM:[GFf g<}?.ӧaqL#~u5a>[x%Ψ֔,-Q9M(r}3Py.M|Oq9fy{7~ 7G Gk]I̚Ccxw<-`<(9󧴏M ӆ =OX/0Wy(/H&y$(oQiG[h<.Y < +LiÌ"F58}\Ucb(AT8`9b@(~[j)JT5ex=_ޖ|쭂b|\猃eLsHوϻg~Z3qq n82  jU6|QHY1i.~L~$JWZMBYo)62# y`w9Kr]Y?wΔcQSK9c,k,R%)\eߟhx 3e| ^40! ;˲u8e4 yۯ. t.SJIzI\}{"*{6ڜȳd@)Eюl1%=}ܽcLeT\ $Lz9&]\2*xAD2_[[)+\U3UCѵM,6Nj6[y̙L6NFh`q,tفf{3[>E{nc+[FXzpgAAp"&ȵ&E_97x^(is|@g=eߍRpn(+hE4>0\ kfM cy,j`moYDŽJ^홶6 0T4tC5oի|!86-'Sꨥ1 XVxViBY]IR-n˶r Gtʚ3|ƽb=}U|<;3*lg@~:g|p;-Ɋ[hqgNIzp@I ֶX0;H++H1sP;ܦP\Put̉L,t(QW l)XI-]/~y.4Qء@e[Ҝ 0gOJ> 6'b*VZ@#dRҒ,lL$[!ٍ-5}#&Lj!K =Bt97~Amu{#m-#6k0 4÷\6xZ Q9 @V[X3nlWUq/3vd`Hk~-@\%9չe*2qeG/j6ǽ7AޠU:Z%cKg zq<5Pжoa6f##t-@fUtj[l ,g{U̲4q4/fπ 90+@ О r&uUhYS`%La&PŒD$]~Y/S4w!]_{% p+~$w>:[r;*"L9>of0@^.aX=B@yhIY 4YcԅZe\E-7Méd[J븋$Z8-V$kj5c<ҙ[v,03s"vl6 _4qE+Pi'F:|( qO!:KQ2h A?> IGӍ&~]8m5:CW* -zÿ 7tX3"Z@ÈM/3#҈Ð3^D B&#̩kl-4ZSqj;n!%i)bVy602r 8 Q .F<9vﱧ[DK+,ocrUg.rM&(GMjceY3}D D*Ww ?( %TV36Rp.jK6eqØ$h@͉pDe qL#?_M`T Ɔ >k}flikpXC˭wcΧDg `4kɨ蜫u@{xjyBԄ]U&gQ?ƘpYemnJ 9Бp >́RJTD 5wa"y3Nj]}<*'Cyx ŕMCB]mUsyi?dO4wb'vqdJh8A: 8N-n.?@EywYM XƒL+iFX2`@L6F!q)|G?3(O+=9*D\T(ԋ Բ5},p<C5➳^HPo#"uD;Pۅ_of/a sc' X:دSuMPJy)_xag{7 @K\GMUdL s`,jt0N@)S1v58K/prm1OW|U87vPSH}[_q$=(M !qhÐ'w,@ZQ@e](eˡVUvmթ^i^ Oon5nVs,cln-c,?+CbBU&F`pff`i `|Wιm[h&,\Ͳb'r;[o'4@(z1âoi K(_96} Kړo-(]Ha>&&ܘ^&zϴ~,}{k.{rw#.L 4W3\%a.T$T6&lqb~+Wt!C@7x {rch$?)4?Adu ڍדa}&SńP6';bg;Qކ=dyOxbJNXDL(W߾~kI;YUv⪮O4sM9MٰNh3Ԣ2LK acǴt|@1X~y:8PwleA~Q8QXŵ 9Kh2+&S9WrSeٗ99M=cThz5f)=Zz/L jvk*X o &vř:Y joEg߰4zleL"nOʖ",?ʛb|Dx#E .: _/J*>(b;}s6mF[oymfP3FV0FY ~Hkh:e4,u~!Îvb8tO6k2~՜s(zN$xX-=µx+5dן}a.D'{ʶ 5z;FQ Jy_he|T*aEn s$ۂh<YsJ3#VL&&4bQu f "QJq 7hw}g]jWrO؍"L퉱3im몙Μ0y7lb"aGLP3s}in9էzX9>I伞ٞc$aXJl\Kr9 c5X]wy &a*KQRjutC;E LJzs&9r=H*ڲ'Gme[1B' *\-B't9C@=a'n NoH p`o&SA]k}A8u\Sͺj?bt?%BX-&lQL:!gѳOVL! ceڻI*(Gi]3FqpJB(뷓loiNMiY``ǵS 40Έ/M7a8ά'I=ؘh Wv c9eq{}-DHy:no+Ju>Xկ q!1=?&GyVA`vC Z[.>g5i[n|\RΔƉ.c{w?}OW5;j^.dfc%r tc%{`O\LP6s ϱ v=ALi\ z=vx؜ l`i59[";oϪq WHF5>2|(׀:h3Go<~Z~=?O&/L)@ qث;Q1$ţʢ}NIxt%1n#ͤ>[\T,SFsyq|GI*@I vnn5YB mJ4lzo=&0 AH#vտ}l0m;ϑkrBOT($t|,EYϠuw=UhTe=Қ If]|gV K慕Ţ,$Q}HkH>&u*BݨZ5S$х Z9f]W~܉L|gĔ#Ղ` ,a1C 8ApN?k5+`p4wI oaH7J?'ъ7, $&3N : &-fx6$eHtV2xDžC$ctKo(+;!N'>Ax7[ ]A %(U(z8UDZ+*5!3b;^`Nu|Eb{YWoۓGm~6E[ɤg7,nVTj/{+?{?Н*+\fB ^|+RfE;`+Qy9ڕm‹0+Wi.7x'^_[OĆ Z*s SE"c7^3IN4No@l8!`<͓Ŗ5 | >=3IC3A떆4us2ؠ@v]aik7rUt_i#ōu򊇇J%8EB¤(?q~,2 />Ǚ svɷ} 0e3E_>P)rHҼpVsbҠ/@HŒǀ<@LD\|!őڊV!0eY8~Ռ2Ev $Ǽ/sGs=,mF}~`2"Zpν۷ DZCb(:m䍤dhgOD Yޯl~SDtLpd(u3~|ۣȦ`,#C2dih̲8뱀j.9/rlv>說 \d%DrOSAPnqSk;KvOb$+'e)W)!_SPxLR oX`DEu4q_/ (?c%,bF\_\ J-v@@ɒ9Sp4Món 1*_-}i7ig畀=]7$ߵ@o >~ȸǼh#fռOW *ųmQ\9NaI}qi嫢 eYw `FY=CbqCK8[*cTȃJ:S3mK*uW"8Η|p i۬?8SK,V+y-]iT3?'\ Ev*_(WYء!e8"E@Kλ *WpU 9)7y&_~+c Jϑy i8$ccM8@jDa&(Y, I<a&d5_`&[4l`,BģY i%|+.{?$MOy_[ME '5 _qlmRn&Sf )_F]8i5m`h8,Tj+`?9b Qd Koo%ek (*ov[,%2&؃[i);2٪-^ qS=N, E?qw˻eĝC/#˞p +tR+EUp,irJLE%>TTKM>M411dWP&@:&6!gS5B3srltWȶ3z$BX&p W+txJ/z^l2&:]ci-,Uys 2av&V/݃=io mcbu!`?ng+[;ێp^-og.us9IPy=e8n<#R6iD؁lu%,uZ,<[aXY9WQWB'hQH jSLa^e;y@Hʃ`%}&ݥ" :TOP{'[>MYB0|X]XR կ,öfaӤưf! 9LW] ±iZ"xrb~;[!Pw0O?*^nt[${|DyF T;GWPF6OUҶX=5XLytm˴}[~8Rl- ËERul ^~HbjG"?SK/CÌ9? eƻĆ!{+A?̓|& z)mESKװPk{6:ӈy&FV胍]H~>N5$zus"EM9\ʧUق`tG5?ԧ'oJ^Slzp2QGYuy¢% ]u3gq<_\xm(P4?pt $VSa~NtS4D/)o`eJ$HQ @t«iA(& ׅd)=2Za5zOlhsJyTGX[_w^V)_m":u􀚾G_ CJS/A >fifMBk@'nZl6MĚَG}ig}[3 reݷ)6Һ7{& V,Eaʙu{C9d `G١bC/M~h]!Iب5ʙW:;BGiaVa,-ArZ%Z7;zpܰgB~) Lwuqu컺9LFL 4b3=J޻:Mo_$^U4=.x8ڜ<W&2%8~TkmxZF<+Ol)T ǧ18N ";x^=wZv-Ugf}1xŮ:rbW}qƞMˉw.Dxy>±Ӑ,tm3`O>I͔֙ `Mz13,d:}]3ϙmٯ-`pl6&G `4xmF@K䎊w{Z̾/4 KN}Ζ0+IV\+z&/@T,W~Qh,s^聟`),M`mՁ7R.:]\ڱw QV DA@H+= SݤFxT(,왞]-Z+`p^GN$K?/v],+^|襤 YfB$EsXxU#^3ؚ'~< \lʩNL}-X͚dY$\R}4pYމ, ӧ b7&GY+=Rp.c٪;o?PK u2O bobthecow-psysh-90da7f3/UTc]PK u2OG% ?bobthecow-psysh-90da7f3/.editorconfigUTc]PK u2O bobthecow-psysh-90da7f3/.github/UTc]PK u2Og/ Vbobthecow-psysh-90da7f3/.github/CONTRIBUTING.mdUTc]PK u2O6Qi" bobthecow-psysh-90da7f3/.gitignoreUTc]PK u2O Wbobthecow-psysh-90da7f3/.phan/UTc]PK u2O1$( bobthecow-psysh-90da7f3/.phan/config.phpUTc]PK u2O y {bobthecow-psysh-90da7f3/.php_csUTc]PK u2OmK$ bobthecow-psysh-90da7f3/.styleci.ymlUTc]PK u2O5w_#  bobthecow-psysh-90da7f3/.travis.ymlUTc]PK u2OyC>  bobthecow-psysh-90da7f3/LICENSEUTc]PK u2Oe{} Lbobthecow-psysh-90da7f3/MakefileUTc]PK u2O'u! nbobthecow-psysh-90da7f3/README.mdUTc]PK u2O bobthecow-psysh-90da7f3/bin/UTc]PK u2Oe&  bobthecow-psysh-90da7f3/bin/build-stubUTc]PK u2OV.! bobthecow-psysh-90da7f3/bin/psyshUTc]PK u2O/E_ % Hbobthecow-psysh-90da7f3/box.json.distUTc]PK u2O|*%  bobthecow-psysh-90da7f3/composer.jsonUTc]PK u2O;( #bobthecow-psysh-90da7f3/phpunit.xml.distUTc]PK u2O $bobthecow-psysh-90da7f3/src/UTc]PK u2O.[ ])+ $bobthecow-psysh-90da7f3/src/CodeCleaner.phpUTc]PK u2O( 0bobthecow-psysh-90da7f3/src/CodeCleaner/UTc]PK u2O>= 0bobthecow-psysh-90da7f3/src/CodeCleaner/AbstractClassPass.phpUTc]PK u2OoW B T4bobthecow-psysh-90da7f3/src/CodeCleaner/AssignThisVariablePass.phpUTc]PK u2OGƘlG 6bobthecow-psysh-90da7f3/src/CodeCleaner/CallTimePassByReferencePass.phpUTc]PK u2OXgn[R ; 9bobthecow-psysh-90da7f3/src/CodeCleaner/CalledClassPass.phpUTc]PK u2O¡_ ; =bobthecow-psysh-90da7f3/src/CodeCleaner/CodeCleanerPass.phpUTc]PK u2Ola&4 E?bobthecow-psysh-90da7f3/src/CodeCleaner/ExitPass.phpUTc]PK u2OD: 8Abobthecow-psysh-90da7f3/src/CodeCleaner/FinalClassPass.phpUTc]PK u2Otc 8;? JDbobthecow-psysh-90da7f3/src/CodeCleaner/FunctionContextPass.phpUTc]PK u2O L Fbobthecow-psysh-90da7f3/src/CodeCleaner/FunctionReturnInWriteContextPass.phpUTc]PK u2O#5> UKbobthecow-psysh-90da7f3/src/CodeCleaner/ImplicitReturnPass.phpUTc]PK u2O!+[2: Pbobthecow-psysh-90da7f3/src/CodeCleaner/InstanceOfPass.phpUTc]PK u2Oˢ? Sbobthecow-psysh-90da7f3/src/CodeCleaner/LeavePsyshAlonePass.phpUTc]PK u2OѢW; Ubobthecow-psysh-90da7f3/src/CodeCleaner/LegacyEmptyPass.phpUTc]PK u2O׌v 4 .Ybobthecow-psysh-90da7f3/src/CodeCleaner/ListPass.phpUTc]PK u2OS ; ]bobthecow-psysh-90da7f3/src/CodeCleaner/LoopContextPass.phpUTc]PK u2OhW,> bbobthecow-psysh-90da7f3/src/CodeCleaner/MagicConstantsPass.phpUTc]PK u2OWU?@> dbobthecow-psysh-90da7f3/src/CodeCleaner/NamespaceAwarePass.phpUTc]PK u2OiRp 9 gbobthecow-psysh-90da7f3/src/CodeCleaner/NamespacePass.phpUTc]PK u2OLZy9 lbobthecow-psysh-90da7f3/src/CodeCleaner/NoReturnValue.phpUTc]PK u2O5,s C Bnbobthecow-psysh-90da7f3/src/CodeCleaner/PassableByReferencePass.phpUTc]PK u2O4bK 7 tbobthecow-psysh-90da7f3/src/CodeCleaner/RequirePass.phpUTc]PK u2OjHs7 ; ]ybobthecow-psysh-90da7f3/src/CodeCleaner/StrictTypesPass.phpUTc]PK u2OuT< }bobthecow-psysh-90da7f3/src/CodeCleaner/UseStatementPass.phpUTc]PK u2O[ P0> ΃bobthecow-psysh-90da7f3/src/CodeCleaner/ValidClassNamePass.phpUTc]PK u2O.8 = bobthecow-psysh-90da7f3/src/CodeCleaner/ValidConstantPass.phpUTc]PK u2OM,@ ԓbobthecow-psysh-90da7f3/src/CodeCleaner/ValidConstructorPass.phpUTc]PK u2O W A ǘbobthecow-psysh-90da7f3/src/CodeCleaner/ValidFunctionNamePass.phpUTc]PK u2O$ bobthecow-psysh-90da7f3/src/Command/UTc]PK u2ON2>x5 ѝbobthecow-psysh-90da7f3/src/Command/BufferCommand.phpUTc]PK u2O #4 bobthecow-psysh-90da7f3/src/Command/ClearCommand.phpUTc]PK u2OM^/  bobthecow-psysh-90da7f3/src/Command/Command.phpUTc]PK u2OӕS2 bobthecow-psysh-90da7f3/src/Command/DocCommand.phpUTc]PK u2OЊ 3 kbobthecow-psysh-90da7f3/src/Command/DumpCommand.phpUTc]PK u2O M3 bobthecow-psysh-90da7f3/src/Command/EditCommand.phpUTc]PK u2OW[<3 Ǽbobthecow-psysh-90da7f3/src/Command/ExitCommand.phpUTc]PK u2O-0 3 %bobthecow-psysh-90da7f3/src/Command/HelpCommand.phpUTc]PK u2Oz0_6 Xbobthecow-psysh-90da7f3/src/Command/HistoryCommand.phpUTc]PK u2O3; &3 bobthecow-psysh-90da7f3/src/Command/ListCommand.phpUTc]PK u2O0 bobthecow-psysh-90da7f3/src/Command/ListCommand/UTc]PK u2O A7h K bobthecow-psysh-90da7f3/src/Command/ListCommand/ClassConstantEnumerator.phpUTc]PK u2OPT. C bobthecow-psysh-90da7f3/src/Command/ListCommand/ClassEnumerator.phpUTc]PK u2Ok> F dbobthecow-psysh-90da7f3/src/Command/ListCommand/ConstantEnumerator.phpUTc]PK u2O`v > bobthecow-psysh-90da7f3/src/Command/ListCommand/Enumerator.phpUTc]PK u2Oۥp- F bobthecow-psysh-90da7f3/src/Command/ListCommand/FunctionEnumerator.phpUTc]PK u2O+! L 9bobthecow-psysh-90da7f3/src/Command/ListCommand/GlobalVariableEnumerator.phpUTc]PK u2OMYy^G bobthecow-psysh-90da7f3/src/Command/ListCommand/InterfaceEnumerator.phpUTc]PK u2OqHD bobthecow-psysh-90da7f3/src/Command/ListCommand/MethodEnumerator.phpUTc]PK u2OF bobthecow-psysh-90da7f3/src/Command/ListCommand/PropertyEnumerator.phpUTc]PK u2O.tC $bobthecow-psysh-90da7f3/src/Command/ListCommand/TraitEnumerator.phpUTc]PK u2O F bobthecow-psysh-90da7f3/src/Command/ListCommand/VariableEnumerator.phpUTc]PK u2O34 # bobthecow-psysh-90da7f3/src/Command/ParseCommand.phpUTc]PK u2OG^/P9 bobthecow-psysh-90da7f3/src/Command/PsyVersionCommand.phpUTc]PK u2OT9 %9 Kbobthecow-psysh-90da7f3/src/Command/ReflectingCommand.phpUTc]PK u2O^@ %3 bobthecow-psysh-90da7f3/src/Command/ShowCommand.phpUTc]PK u2OaB3 &bobthecow-psysh-90da7f3/src/Command/SudoCommand.phpUTc]PK u2OOdp66 ?,bobthecow-psysh-90da7f3/src/Command/ThrowUpCommand.phpUTc]PK u2OS5 2bobthecow-psysh-90da7f3/src/Command/TimeitCommand.phpUTc]PK u2O2 :bobthecow-psysh-90da7f3/src/Command/TimeitCommand/UTc]PK u2O9hTC :bobthecow-psysh-90da7f3/src/Command/TimeitCommand/TimeitVisitor.phpUTc]PK u2Oً["4 @bobthecow-psysh-90da7f3/src/Command/TraceCommand.phpUTc]PK u2O1?7 SGbobthecow-psysh-90da7f3/src/Command/WhereamiCommand.phpUTc]PK u2ORUT2 Mbobthecow-psysh-90da7f3/src/Command/WtfCommand.phpUTc]PK u2O=uZ:+ YSbobthecow-psysh-90da7f3/src/ConfigPaths.phpUTc]PK u2O9Zه- [bobthecow-psysh-90da7f3/src/Configuration.phpUTc]PK u2O3 3 wbobthecow-psysh-90da7f3/src/ConsoleColorFactory.phpUTc]PK u2Od7 ' zbobthecow-psysh-90da7f3/src/Context.phpUTc]PK u2O-dL7, 1bobthecow-psysh-90da7f3/src/ContextAware.phpUTc]PK u2O& Ѓbobthecow-psysh-90da7f3/src/Exception/UTc]PK u2O#'[8 bobthecow-psysh-90da7f3/src/Exception/BreakException.phpUTc]PK u2O˵:~= bobthecow-psysh-90da7f3/src/Exception/DeprecatedException.phpUTc]PK u2O. 8 bobthecow-psysh-90da7f3/src/Exception/ErrorException.phpUTc]PK u2O2S33 kbobthecow-psysh-90da7f3/src/Exception/Exception.phpUTc]PK u2OhM= bobthecow-psysh-90da7f3/src/Exception/FatalErrorException.phpUTc]PK u2OPF= ߐbobthecow-psysh-90da7f3/src/Exception/ParseErrorException.phpUTc]PK u2O*SL: bobthecow-psysh-90da7f3/src/Exception/RuntimeException.phpUTc]PK u2O&pb: Jbobthecow-psysh-90da7f3/src/Exception/ThrowUpException.phpUTc]PK u2O4 1/<  bobthecow-psysh-90da7f3/src/Exception/TypeErrorException.phpUTc]PK u2OJ 0 bobthecow-psysh-90da7f3/src/ExecutionClosure.phpUTc]PK u2Ox=- @bobthecow-psysh-90da7f3/src/ExecutionLoop.phpUTc]PK u2O* ;bobthecow-psysh-90da7f3/src/ExecutionLoop/UTc]PK u2OL,R> bobthecow-psysh-90da7f3/src/ExecutionLoop/AbstractListener.phpUTc]PK u2OLy`ˀ16 Cbobthecow-psysh-90da7f3/src/ExecutionLoop/Listener.phpUTc]PK u2OCԙ;  bobthecow-psysh-90da7f3/src/ExecutionLoop/ProcessForker.phpUTc]PK u2OP+, < bobthecow-psysh-90da7f3/src/ExecutionLoop/RunkitReloader.phpUTc]PK u2Of  4 bobthecow-psysh-90da7f3/src/ExecutionLoopClosure.phpUTc]PK u2O& mbobthecow-psysh-90da7f3/src/Formatter/UTc]PK u2On7 bobthecow-psysh-90da7f3/src/Formatter/CodeFormatter.phpUTc]PK u2ONVzl; bobthecow-psysh-90da7f3/src/Formatter/DocblockFormatter.phpUTc]PK u2O]-3 bobthecow-psysh-90da7f3/src/Formatter/Formatter.phpUTc]PK u2Obw$< Jbobthecow-psysh-90da7f3/src/Formatter/SignatureFormatter.phpUTc]PK u2O" $bobthecow-psysh-90da7f3/src/Input/UTc]PK u2OF2 mbobthecow-psysh-90da7f3/src/Input/CodeArgument.phpUTc]PK u2O 63 bobthecow-psysh-90da7f3/src/Input/FilterOptions.phpUTc]PK u2O bobthecow-psysh-90da7f3/src/Reflection/ReflectionConstant_.phpUTc]PK u2O`$#\ F bobthecow-psysh-90da7f3/src/Reflection/ReflectionLanguageConstruct.phpUTc]PK u2O qO Ubobthecow-psysh-90da7f3/src/Reflection/ReflectionLanguageConstructParameter.phpUTc]PK u2Oc"O% bobthecow-psysh-90da7f3/src/Shell.phpUTc]PK u2O0-)$ /Bbobthecow-psysh-90da7f3/src/Sudo.phpUTc]PK u2O! Ebobthecow-psysh-90da7f3/src/Sudo/UTc]PK u2OLiMi0 Ebobthecow-psysh-90da7f3/src/Sudo/SudoVisitor.phpUTc]PK u2O* Jbobthecow-psysh-90da7f3/src/TabCompletion/UTc]PK u2OkUw ; Jbobthecow-psysh-90da7f3/src/TabCompletion/AutoCompleter.phpUTc]PK u2O2 FObobthecow-psysh-90da7f3/src/TabCompletion/Matcher/UTc]PK u2O%,Q Obobthecow-psysh-90da7f3/src/TabCompletion/Matcher/AbstractContextAwareMatcher.phpUTc]PK u2O֔w"V J bobthecow-psysh-90da7f3/src/TabCompletion/Matcher/ObjectMethodsMatcher.phpUTc]PK u2OpO(fF Vbobthecow-psysh-90da7f3/src/TabCompletion/Matcher/VariablesMatcher.phpUTc]PK u2O! )bobthecow-psysh-90da7f3/src/Util/UTc]PK u2O- qbobthecow-psysh-90da7f3/src/Util/Docblock.phpUTc]PK u2OP2{) bobthecow-psysh-90da7f3/src/Util/Json.phpUTc]PK u2OVh + vbobthecow-psysh-90da7f3/src/Util/Mirror.phpUTc]PK u2O-R# ( 0bobthecow-psysh-90da7f3/src/Util/Str.phpUTc]PK u2O& bobthecow-psysh-90da7f3/src/VarDumper/UTc]PK u2Ojm0 bobthecow-psysh-90da7f3/src/VarDumper/Cloner.phpUTc]PK u2OBD 0 bobthecow-psysh-90da7f3/src/VarDumper/Dumper.phpUTc]PK u2O=-3 bobthecow-psysh-90da7f3/src/VarDumper/Presenter.phpUTc]PK u2Oޥխ>8  bobthecow-psysh-90da7f3/src/VarDumper/PresenterAware.phpUTc]PK u2O+ bobthecow-psysh-90da7f3/src/VersionUpdater/UTc]PK u2OE)/M.6 bobthecow-psysh-90da7f3/src/VersionUpdater/Checker.phpUTc]PK u2O50< bobthecow-psysh-90da7f3/src/VersionUpdater/GitHubChecker.phpUTc]PK u2Oe> Lbobthecow-psysh-90da7f3/src/VersionUpdater/IntervalChecker.phpUTc]PK u2OΐM6Y]: ]bobthecow-psysh-90da7f3/src/VersionUpdater/NoopChecker.phpUTc]PK u2OA[-N0) bobthecow-psysh-90da7f3/src/functions.phpUTc]PK u2O  bobthecow-psysh-90da7f3/test/UTc]PK u2Om1 Obobthecow-psysh-90da7f3/test/ClassWithSecrets.phpUTc]PK u2O) bobthecow-psysh-90da7f3/test/CodeCleaner/UTc]PK u2O (&B dbobthecow-psysh-90da7f3/test/CodeCleaner/AbstractClassPassTest.phpUTc]PK u2OgQ_,G bobthecow-psysh-90da7f3/test/CodeCleaner/AssignThisVariablePassTest.phpUTc]PK u2O$=L  bobthecow-psysh-90da7f3/test/CodeCleaner/CallTimePassByReferencePassTest.phpUTc]PK u2OjX. @ bobthecow-psysh-90da7f3/test/CodeCleaner/CalledClassPassTest.phpUTc]PK u2OCpʨ@ ?bobthecow-psysh-90da7f3/test/CodeCleaner/CodeCleanerTestCase.phpUTc]PK u2O.Qr9 Nbobthecow-psysh-90da7f3/test/CodeCleaner/ExitPassTest.phpUTc]PK u2Oڨ#c'?  bobthecow-psysh-90da7f3/test/CodeCleaner/FinalClassPassTest.phpUTc]PK u2O2 bobthecow-psysh-90da7f3/test/CodeCleaner/Fixtures/UTc]PK u2O8`N xI Bbobthecow-psysh-90da7f3/test/CodeCleaner/Fixtures/ClassWithCallStatic.phpUTc]PK u2O>LpE bobthecow-psysh-90da7f3/test/CodeCleaner/Fixtures/ClassWithStatic.phpUTc]PK u2OpE 1bobthecow-psysh-90da7f3/test/CodeCleaner/Fixtures/TraitWithStatic.phpUTc]PK u2OD bobthecow-psysh-90da7f3/test/CodeCleaner/FunctionContextPassTest.phpUTc]PK u2OX9us Q bobthecow-psysh-90da7f3/test/CodeCleaner/FunctionReturnInWriteContextPassTest.phpUTc]PK u2O}vC bobthecow-psysh-90da7f3/test/CodeCleaner/ImplicitReturnPassTest.phpUTc]PK u2O?W<? _bobthecow-psysh-90da7f3/test/CodeCleaner/InstanceOfPassTest.phpUTc]PK u2Odg@@D bobthecow-psysh-90da7f3/test/CodeCleaner/LeavePsyshAlonePassTest.phpUTc]PK u2O/f@ bobthecow-psysh-90da7f3/test/CodeCleaner/LegacyEmptyPassTest.phpUTc]PK u2Op+579 Jbobthecow-psysh-90da7f3/test/CodeCleaner/ListPassTest.phpUTc]PK u2OJzK0 @ bobthecow-psysh-90da7f3/test/CodeCleaner/LoopContextPassTest.phpUTc]PK u2OeC xbobthecow-psysh-90da7f3/test/CodeCleaner/MagicConstantsPassTest.phpUTc]PK u2OcP> tbobthecow-psysh-90da7f3/test/CodeCleaner/NamespacePassTest.phpUTc]PK u2O> <bobthecow-psysh-90da7f3/test/CodeCleaner/NoReturnValueTest.phpUTc]PK u2O[ H .bobthecow-psysh-90da7f3/test/CodeCleaner/PassableByReferencePassTest.phpUTc]PK u2OFt < /bobthecow-psysh-90da7f3/test/CodeCleaner/RequirePassTest.phpUTc]PK u2OlB5!.@ bobthecow-psysh-90da7f3/test/CodeCleaner/StrictTypesPassTest.phpUTc]PK u2O)  A  bobthecow-psysh-90da7f3/test/CodeCleaner/UseStatementPassTest.phpUTc]PK u2O'6\5*C  bobthecow-psysh-90da7f3/test/CodeCleaner/ValidClassNamePassTest.phpUTc]PK u2O#zZB bobthecow-psysh-90da7f3/test/CodeCleaner/ValidConstantPassTest.phpUTc]PK u2OPN E bobthecow-psysh-90da7f3/test/CodeCleaner/ValidConstructorPassTest.phpUTc]PK u2O+NF bobthecow-psysh-90da7f3/test/CodeCleaner/ValidFunctionNamePassTest.phpUTc]PK u2O3& 0 bobthecow-psysh-90da7f3/test/CodeCleanerTest.phpUTc]PK u2O% !bobthecow-psysh-90da7f3/test/Command/UTc]PK u2O]Kz8 h!bobthecow-psysh-90da7f3/test/Command/ExitCommandTest.phpUTc]PK u2O0 - ; A#bobthecow-psysh-90da7f3/test/Command/ThrowUpCommandTest.phpUTc]PK u2O3 i'bobthecow-psysh-90da7f3/test/Command/TimeitCommand/UTc]PK u2OdRZ<H 'bobthecow-psysh-90da7f3/test/Command/TimeitCommand/TimeitVisitorTest.phpUTc]PK u2OUx' 2 n*bobthecow-psysh-90da7f3/test/ConfigurationTest.phpUTc]PK u2O8 ?2bobthecow-psysh-90da7f3/test/ConsoleColorFactoryTest.phpUTc]PK u2ORS$, o4bobthecow-psysh-90da7f3/test/ContextTest.phpUTc]PK u2O' L;bobthecow-psysh-90da7f3/test/Exception/UTc]PK u2Oqʟ= ;bobthecow-psysh-90da7f3/test/Exception/BreakExceptionTest.phpUTc]PK u2OeAD= =bobthecow-psysh-90da7f3/test/Exception/ErrorExceptionTest.phpUTc]PK u2O1B Abobthecow-psysh-90da7f3/test/Exception/FatalErrorExceptionTest.phpUTc]PK u2OA,ӤrB =Dbobthecow-psysh-90da7f3/test/Exception/ParseErrorExceptionTest.phpUTc]PK u2Oh k? JFbobthecow-psysh-90da7f3/test/Exception/RuntimeExceptionTest.phpUTc]PK u2Oo&? Hbobthecow-psysh-90da7f3/test/Exception/ThrowUpExceptionTest.phpUTc]PK u2Or54jA Kbobthecow-psysh-90da7f3/test/Exception/TypeErrorExceptionTest.phpUTc]PK u2OA* Mbobthecow-psysh-90da7f3/test/FakeShell.phpUTc]PK u2O' 3Obobthecow-psysh-90da7f3/test/Formatter/UTc]PK u2Os&p< Obobthecow-psysh-90da7f3/test/Formatter/CodeFormatterTest.phpUTc]PK u2OjAk @ Tbobthecow-psysh-90da7f3/test/Formatter/DocblockFormatterTest.phpUTc]PK u2O0 Wbobthecow-psysh-90da7f3/test/Formatter/Fixtures/UTc]PK u2O kc? Wbobthecow-psysh-90da7f3/test/Formatter/Fixtures/BoringTrait.phpUTc]PK u2OrjiI4= VYbobthecow-psysh-90da7f3/test/Formatter/Fixtures/SomeClass.phpUTc]PK u2OYa4 A [bobthecow-psysh-90da7f3/test/Formatter/SignatureFormatterTest.phpUTc]PK u2O# F_bobthecow-psysh-90da7f3/test/Input/UTc]PK u2OxF7 _bobthecow-psysh-90da7f3/test/Input/CodeArgumentTest.phpUTc]PK u2O 2 8 abobthecow-psysh-90da7f3/test/Input/FilterOptionsTest.phpUTc]PK u2OcPK"5  ebobthecow-psysh-90da7f3/test/Input/ShellInputTest.phpUTc]PK u2O,4M / kbobthecow-psysh-90da7f3/test/ParserTestCase.phpUTc]PK u2O& jobobthecow-psysh-90da7f3/test/Readline/UTc]PK u2OfGe 9 obobthecow-psysh-90da7f3/test/Readline/GNUReadlineTest.phpUTc]PK u2O$kt8 |rbobthecow-psysh-90da7f3/test/Readline/HoaConsoleTest.phpUTc]PK u2Ops5 Ftbobthecow-psysh-90da7f3/test/Readline/LibeditTest.phpUTc]PK u2O9 7 Exbobthecow-psysh-90da7f3/test/Readline/TransientTest.phpUTc]PK u2O( zbobthecow-psysh-90da7f3/test/Reflection/UTc]PK u2O\}p6 G {bobthecow-psysh-90da7f3/test/Reflection/ReflectionClassConstantTest.phpUTc]PK u2Oʓ&^D l~bobthecow-psysh-90da7f3/test/Reflection/ReflectionConstantBCTest.phpUTc]PK u2Or| B 5bobthecow-psysh-90da7f3/test/Reflection/ReflectionConstantTest.phpUTc]PK u2ON\BT /bobthecow-psysh-90da7f3/test/Reflection/ReflectionLanguageConstructParameterTest.phpUTc]PK u2Oj} K bobthecow-psysh-90da7f3/test/Reflection/ReflectionLanguageConstructTest.phpUTc]PK u2OV D9 4* ȉbobthecow-psysh-90da7f3/test/ShellTest.phpUTc]PK u2O" Rbobthecow-psysh-90da7f3/test/Sudo/UTc]PK u2OOn 5 bobthecow-psysh-90da7f3/test/Sudo/SudoVisitorTest.phpUTc]PK u2OMP|q ) ՗bobthecow-psysh-90da7f3/test/SudoTest.phpUTc]PK u2O+ bobthecow-psysh-90da7f3/test/TabCompletion/UTc]PK u2OmI@b@ bobthecow-psysh-90da7f3/test/TabCompletion/AutoCompleterTest.phpUTc]PK u2O); bobthecow-psysh-90da7f3/test/TabCompletion/StaticSample.phpUTc]PK u2O" bobthecow-psysh-90da7f3/test/Util/UTc]PK u2O9ڴ 2 bobthecow-psysh-90da7f3/test/Util/DocblockTest.phpUTc]PK u2OS0 bobthecow-psysh-90da7f3/test/Util/MirrorTest.phpUTc]PK u2O1e٠- bobthecow-psysh-90da7f3/test/Util/StrTest.phpUTc]PK u2O, bobthecow-psysh-90da7f3/test/VersionUpdater/UTc]PK u2OS A <bobthecow-psysh-90da7f3/test/VersionUpdater/GitHubCheckerTest.phpUTc]PK u2Oc[8? qbobthecow-psysh-90da7f3/test/VersionUpdater/NoopCheckerTest.phpUTc]PK u2O& 2bobthecow-psysh-90da7f3/test/fixtures/UTc]PK u2OݣC0 bobthecow-psysh-90da7f3/test/fixtures/config.phpUTc]PK u2O. bobthecow-psysh-90da7f3/test/fixtures/default/UTc]PK u2O6 nbobthecow-psysh-90da7f3/test/fixtures/default/.config/UTc]PK u2O< ˳bobthecow-psysh-90da7f3/test/fixtures/default/.config/psysh/UTc]PK u2OF .bobthecow-psysh-90da7f3/test/fixtures/default/.config/psysh/config.phpUTc]PK u2OI bobthecow-psysh-90da7f3/test/fixtures/default/.config/psysh/psysh_historyUTc]PK u2O5 bobthecow-psysh-90da7f3/test/fixtures/default/.local/UTc]PK u2O; mbobthecow-psysh-90da7f3/test/fixtures/default/.local/share/UTc]PK u2OA ϵbobthecow-psysh-90da7f3/test/fixtures/default/.local/share/psysh/UTc]PK u2OR 7bobthecow-psysh-90da7f3/test/fixtures/default/.local/share/psysh/php_manual.sqliteUTc]PK u2O/ bobthecow-psysh-90da7f3/test/fixtures/empty.phpUTc]PK u2O- Ʒbobthecow-psysh-90da7f3/test/fixtures/legacy/UTc]PK u2O4 bobthecow-psysh-90da7f3/test/fixtures/legacy/.psysh/UTc]PK u2O; ubobthecow-psysh-90da7f3/test/fixtures/legacy/.psysh/historyUTc]PK u2OE ׸bobthecow-psysh-90da7f3/test/fixtures/legacy/.psysh/php_manual.sqliteUTc]PK u2O: Cbobthecow-psysh-90da7f3/test/fixtures/legacy/.psysh/rc.phpUTc]PK u2O, bobthecow-psysh-90da7f3/test/fixtures/mixed/UTc]PK u2O3 bobthecow-psysh-90da7f3/test/fixtures/mixed/.psysh/UTc]PK u2O= Wbobthecow-psysh-90da7f3/test/fixtures/mixed/.psysh/config.phpUTc]PK u2O@ bobthecow-psysh-90da7f3/test/fixtures/mixed/.psysh/psysh_historyUTc]PK u2O9 (bobthecow-psysh-90da7f3/test/fixtures/mixed/.psysh/rc.phpUTc]PK u2O. bobthecow-psysh-90da7f3/test/fixtures/project/UTc]PK u2Oam8 bobthecow-psysh-90da7f3/test/fixtures/project/.psysh.phpUTc]PK u2OOTE q9 3bobthecow-psysh-90da7f3/test/fixtures/unvis_fixtures.jsonUTc]PK u2O# bobthecow-psysh-90da7f3/test/tools/UTc]PK u2O;k}X0 8 "bobthecow-psysh-90da7f3/test/tools/gen_unvis_fixtures.pyUTc]PK u2Od ) bobthecow-psysh-90da7f3/test/tools/vis.pyUTc]PK u2O# bobthecow-psysh-90da7f3/vendor-bin/UTc]PK u2O' 0bobthecow-psysh-90da7f3/vendor-bin/box/UTc]PK u2O^pXs4 ~bobthecow-psysh-90da7f3/vendor-bin/box/composer.jsonUTc]PK u2O_-)V4 1bobthecow-psysh-90da7f3/vendor-bin/box/composer.lockUTc]PK((X7(90da7f37568aee36b116a030c5f99c915267edd4PK!/.{,{,2psysh/67de8afa0291ffe5137ee70655b46b7d9d671b67.zipnuIwPK dP bobthecow-psysh-a8aec1b/UT3^PK dP bobthecow-psysh-a8aec1b/.phan/UT3^PK dPfm$lAl( bobthecow-psysh-a8aec1b/.phan/config.phpUT3^TM0W" UU{VbcGcw؄P罙7/r)`rP[Ө@+kEi  {FB`-F / v]jewbZ HC4J#gh糲 UOY3:KEX{K A r( CZ i}#k)HPj6AG!06RvB&A߼}-!N##%O}lic4wG2V"CA5f4LLTE#iR|e7 =kGug4R)c{]%G}kErVcUɢTjUݫscX3*LW!5le%d . 9"l:SqWcm$~A s<ʋ0<͈ xe_y熺`Vz'swg{ut(J5`hv1![K3m8T,^ VeZKd{?+c~7W7!mnPK dPyC> bobthecow-psysh-a8aec1b/LICENSEUT3^]R_o08婕XiڛNFYp'#lk; |gda%գp=!=L{kO?fIz:8/pua^MG8!2E=Gg&(lkAgG|;w,bqE:6\aO  .xx=<.$&>8WXy?'Й@=6]hƝ&!g;@] a":ޞ>&1iDI1ŕEߺv%Dkؙ}'D?:fh=ZZp~ۑ0^^.Nj7j1P?gT+o3X `H`e^m$AZ'/_`M βxOD\Y?FRYAQqY3X%/% +$PS!y)z#a(!m˕@f| g,iQD)A"Kz'S.!as]*҂uB2O,*dqnB=O*yUU) $Ba P u"$+ٕ%>z0Kh\M~ PK dPg";! bobthecow-psysh-a8aec1b/README.mdUT3^ъF^T]іx $`\#ihF>-ٶ7h)ra}I۲U蕑fϙ`n3ǩ`Kiy*PCQ.-jYWe(1,>?|(  9N)x,>|xtOqDPh" a~612-!WYXfk ֔*mLp 6Cș,ܤfʏTԊfDjӈ_g*Gwgr΢,EX6\7Gqcuy1+cg`3ߕLAZUyB%m&Ŧ]7bUZP ,V,N1IqNsއJ4FjvuCz/.XfKscqٚml m:0|M#X('㓓IxroIs3lb.SJ{MNq`ٜˏ @~{'<m*ׁ+/9 c-R`"[h4(2lpWs.)RCRQ'- jU zC7:5qr<0o<40d%txGq~!lxl`Na`uo {@&:l%ܝS V#d Jo{V#طëwQd(DHu~XTRtO <+gݎYA/\rdr no kwWZc4gؔ .o;Sç>3\XwzCT>FnYu5S$%,$Xs$(wJ6Zʂ)2ziY:xvK(O/ oYEHbQ2|[7-&%s@51ɵ^Yai6Ob+ lOD-56qKed=Y׽*eb ti>0`L>9 ?T\1~ R)V#@˜/<*>8)ҫX:.|X,%rܰL/<QUм%*ޭ跻j+^Nl`%`q| ]ޛ fw踼M,[Z~$z,ږtyK^)ݤ ?k_{6g\Ny ^6*@se+Z[2bG-PZVFz21 2(s^Ѹ\[ηs5,gmٟUxߙHϚlG2Ui_5_-3sM=v!wͅc{RNxާ2δ1L0|l0S }!Q+O֩٢˝,t}7'Qi[- km^[.str#zϨܻ!Ԧعuq>i@0+0.'ޣ?yt8F AfWI,SsbT)K%)FNj\*\qy{ ѡpk!(p=ͨpVr|o,|ͣ?5&cX@G< \TLPT]@oTnbJj{SoNzi oW%Znbנ=nPK dP'3)T% bobthecow-psysh-a8aec1b/composer.jsonUT3^}UmO0ί8 " 6> M`b['aPMԱ(kRH=Ͻ|D,H۪?Gǵ e61\;_J1C l΄2P iҁS𩡦jZ*ZEV C?E`f7wN_jw2Yc@IT^SZ\`5yk%Kip+l >K^+.gx6(QE]aO%7HsMޓ>09߬g|رm}uG]Ss&of*fJVvPzFS:dHNp:$'d &NB8wAyðbM@v5 'T*1@4Բ8'rTg8ev.sEwpI+SZP#9*ZoX2!M2˘um3>:.TgI \`PE]3 #[^Tk \^!:Wz*Qs!<߇؜K*]m;[t9 ):Ƕ7Z:1v1:e*t3G1PTPKcys] i> 1:d\7NysKT&,Ʈc j[!&4UCTxj-+&K#jif&Jxg,&>mA1VУky:ҭI> F3" m/9G˶6&~Ҽhf4vsAaZݭVӏ4>Y%{{{%ZqI<`MP$^ ! W RO޾~뷯?SxD>FI,Z1Hq|RFspE,DXT8$`=pNUiwԊ*̹TRd FUg`h^DC& ý_ *$sڠT06G ~,9g A`R_ *m/# W*8]vHw(D+j56l-ZGa6!昇'L-\;;I#w~C)/JEt}\NҌ+3k\$a#}e.sFg,iA6Cq%g[F8i3]rw%y fۓRrU}IȌ|}2[< *LE[t\W!gfg ( !b\y4$*&>&iB@lLR%sA3C5&"ېMuQ"뒁sP="N)2e2KӅJhj%1a1Z|`[ȋ$+OUBCDp@G?/mj!\7[Mï3IWK 00oC0]/H+ Luf<uӿp{e++|_:qh&tZ쐗YͣDзn":@=k F`_4+te2ָ'fQ\ϼC׌QM; Þ^wj2Ey7~l+NټJqv1+ѳd-hhdGJوd;:CT<3Î?2( V:-tRͺ 5k.,/ZrZ*iQ~lBi#Wk!3A;"scRc4|!PXڪf@YonfTꮁ#9:FSx7tkWM%1GM0;Y5xm 9YKyDZKRMMTyK:2Ms7]"-%Z. )%bc(WOKhIE4KUёNDūʺ\CvqnljT&ֈ3]`@ L*]^՘+5h=83`sE1sDgem*='hԺNrn 4ߨ?7د*`8:BLCBd~S$"~EaqWFwIU]D n/j=t:QHJ_~*nUoݑ@6AUx|)U ֭Zt[hmW` <;FBp5ͺu&s V*1ShT72]3 J*YSEOk`>_MCQfΒObNY# jf."jK\46YUwBk̿f +ԊBg&W+B㨣@XX$\ݓ Ys 3*25PԷ&GAcQƛh⷏vq8yǣ]]/y4h@ mb%:'; ,X\x(x WZaU(e[3uOd:]ۥGiȚ?E:=M?(z0O͛ۛ׷[גhZ}x$ =4L%Sl4?PқTrFΚ{-:J\('yO\I_7XxT:4C˜' <`M;ʾ˛~Z暆*cX3 ; *vlw|C>v y|ʋ ߞ͓h5;y)BaDcT˝bca:Ӻ1ҝBab,!ۖh9 n]d@le=$ Du ]⥒~lʐ+GքZ9WkoUt7P.0}OuIןt:_r呮fmρ|8OW`80Ww\n+66l^~>R]-ϱRKHRP}U ojC(J5 U Xo" +ÌBtLU<_PK dP( bobthecow-psysh-a8aec1b/src/CodeCleaner/UT3^PK dPGX = bobthecow-psysh-a8aec1b/src/CodeCleaner/AbstractClassPass.phpUT3^Umo0_q*eUjV$b)q")E}g;@6%s^s>]Iygτ+y@ςI y 3#A 0zJ/t*c\ti a^%_& ! EDˌiɞ9칛ԘiX1WZE1 i(T2Dr P|B (WYR̘T(緤6:Iʔz;$*XLt*e.w!b-(j!)EUїY_*d"e\p$sGSRQ֦ ]Um3#"R/#~y@i=>|+ UL::JA%U ȭ<&ǥ-V"֕ɝeT) Jq",r{;(4J4[.4!`fLƎё37lB"LN՝1Wr:Fa&LE[u7)@eռtSzxБGBU48 >F zh MW-V2!r\h&#qe HC'kOӻwq Hxony@Njw54G#KM o־;8>Z4VcCZQEfUsw*}_tcFW-/jVN ;,4hλp \@G57ql^ M_pV6oPK dP_r} B bobthecow-psysh-a8aec1b/src/CodeCleaner/AssignThisVariablePass.phpUT3^SMo1ﯘC \ mViHR3ؒ׶loHT?ձaZў-כƾ|oͲEMH , R!1]t`4|7ꍆ!|}>rVreA''",H{F* .XEȶIwiTj' Cu =ܪ7+JMLcE"՜sYV3B:Onuþ *n{ߡVM 9^mtR,1E\*P ,Rb3A_x\qҵ/g &u uaO-!fz KGE{#^T)8 ™ܼ! cq\py?8#Q]$ ҁ\m%tR{\G;9 W9)so=7& "V'$h'i樣zA. ϗ˯.htKZjjw:Wl?gPK dPPoG bobthecow-psysh-a8aec1b/src/CodeCleaner/CallTimePassByReferencePass.phpUT3^}Tn1)R@4)4U= E;Z+@X߫cI(>y}-󒱓c0ʥL*z09*"`Uu?vv ?*祆k*^\ >G*@ra4u J Ԏ2؂{itJdOg*90R鼕c 3sTg*+@0y$$)zB2VQ~^uhyiW=-&o3t8) ,WsXk심ɕL_ ԆXC pBA^H9ל,3Sp2u! C5.|݇ϭOvcoS6wi!xh#ʂAZϚ<\И<>.K&фKr|jqp wY-qȺ?D0r+SG8Ć1bG(1"TkU[}_x\jRӈV"菷};v5#w'8?brDCIkvQãfNZ" F~b B L:+Sr}+:ߕ hӹI'0fRîo>vƺۣn{ l:bSnw 5?~A蟰~HxbGMN?~vg/EQ;8N6sǿ,@}9'_0FRkifK0C>w+: ayb uhw=?6jQuĢzǒfa*U9# ꩔ %NCnh4"P3jRkS):v|ɬ9Hu#e3'"7.?1h˛>BO2љ6?PK dPbSMaB bobthecow-psysh-a8aec1b/src/CodeCleaner/EmptyArrayDimFetchPass.phpUT3^}To@ “ v|,[֪k@ӤRU&qi%]}@Iygm0IX] [c5JӏRZOynJcPoK9M2M!̋5ybu IaqZ)z܍תcD2լRD2"%$D9g1#SEt Ph4J!Iw 6 VOqMeCaN1jy! V!n-s/*BK@Ya0c 5Lt / "Hz0#q´#]끜0B{&wO?{}8ֹuX2aD4;ljɒ k2WLCIEL,סf$h¸ N/ig PrȭbSsTӆ6|iӠ:@\{Y]B"A쬃FE[2y|=6qvpr+`dت"E ky'ܹ~]m1M&\-|_kaSerݳ2NUp`-Ci|q%N!PK dPp<:\: bobthecow-psysh-a8aec1b/src/CodeCleaner/FinalClassPass.phpUT3^TQO0~ϯIE8lRUMU-o!^KMwNZ6&}}9_UEEg]!,B"ō¾ª@)?SbY ɗt2:e\!ڀ+ZJtjĦpPYBP6%wB1T9= ܆jK:ZXgSp [ :!V&CZ'yEh+ND? $jBZՂ&d`/]ҥ3ɭ}lϩ%sNrn6 I ũy_ڗhhMԵ? /BߏD@2;QBK Y`|'y  #El{tє2JexB FuР5ڟ_uvLFoc@wgw:rmу6q 6ʡ#;bF eW]h!BϯZA]M ('Tndc<خV<J!Ҙ(Ӑ'JSiG]h7Ƨ5{1Ex<1L0/cPY#l,(&{+c`NSrihXDs405RgTjՆֲ?jp`L?G|.PSP_ FǑ#$钞1L>[ܐ1jxPK dP8;? bobthecow-psysh-a8aec1b/src/CodeCleaner/FunctionContextPass.phpUT3^Sn@}WL#JFFMRDxd)1^լ5U{gmCLpy>9s53w""?Ce `Ssr6 `86BwZB&Dy@f{%V!$" AFZBm#h[M˫gKtL!( &fSib,ɾH\ΐLcqrF &忰o`]_?e`OcveO`)c8vffm'jvM 0JM$S)3<2ڻ8s.jZ(Ism+ 0&! BEHbId)&?G!$ni4ٺ5{!W3 |*煌zLfhވp&1Fxl328Ian3DT#?13 2>B W ##9eez6?pNBKy:M;Q;"Md_T`/:e$~@ODiFe8} 6{L\V2Q ڜIi)gWfNa ]#->[>5fnUiT*/wF35-RB0DptA!G&+z]70.°yqGh'%V7}(38A<>ºG\ۻ}>4HO5Y&= +[멞uʢz|5P]gC=_atFgXJ j{r5?>PK dPo"E5> bobthecow-psysh-a8aec1b/src/CodeCleaner/ImplicitReturnPass.phpUT3^WOF~_1$(!=zWD'ES@lqY[uLTwfI։T=~;?oYZXjd@3H#bLcavЁӳ |+ nHk&T%G"I HE.BHdJL.d z7XZ۫MpL, BC(0B)ML'N<@r"oWtpE.VAq6|5^ߚnT/.RbSEUHg8H eC zp9V6IrSڝUى 9]:H7L7Cp~9~8:/o`fd?iP|ֶ6Jk hGFEzzgvB[$^-!8ˌl[˘a=.(UpvrtDjt9?!fy;Y= |$8|xlU4v^5_\eKblqL鰻 ;!h Ŕo =[_~[ezE]Ì%@ -⻻] ?ݭE #rBQ٬wc}PK dP 4 < bobthecow-psysh-a8aec1b/src/CodeCleaner/LabelContextPass.phpUT3^VnF}WL]\?VF*Xy`Eą%gM݌(93svV^E?D􁾦LgLxzg4re=l]M\v//./ym^ e-%2,8/6VSO$阍C3By+-57/@:>UVQzZzNh} 1#PBEF- ?! A4J l#k^?0 ?#{56ps![U66/kiC(_H9 )k܊а8=.lC(3مJF+83 0Q S\v4ݐJ6ϨkKtzReBGizk/@EncZKUnvrX)k:9* (LVqTb8t+B,20sq]׬{D-gӉhG]7c~g|Pd`MY$nя@iP1D .= ΎVm\Bk?>O{kQ p)8/{ժ%_;8Ts&M^IWt1qv}{<-Ѱo4zr[Qg W!eshO%c]Dz/y%}5Ts| ܎*O썘G 3DvU6yVkGԿ=gij7N[q"ᛲ8dwW@o*zY3R3U/Zj!gRNƄ@)JNs['[!ÅQe$GmN;&PZCI/\Ȑs06iV!L@.)*Z' ,JJ Z"PYbȧ+'Z׆I d}Dlf|r5oG}WIK.zIySi&Mm]^{ɽ _I~k`cYQ#XKZ0DJS5Z v6rmNG\k4fIN6wFl ~@PZ e^IW)mx/DĹp%4`BA"Ӥq^9$HQ>Jh$&+'PN^N tm6DB[GIdsQҎrA*Ko« H??Ǔd6Fxa[2%ۥ^c1vէ9UrZGXrZ>Y@۶IH!`qLkōӊCuP ,{/ef:`W-h*,^Yeץt30RvȢQgHv Av5厒];_.]fYʴo?j{؅V4] *4I3ɸprBŰ U IHN,Ȥ6h!4 (.Ҍna" 3-1kv927Hf@+`X.pJ<AbTae/̹t‰th6>өⓤTQN~q`\Ʉ ϣgcTAH '3-k| ?~X(1_M2-tY\#ɱ'딾~HT,M&:z6lUe'#1bI' m(:a^vaz}o}K^X`M X 0b[iHb}5WGgӫhoOJZTXD0(#P=y [J0𣃨RV9XewIþ+^xRf I7Gpoq-;Ŷg ޼*U=ln5)\˦BUHo)\'ɑ(%d[uydѤ^m:V47BfmX%\iU9>:E@ZC ?¤0tf$J5?5< nXMFڈ_n^afy\o;:o \5]D8Z*]Rm9aOOC"4B1M=(E'2zwǣ^CHPne\t\^4a`(5l`RZTvۡE_]sZvn1PK dP$#,> bobthecow-psysh-a8aec1b/src/CodeCleaner/MagicConstantsPass.phpUT3^S]o@|_#(TI+*UPݷzDJsF ںbt& ~A zh*Xj4!&㏓x2oyMI!Ƃ` }z[{T 1UIBkPrNf9yJ՛ౄ5wXkUD%F#!Hе,?qcv*D`uݮuh'j"IcN"VLr)iͿ˭Vϯ}'rxxg^EqQEXe'3 bobthecow-psysh-a8aec1b/src/CodeCleaner/NamespaceAwarePass.phpUT3^Tn0+@X>͆ "pܢ"ETcŲ"Vli7oH p0@f <5!>&|+ PVTrk)BRJ 6BI 7 t(f{)5{7Fƈ~"keݥta_2Sa_$~EzTeu_8) BrF‰d`6'HpEJXܗ?;Ib #6k񒌜J#UXd28|%ONJy=' !8л2s\0ohv mK1e=?^5iԬU*9a%.~9,JƳ`wE+Yho` lWJ%>+Evrc jVݨ # ph&dH7?r@ 69I7䂐msjJ1S{Va|]PMY;"tѿ߽ZizoKR o"6 ۑ-+ϟCUsJkĚ v~B}xWW"J~/C#ږ[cUlѥϝ񲳮!?ZSu.A„ 6tBFJM+ ?n}PK dPE. 7 bobthecow-psysh-a8aec1b/src/CodeCleaner/RequirePass.phpUT3^Vn6^-n壳 e8b¥%&JI1{=؞dwlK[Ll=9=K넂ԒJJp y)%X1_8`*)R,ZP6KV}($g(ʟLF sb2a V-p]4)GC''bKn 7.ф)ݢcr3فɅ\O 3V,3>ĽK&A:8ߗL\`@_sOdfr3*3ɋ`S J$1F!+l!|/ LXbUЛ dJag_T/iC Rɬqؾw,A띯09'u-MʇÇ?8yzvt|€H#N7e:}~9Cl"dUcqCَ1Lo>#r^t [5yz wto;׮"kJjVv#ThxmrQ]MΘWɤTZCí>kz_'Ua%j${"\áGXoU{古;zW`>fK͹Gqjl ]l :-<*~yzL*B"S\燏1"隕ĴFAN⇶w^YkJ` JfDzc᭧A[aK&$|,O2b<J˕ _S m~\;-hzr!PGBa6 B֢mU+K\{%M%`3:oMMfs8, JTV Cצ+3p Val' ЩO]=+Q.g_xjG9pUc}VwQ)1_y1Uz皇)^hit8~wTB((SŽU~Y"`s4N1-3~y#q+\J+~d2p76~7x1AqVpVM:%{.q:8(G/e Ue^[I D}vBN(d<,:_ٜ {эu3+DPSf [Gp*CRqPK dPi : bobthecow-psysh-a8aec1b/src/CodeCleaner/ReturnTypePass.phpUT3^W[s8~8d dHsyLIʲΖ0tسdl؂e9U◇4L܁sFfQL?S" !(~ no.nnL'J+DReq >OW"  |$" QgmHcJpmѥ`iS %DR%S4eBAg§PMqIL ."I7p'CaTLZ&k*&ݘLLG* (S,Ƈ*cU&uEFTeb#.{>M({BpYsuM:A"C FQ`$(&1r(xWEY c|w_A5{範 zh:m%3/~׾7y{ V<i0)֤T. A? O;`^xUq`Ī''LPcA'Z0&R-pFT;Va)~vwĦ>Ɗ p-#W~tg_ܗdAԭm? h{u?[l]?cB*"pXΥBXS2ABUO&zLu9:B7g\ЍhAwm00lr"UB0hF:6rX$U )V`1jkJ}Z]g'>Ʈݝ)*͡SJ"[Dx lK%g֎vkzo@cI t^H@GR/(+\룵55w,iحgO͹`s#d_Z,<*PMzF:h)kPDU(,ކ6xSo4zz̩G6[j~/3/ #Ῐ"YMS܉D?<67L񣾻ⰙS3~ht-HhU^ȏIsG̳!]´o8aKQޜPK dP4 ; bobthecow-psysh-a8aec1b/src/CodeCleaner/StrictTypesPass.phpUT3^VaOF_1H⠐T$RhGK!"Tƫ:kww}I^-̛yofCgVE'+KJ$ (hl74e`VAء|@?)Mqj)ti)5bIQ$ƨؑ JT(Ef)JuD \s7ףɈ]y8.BYglq8Ї:N-.D.C.☂$u9:XR[ܠY =4k+%o.ʛ"h-,:晓!Sm@PǝKiSE?{7BK3t2tXifWͮm~D StMG$JwpcJۘ]dBLrħN.v I cJNZ2.j,lC1ؠ%I$vK^&0q;h "X ͚D o%$E2;V"ӆY2 ܧb>fŶ1~4߀ DN Yt体:Tw[Q+H[ʟ ~8^BD)x\yN0NDJ  qPDYT˄(J;9KSi@|2v3}G06UԖ|l&lA[K V KPLY-S||Vuȵ"ZZJ_.̕=Nk:M$)PKe?Z)v 3n5vxC폟m~e]V\'\HMxvO_|bi9_ܧlqp2ۑ,C'(m!Vb=]P5{7(?KY@ҴU \OnMKsrxثYuM\/YS6F|QHWM}%{Q[YgZ|u6zmi֡M0M|A>,,.wB1rV.r-9Ԓ)cG.ձ47ߧxa3gc\k*Th+^z}ۂP:Xo}uN8ۯJXjKG~?LPsy~q_<\[u1o{.N;^}?e]OFҀ=zw`~+ o X bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidClassNamePass.phpUT3^ZmoF_-nۗv}@[r/6z8D&W+.]-I]\ND;2 !т{@Fh _Cر#"sdrhrdbB1s .91؅`b^#1Z*E\1|m6h@ MqAg=9;B kJ PCwpd-C"%z/8 Jbz֒9{'}-I%#<(1&9NsL_[#CtH=^ G0j LEA3ʒ t$aܙ^ו @_gnZ e"+.momrPll"/4c Z/)kFqE&)2Ybm){4k{ָK 1rxvT ZTޔ8d)1̂BP~ilNH׵b'9Qm3Z@+^he֗w.wYc:&Fص=+ C(:ׯ̢H&yhԂooQ&hW;G֓]ZuR[0JX=nSUWvdOw]q՚rbEDoNҊ44(P҈Gj-7 gcBOНQ=jɍpci1m$* :+œg "b39}Ji t ;5>]WJc6g6=vZ2]LTM}kF۽U$-6M$X;S͞e42Y}9ǻpJa?+IFkHNdɦ[Tocmd]C35g, H7Q7e=wrRzNJ(#c*$F&^dh|`uwgvil|f[?AUʮn ɴ eqokc*-6?/ 70inKхDoW .ޔ%q%J[‚4hIRb OlOrj(*ߪq2#?^6H m˽h#(/gLP% +!ðµkW#6MZ_daK4EYFBhPD@;!uhv!eJ^:XǂTZꏕE~Bokʩ<٦M]Ũ9ی7z`)`g:LI8܄~K|lf}Po1;@}κ՝wN0hִ몗PuW'x^m:3ήb m94`.;@@U\wu[_WGm8Dvej TL}wi34?ݰIhK9ǟq$/K]n̅>~jju7))Q廳5fJXl,:"R]4WgjLJ=4"efxn:f>GLG*A9.z ж+Ժ&!>eqKд10(X)b[XSR줛#IZ>/J-\14d vSM>;OuZ+QLbIp#e+CQx}߰#,DΗ~B[!iJB?x' o4z8:x =yE9DK탁Y`eHr[%D[1S5sgA#pt ǤK"zDh\}b&OlẼ 1Jjh%;WU@4'U%M?ہ 'bk%euJi3CT㩵o;u]`eN;Izue!uq6|5(4)M69卛StGWx~Sxq&l3[:p{>+n5~(M#!p[* [y n^W{zz7PK dPfa,@ bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidConstructorPass.phpUT3^WMoFW]XBPcF{( aME]bwiY(|RhOExMǾyvmDZX~8KM0MǴW !p::=9=_ 뤂 ]Np ²HSt1r8*TF,ePKm2V) q>\Wsqpbi%dR.L(F.S"C H32(B3 tX4&K>[p k߰D]@T1œ 'ҹ1M__E*c1rVP9@s/v` c"2 mr5z`½&1I>6j̚¿uۤJ8nk 'v3X0 ZPijoa\Zwl=1_O?N q~ZVT't fŪj\KZU'/Htob QP>Ҙ duЫXeBHge2#>:T@gɍ|`! yCqO]1UJ!VI!/ jޡOyЦo~*{-9}] 1'D}fl) 5^[4POz p܉= <;4AKx'm@EHT~֏aeI+c!uپ4:;\l ΁ImLD J^Hf^ l1\.I$!f Pn+T\^:sQ$a:BH/Nz,y +zNJezJ&N:Ono.<4Vާح0(TWZMn#ax,r49/U !лB_y*Vw~ֈkkw-|큵c+AЌ)ѹAH4|KFycǏ y0$-Y$kmc[Ӫ`H47(+i [ZW셥P|U?h92S>}a g"CָP^  v:^[ "sN/77n5V>Hի?,jmbx^^{->H#E7[wES PK dPrH'X A bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidFunctionNamePass.phpUT3^Vmo6_q+Nx:xڢHx>LCH'M $XwG؉$~==?ypB"}8 ,RT G8?ONjHVBẀKB)|c2u t JF-EIfVL!W(ݭĵ_tv+ ka!yS8a-]Jڪ !7yZ^)BAAi>Ƣ /6xr^: # #ōvp+]7r.O'JRek;iva ᄚ݄)[M( W$v RK߶"ĸ'U.&[[3k89I)8:"ȇA aGɓ+"^B^%e͑_xSOFr(ӱB-h T rs kMa<~0bCgT,XUjh ]Y74G  YfPڝn%ʇ@ߢJNOnsgxF"{7ip">(y넎t!x/*]_ VP71t7:gn3e18DMZ2J4$j9I1Qqxʊm75XfQUhc "T;_=3*ի:5ޑ8ھ/ok5 Üa IY]FDSE+FE0ZgΧMGòI/<6]zCav=z5M,Bxbo>xϤN9Sg;_Яh&.1>dUç. b'$vW4HZO°aHt3:r3Xn~ZVx@RJXk:[uV&Dl--}k&{6͌,#r+A#8:%{{RN{xAIc^mk4k5W,\A V|%U{R9;;`GҠ+U”gat}\^PK dP$ bobthecow-psysh-a8aec1b/src/Command/UT3^PK dPNy5 bobthecow-psysh-a8aec1b/src/Command/BufferCommand.phpUT3^Un8}WCQgަduuۗHPARA}Ӡۖ-sOU$$pjn> ޛ ,j&)8)Rdp~ Q2k5ؚA E6j T xAYrJ0grz|1u<[S kjjYVšoi;]0*#9JIfCjV^$IgmgUgޯ~jPd4`LWh'tnG Vx`0?>v;iU<-vm| 6^>@Uo:aPpɀ}UlC, A7^/e,OIulx8O[ r_űknvn '9f4{~)8!L;oY%wޭ[4H׻?]>N)^^9|`Lys)Yb5%þtMd<7{̈́"<ާGzKB ~=lp\d8rNmtvOo dGq]G?xV 9ڔ¡'/4 +z%^`=1*LH i;ä\ Ӊ 98?ff>]?8 b$Wl%K@{ anK_kMrkΕ&<:>qb}XʜF-ktzwA3Q !cHʶ/"rGe܏m0X "Wq%u2KV$͏#|H|`jw UdLjxفVx'8 ]?%PK dP_ #4 bobthecow-psysh-a8aec1b/src/Command/ClearCommand.phpUT3^RKo1WL%](^*VTE)w6kؖ%(xFБyylc ྑj05 *uE!)*}(,nRÂv\CAR =8%jOtm܎iBNmr6[SNhx=PIƀehCPN 503d$jX.î6ZQ(,;:9bHI[QR1:2ΈL>&x~`tIvsŽJg| +2v:{f@6K2R7dx9m (uu"1OZ>Fy %%f_$kᎈ3est 'm]ȍ.^9t:UR3p/GXpub mC^)|ָ0Ln-ߦ3@)zOZ׃ t '>? z5=^g]-oԡγ⡼u6C5aNCkPK dPxJ/ bobthecow-psysh-a8aec1b/src/Command/Command.phpUT3^Y[SF~XSIBd !Ct:aiw*{ϮJlSh\l~jM2M:M@ t*fh4%a$=r~K WYN!HN a8qz='L6y%Y%!p톒[wP) P!9J% -SLq}tH0\qN'P͢I4Q3$|b"x?IZm2\yG`;P 3|f1*NR2$PUI^& t2gfW$KXdbB$aA%0/-W^B."$f̉+xOP8BV*-m(~O+fDZb\[dE+L]V^e觟Z{Eq^r[Ġu iϯ2zxD[@FG&qWJ9D nYk8ް)>r"S4?-eS© baa8qBg |MDgOX"mNJPWUR5A,a{?P\OLaؚ3z?w15y6W`Dɪz|(d=I7 fHp:Uh6 x5 gusA\w Dޖ ^RA@-r5k무ȰAgں`%Xu6] r1U$h+\0nbb_eMk.CQ ~(44[C4 bIž ۯF  hШeZFIk!a ۜ6 a/p4@Š!2kv}}>g6gڢMc.T|:HTHvaj*ep觡B\u5A4BPn 3l #/uJRFDC݌;V9 вN _-,zW@Vc+ld D?/I\g+h>ii.\-7CM%aV4G$7wpg ;Dt1RU1i,G L;嶹Ν \LmZaN0%Pk1=$yJ#d8g 4'1 5gz"\]SBSMT D]bry:'|R96R/[/N|<P!NB0Qp৩i?2W F>< `poG5Cu36aQ15<9C`?;MBoʶW KV]SpqE%7KVDQyuO7h}XCzԓ%f#"ﮣg 1A]xgN?r|85UT6dK(ڣwUjzV/1K |Y@Բ& {Cw]mcq v(z7(u5(__`bř__ nOm@9%7zc!Eկ]T]t$Eid(k;E|AڄKCF #Gx ;݌Cx1Q}RB|İȔ2 ` -Ņ)4߾?">tI]wKqwY(*i, [E^@?~՟tf:t D~/[SFoVTAP"̨\A`Ι5K`c̻ כB{N&bJ=1E" {sD(x͐ѡ:4W Q# ZB<^*:kU$)3U[CeTMy.јѳ57ʭ_) O0פyG5vTO讫׹%th~iִQT:uQ ԴO`3SEZzy>{t[YH7RBP%`BwTKz]*|vH7|1\+9%M""*o(XꇄO2YWC#X2=" UͶU+ahJ _ g/UQ"'hQMAQU&0_ϕI% NviEAe2=*pJGyoXAUUxx$RS7#h2D6pH*Yu3ht[]Bڨu&Yl1MW;V.@T7fQ!y͗n2x 06ndZ[-.4AY߳;kå@_$QՏfwkz(۝Hv9:,7ʎ`|_Uy[ RξMm}mEaty:"XmPhԎӠ>  θYyhPK dPk 3 bobthecow-psysh-a8aec1b/src/Command/DumpCommand.phpUT3^Vo8~_1HGʲJNTrL%vd;ժt?g7cF߲8sgs !O;cʀ ^2$鑊r\ \_ .[ pCV)ʯRN6La|KC) $'esfBlM 湱W (ENET\)7-(@M`jXJ8m j*'L*ŀEaaB>Rm5- B+g:;2$U!*{ڡJ?·fg6Yw ]-˿N_[(~\q&!% eȽK(W6|Lݶ-[s*b'H~pۆM{=.g oڅJ&R`ڝn 2f&&WmzZM{8Yc $|n~t&$pG}]R4$~W4 G}׾Zn7dIѨ}޷O[G4Oܣ~\kr{Q)4cZE=9|L$٫h/]ӥ`hq GZ8鸂`0,8oЮvJ\ Vrkt[~HF hYmBh߁oH̗ a`N;Z2 ѕ >D-XrW ~ƦC[wL"TkTJ*t`dq%Eb~\zԻ_xדoZ/UcmߝPK dPs&3 bobthecow-psysh-a8aec1b/src/Command/EditCommand.phpUT3^X[S8~ϯ2L0ay -[0} lFr#y$9a{$;BKSY:|(|Ȗ`0=rLxfTj"bEm>l]~8$? 'ng!^2iJBmdXjByD$d\ :< Y(`ΝO?M.'(ʘTH(-\<$z oT%r2P14r<pb*> rUp̮^oVp&8(ٔgEwo82E2p28v2x>*jaJ"(.\epy&[&~o4o0xӌE+=.) @WǮa(ֳCwZбJvD>K Pq{WQ C`Fs7_YL<lzx\~1]TBT("]㬕ZJDr>r&{gaʱ}^?`\Ȱ:J8h؝ fL_%W.ۖ{~N+vlW$7uzS2T5y7PK dP <3 bobthecow-psysh-a8aec1b/src/Command/ExitCommand.phpUT3^SMo1WiDre~B-xgY"{^JTUzgfͳ]o~4A--L n$rчj:N[p^jSֆ#䋱:(´{+׍+PRvAnFU)[6.nʻeK%:A%1x`+}C;Dՙ`R #1coеDuc6ĭ1\)w{"urg ojS^k4jOn o9߃IG*wҧ(mx7PܹT8#Σ}̀,6R7h8㴶xQ:h Iu-bOZ^TEvHLB@mΗ&c_8v(,2%QzZ ߠ0B`+[i]XLn<~eSR4,e.Q[3.l, .uFAȸƒV93b?{ƴ)Q,hUAKѴFrՠb,DH 0}&r]<󟫫 5tO .U4kL@+_u4cKMQaU֣8^UvBlk3Mx¿eD t;%7!=޵τj½&ڴrWJPSO Azkt=%`_e5P/Բ^Hw^=z A$/Die~~9wq8L3q`+sxRqv53vF_N܃E9ӌ9ُW/Lt"qU+Gͦ ҅޾ 7lI= G%~_Q~y5ZյccyH^K8?PK dPc0m6 bobthecow-psysh-a8aec1b/src/Command/HistoryCommand.phpUT3^Y[s8~Wh<BOd+CdP]KM9|!=UCb,w.6j[#2I,GP$\kJn4w~{!G,v[-%8Fmx|ES.A_b).'F5ŗv:j)IbR +"LmaTa,| VZQy_| wՊysX-@Qq$]jsvCU8Mnr-) 9 1mQQ 5ˉ@@'gWpem,DRO[*uU㢄Of"* z&V~I [l}Q$[|">4r_@;ie9&}41*ͪ_4܊%9^^;-d44ixALE~k,' N %Tx`w5lǺ@Hm\$G!FpG5jԋʈ40qwIi Ph@O^Vxz+2OjRLz&I,K, M$qi`nq-pכ տmڎ۴naphHZӛ<2`k6n=iڭYt'AIqPy 0q1 mFN'gUT3`Jlwk+m`D; 6ˣoOu"w\~<].|P缈:mT;}!a(j:Xl`|}t.|RV)\.vx}HǷ7B ~~OyfZEwZUԛ/K*z9c)+;pŧ?aLv1 $ ÕIm#Ųb[8)9\!C C rH"Vz qRO]+ 0~:=%GdsSEY9"0&j{j{cnZF^rv +"_M!&w+3uzMoO͗:ĥ1d4[ޜk?bDކyfuɻ#cc/2l/JxI" 㛆t(ou!sP"a\F9 2u _Dn;.VD!(Gj376=Ժ+2#ƺ!Ŕr,&%]cg_CN=B[;ˣ@J{Kn%yZc VZr)1]w{ֵ @Qj dQ@wɨrX7,aq 3T*0ZYE#0%DHnǣN'-U+b N ҢǔOSh1R9g@1UJ٨6ٶ=^TzrpJ|T<6g+MVs ZI)-U"?PK dPn '3 bobthecow-psysh-a8aec1b/src/Command/ListCommand.phpUT3^r6]_vHv68xIv hЎ9H7]tzI~99~Z|\pMf\0W43D{&LC؂dH?gϟpIԒJʈY02˅ Z3>_BeJO@AT+9"+(|]N/}@TTs%\|2jTb;ΛD& *hꎊO4N]B~z x{K×PUnsβ9 ò+ ūu]\S%0 8Yqf^ΔUkU%ϰۓ.߷e}D5mNps+ @AV&r*Ƚ7ur3 Æ~BWd5 r^%4&u ~V5+t?phZHM^C r"]V~ˑA—hfJ zh8;6>-IKǖr2nR<)P(9wxf\r$V' sEwѨy2zqzrD3pty5*0`#| d/`}2tvů]MkWI!E ٍN(FpOo7X4Cȕn)FUvh2M*ٟð_J5y /yiB WruOJnYY,y32>blOwh.p7x [~3_QTŒ˷aZ|2,%op*8}s Iɭ.ۄ[@VYy>! eMd|w9na&U8f_G3%}P DXgTF!1{R Ύ= WiF(9$v0 ${OXeDZF4Kjis]]$CKֵ#ƀݑ JP aRl>n8z{q>X ۍg䏂CKfFQsoUC&C1Pz>$2(Mx0^_>L#&*lXV@ZԼٍ(@!5  FA!E c #Bwr0SwqǘR1 ihoJS\Rc#gs&5vٓ7`BDCFĒ:|2q'tmr8xBY3\nɳ^L1ANN! r% uuȒk4hv\?8 FGuEֳ 2ЏH3cm2ȔO;]؈Y,o3SdvS&8.#[nDtU{3,m*^++RaM~(nWp:.q{t^|nPw>SMS@Ci|Z$h&8j}KVT{PR0eY`2_ b˅ ;\;.Ybmn 7y#`( N7B£ \艶I DY W ]y7r؄m>5,(0cF6*:bZTt Z*5 4rѭ Zz [[̐t[lz׉0ܫ/*&G( DKi(;os`?ۤ6v[]D?k2[_5GqD Tl@eJ(x?E}ŽZޫv)os?Guͣk'|ha1pާP-PoOϦDl[vo9[ $`qWaneoZF+o.P5 J@z٧ZgAF Uz#z@j* v S^?~PK dP0 bobthecow-psysh-a8aec1b/src/Command/ListCommand/UT3^PK dPH-F K bobthecow-psysh-a8aec1b/src/Command/ListCommand/ClassConstantEnumerator.phpUT3^VQS6~dnr6s# sRp}UtG$$-ӄliߧoW(hg+-,q _e@IaQPߣvۅ+mpՒT` y9\+v_ "R*4"\%1L {dt֝Χ̺rtLA i]eh+f AZV*QKr'YR]DSDn)~朦H:Dab̥pJ)0v^rz=ee\r>Aup` fZRE (3qB~6Td:X}a-rDA3L_*ipWnwm.ue #f' Tz3:!Ꞛ;q(#RhXTֱ#YrC"poEM\4OQH#huқsRL&962PPǭfTTWX]оQtISp"f͸$oa K&7nb=rujp,vq:q-#qt5y l.K[nJ9qve)<`4k|?"bFs&Lu#gX<^\R8;@plS9*]}PވRdI IWP9 [wŎơ:J $-vZbks$Q/%?q4! Z9ƻw}(WPL;8 oh]уS4C+GyCeT&( ,/.oN.89b LPNÅɷ ׉P^/Ԇ Y?\}'kxer銜`m'OІd d.ʞݐ.|$ټ}vz xJ5G3ҔlqyrvŠG+=5nok'sG7}EomM37cVXu6$uE=Tii;s_+gؽpm1\Nq{_l4?:P/,ކ;ί( GWDÚ((Ғ}i5-`t'UVԀ<"NVT57R[FnFQߴinoVVR#8W\.fiqMeiyС5Q xhJn6Ht=US^yoc%gB~7Rh4SWzJ% a{jT>-p ^MjZ-u5

`V 1&dgReW>ݝqfc 4n 2A{(x0¡c:r#TәmMX1(I Ezfqn(6A)c. K]ϴqc*?8u'{y~~B^q"KYOnb^Сպf.:h?vU+xd@{s؉ 2([R.6E$$k&\!\G8lC$h8ӘS) |[GѢ~[SAn0PK dPlC{F bobthecow-psysh-a8aec1b/src/Command/ListCommand/ConstantEnumerator.phpUT3^n6_q]8N5K/sEgu  (Di$h;$ud96=آ~ۛtv:/;nLB"  Zn`Q4Dp||̤b@}"@)YVk1rx(%{Cw1_M5+ZDB6S4{AUe j%;Nb*SQ(Q`~II DÈZ`pb8L&ro\&y);把РC#4"\9b*Bi^K$>(uwCDLWlm vG䧘]Dl.-$̠NjCyz< *xbF !̫F}:w)kN>œ?QETc$*uo]*a]5B'+BwW~N\h^ougvpWGuWs]nXK=Dz2)ѱ*!?L\Ӧi}v#bʳ89y _.kv=LV7U-k* 1xDc7ōMH LPt,Ů(_OcC@W*?X,{ krG@I?,L)O"T%^ zS+~pu*> s4b oik}Ga2a->=v\m߰v%s3 Z$S곐$B,"ѠfĞk4djEz^;eM h᫡^D.'Q;zmj%] k_%QrOCpcGJddQAKp<֛mMְ SQEөZЖCy}*2Oģ6[YsQϸR⯍4܃%t1zuMo+a960+N^MgC4(,vqO˺ ao׼_Z+?o1I{3n.=:xx1P6 k|@oh)_a-l_7KPS N<aKK|I?yGYG8Ogu{X&VB疟ܱتU}E27e?Ss]";D9YyZ3ZhFYj,z^.oPhnJUչMnaߑ(۪Ϣ.zD쾱i-ϟj.m]+'mHC}cҰYڽ&r߰n5uI#l۬Ts$U.sГPE=i師cH{}{o.e髵+xlQsЎ%&it9\Mo]09e(r10rEEf|vPK dPG7fѰ > bobthecow-psysh-a8aec1b/src/Command/ListCommand/Enumerator.phpUT3^V[o0~ϯ8U[:[7`cbP1U&8ĒDS.}ǎB(4e~9߹/_Qy3`1!?%RC<_"Ġ睋U >fJ3P*&AFQ3!HҝdHk,B&2&%RN =0r`8*KGGDÖ(X3%[eat'HU% (ZSCyT7rm{y^ӑ塩\FIZnJX^Yjhf|IT$>.S{#T7a",4xOB%:#wl!z3ٱQyh,hrRӤ8{\62AnhYx~sn^A3Vf-Dp/NdD:d?q6մ5ve$~8hGdM&ʉY>V$Vy~įd´LGU!ojpR.#} d|YDQYtf[+ؒ,**ł/7.n%TWn7 PK dPK# F bobthecow-psysh-a8aec1b/src/Command/ListCommand/FunctionEnumerator.phpUT3^VmO9b@Q8>SKK{_Hl֪^^BT7 Pxgϛ"+ q)_0mAl`$FN8y{r|r r 3Y|TlB@ 4dAJr%'Pdvq>/ӱfn淥fCT*ud(AG($\-Y|"z>T`*0vDU0rM* %QZI.f(m;uuȡ#JB9jf1`T< dޢLLu~~2CmzZY:(m :bnF]0{@3 ,+[yRGSX#dA?ur;4M+"h;CȩYÛ7lpi,1RrvC-]~#))6oM}LF'2<1$L:ثKGf852S?vO`d3iWt{3 1o)@apJ2Y-r{68ˠN'(&kWePkԣsD:b#Dƨ'VhP!@غwuեBkP'Z)֐Ab,&嚢m&xB ]r|IXw,w}Ճn 7V { fXlZQezWx/HvM`#8񬰮U47tݬpTol9i0TDV Eq#D~/,6;yVQ鞺d6QچU6\$7'*wp*]#adq240pӸ&ݏʌ:=l{W8~F$=JvˠAe2vD՛^5^7NdH]nIc7DIҠHOOg߯ο;\uDYim;7ߜ(i< >[~75< a3(cf+\0.Ȝ9?C4-OH5Bb~PK dPfC L bobthecow-psysh-a8aec1b/src/Command/ListCommand/GlobalVariableEnumerator.phpUT3^TN@}WLHIPH(Л(ME jT-XZkR;{q!w9{fv^*If; ȹ@i *s@!qQ:{{6KxOQ%NiB^ ͯ Lf x̕.JNhǝ.ZT^-53qc5-f涠jTS$ YHV-[UluJ}$51.2W#*%QZzF \-dUuN(LsvEe]fΝ fL_#ݢL/8==;jn3ř:#ZG؅Ҍ6uÀ >c.({=Iu2}6~=KE@Ixg2.PTpuFCVNPè00ϟg61Gy|^F0<)a Iς-G$r1poB-!ZrLfW]Ɇ,+یL(>hS3ãNƔ1]N2\R(msvWQӚ5Ծ, NN޼>]L[M<Ƿl؈۲̦4Ov^S'IYZ@DS5p~U:RǕ>eyn[,XOMvlۈsc7\^gtQ9e`\~Fe޲ώpyLn*m]Ϛl0 arϷQy[Nj-{n{^Nˠo/SM 7.iۑVK~PK dP6#rD bobthecow-psysh-a8aec1b/src/Command/ListCommand/MethodEnumerator.phpUT3^WS8~_0I crh掶 I{0^:cɄLزP8ߧo?$v_5 )XApV0M0M+ho*>өnGN"M!*D֦H0:{kg{DžȕJO4.TФ ;|)"z|29j}`QJB.H,,],6kt"ǽNO_Tz>?Q&:XY NP7 W5 q4!"w[&ɎЖ,GP**e|QN2TV?)٪MP#R)rrZLlܑhk?!l˺m$`鎹-fل|c|f<w)JiU\krE[LܲhpCҔfx!oTWQ"P)DoXFhkOp=nX l8 ivmU-M@;K60[egf_/W_FosUx>tu6ijoߴ(JP G[2QCG'[FL &%6gUZ,&NkQ5cS \/wL51zΈŤcbU $f1SLzmQrG⬡hxݕz~{XAiP/MxK4h-m>)PN65+IxEqb]]&IÔFȖTv6ZPl [Ν{#QJ2z/k͆OǧXT{NoǧNadv5'^ھPj_nM9-rDp ] WMq(뭨.Cl,Rk&T;>&S 6d % VFl Vz.8}3%Z!VGShIZR+d( }d{D}M;ghũ?~tY۹ }F 0=Q#Ƚs nz98-dsuĺ#oǤɸRO!l2ӣ0OQs!x|mڬF}ܟ]]sI tfܒA/,{f"- w#N!o $M9nN\F2ܹ͝Mll&2NLXk_A6 Yqp A *OfqG)'D;x:\i,I颕Vu@%CPEt]CFWt@l?A6[?zڞ\8*Go7jܩM=uX};V+P=W?:'7r;.n3Yq_aϣ?Cm83,{9I_X L}mx-$v9W36fEWLkazvysys8L})ٓi|g/tY97=էѿPK dPE4 bobthecow-psysh-a8aec1b/src/Command/ParseCommand.phpUT3^XmO8_1t e-e[ztFI;@I"]$j{Əgyq?qWEqw2 &b>.U^Ѕ{{{G.dJYl&EE$& + ,C<CH5aFcȟT)8r$<1P,)+A"ɳFsN 5)A%Y#dNX&xv jceFl,l ?oG4872_ؒ*OY lfINiό mvn֋$VKg H"npsZ !sC%Iכl Yu->09(*UfpM,3ȌBsp"_k>Tmtj$,FyH֊2T!k@,< vUf"|dC':^eP˜0C+r/U 3pxy  :t(zG4q{.#n ` ᰁyi Ob.YXU[.z.fuk;*].RkrĶŽ#6XMJáGЉelֵ{1Hcp8s}~Î6%qTǤ)5­;.'ڔ.+J m-ىT v楉+2bT^]=|%yt<"\N9_qV]N.K+WܲT5Nyr:]&{K 4v|@_dъ?C,RV 2 $7wTRC2_d*+@ fWVUnsDY[ w?m[(.<<Ԛi$j.FFLjvMY&S!.F#XH4M\.%W].r3jn7RTcJ} g&^Vc%]kN]Q镪,ʹL=E BWhoW @]zv:kF2F]ܠ}۴ܦF|}-)im_ݳ0vZEJG<]n80; WBBwbq!7sw|yZ( Shka/ P‡S:cdKV0HQm=p+%H_ `_*l*kw:P4*_: ncdL_"3% MMl:]^*?=Zį]SMYeF Lzڪ6.d"8PK dPyE9 bobthecow-psysh-a8aec1b/src/Command/PsyVersionCommand.phpUT3^SMo1W!Rv\U)j*HA\(w6kk[ۨg]B#80|y߼ub10 (z,2TK6IZ?z曀tRӑ|eT*^|qr?H\Z۟T+/ qޣV~'`:Ll^(7MmQ"K9ΝAQfd<ݢ +x , u?PK dP'JpR R)9 bobthecow-psysh-a8aec1b/src/Command/ReflectingCommand.phpUT3^Zs_1cсJU"E>cK%Z y%;BJ="t>_]tt5u5k=r !#McI99bpH/!N~]+ ɻ(&r< CE8X,%'a1.@G =mԾGӋ1R%dC!`HM TQ{  ZXSXQV+vg#YF&DÄHd08G6O8ӏu`Ŷ\qvf &k'l☾TPQHcl] tO<Aq 'ʆ5+ 7 :/cƑ^YK#Z _d~V<ԟ> /.g黫_.67ߵ xB,Rww]v~ۮV綑9<Ͷ}ڳFÂ9ox$Y<xw.Mi@_ǑT"m"ArIFEdJմҒ:?W#ICuX|1S0]/>\&IJ0+emqsxx #%㊙O<yw$13w̯7 f'~ I3&isYz+=br47Ad,#Vy8U,@=l5c1~wl:8dG:&.s'> {K&T\ddoI'cb;Br*R1#|+] 6>HpQ=rpca'tXf<_~:3M.ɧtd|'o6='invԽHwV?'9>)/E- h*?me ֎N9 ?[elNPz+%|dJTf9ZiDEe \ҙd^ltEܢ[H2n^: ȟGНVl12}4p/L|fs *S@E!k֏Bt^xK|ǶBrPUts` ߗeH=PbɁ, ȋz*AzdG@dЍct$Snn9.^Faa>麃:=Ѭ:7rE U'SGTG{;9Hk,a&IsvPV`* ,b s3}7Hmh;$P 0i#A=2^]'dr:ݎg=򢛏EE뺕k%>jB;B<" '"u=$0,*^C_!>0 )':jZ7)e XG+PB=u j&iJ;2N%`ָDivm0cn38e0CY.]qS͕~K\]fKUUq]fW*ak%X+] [{2X aRʵ8 6zL`Oh8`|RHGO)uJٲNaS}~>1+ݕCtτжk!Y?U8/kj0#㠒7~kB_)BQ%*qm68Qa~VUba"2c?xNdSXɑG0b"b;]W=8'-aP]vWi6Wy4 ̈́+Ͷ* 䘋 d_,|z_5hN r4eo:+Gnn*7^=Mw2xGqF)k-AxZhbqt&)ꬱKn^ 4X2̪H=* 4ϗՆ,p.Ws:_>Qxmlʂ>r3%@C2{C^__b)|tnKԄH5ӵ#d<^֤*m "ѪF>fJiZ]jXt.ys3 -͒Iv{?߅|S+'$ga b`>ab) <˂oar>D>sp푳K`wP$LcE#!GNX9O+;tD>,'i  4)b.^z &Ϥ2x&MTA $^+wY@j. }fJ0m?H?Gk̕aJ&Ǹ'r w@@87$ A^ pa28X,6ݒPҞ$X%p>Bt~?:AOl;<>3BeO@xﺡ lE1s+c鑺/aP`.]ө8N]aJ y؉yx g,Y̅ePHb 9_ L] >ㄉK9J VgKm hV<_}=G~}fLY;mS܋V#߽>HڒQv&aebenursU(@`K3#HsB߫Xh%*smm݆!`gU%`'ia\2.yGݱCGӳt>ϝңpkedEq;KQYJ:((-.0 $ ! VۺcA.=WbҎ FepziI6 ļ"!*p>G;Np]M,}|-@Of]O*Gfx׉Rd+iI G̏r[pb:KJVLڣDz1v+I݇ίO^]szs`ش>HXFYoGBKCפ`Sme@j4LKn,w椖~(^mfNqPSX+ϊ}$j\q9'|_puRh/Wl gJ5qmd14uę"F73GhVFi6_k*V8RR|_[KCR߸\=Нx.Dm}р,AV$;k:d[iDV'<ɚf*UU#D$y52ʋGe]fFJ\c粢ټ96ip kf-S.(hZ$հY{lϖ* a="B2PܶTF+*CY)]Zfm./!t<9/Z,kbt f+.(UzmO&GB CN˓?LwGYIr RPK dP9y3 bobthecow-psysh-a8aec1b/src/Command/SudoCommand.phpUT3^W[o6~ׯ8 H.l'ͣRХ^) F-b2)T9%.}l~HMޕyEGo"x_ra`! _2mA-`np! q%iNߞ OOX!VLzJ9,Tk-&3(DʥA rYʂ3ܻ}<]Hs3 c,A)QN989yE)njeQTy^Ι6\^9Nwsͭ]ϵW70:꿔eeJjťjmYj^o9 !y!Tr? #PܬW %],hߤQ%&$TmIa#YQ1]]^p.1B.LF܉B5hNHN}Z >-~DO=6vvSv1~2ZLO~󨖭CO1&=j8wܵx|A {6(r?pS 2i[^ܮ`7tC-pʲ7PB[ X)lWK:xɔw㩓n8; 4=36[mxrF"vWې&avx<%0j,IJarYZ^2õVz p,56W3iM}Xh[8cz8CUM(ϨhQ:Y8R*<}Ӕ#47Aaq`V46_9a}A!R, ?d&y=ASn541mNl8]r~t؈`xY{%$^q˔3|N $]Q| j4a'鱹V &c=:]{*cY_?p5/ w?!4|86o OQ[DR:Ow$Jׂw!^!QW}O"lRu7=!<㍻=ܤ6}0tto_wqO:AZΌM'>\l2qID!P/g^ef;f#AL̞9-X[iBFAqW?S=XIX2~tn!  x$,@-(K_3 W"UץG#>''OѿPK dP6^T6 bobthecow-psysh-a8aec1b/src/Command/ThrowUpCommand.phpUT3^XKSHW4)WIN7^ -"=4"kT3#owȖ`[~C9)h}DY\~8#\Odo# Q%ivŸu3䚊"jn"aT958EJeaQC1f*E\ <{R.? .$qYXȔuF=VNfVW&(dNb*m)Ϳh[vEjNʡ0VKd=1u烗Oڟ~yoaxZK44)t lZT䂬07M׉ѫn tn6D^'ٕ"Շrp,\^RYRBo`As^CLbܫ,Ra"ul:gRjs9Y;dsU9b_ .?(Ydi ~ꊫ٪(ͅ\PC N^M.-Ҩ'$tJa>f[z?>b"rN_аݸO1TK:Tp!DK v09_3ǩ@ˌ޳Zki@yו|did*E8(4BJ̊(ۉs!WLk Ocl 2rwvF0 x?IN\7qedQ1ZJM%9>H'7tQE{'WïW'=ͺp]a*؊k[kMb Iպ3Ɋ{bGľ% žTA&G(]L=:AnClҕ):Y;pS7(wD$?ggr݂" ƚ\yX`/‰Y`Eq o%XɋDy:LqeH:{4`[quԜ\xIt*|h1tNb5 Y<}X[# ,B6wU3f nM $7 Z2mYb-ޙ,% =تNݦ-݄$%\7"ݘ4X"~kX=I\;yya-<;s/7.˛Mle@%|`SuL88 F@5:A2Sطoh C~^b-  X:8h>wcW D2|}Z4 5 F*h .lߖUs:p7!/5L i F[l"YȚov"Kgm8l2x}e!IKJRLg][wm@T.ل3۴$cdX6|J8b;r2WMmvMq="\&ԉ. 2>F +;0Fx4xIo4B6|-~S}tEx\g<[EZ+챶Ggufst9lƚfŖ#˗ U0mrRKFPK dPT5 bobthecow-psysh-a8aec1b/src/Command/TimeitCommand.phpUT3^Xs8pcvZzM暴P:-$7a:ow%mM߮V櫼YI2 s-S vez%$HFvz|r;=>=fʌg̮[I"\,ỲltʭTYM;81(2ǮewܰX弰"fwҮ`L5БE@#VSar`Jxjj_qm]ÍWZX2vmA1#gʟTH[ B|X<"9կxk|N*#ʀ~eF% sgc3EUQLH1KAĽYlo}o1x"Peٻ7;c!2)yR_?)Vk б?q0H|ۊGHTC0`!m"<9*,O:Ԓ\o f,:bm:ch/!sڢ݂N\")5dZXE~qx9"Th!-EM X>QL E"nhKٛ8 s&cG&aV{m{ǾBUc٣tɽՌ6ÝXyC~%ZYaۤ." :Zyç71^0Y)2(;X40Ȋ4 p)TM_e!Np6Hp:ݽ*. EpXXa^Dw~륉N\i'qg"qzzq0%'%j)C'YZp`:\NIÓxc֎e([jf4ݰ~v.k4{VJL&4&Ka'N[]= ]i<~E`7 IZE[丶;UV#pۃtm #|S p:ޤ]`f!4pUՖjģ7w<)@myW\3vC7 ™n1F|<ԩDsFC*`Ɍk׷HC݈L;)xUΙ;T|/[Z9 tK}zg\v+WbSaW*&48:UP z^Iz'am`KGI4 bHQG#`I€*-N Q@T$8Hxn7.4:dmR~n5Ke=g9?g~m1_ׇ2;UK#r0RYw" "xx1E|mRqIﲻVhf59< OidΜG_T6Z}wDRgs +-&12%ɢ3 DBGa7Trt2V>gSl(Ⱥ&6֏@jiBCQ&yR tuNiF*ۅ9Fr5U ^ @oH@D4 _[HlZ~;h(X5MQȰVePK7m3 TtIp1PxdTpǀGJ 48Z8VN_' Ps<ɏwjh?6wgXz BS ,Զ  M#z#A~`B/ X-UJF@XUKuh8o5@"2a[LF×p〛WLӷ`"A"WZ݁,Pv cu]_r&f4Pljﱡ`O?PK dP2 bobthecow-psysh-a8aec1b/src/Command/TimeitCommand/UT3^PK dPu\C bobthecow-psysh-a8aec1b/src/Command/TimeitCommand/TimeitVisitor.phpUT3^W]SF}LlK& I05"4+Oサk[eAVw9h<[~ :2E)\%\%dV87GãC0V*HfB L48˗Z'@*cT"igLu!OQ\]tl",,4Vqaq izB1R rVK\"?^Y*.>ihP1Y>4G*M"SI%S+lԸά(m~G[hudEi3}: dz_DZ`٤}GSPw@0 a 61>b/9F''x&m'}>Nqx9Ǹ:A- _ouu}XOo \=XWhF|Gw9S|j$:3ٕzLly/hww҇3݉%)X.|`x A {, ]|ev\ǨwWפU_0[}4ْN onwl<>$9 \+KTd$*ib) !I4(+*{$Kh|;BQiN8"d%܀yZ=t!+-|gYEO.n܅zWL Wݝ:ԟUr!K9x&̿ȯ^r1g!2/1V2Հ)\~S\/`d$>db`B$4ɟHHWq~ÜwJF:s-V|ސKtE0t|1):Aw8! ( %wO)9P<@`l."!kHPf,TA ^V#{Ԏ'㑧x*Uc)>*MPMӽ䁈K3]m@E6gdN``]] "-KIdM!St5_e-1KƳnW-"e_eŁ5LmސA1~g +{Ǵl3(o,X֠:qQ9鏚.ajϗ2bE ۇA,h;=p$lV3:[w?|>#zetthz8m(Tĉtwu'س6i!{7uPM@s $;tbHca$TtZ.E*:{`$GGNJeuB0+ͩJGL |( *[;}dVre l~)VL?jig+>5q<` ?FZ:55%.`6#dHאK,᎟Ð2r A8y_僞zca Fa,B5R~k :*2WAeHHDP[P* 𹊼`^] טTl`(UhpF͟G<5IJ juy ooaim?J ])a9MnݎOoN%\%_mԇJvF6U9ۓ/PK dP΅b2 bobthecow-psysh-a8aec1b/src/Command/WtfCommand.phpUT3^Wn8}WL,$vd\Ǯu/\hҽ .Fl%8A7CbJv-P"9sxFF:sޱpf"SwF4|5\WygS=q] q A= Z+ <KT$Dw )F7fln2hUZ"!dR v+†5JLsP4R 8$Tf'] 䲚>,W,VT\e rBvD)7VSrƴTgc)"/HP*Ot\QJd :[\͹ƠǕE*ѓLcJIk˹yg"U4sT1喍 $aV{wLh@RU|`A#a) ?5Li™k +b\Pm7 Vf8B1Yb|=P|Ȉ~E@_Yң;D昛Q 1J [WZ1zgo4bemCǚH9e<4cPoC_-nW mKw#ySc8R$'y@8!٧j>AI:0IE,2v,ڝݷOgWRPC$$ (Vw2%3o`0p/'hDH\AoitiOik^<m aX|Si!! ZKLTLN*|0a43%MBn۟.Z%n^%[O)cf!h5 8J %,2Ţ;g< *ae#n=C,0/ϫ[ [f0+b繽rtӮP[}߂Z qCH 1ϝZa<eе>[UF7ǝaۚt`1#X\.㿠˄(w g'Da &gg7UԎ{[e͓iݚn3i@ë,5431U!E㢶 uAOߟvn6OkmxqKNh)3hd!~KyU[ZV}n3olGܦ+yͲL,ͥf߬ YpZg?PK dP\5$Ƚ1+ bobthecow-psysh-a8aec1b/src/ConfigPaths.phpUT3^Y[SF~8!16KgiB d` AYK+k,ivW8_ ndZ?Y=ϯc?/z>B';fRCZσ`$De9x;/w}o-XFK(^I15Ѕ@82 y W wc!ys[ţH3[_9qQ..r'l7}тbR<N-QrV V45c(Tp";f>(*gՒhUkhx,tr8xiyzƦƢ&6BBd&Vs` oUob;)TGx`;+M K}pEu =Đ፲[PSTB;w+X٢HN2<|[2syo85 1PqF dŤd̀aU),8hP2Zx]⦊؅sH2b6iX(Q]z3/1Kh⺬,Ihf",s9-֖S,2r)ϲ_DW ?!R>Qr] 2˞"7 K=/9+Xt][zdoFԹ@&&XhMU1Jtp<|GO+/S:;z4X9 pi]՗] }-uT7*kv2Ca&nX͢D7rJ-MIB|qѭzՑD%cg0 v5em.xPbB 6hT% wgԯc45C=8LQśvI[6nH;rΘsK֢(pq \.~B.E[kfH;E+DlfH,8L5Q%mѩ8>0_&?RYCjYuE6tI hjVWlG.8i̵5_N?L0sh54&aU(ٸRxҸ$%ReDrOܵgGg㓃ˋ)8>=~zo ]&gHy{&uj<@jO4 y*_x:-Zn3[RМ[XOë?O?m}?"2T:W!to ,fnlܢĜ2s^uV32;YGCJ]fJQZŦGwR..HL_7wn☄*ًOcEBؠRh6 xs~xC.iVw rMR)>sqӝ$fvEQ@-^zaDWr54YH3MnD],-߱7*`dH_TK/&j؋ۜv~"w7Ͷ+˴Z g/3{hQ?-a>UV:ȮPjrCm:#=[WGl:j=A4xpj|O onz9TEoe%OTP`:{M2d5-mՊ`v@&%{E=oxm]o{PK dP0g)- bobthecow-psysh-a8aec1b/src/Configuration.phpUT3^=ks6W [Jޒegr*Md|籽~$OYI\K~u7@<=<$hݍ~|-_ 'v=K 6I(/Y6aŚ]|>"X?f/yrUQ&){ Q*rV8s6Ζ:ͲEyQx^:_U)w[zwf @ u`Uf (?Z-P(ݻ㻃s|^^d{s~yx|$D8TS( %aDs*k>9><8>C'j[R+ޡ/<:7'L~_W /-UٳwU9i(,< .]UwUyWS5eN&k $[fA\ ,X,ϞHdqm/nVi!̃WZ)/_p8oT]e4)oL/O@6(7I2ΝP ^(AAe.f;c1 )kS#&<Adx)(E-+fjhxl lCKt P9p'm\*@+aV)JKwJ%x,nC[0b>3-,x9!;){KI!@ˤqDa PyaOYM2U$-  24Er qySOJ'NK]d#Bwn%qa#}kU8V$XwV!kNɟ};Jz%~Ŷ%tF{C(>'ƴ]ÐXf~Մm6 5>*2Bqe`e&oJy/aMյ m3WqnJW>bU߉NOl?Nw'kWkGX,vreʶI7Vu6:*Q]\t]*o&o>H*O݀Ie vHW) 7ki-Aҫ/ YJ[RI A(h7:4i5džt:;͢BP/uGF6tYCAUj:RQr͵v&6z(BTVy.>?ͶJ+R` 2eÝ?FoK{%p)j4s ~[h+-4ƌ;;h%؊ p"ͪ h[ R\4cEȤ8ꂭ = ## $d-l/_K{rW( (BgڧxӃeQ!I Eѹ'%$`xz7vvzl( {kDqG uv_YO<ysAn },"Gy @nw6#]4lx(|F ܂I.'4Ę(3O8x||uSAemU<YF#+P*==m,g@ W ɱ&n4XpM渂Nj }D ڡ{Lٝ6$&er<]1+?I>b"C|xjF_vE3!7a ˮ˹F sJ/AtU5 ̓UzЧ``茜L{1s1mw͌k[K-tQK t޸a䒱yy hz7 z\뫷*gc)6:%hUY@K'hWgoÃX>uM&"b}FæMF Р'>/ވI VҚ[~1_gՌ>#j#AiC}0NqNEU-DdP1č>;؇SzԅBW+Nv_@76CK\HYO+BE F;?ʙڴO~ZϫT7V_ ԋ]Tu_-]"(՞NoJS>R2ҝZ;}>(;ALG7 YkR .Ё0}U<(rQRJԢ:N&`ɘ1dRo>S)ȸXZ|Z*zD ª(^fSxF(2(=Xk"8ts.e_ #Ff p ؉P\|YGzJoZm h־`}GD H8[ fÅ0١&zqZ=ߨ+nƸIAeQ5a}5\oÕC!8$!>1^,23XSG?azb-%9l9Q>E,2l XKuLp&Ik ʀIxN~>JZ 20:`dE] Hۭzܸ8!vvffp#--(n/rV8P!(Bf#GIܯb4Ԋ7jBBǗôgTwo-&Np|}] ]nqQpmއ-v:41B8q-^K+Dw9 4HLHk i)ѐY̶$5ōj58&:wd-Tg͆[pIq7 D1ʴ? 53F]4[1mLv-_zsZxF워RH@I=s淫1p3_lu=-u[y<2jW ډ_H}{0~hGLJ`7NK jZ@I.7[ȃA}g߇E8'`ujsVQ5;LՔu߃e۪(".e}6z{8h06LUS_!ھ7,@X ]5_Ï4YQ>)K yĹ4AUoN"ˌ9~>(xzU9B) k V_Uv3E/+M`9Pڶ_m/ ݻ;&Qc MپNMyB#`U51k*sE JAcD/46aj,tQk#A"Y*mw{ta^ [Ra3i{ ZC늼+GtpgF)N'M1ұtBۢM|0?PJGS)-G^Hc~w"/pؿ }}JOW:vW j_YB6*Ү3/oN1Ia?A>eL'kA;! B#q8sI`w¼Gd0BcQ]PQ4aJY)3 )[HS @|!"@JATdãi 0sNveq{Rʙ -c/55MXlYq㺼,$0\Q__͛|ϴ*_-զӢיmTyn_I,yfLҺf1[cavث.pSf G="[mcB2 :آ MEfQўeVk%~0_P~P-ZB-/ }4Dm,,VYtQp5~: vVf8)TB|G3(Jf.%r^rRA`ڶ5mĦZTnQY63eFʮѣmF "6Cg8*Ї6o R*mpA{AaG7s~fJV;nZ`JMiW6Ȕ>dA]iWߝ ݆=Jm…o3jPNg4kvkmhˬk4k% ,],{ykUıT0(D}Ԫsm:0Ufؙ;X$v~F:6/tGKA!waGak :""utO 0D &=f\cJWG'l#pBܸtSȩ4@ABz+J"! =8̀$GJꯄ2UAvUwRuS'ɠ bɟb- Xqc9O0{SLD9,RdkMα_\!@*rBW>۾,\6ҙ6soĄɎmp,APgZ \sVJlY6G'R-="#kfHbqެ0CFxn K~*Nl湊:Tg5RwQ?U*A1a5 ڶcBj}Sz$[4!Ani;VZ:7*FiYl+x_ C 1ffd|MTڃDP!^~rN+NRâ'+(2D1fEH}C O0!M*hU'7ZYK3։Q7]{0ڝ -ފ:2F:$]YbI+0:^=%u*x/ܘ$&\&CZi DЖdי|Q jH)=;[W:ԙV^>H埌'i+2+2s9W5)ެѦet,7jk:j(ʩJcI 7x6pMVL580uo$$iN wTyHrF!A׮jbP-kB#]O#OzӫQ0IRmΧQSbFZAS ]ыGƑH\ё~85(/]jUXLpI7LE'6"Nsgr-)/wŝG'Sh!!I ژiUQ ]񅽴@wؕhAqV){![ƁsՅ6bǮ>Ô!}KyCLfVJ:!N wXҰfEacλSc:?ך,٬{hk4`\n.lNrS302`]h0nD!_{ɑfXx;[9;뱋0F!Y*mgIA)`ycy叆])nPL>Lms .T[rA6,Օdn e| JT>y ([ǧ`yT9{2 q1M@$xQ,< Fi&bfr }&)]hU\ʢ ޢErHd܊Ug-ږr|w֯+j{'{xRL@Њ,N?uXq}J:a03!\ |[ j]f9w)7{r/_LBQzy TT"BW+ӓӸE%5b*C ^ ;Qg UfHYBmzGRcD8&Ǭ rBۉޘ39XhGǪsnR܆8,H*ں=;`^uZډ x42?{l VN8:Txr8l]Z<<; b9F94a%LR~(]]qus]! &R)l!"j2#z53Sl-I5kPn^W{$G ]&4.+ZS7;M{H|>kcl$N>%FiS9S5LG L]@*Q~ʚ?!,4mdxdN9[ 64b?Fjfڒ㝌n38'k `t 6wlkdd4۲!3I7δpᰝ_ިJa; ],NSx:FCY U#,XT ՙ$+ϕ$UHU]h!Ib$Un>qBq4;MU ^l߬"eڞFWiзLDDP2JN &Roj?UE(Jl}}r-Uٮ'*w#Vd c5sW#GUُQJ=u Uʝ!e!-fQe\DҰkѷFo13OB0kVTPHs?>GLtR)n+yTv* yWAuIwlo+Uc?՟RvCSv NؘBXZݪݙlvz1ޘ1zX jph\z=)ʡW 7.և#k78z\Ph2,2K(#p)*X߮6J{#l!Y_lS8@ۦ.6/.N̥*t9O*V0"~x LIeJ=B9 c4fw%A?RU_aЯ*@逑iN$j698ouu(s-)*Kvn_QX^Z!v~Jʷ{=8x|pemZo.zw~vWA#-<V. P o1E'N:N'c̸ۃR:^w$e -w99WE/6ߎ[ u,ytOAZ_єR=I箢AwW}mTyl!j77!H|2źƾ1X"*qUCyk4ߠwṈNk_7 9MȪܖ6i&sڡnA.5>YZ)FFB9yQS \ ]|yqBN$'pv[fwJ}g)nRwu}tr֣"ϳ8MuKE:G&MSYBTi>I)B )tlWcZN7Dȡ#흜HOtӦfx0C@QVչ*%舏wI~*Z嚸5{g_Y -.PK dP-3 bobthecow-psysh-a8aec1b/src/ConsoleColorFactory.phpUT3^}RMO1W̡Z65Z)ZR$zDwvmᵭMU- 9Tw~`@ֈ! ppkȹ3TBjqa\-᪤l=|Wr!sCܳM=8'QC =DG(gOvoJdv)ݖL=l6r#VS(Iz&;/kܺ&2aPK dPW' bobthecow-psysh-a8aec1b/src/Context.phpUT3^Ymo6_qZܤti]סȆe>4AKtE Jb#nn!UM^{x<~~ 7P(Xad -\ 5uLD.`q `}p2ix` t*V<,9* 8y2Hsa#H9?;1KmT1͕1ҔK ,lq8QR)Y*q48J7I.lu^Xk&_'&F| .i%×rْ$e*\1gv7G"0 BSfp?1 [\xl>.b +8[xtI I 2}t.{EjKLzЭu&}:s&}7U_}FpLa/S3VNlLdh] ؕ*d?;G."Dvz=@/x~a<( "xf1R4> uK`e&ոεu`>a100g'<r⎬*x#\xtߏ5vH^0w?.$J˰ o1\&(^6qD.Ћs1s8aP MbzF݈Uq1ܲ3ڪZ ĩI8\{4mDZ6NҖwqB4g96HQJ0hzǡ), 1X˓zNǗ%)C9ـ2yH0)ȏuĈ{ DTkc-ig@vr 3=%U`p !a?vj!ٖ)u~ uoSF(ꘙ^mUqX{D?a6dcSIt: ` { 렛mgE^΋oR^:z\m:+NNNFC5f.gK8x-8t]C]UOٽtu{&ihOm{}ne2S~/:ݛ&I]mf7tb($Q[_1/+Q)b5>r݋'5S]Cp2\.4^w^Pu;}\#)};GV*o7$q&_ P9SUm|u6[Q4PK dPaK7, bobthecow-psysh-a8aec1b/src/ContextAware.phpUT3^]QJ1)  *""H&Mĵ$nU%d3sq^L #hG׉!D{ZL 51SX.ΗrNrEh`bO2ЀwBhc4Np}wvSa#Nn[s2(B sz-E*u |=T0V0`5O pYUcu$R<:PGB6Xg,$|N1X(be19% $:9H u>ȩ9ʙ(jQXk8dyȾ)B}ӕT_PK dP& bobthecow-psysh-a8aec1b/src/Exception/UT3^PK dP;&[8 bobthecow-psysh-a8aec1b/src/Exception/BreakException.phpUT3^}Sn0 }W!C.p,.݆m>heْ!I">v4yx!}Q4E0,M RyߴEy~)!!j0^L' |U(ۆ|v8CXVyڕ[oV)F%`19*[y?}ZTM3ŰQ!&SEF)b 9" Rɥп?j,Cf)THAr06x37ȕ@XjGE>5z 2d2C{X[\'̌]MxpIsfͿfmNX>L@İW~+s&QPO1YJj֠ӡU=md,+(}̑+a.\lߵtPK dPtOeF~= bobthecow-psysh-a8aec1b/src/Exception/DeprecatedException.phpUT3^mAK1Eu "ZQ4;klHfmߝ\ޛ%%c >0NcqsTב=F8kOETGijk31)1w6~ R`٧>x|Z-=8lE_O6^*Z)[֢+dcLK"*rk9զ=n8ed(R @kp ^(~?|iO|TsU)u17PK dPŠm 8 bobthecow-psysh-a8aec1b/src/Exception/ErrorException.phpUT3^Vs8~b2NB&%C09#{$9l Al2])[ei NaDqBfKH#-W4IQDI9azWgW 3E5a甃\Q$0Ͷ<^$$)SBP{1h?ʔ#WD†XBxKM,WxTE"Ђ*#k*2H?4SH5H<] @Vem@ARѢ !L+.}-L5:LPw pe<~$BIMTS Cȏ5@%T,hDDz]@)fV!zHy,NA?C,Y:($f{L vcAL>ZfNlVipL0es-pZ5k8oCo(C*

Mx[PK dP pa33 bobthecow-psysh-a8aec1b/src/Exception/Exception.phpUT3^]OK1sܖ{"i=zni"~w'۵!yywub90wJG-v.YUE=juY]TjO)DeL{!J6i uWj2'Fe&QQ?{~ۼ6jĉ#Q!zOUa`5!B7aip'7mRmȓdU |~ Mԫ؅FVfOhQ]bґ;2G1Fm)QD1c/q;Gc] ~էx=Y2vi8b޷g̿$x}ma GI=Nq_ @#\׼o^ϼ]2Cm|@WMI"@X7EcĖC&_`9%f|Mq<YZYGO'qvB=IU/2;7ꢎ, ? iKEo-C}}AJbH@f,|I\U A>U ^)Ulp:)i :L)"oIǦۗЪ pȝw(]j+oRbEiQ?SJu` 6 ?`뵓%9n;JX;Г#Y<2!J΢~G਍<Gq#kŞXH4bBp'~Q;NdUAG9BD0ޣIvr[jzQ%0&׹*,:GENjCYy;( SݢxǼz6<>f>uq/vybd>Ь[+g3wj|ۣx^j/y~/ly!t}w|~Sؠ#f>a929n|tuZy:&c6LCµQ|i &&U1P0+PD>cnR* l XjzŊ(AZcx0s5GUJ DÁ(&@Ss\dIdC-,$gE-dM؂4#_GpChB.& jzkԽݫ>Wh^do Rʯ}UE LDkg tQߪ.8U(VD?+T6j͕Xj6_>7^˳5Vѱ7M2$lR%:Ζ0oSkC׳h ĩ<.tj$bӘQD\?; āX0]5K8`tŚ]@mM"mp5%EF \Jʔ6i6_"Ea4J`$Ѱ=19V#KCW.e."e$[f]iBh՚V[4;O͠+jbw~wcmx.|Mڠ6⦦Oo.Du_y^@Wsŷ?2eCѤ1QɚbdaKPK dPʄ9SC bobthecow-psysh-a8aec1b/src/Exception/UnexpectedTargetException.phpUT3^}Rk0(&]|LP21oX B:%)[l'v3}{޻;*'b.`Pj)gx yǐ,˫e[ -|aV-mx ƀj܋ۊ@Vh+ز$ Aɹ}v~Zv{Ё~5U\a^! L.$'AKJB(#CGo_{{5g4ݎP:-L ,e4K[qLItM #R*yn;ZnI5]GE~lpˬ<#n݂W9-1jB܋fʬ#{YY9^o,^_PK dPpn 0 bobthecow-psysh-a8aec1b/src/ExecutionClosure.phpUT3^Un8}W̃ˁӤyLtQýHu>l F4)b(;Xx}\3s̙w﫲NFp%7Pp@TfxCO$ۋӋs>Ն`K K L xPY(a+9J -]e].ǖŽȹvܖtCPr:C y6IAS1:$W> '̜PFL0c`\ͅ2N˔4n/&$%{5`]YqV'65ieLx}V{q+hY@!vM`QSszc e2GԷ.-'z; hgLshFd5#h7kKo1K & N^(Pr v8!$ AaXJ%='94 &fHĹ[f`VڀUu44LKҼ@ \.ɯ#Q[&oi*00$F$JJi!) j}3df%$V;_% }4|Q7Kp"3qo /2ֻ}etV3_{kǍΆ^Y uAo)H=7崯_ެTmG|n bobthecow-psysh-a8aec1b/src/ExecutionLoop/AbstractListener.phpUT3^RMK1WC[{"+EzΚ@6 $[ zb˛Lrucl2b0WJ#PuG-< $j}A!T꼚VSxL!*q[Q"Ikmzi@+&ixT֌i}(\ng'Ja4*Dn(j $s cw'?Q촴KX<}I}[8| $S4AhB;:41ٖb7H*6VTjZψF$3(,2,^vg=5 R=3y􏆿]8 o#;PK dP_k<16 bobthecow-psysh-a8aec1b/src/ExecutionLoop/Listener.phpUT3^TMo@W̡Mڐ#E)(ܸqbkGBwޮC z͛nxјj騒 VXOeJ!$F#M^Ϧ)}KMjC>KfRTvg$tIJ*FxiZg۔(XU϶X>"I0GFL#5;֌lT1]m*)g2,`5ƨ8ېcy?4EOZȢ94IV3IJ{< ډ ?]=ĄvQITmHWZk6uK0Mz`1oZvR(T 1BߔBxԮMfMwO^"KI={%;د7PK dP$ | ; bobthecow-psysh-a8aec1b/src/ExecutionLoop/ProcessForker.phpUT3^Ymo_i(N.@qΩ%{@Vz.ջ>×վI",.9<3 l<~xkR&3aj.M"I1fE=}GO<}Zh#S=VmxꧼR93kEXe\ֆtTct 7Rc%cF]wq~zzrF:f rR\ #l+oVE lッo8VtTvtpPh7~R#nQ9pv&N ~]~ϰ8"كLY86"gHYb5 *]Z?ZmĘqXc%U$6E.Kr4+ b!4l Os.5B i{ǖEA S0H <60l%Z{k$ N< !E O[5m$Ya%ڪ+~e A bOrlTssd8Vm[y/JdԗRe6gHenJq򚭣ǖ~\\q\@ڲL5F }{eQ2ۢKlY$ނkT߃c!jXhIh ג6R2őpTI0o(Skzwk_ Ê\6~s49G<' Y3*Ҩ;"ghȘ jPP_̩5˸̣۫?._~z}7?՛o9:ǖ ] SՖ`SjF3<C#4uΰHQe"iag]s fL~ҞNE~ZDCe'֯[JI\^2s3llS3Ҽ->Q@8ƉD@AsgF"D aFBW$uH vnb("e ߢê U4UFE707.9b[[H-ʴlڄ|/Ŵы"\@媔ڕv E`O{c}ml B#Gtu';GpcoOS8p#@6;0pV$J_*RTP̢Y%_Sm\pp~q^wXQ-5t[%YZ1Q@n|ZsA wˁ.+K-tӏ{5*N-VmC63EN-loi~8DCY,YBXʆc 2QrF"gZ8F]D;,e`yNwOl6]c)/h`8:[B5:)RbXXo;5F /֣ƍo]|#[!U=] 6iVǬᛣag? Ȫj{xx蓟Z52ꮤ~walmuL#مt;2i1E|w J\qykTSػ۸}%v'!XJ2~Em]׼d)?o~ HRS_T^ )., o*;)N􈸏K۵HRѯs!߄y֌[aN|<7PK dPM`3 < bobthecow-psysh-a8aec1b/src/ExecutionLoop/RunkitReloader.phpUT3^VSH_Ke@\=Œ; ^d+5$3f&$1!ry t۷t:Ń3E a,70](:Gmrٽ?2{ YjE!̢$\) !@D~f>;Dl&(}; 2]+F z Jm oL̷H aK($,k4SNE$5ubET@3hEpYG9o!;ED9gf L,Wq_uM4MmF\?qR"gSӶuh~ >XP"d * bDBI&Jk}MX:y~\pZ{[Wq s]{ )ӱi@$v~| Ɨpb? @‡ǵڬN.u6kyzm-l=(ú0@.q7I@L˪ZߔPN}[BO4N2]i>`Qdw+snpƝ1T8_?'&%Unab$~w T`%Y 1l\61U6>F"*#X.u4%枫=},rfNl, ' 8N;PĽJz-.qWChQse iD_@bW:pV-f}u;^/{El<W昙yk[=u` j#/=#} vUz,K֖zF9Mμx4ywOi f:=fr"ٱhk_d}Pcf`{`LWUyfڰҠ g}ޏ=\]:6\'*| L30giz`B$(Fw>n뱳1 SkƔ~/5GSAyشuèeBs'JkZ]wSQ2rMm5먩B{c:7sOᄦS.0Nj@DZsH Bz"6$zA{+3[)H(0:uѮq#1ݴO#"oe$9WޏP ,N1~V) 0 uڞD; YeNnl[ݒSi GSWFWNõb xt( SZ:`YӜ-i_Wj91'7pb fxqr{z)#:Y&E}3s1[_/H RW]ؾ Uz*zEp]QGsdSft@nĶxîNŧcSȁـE;^w;4|FcJj㴡m_AU:)C8R5\;2u0H,LLKЯ K?ҡZdLHֺU VPK dP& bobthecow-psysh-a8aec1b/src/Formatter/UT3^PK dPQ &7 bobthecow-psysh-a8aec1b/src/Formatter/CodeFormatter.phpUT3^ZmsڸίvZR~LBRJ #l|kll'6I7nz XGy997~} o|cdm;_xk2 vdaHe>~|=+ B%kK]ErqnYGCLqnZıM ]{|KCs;w{6{c43P'А<ЀXvr{"vP5"n2d1ThtMPq!$7Q &QbeɍcA3mמ[ xK-QGνF'>ga; [5Ld/- ȔfOV?.49#cyݟmLf4 9===Oy6 Fs9rysjN{i)?=xܪb=.h<`n+ZfUFš4dU ƣPP ƣןmWWKBhu*hkc4OU __!:˖p*IBT ~0@~Pnl If%Kr<1Fy I) >:*Ss}8\qݝ S֟_9-gƤ?;u{e;vQG.fH>^mtX̪.t68\D4e^ {kQ_rP >oԃLg@Rz>yOaY HJIҬ#~o1'3|/_lehfG{g1)ce2Am]г<2 (ٙ;eҭܢkKtNPE :솆g#< DK`_F<цS,bN[H 2bv`zǯQxB&EػwǙK^'B֪k+K(qZG TM5 (L=|jҶD.~i*U^XP 49` S!`KzZ3I!E跥gRE JXuh^mQ1pӎޕB44Sy`R@ڣ8jZ V3}"[9yzȻezK9*1l* BhSrg37XsTڮqZ[IT`z:6T B[$o^,y`{ 0{Tv!` $pF 6Iq_f)j Jg.(gZi/"Uz.t$d W@qy*gMa,-f |=-viC "2ʇJ0d^zED࣢W a!bY'pB~CyVP!8 #k_ٕBP?DWʬe@m.`MtB8t@ $ղƪ!mr99P0~\K*#}S}/̕i܈sG9{ oZtQJZ[E58H M `=憴r1Kȹc QT"]Ғ;;ZBW7|v2M/!K)ڠ+n ]R笲1;r;rr͇[r>vd g5y\UD%qk9h"*EDC`W2'8BŠg2 :{{"A_+XV+Kz8^G%OҹA" c_: tsX!X`%{Hb8<$7 E yoeŽ'\Y.7k;S 7$Q A5xAr>y uF &(2ncI xq(6TsmmYYSW;VI5QtgŒbglEv-,⾘J@$=%(Ӟ橪xɌ4vNᕋ߾-;m%*)MNYzG1%{=o4rLdeRre׹2&db\~!1GuJQ'C}j,f &G#hH/@wNq*Nefy&;ZGJ+1 A5yz"/RO⸎PK dPhǂZ; bobthecow-psysh-a8aec1b/src/Formatter/DocblockFormatter.phpUT3^XYs6~ׯf!PGGm:6Sy8@V3]\$J&Ճ ۅN/M1͎Fp6$(p y.74^ N_LOORȔxkK%ys IeŎ7 Őe%$["ӜPd]J?y;J#7D=BK)i *GT)9RQDW$Ib4*[m}v/w$g՛|[2+& V(eH NM 2<4b_Nh-:`EF2l $,H8~xR'wk#|kL fy])-m>ᖿ"-݉ %[5ꚪS=e+x{:n.>a\L4Wr{qpz;%(U1NޥvY2ڹ{-'6ܓ*5s l{wfn ^ѣ V \c$XteJloIW(ůycjZF3Bqgg=qrU:[ze-z m-y5aeuXS!֢M P 2G02򧇤-M:aGS{D/rB*eWZihۡ1=FC/)a"1&b`R.YALsж*w=r(m=\5 $2 _^u uWP zzr}дz~1 [;N9Vy1L'ʁrwQD{3\V &FP~ `>]611@miBLKk_0Zs`gGBWw"W/XИ91|Q.Dj."X TU~п%<*s;S?'qnP& =ڜ66L+8͖+q5]?yL]u/a|9O e=2xe\HKc2?PK dP  3 bobthecow-psysh-a8aec1b/src/Formatter/Formatter.phpUT3^eAK1sԢmݫ՛dIHf.wvkۃ&o^MJ-f fj]yfs`cHFՉ>jyQWj ]aNZ uӐ݇e`;MHBhbn] g<̾i&c gWwLzV^.k C#B-2Ĕ/Ǧ{H@lDwc(e8fL@?Ignw~~~~`e!Och2t veHF-ꮾ>]dE {@uH߀ } ^wd; ܗa{}~ܼ6jCF 2AcE{ ,Q!j0,$'Y~;N"CES,OM$ķ,Gla!焙*8e >Aſ˕PK dP:F$< bobthecow-psysh-a8aec1b/src/Formatter/SignatureFormatter.phpUT3^Yo۶=sܴ[^hR-ӶVD*}w$%Q2-;k)~xw:9[e<X"N8ߌ LVo-ХZtXYeaE{"޴H0wavOɓb!g [s1U`2]s4;tO^Oߣ; UՂ_Vn'Nro $E fBƂqΓͨAtm\GXް(.߽Bdt`K>A;mM^0 OYea尰_*fYAp6/q0%(n 3 vCUNܻE[+JNyhU^ON6aQCEΪ і -ᏟpM0,fcW ^ZR4X\ أǁWXO}B|Cl&Ӊy4էd'zݸNq1=\\+s/ L%ŭj"͡@Z3*;j [*MeƎVpGK{?֩bp<|F_*u ٺC`tzX>vP"vQU;JOVvlMa"]%m5'+xjVq̌^@uҷ9v4oB i5:f*Nn;S(,h;2cs;"o4*fJ(s^'rŰCr3UݰJ |^>Wgz9 T$ 2Amn ٗ[%'4|^1$ױ{S])ml [ "ƣCMvauX9N>_4:g< ;1YK.LkjTj^~ ]yMH}!)SWBI7ug7,N,AgB`z*;W+3 q+v1t/cj t:zK>~$l ~ ˯nz`c[9H`_58ZwvV4ws{ƶ ۯ6s-zX>r~iN'R ֹcƍCGyY|PK dPRmV8 bobthecow-psysh-a8aec1b/src/Formatter/TraceFormatter.phpUT3^WO6Ń+h 헖tL63DڙЫv{4MZ4f$痓<{=C>}JӌD(1%%4DSLJGC*e 愕$P,KE!e59Q)g3Jp9 w}uqR2樄(X Q*H E#X*4UBETz̩ nGIQ1 iX^c\!n99[|sF'&yFWb/BXq@\'Cj4h6N-OpazH a/䃒bY%/$$Ks1+emJc8` 5y`#CA;xA-s IUMHАHd\ͧ{[!X @@k3&Do&-yk~l^ јC4z->jC^T+>toٟ8) "dVJkGAPUl0 nU.b0*KQ,4x3XrWlDbPy[64 14`Re#?~~;3/6Uuq-fz?\DY0 ܎ չ ~r9>zpi62 m7p@‡鸱k2i|xZ04!`2IcZ<Tr`r 3hb3v#"Pn8'mڷmU%fDd-a:zD4*%~aUσ!tta8l,aۜ!w-b~3nuѩn鸣C4uיpΠJH}W@AIP{@*SVΠqτ/ݚ2+qYwo.maW$ړھ)7iKţylD\JK.zL}v+yk})y; qqF{9ݾ6/rAΗ"/+zg8nM-*w&s0N`]88ttaS05sw-t8.[v0 /q=씛S@8DuNhOj ÃJ69پ:j%aj+K:81vzL=Ê(bDq j5,d[Hs7i7S/GMLA#҄SRd9wc e}QHc`Io^* k^sC)2EKu+Q~=kaSqR2tۡKD/>$)Phבલ440OUec% @j8xk FQ}C}ra 蚲&Aڠ:z%Q<2LjO:6Ug]#qE7- !{;pEcZS_ &Perb9dfqu9xIJ*XF}B>\J=}#T00Ѫleک;H#G'&i$<Ꞿ){] :QGG&5/d-gE={hcصQ=N}w~KwƿF`mPK dPnLa3 bobthecow-psysh-a8aec1b/src/Input/FilterOptions.phpUT3^W[s8~Wab;I}K%K[vҴl2aԖ]I0-}.vl 0ֹ~/9>!0 3RgA| nG8ӓ7ӓqxVNm.@%feB+§r,Q,=(RJpn].׷Cʤ`I$LTMJEd*A *RMN$ 8G(ySJ>|i#B~=ߢqSr2ܮYW<+rN\)+*f+l> # )QԔ'-zdXO.b +3 Y'rT)޲d{p-ta3J̾%,B!f9lHt."=kV! AKvg&!@l͂3,TC`wNxlH<6ԩ02zvz8wAC~vϫÇ῟G7ÿ{\)P90E3iwWd@>ZqpP%pA1: 4jl{66IBD BALP@WlU-ŋGiW{ jbg -+@AɠMFH|߆(n5q Q؄Na^6:H,ѿE >#[:ڏk}X䍆WX%)8#c\ڪe 3p)l_s9hpo [PJժ]Cmcm^kn\yVCh/eBm؃u5" s鳸GW`[e/]|ǥx寳ڧ'$ByٕЅ9W6W}c)%XhUP_٫1xg󔕠e&;Qr|)hB[?x8:Ow[w5{]xD:wOWkKW6U,04g_0uout#i@B,~G%;nEgd!c~9IQ,UeH})S">"_CΗC;e9A'MdOM/W"u?էXSghp,J;(坈^Aǒ)6'ٙ^@}J<ӝ 5;&l. F> 3Ra!#RCdN(j_$$M7V>tMKuPK dPE`jd5 ,0 bobthecow-psysh-a8aec1b/src/Input/ShellInput.phpUT3^Z{s۸_Q}'*%ٝN)q|wd4N]MB'#Hꝿ{w I/fQ$v-^,NgÞHisK?Ij.<WyAGcL`?fɏ2a霳i,U)E(Bb*FR 2>ܻ=ѽ9?={{qHtW,TDYCvsx*%BB:/ZpĿ:,=t2bJ:\p%^ͧP.@(1˷=%#bm AѿA0Id-duMR.BesaY&ѝr7)ze8 .#}qǸ4ZS,Im@ƒH(pș+-%\+JDIZ,[1nn34FU{zR}d<+>I,HeEdW>'\uNߜ3bA;#_7HG" 2qJ~K#C{?% C;b*,/C.1.vu%s.X&[G.2CK!d)Ԧ}-nM ̷4"LK,Q'l\ ˟3r#j t`FWj oz0`ASe8T:+_UJ]{cC;Ž?tϛzo%2X&F#.dtyx #FF@A=sϛ/c@tetazW?5|- ?An~?h&ᙛ ׻N}}7c6qƍ&&76U "F5-{mT"gE ]m6]FM5Xp?appWNŪ]~hLC^U' [XkmMp"6uۥSIxp+Et8TZ檆f h33X~L8?LjMaֲ|B?q[ɬ2 2:ꃚB?U"Us{J ZV(^ז$l*0;Y&ЪuyqB)C3 śRNkV<'5Xo #fM5.Vy=? y}]0f&<=<^u^ъBYA.>VڍJ+-}iHlaYyU3&y+w4Uj5 X@حX+VRw;D'/^kߌS歴L L'vY.8bgxbrcy_"E9XNS-aӹ U}7+c-9VUۡmYƴþs\ Hg͇M;LbYinMh-2A qm\PF[Ur/!:(Êְw>_ hٚ8spdB- ^f3Z1/9gp.4}q, t[V~S@?*pܲIPrЩ5 ?m*q6k;6ڲ 9ԳYs"ʰxg(Y64uMyGQ.'uiWk)t-O[#ӰV5Ik&9ʱ2KIsȓ|RaMOSn.bx AM2 &"^ Yy_qi<j(x:8h,x6cX¯ۘazOo~9pqk(6š&Z_e6=ďQh8<@tܺ[e֘mZBvTԄ`« {C)S(*Ԁ8E5< 6=mڹ*՝ުLo{-q|s0l~ 6aakXewءIA`Snyslxɿ*R)ma4)[E_;W릹c&%iR o//җ*xQ~|R=0lqi5 U>~ V~*UpyS1_S$tȻ(wS{?_ C:"8^>wfYx`FwrK8)5 #EE !Fz!(K1?䦑 ʖ!ǖئO;GS98U&bHPK dPr1 bobthecow-psysh-a8aec1b/src/Input/SilentInput.phpUT3^MkA +t1mR αƳw`Vhl^iv }\HO]UrZ^`<|;~6 z͚;X>zsbG,U1[ .{6t}tP Y$hbkAHX~<>Gl` S|OBMCz7 ޡ#r[ac;ز¦Lv7cR񒭌p#3N Zߧ"VIQv@<+OQ3WQPqMtk)~˙ZQ SZe!yYCʖ@dPK dPLR)4 bobthecow-psysh-a8aec1b/src/Output/PassthruPager.phpUT3^}Q_o0$ڊ6i!cs.%Ƕ3%B/Nοw}Af%`?IwwO#4ZaHA-v۷n—8̬AG ekA0FkZFK:Iƻ7,J4x77E!- N2AkEs [8QQ!XB6B89` =St)Df8tލk?-ΰ"iV}sg|gHSy_N=.G^V֔eOy3t}#MR?=ՙ<”6/]i ! gPK dPNL@ 6 bobthecow-psysh-a8aec1b/src/Output/ProcOutputPager.phpUT3^V]o8|$cS)Cq= FZYD%R 85vEٱ$'=.ggfIXf`09ȤT] @00ǴWN8_uR*j|\Vy.\eJ 1*K;TB8Ue%븯oL8X Ȼak2!VW&F(A9 (Ж {ʝmx,R(B藲:fr b39KX8n(ԛ:hWU. fzw 6jU%k0v#8]G XĂO ҋ- ZTsG<'a/P(EzqZdpSZB! #a@) ])gE.ثSSc F-@d94^8C.3$K ;qf+paP=T_u]֒P&i`kz,4l\[MW1>Eǯspe֢ j]f]s~:Kwt#Laɳ7ԼM$nkf6uܡi_M;EfEsQo=NBo,3rR sQوszo62nYK9Wt [;l[r!߿ &hÂ\G:"?i0w ]h ]"ma=FбA>Kio W xܴd^_FѝPK dPL/a2 bobthecow-psysh-a8aec1b/src/Output/ShellOutput.phpUT3^Y[S8~ϯvơPveY:N ,2;M'Ul%֖L;^:t92eluZR'~X(\ RG{/vvT+,yRK#kAK0O]$\XQ( g̾w eQK KQExhEV@U#8#ZɝNCPr0RN\9g1BS'7F!ED! ~AFTkqݓ|M28B$c n KžF,ԈQL+lN"nkDžg ^bn|zrFޯ^Ŋn-`mwтyh,П-s YTЅc\x#ȿ ʦOT9|5Dog㫿gK3{#.Xi0BwB hڃyݬO͟0;6 ,t&Nwrm o6ڗ7-T9eR~8V* ݏxAs!e4G:y :GN(V#B$C-Ed~_aMV"$?!C=A+*@ ";٨!7s ,tݶK ~$~1-`!~rsG(Ec0Sj̰KB?]+#zf8:blZ|$[Pj9ƨ~,m_4AgϐYHrV5qnGP"*t&c REkܴG,RtemUJPU1נ13s2zVAaYP#QXߔr)݌=0d\ՑeƑZ;%Wm =Tc_iAԇdfrf)s^OD!z-iU|Vi)z@\|Ƨ&.S~q"0Eb|d4_'XR>y;=O=ĨV]___M/n631ޙ8t>ܲGC4ȶL|(j9B.ECR.d /N?8bwv wf(4”L$ȞfN̹2*G)-Od9KpP;Q,-USS8[<~Sc&;!M͝baHaCߘvM;~ &~}q0jrsZ=K*&omv]lP|-w2(J魰``uo`ުVNo)XmM|zyF%Bp;P j Qތ^S3zBrcf(Rl=wY #.lFZR# JXtF}7d] ̫\mq5Q;.|>~6nyQf<|f'4C$ _ y5VU3T>F T>_`j hB&Lz.Y!B+.o]6.F:jɾ|7arA쿏ڒC>[G$-:Gn<2=L*kO-PK dPG& - bobthecow-psysh-a8aec1b/src/ParserFactory.phpUT3^UnF笠+E"""jmT Gkf1m! $aƐ[߹sι^-"~˘%)ZA,av!Gק2(.%"%+JO`EuW"m<>_5:u:M-:M;m-X4ʢR+ TPWܩ܌|DZ NF٥?̺pN_Tt򃁍 ]2w bˊM;fO$k/2TUCXWp.E'xs+b.L.oZĵ.<k,~?Oϓugr3 c 5㠵nxfF" pjv؆roK('NpaȩI7cl{֌wCk~4~3,ppgJ,jI.0r0F`0z\j2cJSϩa­f܎"Gsh{@GgRl-لoHҟ\c_ZŢw-*a. a#qfU_gB8X~q=[8ߌ|YC}1PUЄ-w%ջIjm?PK dP% bobthecow-psysh-a8aec1b/src/Readline/UT3^PK dPeaQ4 bobthecow-psysh-a8aec1b/src/Readline/GNUReadline.phpUT3^WmSF_L[6oNJ JMx9K'Yޝ츁]7:͇jiog_ [?<> 2 ]k{(BR #k8Y# ~\ RR8-õs W3B=}RU|Tp Gh,2܁0>AZFhrjlu&Ÿ|EϐC +Dq,x`bT?s%e>q F#A LPtn]e ?zJliMvftx3n`2YD%0TpEF|,?Wgh0|DFS+2H( SuJM}9M %AxS2¡f;0V\' Q㍘q'I (0D1I[馚}KU{a.M|T]&RATz/+acPq =tc$t&CtZq{ l`D6aǚgr6"Gɓ_ŤINNt!9Tz%{x41*@ޖ\De)zDV&>\)4 t.9n yPJ IZ?6~4xv |5ɕPG.lJ9˾Ǖ09USglUD*Nq|LOOU]Ii^!/T3/r{/q%>;z&7RC}6)dk NdNlsxutb.ȐV#T ᣕebS&L)N{D=_kJV5I*;]ڞsJtMlu\a*nCӻlW0פl- 5Wl/8Mhc/M/w{ )xxcPK dPA#n3 bobthecow-psysh-a8aec1b/src/Readline/HoaConsole.phpUT3^UQo0~ϯIH6#]7&VoBnbkƶluMPu[w}T92f`8|+-\%3ktq^qҀNmiw57 bԜ`3 sHZjvY "* "sbMP3q/xRy:6#@ʌ64 U#sPJ#&S;%)g(G$Fryrm޷or?iE8CB7)Qr2yLX9f'xwd1|05rr)ܙX ,[ sw?nZΕF7j9Z-'B$NN8WJjdk)RM)}zkicVQTBL Ơ_b jnpZA!_PHؿuJQ '7q# h#8YBt펯>\ Ax%xDF5LVPDC˸/\ $]W^N.}7Pìhqxjt}-2,!%wF^duܛ(p}|x/׏k,}J_\6ra*ש[͏?,}k/1(zxUXk/:Qnk6v&!W#5Yg믛ۥxo:$ehV^iNiPK dP>ñ# 0 bobthecow-psysh-a8aec1b/src/Readline/Libedit.phpUT3^VaOG_1 )_LiRUPR!U#g}r{X7w`ROH6ٙ7of/ʬloZ>gLY [(yއ [u.|rtr|rLV+M8U]\K>4S.gN)WBxet\ Sr]}ztή O (U[5Li|_ՙ&R tK"͕V/^㑷{]L?KJ!RRa!p\ع̗CTJx'YTұ/W`$GD.SHLT *R"hn K oLx=wˆ~<ϩ@4&p佗:ukGV!:Ȅ[X-ӛ681l ]Iv tIJ`;hms>45& "j#$$N2ŴeØ?qc<:N.nB >~W:V$P?e  /g j&s'(0Z\?jF|w _B]tۓ@?>6BD-V1͝==] fpjAd!A݉\kyb9 :9Q{rF3d<`:< -e6TGmnmYZ+PU/-!v/6tMsCK.`$w3^@mKh(uDۅ^wϵF7uM@RθO FLs'V.ZdRǥmH"sljGS3E,[lyoO/RrVcf6_Hf U(M4{ߛ̶l e󶒧/Onubq՝@{L<\GRsi't8v'_F&7qc8mB`wu5꒣NF[6T?7q4jl #V~W⋒]ŋ,JL:f*l>ܰy5Fcsp>cJZZ]c[GU|E7%pA|`ye ^PK>@u˄jO:)ssS00^kqЇ0[Lv^δ5_wU9( -E6zxFA6jͱcLtZ6.:,w;pX;UG0TֿPK dP0z1 bobthecow-psysh-a8aec1b/src/Readline/Readline.phpUT3^Mo0sa[Aw+ VEUH YgX85(]dT\"93̇o}U*8OhC o5!laݒ1fg˧rR•duhǐ7!M2[ַm5qv xC(gwwvu~} Nl1Bj"MTCc+_5ĊĨ 9*r(?F[z -V"qCp#~] cHVe0IW* V-з$k:# dTwH-?L>7p)>ꄣ/!lqu_n 2ɉpӖqϔ[%\;7b v!1spsNS'(NT)}\rw@̎D'=CM%s= sp]k>򹱵{omEsIE{/Ʊ{[ݕ GV6=֏\AXUghKQ4ױGM#C!>Rŋ=I _яH,?}$jǤa0E7\^me8)٬'0^sIHt㚂Gt3/:?PK dP' bobthecow-psysh-a8aec1b/src/Reflection/UT3^PK dPY6 LB bobthecow-psysh-a8aec1b/src/Reflection/ReflectionClassConstant.phpUT3^Xmo7 _Ymˀe隡->ԅ!rjc#{_.(BȇCR?i?Sx 8߂i *۔gEHj 󓣓g'X!5ʙD^) 6吔Y*Zܥ!-DY3\ p\_^"UM3 cǰ6jT#bN {=rn 'O23rAU9O7g,"c:"Ιfzcٷ7md$5PJ+2iNkD/+I<5ʅ1(z]'E9Y=Q+% AŜYs]%]FxA 3.#_$,yT`@s*uRJ4Q ‘?5t{?x $qdd͑ap!'A"օ+óc!Q>>&@:٣;n@A`6aZ/H(P5\Φ\x"~JC rt ZȨ̑Їq];9'q_W0 `R-1S* nZs[j DAF`uQE V๰:[AX1#cCB{3\5!a !"Y KQ B(21XM&?֨4|?LP]|- Gwa@+~+Dĭ\[f0aJ2#Dtwj)cL%\l6U\V+ 0(A=Bp| 48,9GY&F$14O\P}̠Ȗ,˰+DH (=`C5FBMlDfVπ_RjhmI]8Pj; C^L-^o("/ T]ZMPV۫h[. 8'OGtWZ*t~~R!|I􊭌v/h辋Ԯhe.UNš\"\od}^tIUy^s;|c?˦w$vu4 zͤ~y9B uҜÎxc5Į`-OOo7~G;X;>zo{/$y낖CVuЪvlT u5X]aZ sڍOa; 4}Nڇϭt#]ޫ!Sn5ٯm9zYj#XG8VoN2j^~XGx+T#f]}5m{mufőZnUhI:|ϋ[R5n ?Jw’C56&vҧ>8ÀL,G Ȱ5eu|Gd م{֯u׾^:]m<V9ŦV}=RYs^+VBeKL#׋IO_v`s6_6&N,ֶOc F@M{PK dPE(= bobthecow-psysh-a8aec1b/src/Reflection/ReflectionConstant.phpUT3^R[K+1~ϯԶ *G" KdIfOH3QQ<̗2ӳi ற jnu$5ܦGX5܈!>L'ӣd:.půڿB.Cj90}vh_}b_dBPs]~ϼYBP v:AeE+YjVSAPLz\dK:ymD?>$atJo˨ԄiݲHyOk'{%P>~uW¬sfgUɿzRœG!gO7--ُ^|ݚwƫK !H~09Um6K1|8_rQ.] gK'W{ PK dP!> bobthecow-psysh-a8aec1b/src/Reflection/ReflectionConstant_.phpUT3^WmS6_ܤ焆#eB8ҁ\Ql9V%$J~I@ef}vߓ0i4z ؇i,"5n&!.׆/GGGG4poń*B)i'dP>Ḍ\@QGF{p<S'gJK6O5O(:k48J 81 ENiDFTDsI|Aw47NQתH ?rQIJ Rx^1͉'9^"X' ϋR$&*OI0vkλ0 2,ǜyk c2_Y2_uYU)FEBl4$c]i̞d|$Q7BzL+<(8;fu/G:|t!;n|pٟLօh.N/֥prl`\_ [9u'Õ<|< ZDmousoؓ$|e;?UfZ\]1oJ2=q$r =-≗u t3<#ԲC6WT|UJ6|NDʔx#N%!݆' DI"6+*Иim,387ǹ[njJdntJPHmč&kٵ_Ti$vTM*3À;E{x1^Є^&nw*e$oXiGh@z vӌ:aK qHIE3M~ң 76{9%0gǦ)[[[3;`7M Q eS[BZmunAO!o07+ GdԆf'Znkc>IIdl8>w6{YVҸqY}m ٳYTv# ;Ko!\&U_Z. ;Ѿ)ȖFnUY͜6읞)s]-&V흔nv򏂺r-s/2xtpHj/ e7[pG-}hc]Ƞij^o-vٵYxvŏ)Q19Ŵ\rދbbL^ō0*ԺіDhv/sgX:_WP)24Zpv>2ncC׆Jf PK dP\ F bobthecow-psysh-a8aec1b/src/Reflection/ReflectionLanguageConstruct.phpUT3^Vn8}W$vIEMۗ:0hidIE}J@QȦrf8sf+hG9R.3mAѬ6C!$8ӓ/NONOX.=i-D.!|"d( yKf#2:{zW7Δc3fa $XVfUQ` MO?a*0v^P=3H=e!:6L. pv%y-bkJ`li^WE͟IvcŜ2{\N;s-f(<LάK?0`,e̋}^÷R6ox!_;LLd#r~e@oKRmy2Ռ3եeO.T*=y5?Ԅcw̛{ Tզ ^VR&Zp* IIRi͐YCFay \BAN&ܴlԢ-LH+OX1y/JvP7QD?7w:tCśJpþ[[ s1f2f2UF(jk2HDh(KlBJoM1W2f~vo: n5ZK.s4,]; Vn^UX2HqѡT# ^-*hoBfeaAQB ZjL)$9oWʙOC(S& ˼;iO%c aiލM'n, ,c7;k:*fu,/LVGF{HAm9UaOM}ҕ+Z-1۷{hj`b֦ƣ*%KWYU o6֋=сMBsa|Oj 5{2=eGwDznig`iFpwPK dPƵqO bobthecow-psysh-a8aec1b/src/Reflection/ReflectionLanguageConstructParameter.phpUT3^UQO0~ϯ-*ucuB 1UNri,\;9NBڒRwwb?,8)7p@T7xC).axvx4<X.+U͘R>+ 6EHr! RY4d G( u3f29.ʺݥ*ؔYX017V0Â۔VQHd34 ѿD`ZsRK#H TdQ4gS,mY7di-U1YeBȭ)uk$ɘ1淧2k bobthecow-psysh-a8aec1b/src/Reflection/ReflectionNamespace.phpUT3^Mo0 <M㾇":  Pd:fKD Ka|C޶Ͳ81|76Bek* , W M.g>wO(7| T]].ح!Pjt3ʇF5*ا/7r.R "UF v[2la軠(,s*d7jԒ꥔C~" &e8ŽU8چtau~e V…qFKY;.܏'_] w<Հ{4'6ZKr^C/UZgE>`%Omj;"]ZYVe6|zoU)qGtūu =TmtEכ2.7.2:kU/gİ,Ơ,ޭܯyY>ӢX.bʫ /c.7"^0M%Lٔ8כzDA_7pyN'G 6 <ެE+ûsu9.j]U*mf#^_\W{ʹoj3/bN27d[y٬yg]èt=~@uFrN~_?XI^c_{W7@ϓ>g9%~IKl~gO f5]U%ſ}. .6*@^$$:B$VrgaVsVӅ @V2aoOe$?6glrO}`UlƧ QO8&EQBɀ33(4e6)~/D65NDgI ȥΒds( "?})8O}w8v `}oWt\S)Z'mY]#Tbe$nU\Ȼ3>3.9l YXǽ=Q@+ EYո6@M+-tFPL1w@׊$:iv]WjIBNdهAbs ݗK// $.Guф 7 ٟfEQp\*gEB^f3WPPF,̤̎v"jB|LBnl, uǝlM”*~UuQ*(s '~iof,O[ڤ.k󮿽I u!XT΃xE ] JF$PG!e#6E h xIdQr~CPZvғ3 [rON.ǰG (B=M0p&'O[&P;WO ggCx}Uez/[Xˁ~gߜR"Liբ,g,]ޥ3m-VQCEAV@-b}5zyZ+x$[+%b#[ oQQއ`cΰLuԭۡʺ+J]->.tu(*-]Jf+uWv('ԓQwRn8kP6y C8pWa1=<@*F G-]O1aQ}wz{O0+1N,IQ=I\[9[a9ͮ`F&;x!.=_ﳶL/eVo=- (hWo( h?P\NpQ?3߂NYt?N$voAP$n_$6[ꫵR7NĆ>yV#ђNE#u q&J迌`Q+s^\oڕRٍK3T)ӷH5m mgddf.Jh)Asky5r(GShI2: )f>t:ѡ~!q,m3vPfu:(Ĕ;bV*Mոԋ jWтz=09kli|ޟ]YuqhHViO`_c :Oj[tasM51aG(pՁKX`D$R;2 !Y=jʒ'ѡO՛Ȁc]q"Oʘ];2[|F *nmfy-/&tQih ֵV{Hj0n7pĮ$de7P5dz `Ha%+z.k\׽y.R{4 0Lձ 9бF"(6) 5[=Ht'skz6c <]gk>Cл;Y`ܪ7*Iu7 ^p,#m"&iFo{1 9>D8AmzA ^#.C?%tdu@zC]9` JI?JVz[V'4ŽYsZ:wT+m+-WBw0"Pz 벘|^O w: ݊4&'# t w[$E 9/55Vm䦪œ)jVf耇YY3CSa‹te^2O½|wJM 1iٕ#z1e*۵QGSF a?N cfb|_8f4IMxLv;#o͖?6'Rdv:Sd) 6M jƠ_*6F0җЇ+o(?eh>;rp[=K^FVp.w )CQG^ )+tb,G0F9C_g.ilWrD',GWC[!YR °R(* +6*f3Uf5`GSK,2ةrq mN-25 ~ԩ݌cht9 %;@hn#` "Us9Zٱ? _1ǘT{":T"!0Vz YGX(ی! Dur\ #=Dx澒ҧUl d9P̲[%GTD%W n!$`?/0F![]`(P"JX#{EUf>%Nvk8CsWx07À[ǫMUFt8b$kQ/n r84ːwuWF{t8%iD?aȵJo`bD>- | P D Er EBz>V,<{#HĪuf,7Sqh}6R݀5 @h9`octww|%;aaާ~+NJh{blHv|,ti(7_AH:g>>bO$H!U@ *0Qͮm Q/!u;$iւPY,;cB8!vAxht ^-kD( u>9Nx.lgi'.1eKOq2oһ=6Ɲl]d 512ao3:27vwseO)<U3;f߱Sg2߈}|-XtiQ@Q)<`?3Ѩך ;Tils # FػIj_M>i=v` !p/>dr+ʦ%-N4[rT)vóB(y]‘d[IY'VE*$y4_APq?no-J'IO&OT4-GdDa`FCH ?$]e盛Bp{k+K="^(Y4yJlf9g {|֛J٘"Ei'fVvr`v&G,Ǥ@f["mwgu NT؇Eбd4/Uit lR8섹*e N\ cfYh.!.%_/)OP$`D(#C}vبr?Nߏ7@:NɧEϚͤG0,X#(a"ft80C|Q\M|b{Ƈ\Qdak64D\Nϊ.lfNr2IKt 8 Uzi!٢`7M*ax+yl{6/)ʁ}C|z 1~JZt^U^I2 Mj7=)ۺVrWC¾kPKk|%47EqVNj MgP mvb[D"nAHq[D9N4s`a/Pq*#|\/ 0*-nJ|2j1Pb&X['6]hji'{Xeuyjʀ@yRgͲv-xt/z67.zJ~VLg3e zO3gGxTȖy6`.UuuezL0˜`S\A:ĕĘF =%[aS/*˜o2Fl(up2=)4FgxCevVJ B$yT2!ٻ80sbȨքIwm.nYqc\˘P4o=iS۰I  ^asp2*ݾRsԉ*xx+on>v*T~ KF 4½P…q#R GXRl15 "z2A[_W1Qγw7gǧ#"L枫߅*+'$dA=6ꒌFu/1pFe Cޕ,)3 ź9jOdČquofE۳2Ÿ>^"1z%d&\"3e3\nE-HJu}m-ѡEaN/ f` l`f۴z[5]RСbLڮOԨFdO7n=g)$9;9mHIXB ei< %.arV}P7Ԑul#kZqc",3Ho&򲺹B ,>RDnhNE9SfjPM:Dț)5ڎH) 5[&lRЍjKY$]\c9R1N8)ɍ,GkZu#PBE9mҧD)frvϚ [CyiC١j^AGIa'VnR3{ֈ?;'{}rK7S;hZlruY۽'18Tf߿,CfT ZosX/P@%Yswx'V A{4l`UDVu\o2)2d7A4@}Ck5ܸ4M¦GڥQ_6FTnOF=:&v'*3ZFKV՝KF)Ӫ>1]꿔a]{zf? mF۱ z ?Cԥʜ>nNsGaCݢkaV$h qfd )WX*$q$TX}Q*3y5M\d(s) wcC(|VbyE=x?bDumꛢ߱ȁxR7@T@z^g7v -3˳ޟ_ /8:{qr]@թЖ^]]_]#'^ [|" Bm s% _wB\Tr^ad<UЛBxo%lUv|Y6,QanBnIIfkB2n18Οd*C}n}6DL v0SEoixqޯy4/Lt'~퐁6R礳͆[ưYhbw1xx.蚸A)PaJK5k)ͤ;M6 Ye xG{_LGjP5M1$l*) =kґLЦTK2:FCHp/Rua}b`F»pƊyweu&򙞟nc?y,z^LkAMt{^Q5ǿ#eۚm-Cadw1Y0gWvP0/Pnd 1Ka\s#9*0f5Q[e@7:p騾&w9yQY-ߛk>]ٔ|=`;MdQO`NE{,nK$@M}.:$ T{K%Ġ˫!}#1y IU+Uȓ1qG@HbDϽ}2>Ω wBR5DpQ;eBaf&2 aGJ,ihn^kquC5^Y'}} :| /r.b&J*G;r]Bz1Bˍp|3sVV訦\>$ lsd3ӸϚ`/$V2`+& 33H@HzOkT}e?yy0~}zY*eޡuysۓ"z^QZL׾f#^6de ϪdZFZwuC8 -w+"lᱍ7zXݭfvAr}<vH _%)Xs6͖$O'R:)`AX"}!4ٙː><&f6obY7ZS $k]p5~. |軉RsۣPK dPig-)$ bobthecow-psysh-a8aec1b/src/Sudo.phpUT3^VMs0W!%NLa(té3,˱=wV=/~y&2`F\AcxψԐp G,'bt/t>Js'Bޥt h/" DsʄB2!bY}|?;4?6, DA5 OJsI̐ A}%:7^wGXn!$=-Wva`nQĎ g$嘿$P3^!{pDf43X!!"j2Yj bSԂVJY43sSxa^ kq=c *!Jĵ\?j7r-aW'igpq`Gf,[.lŀ5B+[iqxFRJAЮۿ>dܾl n ̤짱 = TCUlb[}S}л\2,7omI>}ԳU hq>]<ùln׺VV$R}hԄumˮif6B(:+waH, n|Ge$2cUn >VxTQ\_f7͟I0^F$ QFr..`2ƟŶsׇ R!41 bt͙+ A@*W=Kb\Doeb1*D< 4 &g(Jgy(%MCz<(Fx~f8B5~ב h=?>0D'pz|пk iz7XYVgg[C4`p烇djr0*5[fS9y. T5L U(}g--ib X$H UilYjjŵ~7ŵLZ-+z—S5k#gk3&hpkxdX_(}\ NeS8S:UE4:O@A5E^厗;#Q){(<~5W a(@P M]/F*7DUEI^;NR+FD6aQR8<>T >uuLVCȢgD)\e Ś* S 2ܥLӟq2tp &% [.(5~N2i{\\ar$Ѷ>/K `m_"+GB+>YŜ:K BE{;ưLU.t/(7QNCf u1Ik*wA*̼饡$}cLC4sk[x EM !0]eiY׏gQfgB/r ׁ)&&P"+ ?,(aRlY2 RmL\uq3e6/ [ 𸔨<,nwԛfgn|80"X\./2 bVIe5!/X ){\n:}Y2iF\)O4s0xvݯ.i!Ԓ^Ϡ_5zM/p,a i,5q:K:"jb]LD*գ(pD-(ɽ#oHp:v'S!]cf=jcRLjԏukעuJ>-A>ҶKiAjggWb6kI#[#U9 RP}|`A;:htA2WJ1S8oA -am%I)=JjGwj7ͬOiHϭȦؔRiܣ4w$;g PK dP2 bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/UT3^PK dP$,Q bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/AbstractContextAwareMatcher.phpUT3^TK0Ẃ(WVݪҢ2qq"{UC}WI2'ЇU=!{\7JJLo'x2ϵgmTh۔ ֵ1j&g@ъ.]K*C(]S}hv!ӞNk vs"(%ł|+Le! YIRL/< ,vhiT-,`*S= \tdihJ.j.[NRm$~ic+ 11mվPJ<\;4 DҜ=?4I % zL[P33+&(1(Ywփ\w3Y|Sl0˄X+͟ LNArY!Ay:6a$8% U2#5#yѤDX=I[,l'Κl|HlW.<) Vp{L@" ?%\BDl`(:@BY~LHKZ@~N8ȐBEIlJ "X8HH=H#Jpu.w: Pݑ!&LH晤 X3* -rՊɊ"?s|Ј6{MRDE{kQ)%H2G% d&܇x">Dϖ+¢1:5aTj~>L7$W 7)JPI,$ ԵכoЇλsÛ]}Ϯ¬PZkw4jSz4xvgSwkP*7@c$QVU/bבtA[ 4~j8pŚ ӱ|m mSo:%+5=9&xr{`,k@9񆿼O5nZ=O5-ؽ#:{2V7l֌3#b^nxcgP+5918r3RĘ3 X kY >!%[ "[:)=Cz%+ Mч}Dn,"+L3YTf@[d{ٴd:"0K}ԐgFҐۡN&RQe^>_th+Ӏӵh!Mz !jޢCz.^^k&RCVoNp[hjZn)+jF`.]9%RR7iŮ `D3-$UϣdLy-gdcsӎBmF J(zy0c˛Q_5fhc!UmWGSFK%u [c]}R_<~Ye_sYe 2VRɊ3UWQu~tх~o)zcr"~kfSS2ua8&M_vLA!kSY\i SgOp2}eJ>!]c.s\M1z|ڞ䨘b!'OP_җ"vJ3jeRp, Awۓ*+` tabЪPXNFab44b y Vcny MAk+4[tJMQ7>Nga)26'-@n5KT0ܵC;S=ն)S*5٣NKꦽ-))ݖj6GQ[b¸Y=ȓ^]d8w9# ߃}\65ɯ?MgS*p3W/PK dPd#DI bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ClassMethodsMatcher.phpUT3^Uo0~_q$-Yە11t*L{(Ue/U;;N@ﻳ/_00 E.! X$Qt.}zg3%b)R(/֜=HC<̐)diҁ,th0O Jӑ!"|&$g\RVLhA"͹G1Oɮe%$"#gS21&QfDz!埕jͶ^D0A9B`KlI ͠TiN&. TP3=U$%cF501 ]=DŽEu%1DHsٷ^-5u W,A~mfW?|}%L d -.0p/R,hjڜ\"H6TBN>4Sf5ҕ` M#aׂ;POh|85B]R웎V].r?dbH3ʉLNܻ65!Esq'nڡHn0mqDh\18:YxW`\/4 "6y;(f[R#^[p*lEZjpI,\w4قv$XFQ5cSDoԐq ʔmn(N[' -dA=;w2ʠ6YTTY!o㷻_oOGGypqjq{@pD=XPK dPǐ G bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ClassNamesMatcher.phpUT3^UQs8~3ny$% \mB#l5e$'t﷒e!izثoV+}X$t8y$XJ "+O0KhCFޟ=R*O.TBaU)Dy$:Q@x )(rrCRFMd4fc e訄(x$b&`RJpʼD1$IFeAЈs&WDE jvQJ,v\n*"`1M, S@SYR%sED|ȈǗ|C3SFEk]%<0\$RpS~9TGk\b'A<2ԢHA{lS p{*~:F8o)ذw-w c+pH?ܭ <8yco{w0 h8Z9XHqq jBuhluYPU  #DmqJhCuuɛuf2[bOqvVR>r!";\(/ `:=* ߋ՞>48Fuvu">މQkŲf+ԳZ*Wm`7~bᱠp]bMr I $l-0P+<g nܐdoV}kҒMm# !Gyzy̌wpϝ2%};Mrb%MW</!F tPm$$^)Q%og/ 2CwnV L kgN̪%_I%=}WX0ff8ί;l>?OZ u8 ?]낚}ֵCͫg:iblPK dPƔY E bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/CommandsMatcher.phpUT3^VN@}WL%.c4QJUPU"h+|4Bήח8xh3sKw|L" 1s&5d!T+0XσJWRg5#cYbi`i*LYڇ2zX[SbK5e,Tm{ (Bݦl$2`,$Ǭ2~ӄ' E:y̔`Fz9)ȸvދt_?3 Ft05@ȍ{!1(ԺZ2@CQ=Z6,A@2?<_#7;eW zZ4U,#Ԧ8N"`G]..u!SgYYr [nңHgVҪ%6I4/@ÊejþIiN)m&['Ti:JoڮkCף%)8nvT,VK䗱HI^NjrgSgOtV=#֬;*OH7fwVntiIoۜV~+a[yo6֘Џ1u:>,tUɠ"ժlemsi<|\(:4A߭Of_7w=O>?|6Lr ?6L PK dPMj[DF bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ConstantsMatcher.phpUT3^SMO0W̡X> uٮh$U!c 8m|H7o8u`pĹB5*[y.! *L"$ P. J| PPD(TVIVȱ)^]d64TNHRiUM"WI9T[&\(A(,AquY\FJraN1g*K< \qŃǷ;hST.SI:[r2\`M9$ppZyMqT,ܵh-\^ ?$TjabC0!k]H*uaTt? bC4Уgٌ 1r讀s-Q93M) {b(X8%O ׳XpKr]E԰DPQGSF#4d>O_75G?_S?Yn{֚+qpFZEB2MpVh61IMїv|7o>0tFaa>~6ϱ-dW:n:z{F TЎƯ5ty;7& PK dP_9V bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.phpUT3^Sn@|HH1)ǤjSR( :>8 ʿw6`h X9l3+DLL3!UV:<;IZ`H@Eqy“2Ԑei5Ĺ];HV1 &RMFg}x2 T$(ON- ^e\a>/\,`0%z+Ϧrq/Y$~I3tWBZz7Ct'7:_W&e2~l!y*sr -ʟy?*`b Ϭmn}. ,3آ[1bwhrR0Xy(fۓ͒=GB愨7\hKR ݠhce; sxGͩjV%0=aN<rZNwJ={=˲8v*Nh}RaY9+p֫ PK dPDMs~F bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/FunctionsMatcher.phpUT3^SMO0WX> RRCAL DZlB;vօ>c{3wU$9:H&%7Pp@oŴ{8$CYq~6r ?(b2@k D(! REiP ZWZvA d{~㇡rl,197Vyc17nK!ntT(G'(I$(FA4a󫺢"-YĹj/I ˇ!UhX:/뙕Zd`G&2wd6>v;Q_ & |EK=Y:mfK0=߸E|(qsP3[Hs TUPK dPY E:+E bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/KeywordsMatcher.phpUT3^Us<C؝1h+G h'țZY2ܐgnp\RV=ԗJa0-4V8 k.PR'G''N(xKJbڀ+u6pTRpT*6%sB>T¾s踂9X1 Έy0pUkÑ IDm(Hol~K*|dh^xՁ^+mrplNHM6F|Ġ2^hI0R#)]6Pved ^,i"OJ&s~qɬ"PsqC=[uԆ| k1cغׇZHf*€a,+r0ΏBqYC3xbȕt|~P~=k)Z]N#-gNN}[ MBf!\ gsesY CjԠh 69|p-4 -rUSEXayV _ª@[9bu~;隳Rw-us  7B͂Wmb+;ۧT(R,\߼bTB/C!1]RՎ")BH4ے+&?zjzMlhb7JO_o-L,>3Xa:jLtTY=mǝ:ScUX8tr6_||8G0 vm.Agh_h}E~ ÎPyb#'E*4aL[ [= &-6PK dPM H bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/MongoClientMatcher.phpUT3^T[O0~ϯ8BcmqTC8cG!6|;|-2l8g2)$ʀJ?MN9Ek'mvz{=8a~WA7&BVq,H D&UA %e Fptq3Pɉ%ѐ2mUd&G RղR @)$Q$HAuIPc2hsb6kvR1 9€!3k;4* J%,:jD9V Ln-J;1Qa|A]B 'ZпT`!JaP6XEM=x*Ie],6&ʜH:&J2m/0m;:=)+-ۢCD:#+ی)mVS}W2mLYF׃u.GAnYέgk4)PK dP=CJ bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/MongoDatabaseMatcher.phpUT3^TmO0_q*B ccEEPm(Bi<8vwvCԦ{^/EVAg7]g\Cz n3eL}XTG=8upQjsNQs=T`2i)IJxV|<ckʐRp ɶl~ërrL!(>- K`MFebFfEv 9O89%&h〈#[SۇK308% Y3lP( MC'[_;= RهOT6}y 1=[-Lrm`+i }*m:Vtpak*.ZMUE$e/|01M;|UuB2Ud;U3۾bj BJ٧^GŬ볋^76`%$iY6)EY=/PK dPP̮M bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ObjectAttributesMatcher.phpUT3^U[OA~_qj1%2βS 1Z$=;K`X=s"LJdb|ބ㓃#*4WRg-ScYPr!4XrjbHL% e #L1oʆC3 Ԩ@\bD Ug₈al{^sFB 4d^a]3PW X]5-bܘd)d߂Sل*HpUlRf2nOy.JPKMeRe)/X_3ᒾ$g_L&Cb:u1n-v ^hPEhNcΙ{9z!SRH 2m̋ 5zrT`}[@g} ܫ OM_RC@R5L{ i`$ChRsTFN# =γf[|-ӱk-(U~psl5hhY)7 35Js4zlFJ`RZI0V"ie^ SG<~bt'SMb%n-!4NImxw+ugMϘ7[+sԯGZSF/3 )\sG+\.9Lt#Wbu|3.dmquo^{w·vumBkQ5PK dPuZ bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.phpUT3^Tao0_qH*|lǦcZ*@R*dK8픢 $dP}޻{|%zpk@gƔ4;aB|ONG \p ? 5c*0 B a-L 0!JM 2NՌd=s;ܯUvص0s!(> F0&\HDZǞ' uhGlzΈIJo T 5047h41˅cT|1(# SB+,RT -'TEa/7SMJ50r.xY]5\BhܓLB=3b5plM՝׶eYQ~4,GX[#vl_OkS Z]:SrhYq:POqR܄mOsUԛaā]}h4d8n7~I^Ӳ:+zuりr\ۼPK dP4x>J bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ObjectMethodsMatcher.phpUT3^Un08P v]bzQcGbGJ{=؞dǎl%}yN;0H1O3'ʀõ~ۄX6upmІ V^T`"MQIbRN Rep)݌.o{ʹcb`N4\Ga1̹IPjY(ʐ(f $c:'xdԕX14a( IyQ"c(˭ڑM #@~0j c&12BxEz\r%gtW7K Ri-䦦c߰EA?PK dPAWZagF bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/VariablesMatcher.phpUT3^Sn0+`$RP? 1cķ9 8 E 9kBцpf< ﺙQbawk1/cqSxzB?6FZ'ng7]u}g~ƥ5Ȝp@4I/mQ%ͲڑAC,hZfuto:k,7 *~hf^tAn[Yԙ;+r9ukӧz8܎cU9Y#Hرj`gg)韔9AM)ÖA~-?)J[7V_PK dP! bobthecow-psysh-a8aec1b/src/Util/UT3^PK dP\0 Y- bobthecow-psysh-a8aec1b/src/Util/Docblock.phpUT3^Xko"ί]k0z/l^WQd]o)@=Ct<̌{TU{{/^tӘ ƽĽ@ d#CW~=D62չơ0[< `rE O\4Y9CݹB 4t&i*ndIaпS sXZ1| L=,` rgRlzRhU5"}B4܆잛'*"% #}{q؊HkOM*ܪC 3X"QSPS QKP>aAxba|/L2Xlu1H0N4= ;'"9 iDy!//xEFi&vFo=s#PFpkyAE6G4Sړ`4̸Xɣ 14m삆"\Q8 VKRmֶYsZGsс}&Wn}Tx8: Rbl `1tŲXe%>|Q2)>+͌랑(|:&xеvflL'@#}rg7QiIi'\ VMִmZ<s\"QSH{ [91Yik*vA  BQW~yqC}ӁχB`5G5jݡ_,x!3RpXr?{jr~JR뵞8|FE8wtv:-yNhQ7ڷ$&raZIx4mJJ{ >7ʛz6f URю6F6O1}ӠSSZq S:k(ko2tt3Z\}`F\AQKF~ul} D_kK9?bIrG):mos=~ͥSxVSG^s*b0ɓ(f"4$,!p1%*i}ٝ8ϴ+GEDRx+]" TsA ٲL ~pX'i!rK^Ǽx RY-Ey*ܼ]prr8{77lܸ lE^+`N,uֽo!LRMz/L",f0a)2lHkS5F~7X0T~uߠ8 &Y4hD -,9Hܫn\{JSp=@ T"H";3{ې' =tÄ \y5(??Qu od=hc&׃ g~afYXA|I2AA mdD?h :2׭#:/P4Q {Ia1p2r m#'uW5*8u[r%*-),Beq9JAk)˔5xf[Օ/q|i+5 Ĩ]EZ+Ŵ1t,8Sg:) PLϋ sBN툒$'^d'l*7%|x*9e .pHb>IlӅubP%2ʀ험M-Q@<` N#ûyck+en-#O(QBk+RgAk" Y<fjV~8KFK==TVZ1tAM۴4":bɱ-h)SwIh4qt~w=3}Ωẇ7BPE@s{=1ʸi Xr۶2,Ԫj`='1` [j!D'JL"iޠ$uYl,cx]S[-McFՒp8Oeܪq`Jtvao|- ɕI`LBqKİ{ ZW0#tkt2F+kl""&`îߑ$#&ړpYRGAey7ؽa"%c,oͻ"g;/_!;#/PK dP޶1E 0 bobthecow-psysh-a8aec1b/src/VarDumper/Dumper.phpUT3^Vmo6_qJNZM? pⴁ,8+:XJTELJ%;,JW ӇPytG0i{-؃IXDׄqrӐF[4VׅA9pT*&gR(/NV} C<%X,b1AQ#Oxr=h,ODϤKOLCq*<T9h8YP1|"Jqj|EsqG=bRT7JRUcI#DpIübehL/11EDJ0Хܗs I{$B'$Q=z"Y]p.A% ȃṆJDC"F` Kwg糇:|v׏"eiN[C`իKo%%l68B 6t|aikW9^Ù$fꅰmCT,wwUR5XHۄh F`ʏuuM8'2MaQd+*V %k \C"!.,w8_'WK=\^\'M*9SXxǚ׺pZ\/,ڽzA!j:v70Uގ [>밇.|:C~6A=@q6V,jN=ZςT,NDcm]2y4Q! $ >xCfb 8pagnd#Cha_jۼ\ʫaPK dP!ĵ-3 bobthecow-psysh-a8aec1b/src/VarDumper/Presenter.phpUT3^Wmo6_vA%Nz8sQQIl8n! Z:jrb4;H'-P $=w*k'UIF@p($ Ȅo !e{m.3"L'<@> "ن+Ah( ! RSIdP\[pΝť+E):bE!,\|r UT$Z g<΀Z9Al4F08 `q.\CE9|<6H_Lp#} "vE WK=J T󔒣o\Q[2y|\(ZvݟwѫNc]٢gQ4B1Xi AMuZVǖ=8V%0kRNJVAUx!>4j"T@. !!˗V0*崆Q~ !fZA hh;T@[~S<@?ŒB垰EgG1I5qh+_KCJ,1xqn1'Cp|rwz?kFYQ12 "5φt4nĿVۘʬtp 'tۯ[[Tqpz/͆VtEz*jdIoza:+tֲԨc:rW|^+CdTK K ۮ\&ĢF,5XeuBCQ6ךlɵXr}>ubt>Og'3l=ٕ^+N,'d:Ù{d::TڔY nUL~d TK<F;PkSEz3 ɝ5e "Õtl\h.#2X^cɞ~ٙ*/ټXs^K2Pph86,"UỦQ2=4ޢ,EK)Ì~ߴmY(:˾RLy3lZléD%juAbT+l{;?Q ei|8 O;>Vo]`6v}ֈCz/{T^ )Ezj PK dPϱ>8 bobthecow-psysh-a8aec1b/src/VarDumper/PresenterAware.phpUT3^mMK1sֽVPъHK5|̺;YU\>GffMXLuFsDM^'^}xe~܄ZP!y7`B9!9I&c%q*Ғ)mG@oH %`aYELҁp0'L 2h[ F z aQ0)u4o?Cl [L%t`½E_Gq%0n˭23=]OPK dP+ bobthecow-psysh-a8aec1b/src/VersionUpdater/UT3^PK dPz3M.6 bobthecow-psysh-a8aec1b/src/VersionUpdater/Checker.phpUT3^}O0WýQ3ėhC.mDzwoD%Ѿ\rw_^\d, A.Ւ[&'BRg4ND4FCt0rk,xWJAjʭuJmй(r%ݽd6狸x=A&rSy̠^!T6EZak2dL]ɩI^:Rfܣ1&5ռ-{g@'5y'zp =j޸ϒ5t4R5*[JFчrJhaGx_h v4 R}e5lQ^ղPNHz"mzPK dPͯ0< bobthecow-psysh-a8aec1b/src/VersionUpdater/GitHubChecker.phpUT3^UQO0~ϯIHIQi{+1!6(MGbGCA4P49ߝ󗺨 ` aK2 K?¤~ۅ6\)EULxoR)MYB*Gk fঠeR2 B]32 *M\3톫Ӓi ߹9mfwWBa4xS7Z9@XSqrFbLΨT.Z?ꂬNCN k[[mK)40lf',RK$ܥnkO0oH##Gx|sr99y1-afhA8w7Bm:I{\k421t% 7%+G)K#X+-Oݻ%vy~k'~ kr>q>X™IeѨßk* Zv {^J.@Ş{V{NR-(lf^5:\kf!eS;JL*vG!jf-҃ȔJ%I`{g7B88uۣy?#79CAo5BP- r=$TIASD% .TF&lAyɥKnL!=RxSBݔ죩}qHT40gKwj 4 _PK dP4ޯ> bobthecow-psysh-a8aec1b/src/VersionUpdater/IntervalChecker.phpUT3^Tn@}WC  m%%QU*x[vסQſwv16)~gΜ30q0 G 7!RCzE;t1^.ݺl7ڭv >JscZb :dQ4N^%_! D<uH"FMnwOCehX>WZEkCTUJ0 ɦb*!hDoL*5f84"J]f̈́tYHpF Iuv! THTFl6yΌF {n9 '0M RWU &<2ێԾF;3`Kb3x͗LXRܪ:$R %<7Gߊy[+Te6zЅ([R^f\MW/{g5ygIIғ'e{Wr8PK dP>X]: bobthecow-psysh-a8aec1b/src/VersionUpdater/NoopChecker.phpUT3^}N#1 y bi鑮"Tvᴗ46$FՊw GŒoJ6)5)_#HN:3=#l-z.#uĜrq\,P];Q:L#1[}LLA3Haspɣڛáo֛jvjAt8]a`pl#V)lP@Vs:͘WJU=پqE} \3#%Gч61i^TSIW ,Ԙ\r]~[Ne'#QP'=.1-\pՊ+Hg8|9 io|Y?m>PK dPdO8) bobthecow-psysh-a8aec1b/src/functions.phpUT3^kSHdZ)Ru &G u)94g#KF2.o[r~Rtk{Ư^~bOBH6.gXa5-LvwvwwvwoNkiyYl.`"b0Wܓ07å |N"v;K2G(8FUǡa"#ۭg- ,jŒƃ{n8a\J_@<>p": nPr{ |{yw h|W8pp%} Or"p '1c,l{4 X.v~>AA0,QzAܮ5uVpPF`Pq4vBD18\M o3!"}Gc> -;R8|9&;J×<2Ь5goֶ\@mג LJft;V'ά,$B;C!ЋH[["Ky-aBQ$Zjq[1c]\Q0k6vDK[8#!UZnۖ͵ $Rh '%(#)82PS_mO )gw0.59 fMBV [w]C$ew'qk*\ d\D/jH^'ܚ4e;Ghߡ71C]4*H埈V,#&P(ͳ FP㣮(-w3"RC!t ܪi va) q(mY5:, cC@,DYSOLvHΑ2JNk%?jD춎^0̼Jؼb3 i?2 6y (K} S? e{+ҴfbTIs$HO,HPs*6R=jd N~"ȗԎTYEp/HdJA ,~A-ҦpB5 [`{Yh}"̠svV-;s)ĢƁ=6j4cpDcCd' 34R40x@_qs ۨIцcG#/0@f*is+ohOQP9*Z(炊dyiDeT )$\}',-5Vhbj2\^.odrxq~|ָm~b̓Ǡ@T6D+)PcyCv~hN/;%ap ǸhQ Xg"ࢶ;\XHjH4BLHa/PE`WH0X*NPF3n*Ɨ.eNe Б\ Vb`3ѼvjJ D'1| +^(PU+4Z4` H@$ڥ+a WjY!Kl1L: <^p k!i [H^MUMBgFԔ+KDRNaUuycz0`ь*F\mz~Sj".sjFA .Tcک6EUL@UtSqec7s #wh/̛+RJJ/} ۊj%fMˈ䖃YM)EL(5kRdh<%HMKN!Uބ/61NGlXZ# Mg( דfokӡT47cR=Dl%UvtܤvR`x,iZc*V1+\lAUwBѓ7'u8Mᐝ; dtKүt+ȭG}]R,r@8f* Q&CrVaX&n&TXh<7DxztԢW kBpZ,U#HkuksǔQb`&mۉ1#8Jmbiy1d1Y;>/S~vEy 3TMŔMM:MZ3Ǵ94F//ޱ%]*;搦Q.e)Kq6N4fHu+{wdLL V{;A9$oFs1pGgc(;U FЉ/w_>qD )~M4^{-V;5'?<\EtmtqѸ'tf;CY.1$+D*;DA[1YЪ`z;|Q-3>%1t,$O~?i;t%ڹ'% Mr& ̍gAMZCHm3䒶iۄV2&j8m_ct7Ҕm(7{A-d9ߐ˟uh ڷD1ifbbΛSsXS;u%R)z{M GuM$@5/{HVZth)x 6XZy.jĨ錑^zo%Kkޣwv-;ݶZ:| Fw&H*Ri (OO-y-TA^s$Bi% 1p $̭!rK.-3"ʑjbt2?SfPO:bL'uԌ46^2f] Y˙t VFwCZw]}C0jC<3Ůְ0]_x?W̉Um3yhAͼ+څn5н o.j~Bwӆ^|Izvs0xO~W5%]m#l-{Oth;²zr<#~$cIfjfz}*'^^$usI5T)]ڂz=$yJlOS/ ]rP= R]~PGXE1\~p=~Q5K!\ћ{[]}m[xhPK dP bobthecow-psysh-a8aec1b/UT3^PK dP ?bobthecow-psysh-a8aec1b/.phan/UT3^PK dPfm$lAl( bobthecow-psysh-a8aec1b/.phan/config.phpUT3^PK dPyC> bobthecow-psysh-a8aec1b/LICENSEUT3^PK dPg";! bobthecow-psysh-a8aec1b/README.mdUT3^PK dP _ bobthecow-psysh-a8aec1b/bin/UT3^PK dP@DoѮ! 큢 bobthecow-psysh-a8aec1b/bin/psyshUT3^PK dP'3)T% bobthecow-psysh-a8aec1b/composer.jsonUT3^PK dP bobthecow-psysh-a8aec1b/src/UT3^PK dPy *+ bobthecow-psysh-a8aec1b/src/CodeCleaner.phpUT3^PK dP( bobthecow-psysh-a8aec1b/src/CodeCleaner/UT3^PK dPGX = ? bobthecow-psysh-a8aec1b/src/CodeCleaner/AbstractClassPass.phpUT3^PK dP_r} B #bobthecow-psysh-a8aec1b/src/CodeCleaner/AssignThisVariablePass.phpUT3^PK dPPoG &bobthecow-psysh-a8aec1b/src/CodeCleaner/CallTimePassByReferencePass.phpUT3^PK dP*TR ; )bobthecow-psysh-a8aec1b/src/CodeCleaner/CalledClassPass.phpUT3^PK dP ; (-bobthecow-psysh-a8aec1b/src/CodeCleaner/CodeCleanerPass.phpUT3^PK dPbSMaB .bobthecow-psysh-a8aec1b/src/CodeCleaner/EmptyArrayDimFetchPass.phpUT3^PK dP]{4 _1bobthecow-psysh-a8aec1b/src/CodeCleaner/ExitPass.phpUT3^PK dPp<:\: U3bobthecow-psysh-a8aec1b/src/CodeCleaner/FinalClassPass.phpUT3^PK dP8;? c6bobthecow-psysh-a8aec1b/src/CodeCleaner/FunctionContextPass.phpUT3^PK dP'Nr L 9bobthecow-psysh-a8aec1b/src/CodeCleaner/FunctionReturnInWriteContextPass.phpUT3^PK dPo"E5> <bobthecow-psysh-a8aec1b/src/CodeCleaner/ImplicitReturnPass.phpUT3^PK dP9؅D: Bbobthecow-psysh-a8aec1b/src/CodeCleaner/InstanceOfPass.phpUT3^PK dP 4 < eEbobthecow-psysh-a8aec1b/src/CodeCleaner/LabelContextPass.phpUT3^PK dPӠ? OIbobthecow-psysh-a8aec1b/src/CodeCleaner/LeavePsyshAlonePass.phpUT3^PK dPGp x 4 Kbobthecow-psysh-a8aec1b/src/CodeCleaner/ListPass.phpUT3^PK dP  ; \Pbobthecow-psysh-a8aec1b/src/CodeCleaner/LoopContextPass.phpUT3^PK dP$#,> {Tbobthecow-psysh-a8aec1b/src/CodeCleaner/MagicConstantsPass.phpUT3^PK dPiJu@> Vbobthecow-psysh-a8aec1b/src/CodeCleaner/NamespaceAwarePass.phpUT3^PK dPgp 9 Zbobthecow-psysh-a8aec1b/src/CodeCleaner/NamespacePass.phpUT3^PK dPK2f9 `^bobthecow-psysh-a8aec1b/src/CodeCleaner/NoReturnValue.phpUT3^PK dPR}C `bobthecow-psysh-a8aec1b/src/CodeCleaner/PassableByReferencePass.phpUT3^PK dPE. 7 fbobthecow-psysh-a8aec1b/src/CodeCleaner/RequirePass.phpUT3^PK dPi : kbobthecow-psysh-a8aec1b/src/CodeCleaner/ReturnTypePass.phpUT3^PK dP4 ; Xpbobthecow-psysh-a8aec1b/src/CodeCleaner/StrictTypesPass.phpUT3^PK dP:A9< tbobthecow-psysh-a8aec1b/src/CodeCleaner/UseStatementPass.phpUT3^PK dPo/ /> {bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidClassNamePass.phpUT3^PK dPǖ = bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidConstantPass.phpUT3^PK dPfa,@ bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidConstructorPass.phpUT3^PK dPrH'X A bobthecow-psysh-a8aec1b/src/CodeCleaner/ValidFunctionNamePass.phpUT3^PK dP$ nbobthecow-psysh-a8aec1b/src/Command/UT3^PK dPNy5 bobthecow-psysh-a8aec1b/src/Command/BufferCommand.phpUT3^PK dP_ #4 bobthecow-psysh-a8aec1b/src/Command/ClearCommand.phpUT3^PK dPxJ/ bobthecow-psysh-a8aec1b/src/Command/Command.phpUT3^PK dP/}2 bobthecow-psysh-a8aec1b/src/Command/DocCommand.phpUT3^PK dPk 3 Ϫbobthecow-psysh-a8aec1b/src/Command/DumpCommand.phpUT3^PK dPs&3 bobthecow-psysh-a8aec1b/src/Command/EditCommand.phpUT3^PK dP <3 Abobthecow-psysh-a8aec1b/src/Command/ExitCommand.phpUT3^PK dP^ 3 bobthecow-psysh-a8aec1b/src/Command/HelpCommand.phpUT3^PK dPc0m6 bobthecow-psysh-a8aec1b/src/Command/HistoryCommand.phpUT3^PK dPn '3 bobthecow-psysh-a8aec1b/src/Command/ListCommand.phpUT3^PK dP0 Wbobthecow-psysh-a8aec1b/src/Command/ListCommand/UT3^PK dPH-F K bobthecow-psysh-a8aec1b/src/Command/ListCommand/ClassConstantEnumerator.phpUT3^PK dP@*zyC fbobthecow-psysh-a8aec1b/src/Command/ListCommand/ClassEnumerator.phpUT3^PK dPlC{F Ibobthecow-psysh-a8aec1b/src/Command/ListCommand/ConstantEnumerator.phpUT3^PK dPG7fѰ > bobthecow-psysh-a8aec1b/src/Command/ListCommand/Enumerator.phpUT3^PK dPK# F bobthecow-psysh-a8aec1b/src/Command/ListCommand/FunctionEnumerator.phpUT3^PK dPfC L Kbobthecow-psysh-a8aec1b/src/Command/ListCommand/GlobalVariableEnumerator.phpUT3^PK dP6#rD bobthecow-psysh-a8aec1b/src/Command/ListCommand/MethodEnumerator.phpUT3^PK dP:2F Pbobthecow-psysh-a8aec1b/src/Command/ListCommand/PropertyEnumerator.phpUT3^PK dP~/ F bobthecow-psysh-a8aec1b/src/Command/ListCommand/VariableEnumerator.phpUT3^PK dPE4 bobthecow-psysh-a8aec1b/src/Command/ParseCommand.phpUT3^PK dPyE9 bobthecow-psysh-a8aec1b/src/Command/PsyVersionCommand.phpUT3^PK dP'JpR R)9 bobthecow-psysh-a8aec1b/src/Command/ReflectingCommand.phpUT3^PK dPVà .%3 bobthecow-psysh-a8aec1b/src/Command/ShowCommand.phpUT3^PK dP9y3 bobthecow-psysh-a8aec1b/src/Command/SudoCommand.phpUT3^PK dP6^T6 !bobthecow-psysh-a8aec1b/src/Command/ThrowUpCommand.phpUT3^PK dPT5 f(bobthecow-psysh-a8aec1b/src/Command/TimeitCommand.phpUT3^PK dP2 0bobthecow-psysh-a8aec1b/src/Command/TimeitCommand/UT3^PK dPu\C o0bobthecow-psysh-a8aec1b/src/Command/TimeitCommand/TimeitVisitor.phpUT3^PK dP-- 4 5bobthecow-psysh-a8aec1b/src/Command/TraceCommand.phpUT3^PK dPf*{7 9bobthecow-psysh-a8aec1b/src/Command/WhereamiCommand.phpUT3^PK dP΅b2 q@bobthecow-psysh-a8aec1b/src/Command/WtfCommand.phpUT3^PK dP\5$Ƚ1+ ,Fbobthecow-psysh-a8aec1b/src/ConfigPaths.phpUT3^PK dP0g)- ;Nbobthecow-psysh-a8aec1b/src/Configuration.phpUT3^PK dP-3 ]xbobthecow-psysh-a8aec1b/src/ConsoleColorFactory.phpUT3^PK dPW' Hzbobthecow-psysh-a8aec1b/src/Context.phpUT3^PK dPaK7, bobthecow-psysh-a8aec1b/src/ContextAware.phpUT3^PK dP& *bobthecow-psysh-a8aec1b/src/Exception/UT3^PK dP;&[8 wbobthecow-psysh-a8aec1b/src/Exception/BreakException.phpUT3^PK dPtOeF~= bobthecow-psysh-a8aec1b/src/Exception/DeprecatedException.phpUT3^PK dPŠm 8 ^bobthecow-psysh-a8aec1b/src/Exception/ErrorException.phpUT3^PK dP pa33 ΋bobthecow-psysh-a8aec1b/src/Exception/Exception.phpUT3^PK dPH = [bobthecow-psysh-a8aec1b/src/Exception/FatalErrorException.phpUT3^PK dP.= Lbobthecow-psysh-a8aec1b/src/Exception/ParseErrorException.phpUT3^PK dPiɑ: bobthecow-psysh-a8aec1b/src/Exception/RuntimeException.phpUT3^PK dPhb: bobthecow-psysh-a8aec1b/src/Exception/ThrowUpException.phpUT3^PK dP~$.< ~bobthecow-psysh-a8aec1b/src/Exception/TypeErrorException.phpUT3^PK dPʄ9SC bobthecow-psysh-a8aec1b/src/Exception/UnexpectedTargetException.phpUT3^PK dPpn 0 bobthecow-psysh-a8aec1b/src/ExecutionClosure.phpUT3^PK dP*  bobthecow-psysh-a8aec1b/src/ExecutionLoop/UT3^PK dP;ґR> ]bobthecow-psysh-a8aec1b/src/ExecutionLoop/AbstractListener.phpUT3^PK dP_k<16 bobthecow-psysh-a8aec1b/src/ExecutionLoop/Listener.phpUT3^PK dP$ | ; bobthecow-psysh-a8aec1b/src/ExecutionLoop/ProcessForker.phpUT3^PK dPM`3 < Jbobthecow-psysh-a8aec1b/src/ExecutionLoop/RunkitReloader.phpUT3^PK dP3b  4 6bobthecow-psysh-a8aec1b/src/ExecutionLoopClosure.phpUT3^PK dP& bobthecow-psysh-a8aec1b/src/Formatter/UT3^PK dPQ &7 bobthecow-psysh-a8aec1b/src/Formatter/CodeFormatter.phpUT3^PK dPhǂZ; bobthecow-psysh-a8aec1b/src/Formatter/DocblockFormatter.phpUT3^PK dP  3 bobthecow-psysh-a8aec1b/src/Formatter/Formatter.phpUT3^PK dPX< Ibobthecow-psysh-a8aec1b/src/Formatter/ReflectorFormatter.phpUT3^PK dP:F$< bobthecow-psysh-a8aec1b/src/Formatter/SignatureFormatter.phpUT3^PK dPRmV8 bobthecow-psysh-a8aec1b/src/Formatter/TraceFormatter.phpUT3^PK dP" sbobthecow-psysh-a8aec1b/src/Input/UT3^PK dP7t2 bobthecow-psysh-a8aec1b/src/Input/CodeArgument.phpUT3^PK dPnLa3 bobthecow-psysh-a8aec1b/src/Input/FilterOptions.phpUT3^PK dPE`jd5 ,0 %bobthecow-psysh-a8aec1b/src/Input/ShellInput.phpUT3^PK dPr1 bobthecow-psysh-a8aec1b/src/Input/SilentInput.phpUT3^PK dP# bobthecow-psysh-a8aec1b/src/Output/UT3^PK dPՋY62 %bobthecow-psysh-a8aec1b/src/Output/OutputPager.phpUT3^PK dPLR)4 bobthecow-psysh-a8aec1b/src/Output/PassthruPager.phpUT3^PK dPNL@ 6 bobthecow-psysh-a8aec1b/src/Output/ProcOutputPager.phpUT3^PK dPL/a2 bobthecow-psysh-a8aec1b/src/Output/ShellOutput.phpUT3^PK dPG& - 9bobthecow-psysh-a8aec1b/src/ParserFactory.phpUT3^PK dP% bobthecow-psysh-a8aec1b/src/Readline/UT3^PK dPeaQ4 Zbobthecow-psysh-a8aec1b/src/Readline/GNUReadline.phpUT3^PK dPA#n3  bobthecow-psysh-a8aec1b/src/Readline/HoaConsole.phpUT3^PK dP>ñ# 0 4bobthecow-psysh-a8aec1b/src/Readline/Libedit.phpUT3^PK dP0z1 bobthecow-psysh-a8aec1b/src/Readline/Readline.phpUT3^PK dPjz.a 2 bobthecow-psysh-a8aec1b/src/Readline/Transient.phpUT3^PK dP' bobthecow-psysh-a8aec1b/src/Reflection/UT3^PK dPY6 LB bobthecow-psysh-a8aec1b/src/Reflection/ReflectionClassConstant.phpUT3^PK dPE(= T!bobthecow-psysh-a8aec1b/src/Reflection/ReflectionConstant.phpUT3^PK dP!> B#bobthecow-psysh-a8aec1b/src/Reflection/ReflectionConstant_.phpUT3^PK dP\ F (bobthecow-psysh-a8aec1b/src/Reflection/ReflectionLanguageConstruct.phpUT3^PK dPƵqO ,bobthecow-psysh-a8aec1b/src/Reflection/ReflectionLanguageConstructParameter.phpUT3^PK dPZ!tvC> /bobthecow-psysh-a8aec1b/src/Reflection/ReflectionNamespace.phpUT3^PK dPݕp'ݨ% H2bobthecow-psysh-a8aec1b/src/Shell.phpUT3^PK dPig-)$ YZbobthecow-psysh-a8aec1b/src/Sudo.phpUT3^PK dP! ]bobthecow-psysh-a8aec1b/src/Sudo/UT3^PK dPsDD0 ^bobthecow-psysh-a8aec1b/src/Sudo/SudoVisitor.phpUT3^PK dP* bbobthecow-psysh-a8aec1b/src/TabCompletion/UT3^PK dPG ; cbobthecow-psysh-a8aec1b/src/TabCompletion/AutoCompleter.phpUT3^PK dP2 ggbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/UT3^PK dP$,Q gbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/AbstractContextAwareMatcher.phpUT3^PK dP=ߖ#V \jbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.phpUT3^PK dP\E mbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/AbstractMatcher.phpUT3^PK dP$%FL sbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ClassAttributesMatcher.phpUT3^PK dPmiyeY wbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.phpUT3^PK dPd#DI zbobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ClassMethodsMatcher.phpUT3^PK dPǐ G ]~bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ClassNamesMatcher.phpUT3^PK dPƔY E [bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/CommandsMatcher.phpUT3^PK dPMj[DF  bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ConstantsMatcher.phpUT3^PK dP_9V bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.phpUT3^PK dPDMs~F _bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/FunctionsMatcher.phpUT3^PK dPY E:+E ?bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/KeywordsMatcher.phpUT3^PK dPM H bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/MongoClientMatcher.phpUT3^PK dP=CJ 8bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/MongoDatabaseMatcher.phpUT3^PK dPP̮M ibobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ObjectAttributesMatcher.phpUT3^PK dPuZ ؛bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.phpUT3^PK dP4x>J bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/ObjectMethodsMatcher.phpUT3^PK dPAWZagF bobthecow-psysh-a8aec1b/src/TabCompletion/Matcher/VariablesMatcher.phpUT3^PK dP! fbobthecow-psysh-a8aec1b/src/Util/UT3^PK dP\0 Y- bobthecow-psysh-a8aec1b/src/Util/Docblock.phpUT3^PK dPc{) bobthecow-psysh-a8aec1b/src/Util/Json.phpUT3^PK dP%+ ٯbobthecow-psysh-a8aec1b/src/Util/Mirror.phpUT3^PK dP\r$ ( Pbobthecow-psysh-a8aec1b/src/Util/Str.phpUT3^PK dP& úbobthecow-psysh-a8aec1b/src/VarDumper/UT3^PK dPQRjm0 bobthecow-psysh-a8aec1b/src/VarDumper/Cloner.phpUT3^PK dP޶1E 0 bobthecow-psysh-a8aec1b/src/VarDumper/Dumper.phpUT3^PK dP!ĵ-3 bobthecow-psysh-a8aec1b/src/VarDumper/Presenter.phpUT3^PK dPϱ>8 Bbobthecow-psysh-a8aec1b/src/VarDumper/PresenterAware.phpUT3^PK dP+ bobthecow-psysh-a8aec1b/src/VersionUpdater/UT3^PK dPz3M.6 1bobthecow-psysh-a8aec1b/src/VersionUpdater/Checker.phpUT3^PK dPͯ0< bobthecow-psysh-a8aec1b/src/VersionUpdater/GitHubChecker.phpUT3^PK dP4ޯ> nbobthecow-psysh-a8aec1b/src/VersionUpdater/IntervalChecker.phpUT3^PK dP>X]: bobthecow-psysh-a8aec1b/src/VersionUpdater/NoopChecker.phpUT3^PK dPdO8) 8bobthecow-psysh-a8aec1b/src/functions.phpUT3^PKfH(a8aec1b2981ab66882a01cce36a49b6317dc3560PK!Gpsysh/.editorconfignuIwPK!e{} psysh/MakefilenuIwPK!uu psysh/README.mdnuIwPK!yC>> psysh/LICENSEnuIwPK!;;,psysh/phpunit.xml.distnuIwPK!5__psysh/.travis.ymlnuIwPK!^pss"M psysh/vendor-bin/box/composer.jsonnuIwPK!_-VV"!psysh/vendor-bin/box/composer.locknuIwPK!|'xpsysh/composer.jsonnuIwPK!Vpsysh/bin/psyshnu̗PK!psysh/bin/build-stubnuȯPK! y psysh/.php_csnuIwPK!1$psysh/.phan/config.phpnuIwPK!gspsysh/.github/CONTRIBUTING.mdnuIwPK!9Zههpsysh/src/Configuration.phpnuIwPK! (psysh/src/ExecutionClosure.phpnuIwPK!A[-N0N04psysh/src/functions.phpnuIwPK!OOepsysh/src/Shell.phpnuIwPK!G^/P'psysh/src/Command/PsyVersionCommand.phpnuIwPK!ً[""",psysh/src/Command/TraceCommand.phpnuIwPK!Њ !psysh/src/Command/DumpCommand.phpnuIwPK! A7  9psysh/src/Command/ListCommand/ClassConstantEnumerator.phpnuIwPK!ۥp- 4J)psysh/src/Command/ListCommand/FunctionEnumerator.phpnuIwPK!PT 1b4psysh/src/Command/ListCommand/ClassEnumerator.phpnuIwPK!+!:Apsysh/src/Command/ListCommand/GlobalVariableEnumerator.phpnuIwPK!k  4Ipsysh/src/Command/ListCommand/ConstantEnumerator.phpnuIwPK!4`Vpsysh/src/Command/ListCommand/PropertyEnumerator.phpnuIwPK! 4Ojpsysh/src/Command/ListCommand/VariableEnumerator.phpnuIwPK!MY^^5[xpsysh/src/Command/ListCommand/InterfaceEnumerator.phpnuIwPK!qH2psysh/src/Command/ListCommand/MethodEnumerator.phpnuIwPK!.1psysh/src/Command/ListCommand/TraitEnumerator.phpnuIwPK!`v  ,psysh/src/Command/ListCommand/Enumerator.phpnuIwPK!W[<<!gpsysh/src/Command/ExitCommand.phpnuIwPK!ӕ psysh/src/Command/DocCommand.phpnuIwPK!1??%psysh/src/Command/WhereamiCommand.phpnuIwPK!z0_$xpsysh/src/Command/HistoryCommand.phpnuIwPK!##"psysh/src/Command/ClearCommand.phpnuIwPK!##psysh/src/Command/TimeitCommand.phpnuIwPK!3"_psysh/src/Command/ParseCommand.phpnuIwPK!^@%%!Ypsysh/src/Command/ShowCommand.phpnuIwPK!-0 !:psysh/src/Command/HelpCommand.phpnuIwPK!MEpsysh/src/Command/Command.phpnuIwPK!3;&&!dpsysh/src/Command/ListCommand.phpnuIwPK! MM!+psysh/src/Command/EditCommand.phpnuIwPK!aB!ɡpsysh/src/Command/SudoCommand.phpnuIwPK!N2>#ְpsysh/src/Command/BufferCommand.phpnuIwPK!RTT ӹpsysh/src/Command/WtfCommand.phpnuIwPK!T%%'wpsysh/src/Command/ReflectingCommand.phpnuIwPK!9hTT1mpsysh/src/Command/TimeitCommand/TimeitVisitor.phpnuIwPK!Odp$"psysh/src/Command/ThrowUpCommand.phpnuIwPK!B ;psysh/src/VarDumper/Dumper.phpnuIwPK!jmmCpsysh/src/VarDumper/Cloner.phpnuIwPK!ޥխ&psysh/src/VarDumper/PresenterAware.phpnuIwPK!=!c"psysh/src/VarDumper/Presenter.phpnuIwPK!f "1psysh/src/ExecutionLoopClosure.phpnuIwPK!L,,?psysh/src/ExecutionLoop/AbstractListener.phpnuIwPK!Ly`11$Cpsysh/src/ExecutionLoop/Listener.phpnuIwPK!P+, *@Kpsysh/src/ExecutionLoop/RunkitReloader.phpnuIwPK!CԖ)DXpsysh/src/ExecutionLoop/ProcessForker.phpnuIwPK!e,3rpsysh/src/VersionUpdater/IntervalChecker.phpnuIwPK!E)/..$yypsysh/src/VersionUpdater/Checker.phpnuIwPK!5*{psysh/src/VersionUpdater/GitHubChecker.phpnuIwPK!ΐM6]](psysh/src/VersionUpdater/NoopChecker.phpnuIwPK!V psysh/src/Util/Mirror.phpnuIwPK!P2|psysh/src/Util/Json.phpnuIwPK!Cpsysh/src/Util/Docblock.phpnuIwPK!-R Qpsysh/src/Util/Str.phpnuIwPK!3  !7psysh/src/ConsoleColorFactory.phpnuIwPK!+Lpsysh/src/CodeCleaner/AbstractClassPass.phpnuIwPK!¡_)9psysh/src/CodeCleaner/CodeCleanerPass.phpnuIwPK!hW,,,1psysh/src/CodeCleaner/MagicConstantsPass.phpnuIwPK! :psysh/src/CodeCleaner/FunctionReturnInWriteContextPass.phpnuIwPK!#А,psysh/src/CodeCleaner/ImplicitReturnPass.phpnuIwPK!.8 +psysh/src/CodeCleaner/ValidConstantPass.phpnuIwPK!oW0psysh/src/CodeCleaner/AssignThisVariablePass.phpnuIwPK!S )0psysh/src/CodeCleaner/LoopContextPass.phpnuIwPK!jHs )psysh/src/CodeCleaner/StrictTypesPass.phpnuIwPK!4bK %psysh/src/CodeCleaner/RequirePass.phpnuIwPK!la&"_psysh/src/CodeCleaner/ExitPass.phpnuIwPK!TT*psysh/src/CodeCleaner/UseStatementPass.phpnuIwPK!LZyy'K psysh/src/CodeCleaner/NoReturnValue.phpnuIwPK!M,,.psysh/src/CodeCleaner/ValidConstructorPass.phpnuIwPK!ѢW) psysh/src/CodeCleaner/LegacyEmptyPass.phpnuIwPK!D('psysh/src/CodeCleaner/FinalClassPass.phpnuIwPK!ȯHH0.psysh/src/Reflection/ReflectionClassConstant.phpnuIwPK! qq=:Cpsysh/src/Reflection/ReflectionLanguageConstructParameter.phpnuIwPK!ן,Lpsysh/src/Reflection/ReflectionConstant_.phpnuIwPK!/og+,[psysh/src/Reflection/ReflectionConstant.phpnuIwPK!`$#\ \ 4p^psysh/src/Reflection/ReflectionLanguageConstruct.phpnuIwPK!=u::0lpsysh/src/ConfigPaths.phpnuIwPK!0))psysh/src/Sudo.phpnuIwPK!NVz)psysh/src/Formatter/DocblockFormatter.phpnuIwPK!]-!cpsysh/src/Formatter/Formatter.phpnuIwPK!n%hpsysh/src/Formatter/CodeFormatter.phpnuIwPK!b$$*psysh/src/Formatter/SignatureFormatter.phpnuIwPK!6fpsysh/src/Readline/Readline.phpnuIwPK!  Opsysh/src/Readline/Libedit.phpnuIwPK! psysh/src/Readline/Transient.phpnuIwPK!47!psysh/src/Readline/HoaConsole.phpnuIwPK!M,"hpsysh/src/Readline/GNUReadline.phpnuIwPK!. & psysh/src/Exception/ErrorException.phpnuIwPK!PF+psysh/src/Exception/ParseErrorException.phpnuIwPK!*SL(psysh/src/Exception/RuntimeException.phpnuIwPK!4 1*!psysh/src/Exception/TypeErrorException.phpnuIwPK!2S!Q#psysh/src/Exception/Exception.phpnuIwPK!˵:~~+%psysh/src/Exception/DeprecatedException.phpnuIwPK!#[[&l'psysh/src/Exception/BreakException.phpnuIwPK!hM+,psysh/src/Exception/FatalErrorException.phpnuIwPK!&p税(92psysh/src/Exception/ThrowUpException.phpnuIwPK!OK?   8psysh/src/Output/ShellOutput.phpnuIwPK!,866 {Spsysh/src/Output/OutputPager.phpnuIwPK!1 $Vpsysh/src/Output/ProcOutputPager.phpnuIwPK!1|))"Japsysh/src/Output/PassthruPager.phpnuIwPK!d7 dpsysh/src/Context.phpnuIwPK!-d77psysh/src/ContextAware.phpnuIwPK!x=psysh/src/ExecutionLoop.phpnuIwPK!8psysh/src/TabCompletion/Matcher/MongoDatabaseMatcher.phpnuIwPK!WGC7psysh/src/TabCompletion/Matcher/ClassMethodsMatcher.phpnuIwPK!U$&^ ^ 5psysh/src/TabCompletion/Matcher/ClassNamesMatcher.phpnuIwPK!*G׎Dppsysh/src/TabCompletion/Matcher/FunctionDefaultParametersMatcher.phpnuIwPK!,,?psysh/src/TabCompletion/Matcher/AbstractContextAwareMatcher.phpnuIwPK!NGeeG>psysh/src/TabCompletion/Matcher/ClassMethodDefaultParametersMatcher.phpnuIwPK!]  6psysh/src/TabCompletion/Matcher/MongoClientMatcher.phpnuIwPK!L?3\\3psysh/src/TabCompletion/Matcher/AbstractMatcher.phpnuIwPK!3HKpsysh/src/TabCompletion/Matcher/ObjectMethodDefaultParametersMatcher.phpnuIwPK!8~~4psysh/src/TabCompletion/Matcher/FunctionsMatcher.phpnuIwPK!L++3psysh/src/TabCompletion/Matcher/KeywordsMatcher.phpnuIwPK!8(psysh/src/TabCompletion/Matcher/ObjectMethodsMatcher.phpnuIwPK!uf7:psysh/src/TabCompletion/Matcher/ClassAttributesMatcher.phpnuIwPK!R7 3psysh/src/TabCompletion/Matcher/CommandsMatcher.phpnuIwPK!pO(4# psysh/src/TabCompletion/Matcher/VariablesMatcher.phpnuIwPK!\DD4g psysh/src/TabCompletion/Matcher/ConstantsMatcher.phpnuIwPK!Kn?; psysh/src/TabCompletion/Matcher/ObjectAttributesMatcher.phpnuIwPK!֔wD psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.phpnuIwPK!kUw )! psysh/src/TabCompletion/AutoCompleter.phpnuIwPK!.])]), psysh/src/CodeCleaner.phpnuIwPK!LiiiYV psysh/src/Sudo/SudoVisitor.phpnuIwPK!;  k psysh/src/ParserFactory.phpnuIwPK!mKvt psysh/.styleci.ymlnuIwPK!(v psysh/test/fixtures/legacy/.psysh/rc.phpnuIwPK!3w psysh/test/fixtures/legacy/.psysh/php_manual.sqlitenuIwPK!)tw psysh/test/fixtures/legacy/.psysh/historynuIwPK!ݣw psysh/test/fixtures/config.phpnuIwPK!@z psysh/test/fixtures/default/.local/share/psysh/php_manual.sqlitenuIwPK!7pz psysh/test/fixtures/default/.config/psysh/psysh_historynuIwPK!4z psysh/test/fixtures/default/.config/psysh/config.phpnuIwPK!OTqq'A{ psysh/test/fixtures/unvis_fixtures.jsonnuIwPK!amm& - psysh/test/fixtures/project/.psysh.phpnuIwPK!. psysh/test/fixtures/empty.phpnuIwPK!.0 psysh/test/fixtures/mixed/.psysh/psysh_historynuIwPK!'x0 psysh/test/fixtures/mixed/.psysh/rc.phpnuIwPK!+0 psysh/test/fixtures/mixed/.psysh/config.phpnuIwPK!;k}0 0 &61 psysh/test/tools/gen_unvis_fixtures.pynuȯPK!d d = psysh/test/tools/vis.pynuȯPK!0 - - )gK psysh/test/Command/ThrowUpCommandTest.phpnuIwPK!dRZ6W psysh/test/Command/TimeitCommand/TimeitVisitorTest.phpnuIwPK!]K&C^ psysh/test/Command/ExitCommandTest.phpnuIwPK!U' ' Fa psysh/test/ConfigurationTest.phpnuIwPK!c88- psysh/test/VersionUpdater/NoopCheckerTest.phpnuIwPK!S  /R psysh/test/VersionUpdater/GitHubCheckerTest.phpnuIwPK!,4 Í psysh/test/ParserTestCase.phpnuIwPK!9ڴ  psysh/test/Util/DocblockTest.phpnuIwPK!S psysh/test/Util/MirrorTest.phpnuIwPK!1eپ psysh/test/Util/StrTest.phpnuIwPK!RS$$ psysh/test/ContextTest.phpnuIwPK!xF% psysh/test/Input/CodeArgumentTest.phpnuIwPK! 2 2 & psysh/test/Input/FilterOptionsTest.phpnuIwPK!cP""#) psysh/test/Input/ShellInputTest.phpnuIwPK! (&&0p psysh/test/CodeCleaner/AbstractClassPassTest.phpnuIwPK!'65*5*1 psysh/test/CodeCleaner/ValidClassNamePassTest.phpnuIwPK!dg@27 psysh/test/CodeCleaner/LeavePsyshAlonePassTest.phpnuIwPK![ 6= psysh/test/CodeCleaner/PassableByReferencePassTest.phpnuIwPK!j. . .6I psysh/test/CodeCleaner/CalledClassPassTest.phpnuIwPK!e1S psysh/test/CodeCleaner/MagicConstantsPassTest.phpnuIwPK!,9W psysh/test/CodeCleaner/NoReturnValueTest.phpnuIwPK!ڨ#''-Z psysh/test/CodeCleaner/FinalClassPassTest.phpnuIwPK!F *a psysh/test/CodeCleaner/RequirePassTest.phpnuIwPK!.Q'/l psysh/test/CodeCleaner/ExitPassTest.phpnuIwPK!#zZ0%t psysh/test/CodeCleaner/ValidConstantPassTest.phpnuIwPK!lB5...2z psysh/test/CodeCleaner/StrictTypesPassTest.phpnuIwPK!JzK . psysh/test/CodeCleaner/LoopContextPassTest.phpnuIwPK!X9us s ? psysh/test/CodeCleaner/FunctionReturnInWriteContextPassTest.phpnuIwPK!PN 3 psysh/test/CodeCleaner/ValidConstructorPassTest.phpnuIwPK!}1̢ psysh/test/CodeCleaner/ImplicitReturnPassTest.phpnuIwPK!gQ_,5 psysh/test/CodeCleaner/AssignThisVariablePassTest.phpnuIwPK!) /= psysh/test/CodeCleaner/UseStatementPassTest.phpnuIwPK!?<<-` psysh/test/CodeCleaner/InstanceOfPassTest.phpnuIwPK!p+5' psysh/test/CodeCleaner/ListPassTest.phpnuIwPK!PP,' psysh/test/CodeCleaner/NamespacePassTest.phpnuIwPK!/ff. psysh/test/CodeCleaner/LegacyEmptyPassTest.phpnuIwPK!ڄ2 psysh/test/CodeCleaner/FunctionContextPassTest.phpnuIwPK!>Lpp3} psysh/test/CodeCleaner/Fixtures/ClassWithStatic.phpnuIwPK!pp3P psysh/test/CodeCleaner/Fixtures/TraitWithStatic.phpnuIwPK!8`Nxx7# psysh/test/CodeCleaner/Fixtures/ClassWithCallStatic.phpnuIwPK!$=: psysh/test/CodeCleaner/CallTimePassByReferencePassTest.phpnuIwPK!Cpʍ.l psysh/test/CodeCleaner/CodeCleanerTestCase.phpnuIwPK!+4W psysh/test/CodeCleaner/ValidFunctionNamePassTest.phpnuIwPK!r| 0A psysh/test/Reflection/ReflectionConstantTest.phpnuIwPK!ʓ&ޘ2# psysh/test/Reflection/ReflectionConstantBCTest.phpnuIwPK!} } 9 psysh/test/Reflection/ReflectionLanguageConstructTest.phpnuIwPK!\}p6 6 5& psysh/test/Reflection/ReflectionClassConstantTest.phpnuIwPK!N\B/ psysh/test/Reflection/ReflectionLanguageConstructParameterTest.phpnuIwPK!V D448 psysh/test/ShellTest.phpnuIwPK!&m psysh/test/ConsoleColorFactoryTest.phpnuIwPK!Ya4  /3t psysh/test/Formatter/SignatureFormatterTest.phpnuIwPK!jAk  . psysh/test/Formatter/DocblockFormatterTest.phpnuIwPK!s&pp* psysh/test/Formatter/CodeFormatterTest.phpnuIwPK!rji44+˕ psysh/test/Formatter/Fixtures/SomeClass.phpnuIwPK! kcc-Z psysh/test/Formatter/Fixtures/BoringTrait.phpnuIwPK! psysh/test/ClassWithSecrets.phpnuIwPK!9 % psysh/test/Readline/TransientTest.phpnuIwPK!fG  'ا psysh/test/Readline/GNUReadlineTest.phpnuIwPK!ps#K psysh/test/Readline/LibeditTest.phpnuIwPK!$tt&/ psysh/test/Readline/HoaConsoleTest.phpnuIwPK!MP|  psysh/test/SudoTest.phpnuIwPK!o&- psysh/test/Exception/ThrowUpExceptionTest.phpnuIwPK!eAD+ psysh/test/Exception/ErrorExceptionTest.phpnuIwPK!10 psysh/test/Exception/FatalErrorExceptionTest.phpnuIwPK!r5jj/ psysh/test/Exception/TypeErrorExceptionTest.phpnuIwPK!q+ psysh/test/Exception/BreakExceptionTest.phpnuIwPK!A,rr0 psysh/test/Exception/ParseErrorExceptionTest.phpnuIwPK!h - psysh/test/Exception/RuntimeExceptionTest.phpnuIwPK!3&  psysh/test/CodeCleanerTest.phpnuIwPK!* psysh/test/FakeShell.phpnuIwPK!) psysh/test/TabCompletion/StaticSample.phpnuIwPK!mI@b. psysh/test/TabCompletion/AutoCompleterTest.phpnuIwPK!On #& psysh/test/Sudo/SudoVisitorTest.phpnuIwPK!6ii 5 psysh/.gitignorenuIwPK!/E_ 5 psysh/box.json.distnuIwPK!a͓͓26 psysh/756404bf2251edf8e3711bfa0a0cd519e8496200.zipnuIwPK!/.{,{,2psysh/67de8afa0291ffe5137ee70655b46b7d9d671b67.zipnuIwPKd